1 /***************************************************************************
2  *
3  * Project:  OpenCPN
4  * Purpose:  Options Dialog
5  * Author:   David Register
6  *
7  ***************************************************************************
8  *   Copyright (C) 2010 by David S. Register                               *
9  *                                                                         *
10  *   This program is free software; you can redistribute it and/or modify  *
11  *   it under the terms of the GNU General Public License as published by  *
12  *   the Free Software Foundation; either version 2 of the License, or     *
13  *   (at your option) any later version.                                   *
14  *                                                                         *
15  *   This program is distributed in the hope that it will be useful,       *
16  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  *   GNU General Public License for more details.                          *
19  *                                                                         *
20  *   You should have received a copy of the GNU General Public License     *
21  *   along with this program; if not, write to the                         *
22  *   Free Software Foundation, Inc.,                                       *
23  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  USA.         *
24  **************************************************************************/
25 
26 #ifndef _OPTIONS_H_
27 #define _OPTIONS_H_
28 
29 #ifdef __MINGW32__
30 #undef IPV6STRICT    // mingw FTBS fix:  missing struct ip_mreq
31 #include <windows.h>
32 #endif
33 
34 #include <wx/listbook.h>
35 #include <wx/dirctrl.h>
36 #include <wx/spinctrl.h>
37 #include <wx/listctrl.h>
38 #include <wx/choice.h>
39 #include <wx/collpane.h>
40 #include <wx/clrpicker.h>
41 #include <wx/colourdata.h>
42 
43 #if wxUSE_TIMEPICKCTRL
44  #include <wx/timectrl.h>
45 #endif
46 
47 #ifdef __WXGTK__
48 //wxTimePickerCtrl is completely broken in Gnome based desktop environments as of wxGTK 3.0
49 #include "time_textbox.h"
50 #endif
51 
52 #include <vector>
53 
54 #if wxCHECK_VERSION(2, 9, 0)
55 #include <wx/frame.h>
56 #else
57 #include "scrollingdialog.h"
58 #endif
59 
60 #include "datastream.h"
61 #include "pluginmanager.h"  // FIXME: Refactor
62 
63 #ifndef __OCPN__ANDROID__
64 #define __OCPN__OPTIONS_USE_LISTBOOK__
65 #endif
66 
67 // Forward Declarations
68 class wxGenericDirCtrl;
69 class MyConfig;
70 class ChartGroupsUI;
71 class ConnectionParams;
72 class PluginListPanel;
73 class ChartGroupArray;
74 class ChartGroup;
75 class MMSI_Props_Panel;
76 class MMSIProperties;
77 class OCPNCheckedListCtrl;
78 class CanvasConfigSelect;
79 class OCPNIconCombo;
80 class OCPNColourPickerCtrl;
81 
82 #define ID_DIALOG 10001
83 #define SYMBOL_OPTIONS_STYLE \
84   wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU | wxCLOSE_BOX
85 #define SYMBOL_OPTIONS_TITLE _("Options")
86 #define SYMBOL_OPTIONS_IDNAME ID_DIALOG
87 #define SYMBOL_OPTIONS_SIZE wxSize(500, 500)
88 #define SYMBOL_OPTIONS_POSITION wxDefaultPosition
89 
90 enum {
91   ID_AISALERTAUDIO = 10000,
92   ID_AISALERTDIALOG,
93   ID_AISALERTSELECTSOUND,
94   ID_AISALERTTESTSOUND,
95   ID_APPLY,
96   ID_ATONTEXTCHECKBOX,
97   ID_AUTOANCHORMARKBOX1,
98   ID_BELLSCHECKBOX,
99   ID_BUTTONADD,
100   ID_BUTTONDELETE,
101   ID_BUTTONCOMPRESS,
102   ID_BUTTONFONTCHOOSE,
103   ID_BUTTONFONTCOLOR,
104   ID_BUTTONGROUP,
105   ID_BUTTONREBUILD,
106   ID_BUTTONTCDATA,
107   ID_CHECKLISTBOX,
108   ID_CHECK_DISPLAYGRID,
109   ID_CHECK_LOOKAHEAD,
110   ID_CHOICE_AIS,
111   ID_CHOICE_AP,
112   ID_CHOICE_FONTELEMENT,
113   ID_CHOICE_LANG,
114   ID_CHOICE_NMEA_BAUD,
115   ID_CLEARLIST,
116   ID_CM93CHECKBOX1,
117   ID_CM93ZOOM,
118   ID_COURSEUPCHECKBOX,
119   ID_DAILYCHECKBOX,
120   ID_DEBUGCHECKBOX1,
121   ID_DECLTEXTCHECKBOX,
122   ID_DIRCTRL,
123   ID_DRAGGINGCHECKBOX,
124   ID_FILTERNMEA,
125   ID_FSTOOLBARCHECKBOX,
126   ID_FULLSCREENQUILT,
127   ID_GARMINHOST,
128   ID_RADARRINGS,
129   ID_GRIBCHECKBOX,
130   ID_GROUPAVAILABLE,
131   ID_GROUPDELETEGROUP,
132   ID_GROUPINSERTDIR,
133   ID_GROUPNEWGROUP,
134   ID_GROUPNOTEBOOK,
135   ID_GROUPREMOVEDIR,
136   ID_IMPTEXTCHECKBOX,
137   ID_LDISTEXTCHECKBOX,
138   ID_LISTBOX,
139   ID_METACHECKBOX,
140   ID_NOTEBOOK,
141   ID_OPENGLBOX,
142   ID_OPENGLOPTIONS,
143   ID_SHIPICONTYPE,
144   ID_OUTLINECHECKBOX1,
145   ID_PANEL,
146   ID_PANEL2,
147   ID_PANEL3,
148   ID_PANELADVANCED,
149   ID_PANELAIS,
150   ID_PANELMMSI,
151   ID_PANELFONT,
152   ID_PANELPIM,
153   ID_PRESERVECHECKBOX,
154   ID_PRINTCHECKBOX1,
155   ID_QUILTCHECKBOX1,
156   ID_RADARDISTUNIT,
157   ID_RASTERCHECKBOX1,
158   ID_SCAMINCHECKBOX,
159   ID_SCANCHECKBOX,
160   ID_SDMMFORMATCHOICE,
161   ID_DISTANCEUNITSCHOICE,
162   ID_SPEEDUNITSCHOICE,
163   ID_DEPTHUNITSCHOICE,
164   ID_SELECTLIST,
165   ID_SHOWDEPTHUNITSBOX1,
166   ID_SHOWGPSWINDOW,
167   ID_SKEWCOMPBOX,
168   ID_SMOOTHPANZOOMBOX,
169   ID_SOUNDGCHECKBOX,
170   ID_STYLESCOMBOBOX,
171   ID_TCDATAADD,
172   ID_TCDATADEL,
173   ID_TEXTCHECKBOX,
174   ID_OPTEXTCTRL,
175   ID_TIDESELECTED,
176   ID_TRACKCHECKBOX,
177   ID_TRACKHILITE,
178   ID_TRANSTOOLBARCHECKBOX,
179   ID_UPDCHECKBOX,
180   ID_PARSEENCBUTTON,
181   ID_VECTORCHECKBOX1,
182   ID_ZTCCHECKBOX,
183   ID_DELETECHECKBOX,
184   ID_NATIONALTEXTCHECKBOX,
185   ID_TRUESHOWCHECKBOX,
186   ID_MAGSHOWCHECKBOX,
187   ID_MAGAPBCHECKBOX,
188   ID_MOBILEBOX,
189   ID_REPONSIVEBOX,
190   ID_SIZEMANUALRADIOBUTTON,
191   ID_OPWAYPOINTRANGERINGS,
192   xID_OK,
193   ID_BT_SCANTIMER,
194   ID_TRACKROTATETIME,
195   ID_TRACKROTATEUTC,
196   ID_TRACKROTATELMT,
197   ID_TRACKROTATECOMPUTER,
198   ID_SETSTDLIST,
199   ID_VECZOOM,
200   ID_INLANDECDISBOX,
201   ID_ROLLOVERBOX,
202   ID_SOGCOGFROMLLCHECKBOX,
203   ID_SOGCOGDAMPINTTEXTCTRL,
204   // LIVE ETA OPTION
205   ID_CHECK_LIVEETA,
206   ID_DEFAULT_BOAT_SPEED,
207   ID_DARKDECORATIONSBOX,
208   ID_SCREENCONFIG1,
209   ID_SCREENCONFIG2,
210   ID_CONFIGEDIT_OK,
211   ID_CONFIGEDIT_CANCEL,
212   ID_ZOOMBUTTONS,
213   ID_RASTERZOOM
214 };
215 
216 /* Define an int bit field for dialog return value
217  * to indicate which types of settings have changed */
218 #define GENERIC_CHANGED                 1
219 #define S52_CHANGED                     1 << 1
220 #define FONT_CHANGED                    1 << 2
221 #define FORCE_UPDATE                    1 << 3
222 #define VISIT_CHARTS                    1 << 4
223 #define LOCALE_CHANGED                  1 << 5
224 #define TOOLBAR_CHANGED                 1 << 6
225 #define CHANGE_CHARTS                   1 << 7
226 #define SCAN_UPDATE                     1 << 8
227 #define GROUPS_CHANGED                  1 << 9
228 #define STYLE_CHANGED                   1 << 10
229 #define TIDES_CHANGED                   1 << 11
230 #define GL_CHANGED                      1 << 12
231 #define REBUILD_RASTER_CACHE            1 << 13
232 #define NEED_NEW_OPTIONS                1 << 14
233 #define PARSE_ENC                       1 << 15
234 #define CONFIG_CHANGED                  1 << 16
235 
236 #ifndef wxCLOSE_BOX
237 #define wxCLOSE_BOX 0x1000
238 #endif
239 #ifndef wxFIXED_MINSIZE
240 #define wxFIXED_MINSIZE 0
241 #endif
242 
243 #include <wx/arrimpl.cpp>
244 WX_DEFINE_ARRAY_PTR(wxGenericDirCtrl *, ArrayOfDirCtrls);
245 
246 class Uncopyable {
247  protected:
Uncopyable(void)248   Uncopyable(void) {}
~Uncopyable(void)249   ~Uncopyable(void) {}
250 
251  private:
252   Uncopyable(const Uncopyable &);
253   Uncopyable &operator=(const Uncopyable &);
254 };
255 
256 #ifndef bert  // wxCHECK_VERSION(2, 9, 0)
257 class options : private Uncopyable,
258                 public wxDialog
259 #else
260 class options : private Uncopyable,
261                 public wxScrollingDialog
262 #endif
263                 {
264  public:
265   explicit options(MyFrame *parent, wxWindowID id = SYMBOL_OPTIONS_IDNAME,
266                    const wxString &caption = SYMBOL_OPTIONS_TITLE,
267                    const wxPoint &pos = SYMBOL_OPTIONS_POSITION,
268                    const wxSize &size = SYMBOL_OPTIONS_SIZE,
269                    long style = SYMBOL_OPTIONS_STYLE);
270 
271   ~options(void);
272 #if wxCHECK_VERSION(3,0,0)
273   bool SendIdleEvents(wxIdleEvent &event );
274 #endif
275   void SetInitialPage(int page_sel, int sub_page = -1);
276   void Finish(void);
277 
278   void OnClose(wxCloseEvent &event);
279 
280   void CreateListbookIcons();
281   void CreateControls(void);
282   size_t CreatePanel(const wxString &title);
283   wxScrolledWindow *AddPage(size_t parent, const wxString &title);
284   bool DeletePluginPage(wxScrolledWindow *page);
285   void SetColorScheme(ColorScheme cs);
286   void RecalculateSize(void);
287 
SetInitChartDir(const wxString & dir)288   void SetInitChartDir(const wxString &dir) { m_init_chart_dir = dir; }
289   void SetInitialSettings(void);
290   void SetInitialVectorSettings(void);
291 
SetCurrentDirList(ArrayOfCDI p)292   void SetCurrentDirList(ArrayOfCDI p) { m_CurrentDirList = p; }
SetWorkDirListPtr(ArrayOfCDI * p)293   void SetWorkDirListPtr(ArrayOfCDI *p) { m_pWorkDirList = p; }
GetWorkDirListPtr(void)294   ArrayOfCDI *GetWorkDirListPtr(void) { return m_pWorkDirList; }
295 
296   void AddChartDir(const wxString &dir);
297 
298   void UpdateDisplayedChartDirList(ArrayOfCDI p);
299   void UpdateOptionsUnits(void);
300 
SetConfigPtr(MyConfig * p)301   void SetConfigPtr(MyConfig *p) { m_pConfig = p; }
302   void OnDebugcheckbox1Click(wxCommandEvent &event);
303   void OnDirctrlSelChanged(wxTreeEvent &event);
304   void OnButtonaddClick(wxCommandEvent &event);
305   void OnButtondeleteClick(wxCommandEvent &event);
306   void OnButtonParseENC(wxCommandEvent &event);
307   void OnButtoncompressClick(wxCommandEvent &event);
308   void OnRadioboxSelected(wxCommandEvent &event);
309   void OnApplyClick(wxCommandEvent &event);
310   void OnXidOkClick(wxCommandEvent &event);
311   void OnCancelClick(wxCommandEvent &event);
312   void OnChooseFont(wxCommandEvent &event);
313   void OnFontChoice(wxCommandEvent &event);
314   void OnCPAWarnClick(wxCommandEvent &event);
315   void OnSizeAutoButton(wxCommandEvent &event);
316   void OnSizeManualButton(wxCommandEvent &event);
317 
318 #if defined(__WXGTK__) || defined(__WXQT__)
319   void OnChooseFontColor(wxCommandEvent &event);
320 #endif
321   void OnGLClicked(wxCommandEvent &event);
322   void OnOpenGLOptions(wxCommandEvent &event);
323   void OnDisplayCategoryRadioButton(wxCommandEvent &event);
324   void OnButtonClearClick(wxCommandEvent &event);
325   void OnButtonSelectClick(wxCommandEvent &event);
326   void OnButtonSetStd(wxCommandEvent& event);
327 
328   void OnPageChange(wxListbookEvent &event);
329   void OnTopNBPageChange(wxNotebookEvent &event);
330   void OnSubNBPageChange(wxNotebookEvent &event);
331   void DoOnPageChange(size_t page);
332 
333   void OnButtonSelectSound(wxCommandEvent &event);
334   void OnButtonTestSound(wxCommandEvent &event);
335   void OnShowGpsWindowCheckboxClick(wxCommandEvent &event);
336   void OnZTCCheckboxClick(wxCommandEvent &event);
337   void OnRadarringSelect(wxCommandEvent &event);
338   void OnWaypointRangeRingSelect(wxCommandEvent &event);
339   void OnShipTypeSelect(wxCommandEvent &event);
340   void OnButtonGroups(wxCommandEvent &event);
341   void OnInsertTideDataLocation(wxCommandEvent &event);
342   void OnRemoveTideDataLocation(wxCommandEvent &event);
343   void OnCharHook(wxKeyEvent &event);
344   void OnChartsPageChange(wxListbookEvent &event);
345   void OnChartDirListSelect(wxCommandEvent &event);
346   void OnUnitsChoice(wxCommandEvent &event);
347   void OnScanBTClick(wxCommandEvent &event);
348   void onBTScanTimer(wxTimerEvent &event);
349   void StopBTScan(void);
350 
351   void UpdateWorkArrayFromTextCtl(void);
352 
353   void OnCreateConfig( wxCommandEvent &event);
354   void OnEditConfig( wxCommandEvent &event);
355   void OnDeleteConfig( wxCommandEvent &event);
356   void OnApplyConfig( wxCommandEvent &event);
357   void SetConfigButtonState();
358   void ClearConfigList();
359   void BuildConfigList();
360   void OnConfigMouseSelected( wxMouseEvent &event);
361 
362   void SetSelectedConnectionPanel( ConnectionParamsPanel *panel );
363 
GetNeedNew()364   bool GetNeedNew(){ return m_bneedNew; }
SetNeedNew(bool bnew)365   void SetNeedNew( bool bnew ){ m_bneedNew =bnew; }
GetScrollRate()366   int GetScrollRate(){ return m_scrollRate; }
367 
368   // Should we show tooltips?
369   static bool ShowToolTips(void);
370 
371 #ifdef __OCPN__OPTIONS_USE_LISTBOOK__
372   wxListbook *m_pListbook;
373 #else
374   wxNotebook *m_pListbook;
375 #endif
376 
377   size_t m_pageDisplay, m_pageConnections, m_pageCharts, m_pageShips;
378   size_t m_pageUI, m_pagePlugins;
379   int lastPage, lastSubPage;
380   wxPoint lastWindowPos;
381   wxSize lastWindowSize;
382   wxButton *m_ApplyButton, *m_OKButton, *m_CancelButton;
383 
384   ChartGroupArray *m_pGroupArray;
385   int m_groups_changed;
386 
387   // Sizer flags
388   wxSizerFlags inputFlags, verticleInputFlags, labelFlags, groupInputFlags;
389   wxSizerFlags groupLabelFlags, groupLabelFlagsHoriz;
390 
391   // For general options
392   wxScrolledWindow *pDisplayPanel;
393   wxCheckBox *pShowStatusBar, *pShowMenuBar, *pShowChartBar, *pShowCompassWin;
394   wxCheckBox *pPrintShowIcon, *pCDOOutlines, *pSDepthUnits, *pSDisplayGrid;
395   wxCheckBox *pAutoAnchorMark, *pCDOQuilting, *pCBRaster, *pCBVector;
396   wxCheckBox *pCBCM93, *pCBLookAhead, *pSkewComp, *pOpenGL, *pSmoothPanZoom;
397   wxCheckBox *pFullScreenQuilt, *pMobile, *pResponsive, *pOverzoomEmphasis;
398 //  wxCheckBox *pOZScaleVector, *pToolbarAutoHideCB, *pInlandEcdis, *pRollover;
399   wxCheckBox *pOZScaleVector, *pToolbarAutoHideCB, *pInlandEcdis, *pRollover, *pDarkDecorations;
400   wxCheckBox *pZoomButtons;
401   wxTextCtrl *pCOGUPUpdateSecs, *m_pText_OSCOG_Predictor, *pScreenMM;
402   wxTextCtrl *pToolbarHideSecs, *m_pText_OSHDT_Predictor;
403 
404   wxTextCtrl *pCmdSoundString;
405 
406   wxChoice *m_pShipIconType, *m_pcTCDatasets;
407   wxSlider *m_pSlider_Zoom, *m_pSlider_GUI_Factor, *m_pSlider_Chart_Factor, *m_pSlider_Ship_Factor, *m_pSlider_Text_Factor;
408   wxSlider *m_pSlider_Zoom_Vector;
409   wxSlider *m_pSlider_CM93_Zoom;
410   // LIVE ETA OPTION
411   wxCheckBox *pSLiveETA;
412   wxTextCtrl *pSDefaultBoatSpeed;
413 
414   wxRadioButton *pCBCourseUp, *pCBNorthUp, *pRBSizeAuto, *pRBSizeManual;
415   int k_tides;
416 
417   // For the GPS page
418   wxButton *m_buttonAdd, *m_buttonRemove, *m_buttonScanBT, *m_btnInputStcList;
419   wxButton *m_btnOutputStcList, *m_sdbSizerDlgButtonsOK;
420   wxButton *m_sdbSizerDlgButtonsApply, *m_sdbSizerDlgButtonsCancel;
421   wxStaticBoxSizer *sbSizerConnectionProps, *sbSizerInFilter;
422   wxStaticBoxSizer *sbSizerOutFilter;
423   wxRadioButton *m_rbTypeSerial, *m_rbTypeNet, *m_rbTypeInternalGPS;
424   wxRadioButton *m_rbTypeInternalBT, *m_rbNetProtoTCP, *m_rbNetProtoUDP;
425   wxRadioButton *m_rbNetProtoGPSD, *m_rbIAccept, *m_rbIIgnore, *m_rbOAccept;
426   wxRadioButton *m_rbNetProtoSignalK;
427   wxRadioButton *m_rbOIgnore;
428   wxStaticText *m_stBTPairs, *m_stNetProto, *m_stNetAddr, *m_stNetPort;
429   wxStaticText *m_stSerPort, *m_stSerBaudrate, *m_stSerProtocol;
430   wxStaticText *m_stPriority, *m_stFilterSec, *m_stPrecision;
431   wxStaticText *m_stTalkerIdText;
432   wxStaticText *m_stNetComment, *m_stSerialComment;
433   wxTextCtrl *m_tNetComment, *m_tSerialComment;
434   wxStaticBox *m_sbConnEdit;
435   wxChoice *m_choiceBTDataSources, *m_choiceBaudRate, *m_choiceSerialProtocol;
436   wxChoice *m_choicePriority, *m_choicePrecision;
437   wxScrolledWindow *m_scrollWinConnections;
438   wxBoxSizer *boxSizerConnections;
439   ConnectionParams *mSelectedConnection;
440 
441   // For the Display\Units page
442   wxStaticText* itemStaticTextUserVar;
443   wxStaticText* itemStaticTextUserVar2;
444 
445   wxGridSizer *gSizerNetProps, *gSizerSerProps;
446   wxTextCtrl *m_tNetAddress, *m_tNetPort, *m_tFilterSec, *m_tcInputStc;
447   wxTextCtrl *m_tcOutputStc, *m_TalkerIdText;
448   wxCheckBox *m_cbCheckCRC, *m_cbGarminHost, *m_cbGarminUploadHost, *m_cbCheckSKDiscover;
449   wxCheckBox *m_cbFurunoGP3X, *m_cbNMEADebug, *m_cbFilterSogCog, *m_cbInput;
450   wxCheckBox *m_cbOutput, *m_cbAPBMagnetic;
451   wxComboBox *m_comboPort;
452   wxStdDialogButtonSizer *m_sdbSizerDlgButtons;
453   wxButton *m_configDeleteButton, *m_configApplyButton, *m_ButtonSKDiscover;
454   wxStaticText *m_StaticTextSKServerStatus;
455 
456   void OnSelectDatasource(wxListEvent &event);
457   void OnAddDatasourceClick(wxCommandEvent &event);
458   void OnRemoveDatasourceClick(wxCommandEvent &event);
459 
460   void OnTypeSerialSelected(wxCommandEvent &event);
461   void OnTypeNetSelected(wxCommandEvent &event);
462   void OnTypeGPSSelected(wxCommandEvent &event);
463   void OnTypeBTSelected(wxCommandEvent &event);
464 
465   void OnNetProtocolSelected(wxCommandEvent &event);
OnBaudrateChoice(wxCommandEvent & event)466   void OnBaudrateChoice(wxCommandEvent &event) { OnConnValChange(event); }
OnProtocolChoice(wxCommandEvent & event)467   void OnProtocolChoice(wxCommandEvent &event) { OnConnValChange(event); }
OnCrcCheck(wxCommandEvent & event)468   void OnCrcCheck(wxCommandEvent &event) { OnValChange(event); }
469   void OnRbAcceptInput(wxCommandEvent &event);
470   void OnRbIgnoreInput(wxCommandEvent &event);
471   void OnBtnIStcs(wxCommandEvent &event);
472   void OnCbInput(wxCommandEvent &event);
473   void OnCbOutput(wxCommandEvent &event);
474   void OnRbOutput(wxCommandEvent &event);
475   void OnBtnOStcs(wxCommandEvent &event);
476   void OnConnValChange(wxCommandEvent &event);
477   void OnValChange(wxCommandEvent &event);
478   void OnUploadFormatChange(wxCommandEvent &event);
479   void EnableConnection( ConnectionParams *conn, bool value);
480   void OnDiscoverButton(wxCommandEvent &event);
481   void UpdateDiscoverStatus( wxString stat);
482   void OnAISRolloverClick(wxCommandEvent &event);
483 
484   void OnCanvasConfigSelectClick( int ID, bool selected);
485 
486   bool connectionsaved;
487   bool m_connection_enabled;
488 
489   bool b_haveWMM;
490   bool b_oldhaveWMM;
491   ColorScheme m_cs;
492 
493   // For "S57" page
494   wxBoxSizer *vectorPanel;
495   wxScrolledWindow *ps57Ctl;
496 
497 // #if defined(__WXMSW__) || defined(__WXOSX__)
498 //   wxCheckListBox *ps57CtlListBox;
499 // #else
500   OCPNCheckedListCtrl *ps57CtlListBox;
501 // #endif
502 
503   wxChoice *pDispCat, *pPointStyle, *pBoundStyle, *p24Color;
504   wxButton *itemButtonClearList, *itemButtonSelectList, *itemButtonSetStd;
505   wxCheckBox *pCheck_SOUNDG, *pCheck_META, *pCheck_SHOWIMPTEXT;
506   wxCheckBox *pCheck_SCAMIN, *pCheck_ATONTEXT, *pCheck_LDISTEXT;
507   wxCheckBox *pCheck_XLSECTTEXT, *pCheck_DECLTEXT, *pCheck_NATIONALTEXT;
508   wxCheckBox *pSEnableCM93Offset;
509   wxTextCtrl *m_ShallowCtl, *m_SafetyCtl, *m_DeepCtl;
510   wxStaticText *m_depthUnitsShal, *m_depthUnitsSafe, *m_depthUnitsDeep;
511   int k_vectorcharts;
512 
513   // For "Units" page
514   wxChoice *pSDMMFormat, *pDistanceFormat, *pSpeedFormat, *pDepthUnitSelect;
515   wxCheckBox *pCBTrueShow, *pCBMagShow;
516   wxTextCtrl *pMagVar;
517 
518   // For "Charts" page
519   wxStaticBoxSizer *activeSizer;
520   wxBoxSizer *chartPanel;
521   wxTextCtrl *pSelCtl;
522   wxListCtrl *pActiveChartsList;
523   wxStaticBox *itemActiveChartStaticBox;
524   wxCheckBox *pUpdateCheckBox, *pScanCheckBox;
525   wxButton *pParseENCButton;
526   wxButton *m_removeBtn, *m_compressBtn;
527   int k_charts;
528   int m_nCharWidthMax;
529 
530   // For the "Charts->Display Options" page
531   wxScrolledWindow *m_ChartDisplayPage;
532 
533   // For the "AIS" page
534   wxCheckBox *m_pCheck_CPA_Max, *m_pCheck_CPA_Warn, *m_pCheck_CPA_WarnT;
535   wxCheckBox *m_pCheck_Mark_Lost, *m_pCheck_Remove_Lost, *m_pCheck_Show_COG;
536   wxCheckBox *m_pCheck_Show_Tracks, *m_pCheck_Hide_Moored, *m_pCheck_Scale_Priority;
537   wxCheckBox *m_pCheck_AlertDialog, *m_pCheck_AlertAudio;
538   wxCheckBox *m_pCheck_Alert_Moored, *m_pCheck_Rollover_Class;
539   wxCheckBox *m_pCheck_Rollover_COG, *m_pCheck_Rollover_CPA;
540   wxCheckBox *m_pCheck_Ack_Timout, *m_pCheck_Show_Area_Notices;
541   wxCheckBox *m_pCheck_Draw_Target_Size, *m_pCheck_Draw_Realtime_Prediction;
542   wxCheckBox *m_pCheck_Show_Target_Name;
543   wxCheckBox *m_pCheck_Wpl_Aprs, *m_pCheck_ShowAllCPA;
544   wxTextCtrl *m_pText_CPA_Max, *m_pText_CPA_Warn, *m_pText_CPA_WarnT;
545   wxTextCtrl *m_pText_Mark_Lost, *m_pText_Remove_Lost, *m_pText_COG_Predictor;
546   wxTextCtrl *m_pText_Track_Length, *m_pText_Moored_Speed, *m_pText_Scale_Priority;
547   wxTextCtrl *m_pText_ACK_Timeout, *m_pText_Show_Target_Name_Scale;
548   wxTextCtrl *m_pText_RealtPred_Speed;
549 
550   // For Display->Configs page...
551   wxScrolledWindow *m_DisplayConfigsPage;
552 
553   CanvasConfigSelect *m_sconfigSelect_single;
554   CanvasConfigSelect *m_sconfigSelect_twovertical;
555 
556   // For Configuration Template panel
557   wxScrolledWindow *m_scrollWinConfigList;
558   wxStaticText *m_templateTitleText;
559   wxStaticText *m_staticTextLastAppled;
560   wxStaticBoxSizer *m_templateStatusBoxSizer;
561 
562   // For the ship page
563   wxFlexGridSizer *realSizes;
564   wxTextCtrl *m_pOSLength, *m_pOSWidth, *m_pOSGPSOffsetX, *m_pOSGPSOffsetY;
565   wxTextCtrl *m_pOSMinSize, *m_pText_ACRadius;
566   wxStaticBoxSizer *dispOptions, *dispWaypointOptions;
567   wxScrolledWindow *itemPanelShip, *itemPanelRoutes;
568   wxBoxSizer *ownShip, *Routes;
569 
570   OCPNIconCombo *pWaypointDefaultIconChoice;
571   OCPNIconCombo *pRoutepointDefaultIconChoice;
572   wxCheckBox    *pScaMinChckB, *pScaMinOverruleChckB;
573   wxTextCtrl*   m_pText_ScaMin;
574 
575   // For the font page
576   wxBoxSizer *m_itemBoxSizerFontPanel;
577   wxChoice *m_itemFontElementListBox, *m_itemStyleListBox, *m_itemLangListBox;
578   wxStaticText *m_textSample;
579   bool m_bVisitLang;
580 
581   // For "AIS Options"
582   wxComboBox *m_itemAISListBox;
583 
584   // For "PlugIns" Panel
585   PluginListPanel *m_pPlugInCtrl;
586   AddPluginPanel* m_AddPluginPanel;
587   CatalogMgrPanel *m_PluginCatalogMgrPanel;
588   wxScrolledWindow *itemPanelPlugins;
589   wxBoxSizer *itemBoxSizerPanelPlugins;
590   wxFlexGridSizer *radarGrid, *waypointradarGrid;
591   wxChoice *pNavAidRadarRingsNumberVisible, *pWaypointRangeRingsNumber;
592   OCPNColourPickerCtrl *m_colourOwnshipRangeRingColour;
593   wxChoice *m_itemRadarRingsUnits, *m_itemWaypointRangeRingsUnits;
594   OCPNColourPickerCtrl *m_colourTrackLineColour;;
595   wxChoice *pTrackPrecision;
596   wxTextCtrl *pNavAidRadarRingsStep, *pWaypointRangeRingsStep;
597   wxCheckBox *pSogCogFromLLCheckBox;
598   wxSpinCtrl *pSogCogFromLLDampInterval;
599   wxTextCtrl *m_pText_TP_Secs, *m_pText_TP_Dist;
600   wxCheckBox *pWayPointPreventDragging, *pConfirmObjectDeletion;
601   wxCheckBox *pEnableZoomToCursor, *pPreserveScale, *pPlayShipsBells;
602   wxCheckBox *pTransparentToolbar;
603   wxCheckBox *pAdvanceRouteWaypointOnArrivalOnly, *pTrackShowIcon;
604   wxCheckBox *pTrackDaily, *pTrackHighlite;
605   wxStaticText* pStatic_CallSign;
606 
607 #if wxCHECK_VERSION(2, 9, 0)
608 #if wxUSE_TIMEPICKCTRL
609 #ifdef __WXGTK__
610   TimeCtrl *pTrackRotateTime;
611 #else
612   wxTimePickerCtrl *pTrackRotateTime;
613 #endif
614 #endif
615 #endif
616   wxRadioButton *pTrackRotateComputerTime, *pTrackRotateUTC, *pTrackRotateLMT;
617   OCPNColourPickerCtrl *m_colourWaypointRangeRingsColour;
618   wxChoice *pSoundDeviceIndex;
619   wxStaticText *stSoundDeviceIndex;
620 
621   wxArrayPtrVoid OBJLBoxArray;
622   wxString m_init_chart_dir;
623   wxArrayString *m_pSerialArray;
624 
625   ArrayOfCDI m_CurrentDirList, *m_pWorkDirList;
626   MyConfig *m_pConfig;
627   MyFrame *pParent;
628 
629   int k_plugins;
630 
631  private:
632   void Init(void);
633   void CreatePanel_MMSI(size_t parent, int border_size, int group_item_spacing);
634   void CreatePanel_AIS(size_t parent, int border_size, int group_item_spacing);
635   void CreatePanel_Ownship(size_t parent, int border_size, int group_item_spacing);
636   void CreatePanel_NMEA(size_t parent, int border_size, int group_item_spacing);
637   void CreatePanel_NMEA_Compact(size_t parent, int border_size, int group_item_spacing);
638   void CreatePanel_ChartsLoad(size_t parent, int border_size, int group_item_spacing);
639   void CreatePanel_VectorCharts(size_t parent, int border_size, int group_item_spacing);
640   void CreatePanel_TidesCurrents(size_t parent, int border_size, int group_item_spacing);
641   void CreatePanel_ChartGroups(size_t parent, int border_size, int group_item_spacing);
642   void CreatePanel_Display(size_t parent, int border_size, int group_item_spacing);
643   void CreatePanel_UI(size_t parent, int border_size, int group_item_spacing);
644   void CreatePanel_Units(size_t parent, int border_size, int group_item_spacing);
645   void CreatePanel_Advanced(size_t parent, int border_size, int group_item_spacing);
646   void CreatePanel_Configs(size_t parent, int border_size, int group_item_spacing);
647   void CreatePanel_Routes(size_t parent, int border_size, int group_item_spacing);
648 
649   void UpdateTemplateTitleText();
650   void CheckDeviceAccess(wxString &path);
651   int m_returnChanges;
652   wxListCtrl *tcDataSelected;
653   std::vector<int> marinersStdXref;
654   ChartGroupsUI *groupsPanel;
655   wxImageList *m_topImgList;
656 
657   wxScrolledWindow *m_pNMEAForm;
658   void ShowNMEACommon(bool visible);
659 
660   void ShowNMEASerial(bool visible);
661   void ShowNMEANet(bool visible);
662   void ShowNMEAGPS(bool visible);
663   void ShowNMEABT(bool visible);
664 
665   void SetNMEAFormToSerial(void);
666   void SetNMEAFormToNet(void);
667   void SetNMEAFormToGPS(void);
668   void SetNMEAFormToBT(void);
669 
670   void ClearNMEAForm(void);
671   bool m_bNMEAParams_shown;
672 
673   void resetMarStdList(bool bsetConfig, bool bsetStd);
674 
675   void SetConnectionParams(ConnectionParams *cp);
676   void SetDefaultConnectionParams(void);
677   void SetDSFormRWStates();
678   void SetDSFormOptionVizStates();
679   void FillSourceList();
680   void UpdateSourceList( bool bResort );
681   bool SortSourceList(void);
682 
683   ConnectionParams *CreateConnectionParamsFromSelectedItem();
684   ConnectionParams *UpdateConnectionParamsFromSelectedItem(ConnectionParams *pConnectionParams);
685 
686   int m_screenConfig;
687 
688   wxNotebookPage *m_groupsPage;
689   wxFont  *dialogFont, *dialogFontPlus;
690   wxFont smallFont;
691 //  wxFont *dialogFont;
692   wxSize m_small_button_size;
693   wxTimer m_BTScanTimer;
694   wxArrayString m_BTscan_results;
695 
696   bool m_bcompact;
697   int m_fontHeight, m_scrollRate, m_BTscanning, m_btNoChangeCounter;
698   int m_btlastResultCount;
699   bool m_bfontChanged;
700   bool m_bVectorInit;
701 
702   wxBoxSizer *m_boxSizerConfigs;
703   wxColour m_panelBackgroundUnselected;
704   wxString m_selectedConfigPanelGUID;
705   wxSize  m_colourPickerDefaultSize;
706 
707   wxSize m_sliderSize;
708   bool m_bneedNew;
709 
710   DECLARE_EVENT_TABLE()
711 };
712 
713 class CanvasConfigSelect: public wxPanel
714 {
715 public:
716     CanvasConfigSelect( wxWindow *parent, options *parentOptions, int id, wxBitmap &bmp,
717                         const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize );
718     ~CanvasConfigSelect();
719 
720     void OnMouseSelected( wxMouseEvent &event );
721     void SetSelected( bool selected );
722     void OnPaint( wxPaintEvent &event );
723 
GetSelected()724     bool GetSelected(){ return m_bSelected; }
725 
726 private:
727     options *m_parentOptions;
728     bool m_bSelected;
729     wxColour m_boxColour;
730     wxBitmap m_bmpNormal;
731     int m_borderWidth;
732 
733     DECLARE_EVENT_TABLE()
734 };
735 
736 class ChartGroupsUI : private Uncopyable, public wxScrolledWindow {
737  public:
738   explicit ChartGroupsUI(wxWindow *parent);
739   ~ChartGroupsUI(void);
740 
741   void CreatePanel(size_t parent, int border_size, int group_item_spacing);
742   void CompletePanel(void);
SetDBDirs(ArrayOfCDI & array)743   void SetDBDirs(ArrayOfCDI &array) { m_db_dirs = array; }
SetGroupArray(ChartGroupArray * pGroupArray)744   void SetGroupArray(ChartGroupArray *pGroupArray) {
745     m_pGroupArray = pGroupArray;
746   }
747   void SetInitialSettings(void);
748   void CompleteInitialSettings(void);
749   void PopulateTrees(void);
750   void PopulateTreeCtrl(wxTreeCtrl *ptc, const wxArrayString &dir_array,
751                         const wxColour &col, wxFont *pFont = NULL);
752   void BuildNotebookPages(ChartGroupArray *pGroupArray);
753   void EmptyChartGroupArray(ChartGroupArray *s);
754   void ClearGroupPages();
755 
756 
757   void OnNodeExpanded(wxTreeEvent &event);
758   void OnAvailableSelection(wxTreeEvent &event);
759   void OnInsertChartItem(wxCommandEvent &event);
760   void OnRemoveChartItem(wxCommandEvent &event);
761   void OnGroupPageChange(wxNotebookEvent &event);
762   void OnNewGroup(wxCommandEvent &event);
763   void OnDeleteGroup(wxCommandEvent &event);
764 
765   ChartGroupArray *CloneChartGroupArray(ChartGroupArray *s);
766   wxTreeCtrl *AddEmptyGroupPage(const wxString &label);
767 
768   bool modified, m_UIcomplete, m_settingscomplete, m_treespopulated;
769 
770   wxScrolledWindow *m_panel;
771 
772  private:
773   int FindGroupBranch(ChartGroup *pGroup, wxTreeCtrl *ptree, wxTreeItemId item,
774                       wxString *pbranch_adder);
775 
776   wxWindow *pParent;
777   wxFlexGridSizer *groupsSizer;
778   wxButton *m_pAddButton, *m_pRemoveButton, *m_pNewGroupButton;
779   wxButton *m_pDeleteGroupButton;
780   wxGenericDirCtrl *allAvailableCtl, *defaultAllCtl;
781   wxTreeCtrl *m_pActiveChartsTree, *lastSelectedCtl;
782   wxTreeItemId lastDeletedItem;
783   wxNotebook *m_GroupNB;
784   wxFont *iFont;
785   wxFont *dialogFont;
786 
787   ArrayOfCDI m_db_dirs;
788   ArrayOfDirCtrls m_DirCtrlArray;
789   ChartGroupArray *m_pGroupArray;
790 
791   int m_border_size, m_group_item_spacing, m_GroupSelectedPage;
792 
793   wxBoxSizer *m_topSizer;
794 
795   DECLARE_EVENT_TABLE()
796 };
797 
798 
799 class SentenceListDlg : private Uncopyable, public wxDialog {
800  public:
801   explicit SentenceListDlg(wxWindow *parent, FilterDirection dir, ListType type,
802                            const wxArrayString &list);
803   wxString GetSentences(void);
804 
805  private:
806   void OnAddClick(wxCommandEvent &event);
807   void OnDeleteClick(wxCommandEvent &event);
808   void OnCLBSelect(wxCommandEvent &event);
809   void OnCheckAllClick(wxCommandEvent &event);
810   void OnClearAllClick(wxCommandEvent &event);
811 
812   void Populate(const wxArrayString &list);
813   wxString GetBoxLabel(void) const;
814 
815   wxCheckListBox *m_clbSentences;
816   wxButton *m_btnDel;
817 
818   ListType m_type;
819   FilterDirection m_dir;
820   wxArrayString m_sentences;
821 };
822 
823 #ifdef ocpnUSE_GL
824 class OpenGLOptionsDlg : private Uncopyable, public wxDialog {
825  public:
826   explicit OpenGLOptionsDlg(wxWindow *parent);
827   bool GetAcceleratedPanning(void) const;
828   bool GetTextureCompression(void) const;
829   bool GetPolygonSmoothing(void) const;
830   bool GetLineSmoothing(void) const;
831   bool GetShowFPS(void) const;
832   bool GetSoftwareGL(void) const;
833   bool GetTextureCompressionCaching(void) const;
834   bool GetRebuildCache(void) const;
835   int GetTextureMemorySize(void) const;
836 
837  private:
838   void Populate(void);
839   void OnButtonRebuild(wxCommandEvent &event);
840   void OnButtonClear(wxCommandEvent &event);
841   wxString GetTextureCacheSize(void);
842 
843   wxCheckBox *m_cbUseAcceleratedPanning, *m_cbTextureCompression;
844   wxCheckBox *m_cbTextureCompressionCaching, *m_cbShowFPS, *m_cbSoftwareGL,
845       *m_cbPolygonSmoothing, *m_cbLineSmoothing;
846   wxSpinCtrl *m_sTextureDimension, *m_sTextureMemorySize;
847   wxStaticText *m_cacheSize, *m_memorySize;
848 
849   bool m_brebuild_cache;
850 
851   DECLARE_EVENT_TABLE()
852 };
853 #endif
854 
855 #define ID_MMSI_PROPS_LIST 10073
856 
857 enum {
858     mlMMSI = 0,
859     mlTrackMode,
860     mlIgnore,
861     mlMOB,
862     mlVDM,
863     mlFollower,
864     mlShipName
865 };  // MMSIListCtrl Columns;
866 
867 class MMSIListCtrl : private Uncopyable, public wxListCtrl {
868  public:
869   explicit MMSIListCtrl(wxWindow *parent, wxWindowID id, const wxPoint &pos,
870                         const wxSize &size, long style);
871   ~MMSIListCtrl(void);
872 
873   wxString OnGetItemText(long item, long column) const;
874   void OnListItemClick(wxListEvent &event);
875   void OnListItemActivated(wxListEvent &event);
876   void OnListItemRightClick(wxListEvent &event);
877   void PopupMenuHandler(wxCommandEvent &event);
878 
879   wxWindow *m_parent;
880   int m_context_item;
881 
882   DECLARE_EVENT_TABLE()
883 };
884 
885 #define ID_MMSIEDIT_OK 8191
886 #define ID_MMSIEDIT_CANCEL 8192
887 #define ID_MMSI_CTL 8193
888 #define ID_DEF_MENU_MMSI_EDIT 8194
889 #define ID_DEF_MENU_MMSI_DELETE 8195
890 
891 class MMSIEditDialog : private Uncopyable, public wxDialog {
892  public:
893   explicit MMSIEditDialog(MMSIProperties *props, wxWindow *parent,
894                           wxWindowID id = wxID_ANY,
895                           const wxString &caption = wxEmptyString,
896                           const wxPoint &pos = wxDefaultPosition,
897                           const wxSize &size = wxDefaultSize, long style = 0);
898   ~MMSIEditDialog(void);
899 
900   void SetColorScheme(ColorScheme cs);
901   void CreateControls(void);
902   void OnMMSIEditCancelClick(wxCommandEvent &event);
903   void OnMMSIEditOKClick(wxCommandEvent &event);
904   void OnCtlUpdated(wxCommandEvent &event);
905 
906   MMSIProperties *m_props;
907   wxTextCtrl *m_MMSICtl, m_ShipNameCtl; //Has ToDo take away?
908   wxRadioButton *m_rbTypeTrackDefault, *m_rbTypeTrackAlways;
909   wxRadioButton *m_rbTypeTrackNever;
910   wxCheckBox *m_cbTrackPersist, *m_IgnoreButton, *m_MOBButton, *m_VDMButton, *m_FollowerButton;
911   wxButton *m_CancelButton, *m_OKButton;
912 
913 private:
914     void Persist();
915 
916   DECLARE_EVENT_TABLE()
917 };
918 
919 class MMSI_Props_Panel : private Uncopyable, public wxPanel {
920  public:
921   explicit MMSI_Props_Panel(wxWindow *parent);
922   ~MMSI_Props_Panel();
923 
924   void OnNewButton(wxCommandEvent &event);
925   void SetColorScheme(ColorScheme cs);
926   void UpdateMMSIList(void);
927 
928   MMSIListCtrl *m_pListCtrlMMSI;
929   wxButton *m_pButtonNew;
930 
931  private:
932   wxWindow *m_pparent;
933 };
934 
935 class ConfigCreateDialog : private Uncopyable, public wxDialog
936 {
937 public:
938     explicit ConfigCreateDialog(wxWindow *parent, wxWindowID id = wxID_ANY,
939                             const wxString &caption = wxEmptyString,
940                             const wxPoint &pos = wxDefaultPosition,
941                             const wxSize &size = wxDefaultSize, long style = 0);
942     ~ConfigCreateDialog(void);
943 
944     void SetColorScheme(ColorScheme cs);
945     void CreateControls(void);
946     void OnConfigEditCancelClick(wxCommandEvent& event);
947     void OnConfigEditOKClick(wxCommandEvent& event);
GetCreatedTemplateGUID()948     wxString GetCreatedTemplateGUID(){ return m_createdTemplateGUID; }
949 
950     wxTextCtrl *m_TitleCtl, *m_DescriptionCtl;
951     wxButton *m_CancelButton, *m_OKButton;
952     wxString m_createdTemplateGUID;
953     DECLARE_EVENT_TABLE()
954 };
955 
956 #endif
957 // _OPTIONS_H_
958