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