1 /******************************************************************************
2 *
3 * Project: OpenCPN
4 *
5 ***************************************************************************
6 * Copyright (C) 2013 by David S. Register *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
22 ***************************************************************************
23 */
24
25 #include "wx/wxprec.h"
26 #include <wx/sizer.h>
27 #include <wx/stattext.h>
28 #include <wx/button.h>
29 #include <wx/textctrl.h>
30 #include <wx/clipbrd.h>
31
32 #include "GoToPositionDialog.h"
33 #include "PositionParser.h"
34 #include "MarkInfo.h"
35 #include "navutil.h"
36 #include "chcanv.h"
37
38 extern MyFrame *gFrame;
39
40 /*!
41 * GoToPositionDialog type definition
42 */
43
IMPLEMENT_DYNAMIC_CLASS(GoToPositionDialog,wxDialog)44 IMPLEMENT_DYNAMIC_CLASS( GoToPositionDialog, wxDialog )
45 /*!
46 * GoToPositionDialog event table definition
47 */BEGIN_EVENT_TABLE( GoToPositionDialog, wxDialog )
48
49 ////@begin GoToPositionDialog event table entries
50
51 EVT_BUTTON( ID_GOTOPOS_CANCEL, GoToPositionDialog::OnGoToPosCancelClick )
52 EVT_BUTTON( ID_GOTOPOS_OK, GoToPositionDialog::OnGoToPosOkClick )
53 EVT_COMMAND(ID_LATCTRL, EVT_LLCHANGE, GoToPositionDialog::OnPositionCtlUpdated)
54 EVT_COMMAND(ID_LONCTRL, EVT_LLCHANGE, GoToPositionDialog::OnPositionCtlUpdated)
55
56 ////@end GoToPositionDialog event table entries
57
58 END_EVENT_TABLE()
59
60 /*!
61 * GoToPositionDialog constructors
62 */
63
64 GoToPositionDialog::GoToPositionDialog()
65 {
66 }
67
GoToPositionDialog(wxWindow * parent,wxWindowID id,const wxString & caption,const wxPoint & pos,const wxSize & size,long style)68 GoToPositionDialog::GoToPositionDialog( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
69 {
70 long wstyle = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
71
72 Create( parent, id, caption, pos, size, wstyle );
73
74 }
75
~GoToPositionDialog()76 GoToPositionDialog::~GoToPositionDialog()
77 {
78 delete m_MarkLatCtl;
79 delete m_MarkLonCtl;
80 }
81
82 /*!
83 * GoToPositionDialog creator
84 */
85
Create(wxWindow * parent,wxWindowID id,const wxString & caption,const wxPoint & pos,const wxSize & size,long style)86 bool GoToPositionDialog::Create( wxWindow* parent, wxWindowID id, const wxString& caption,
87 const wxPoint& pos, const wxSize& size, long style )
88 {
89 SetExtraStyle( GetExtraStyle() | wxWS_EX_BLOCK_EVENTS );
90 wxDialog::Create( parent, id, caption, pos, size, style );
91
92 m_hostCanvas = NULL;
93
94 CreateControls();
95 GetSizer()->SetSizeHints( this );
96 Centre();
97
98 return TRUE;
99 }
100
101 /*!
102 * Control creation for GoToPositionDialog
103 */
104
CreateControls()105 void GoToPositionDialog::CreateControls()
106 {
107 GoToPositionDialog* itemDialog1 = this;
108
109 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer( wxVERTICAL );
110 itemDialog1->SetSizer( itemBoxSizer2 );
111
112 wxStaticBox* itemStaticBoxSizer4Static = new wxStaticBox( itemDialog1, wxID_ANY,
113 _("Position") );
114
115 wxStaticBoxSizer* itemStaticBoxSizer4 = new wxStaticBoxSizer( itemStaticBoxSizer4Static,
116 wxVERTICAL );
117 itemBoxSizer2->Add( itemStaticBoxSizer4, 0, wxEXPAND | wxALL, 5 );
118
119 wxStaticText* itemStaticText5 = new wxStaticText( itemDialog1, wxID_STATIC, _("Latitude"),
120 wxDefaultPosition, wxDefaultSize, 0 );
121 itemStaticBoxSizer4->Add( itemStaticText5, 0,
122 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5 );
123
124 m_MarkLatCtl = new wxTextCtrl( itemDialog1, ID_LATCTRL, _T(""), wxDefaultPosition,
125 wxSize( 180, -1 ), 0 );
126 itemStaticBoxSizer4->Add( m_MarkLatCtl, 0,
127 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 5 );
128
129 wxStaticText* itemStaticText6 = new wxStaticText( itemDialog1, wxID_STATIC, _("Longitude"),
130 wxDefaultPosition, wxDefaultSize, 0 );
131 itemStaticBoxSizer4->Add( itemStaticText6, 0,
132 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5 );
133
134 m_MarkLonCtl = new wxTextCtrl( itemDialog1, ID_LONCTRL, _T(""), wxDefaultPosition,
135 wxSize( 180, -1 ), 0 );
136 itemStaticBoxSizer4->Add( m_MarkLonCtl, 0,
137 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, 5 );
138
139 wxBoxSizer* itemBoxSizer16 = new wxBoxSizer( wxHORIZONTAL );
140 itemBoxSizer2->Add( itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5 );
141
142 m_CancelButton = new wxButton( itemDialog1, ID_GOTOPOS_CANCEL, _("Cancel"), wxDefaultPosition,
143 wxDefaultSize, 0 );
144 itemBoxSizer16->Add( m_CancelButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
145
146 m_OKButton = new wxButton( itemDialog1, ID_GOTOPOS_OK, _("OK"), wxDefaultPosition,
147 wxDefaultSize, 0 );
148 itemBoxSizer16->Add( m_OKButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 );
149 m_OKButton->SetDefault();
150
151 SetColorScheme( (ColorScheme) 0 );
152 }
153
SetColorScheme(ColorScheme cs)154 void GoToPositionDialog::SetColorScheme( ColorScheme cs )
155 {
156 DimeControl( this );
157 }
158
ShowToolTips()159 bool GoToPositionDialog::ShowToolTips()
160 {
161 return TRUE;
162 }
163
OnGoToPosCancelClick(wxCommandEvent & event)164 void GoToPositionDialog::OnGoToPosCancelClick( wxCommandEvent& event )
165 {
166 Hide();
167 if(m_hostCanvas)
168 m_hostCanvas->ReloadVP();
169
170 event.Skip();
171 }
172
OnGoToPosOkClick(wxCommandEvent & event)173 void GoToPositionDialog::OnGoToPosOkClick( wxCommandEvent& event )
174 {
175 double lat, lon;
176
177 if( m_MarkLatCtl->GetValue().Length() == 0 ) goto noGo;
178 if( m_MarkLonCtl->GetValue().Length() == 0 ) goto noGo;
179
180 lat = fromDMM( m_MarkLatCtl->GetValue() );
181 lon = fromDMM( m_MarkLonCtl->GetValue() );
182
183 if( lat == 0.0 && lon == 0.0 ) goto noGo;
184 if( lat > 80.0 || lat < -80.0 ) goto noGo;
185 if( lon > 180.0 || lon < -180.0 ) goto noGo;
186
187 if(m_hostCanvas)
188 gFrame->JumpToPosition( m_hostCanvas, lat, lon, m_hostCanvas->GetVPScale() );
189 Hide();
190 event.Skip();
191 return;
192
193 noGo:
194 wxBell();
195 event.Skip();
196 return;
197 }
198
CheckPasteBufferForPosition()199 void GoToPositionDialog::CheckPasteBufferForPosition() {
200 if( wxTheClipboard->Open() ) {
201 wxTextDataObject data;
202 wxTheClipboard->GetData( data );
203 wxString pasteBuf = data.GetText();
204
205 PositionParser pparse( pasteBuf );
206
207 if( pparse.IsOk() ) {
208 m_MarkLatCtl->SetValue( pparse.GetLatitudeString() );
209 m_MarkLonCtl->SetValue( pparse.GetLongitudeString() );
210 }
211 wxTheClipboard->Close();
212 }
213 }
214
OnPositionCtlUpdated(wxCommandEvent & event)215 void GoToPositionDialog::OnPositionCtlUpdated( wxCommandEvent& event )
216 {
217 // We do not want to change the position on lat/lon now
218 }
219
220