OpenCPN Partial API docs
Loading...
Searching...
No Matches
chartdldrgui.cpp
1
2// C++ code generated with wxFormBuilder (version Jun 6 2014)
3// http://www.wxformbuilder.org/
4//
5// PLEASE DO "NOT" EDIT THIS FILE!
7
8#include "chartdldr_pi.h"
9#include "chartdldrgui.h"
10#include "manual.h"
11#include "../../../libs/manual/include/manual.h"
12#include <wx/msgdlg.h>
13#include <wx/scrolwin.h>
14#include <wx/textwrapper.h>
15
17
18#ifdef __OCPN__ANDROID__
19
20QString qtStyleSheet =
21 "QScrollBar:horizontal {\
22border: 0px solid grey;\
23background-color: rgb(240, 240, 240);\
24height: 50px;\
25margin: 0px 1px 0 1px;\
26}\
27QScrollBar::handle:horizontal {\
28background-color: rgb(200, 200, 200);\
29min-width: 20px;\
30border-radius: 10px;\
31}\
32QScrollBar::add-line:horizontal {\
33border: 0px solid grey;\
34background: #32CC99;\
35width: 0px;\
36subcontrol-position: right;\
37subcontrol-origin: margin;\
38}\
39QScrollBar::sub-line:horizontal {\
40border: 0px solid grey;\
41background: #32CC99;\
42width: 0px;\
43subcontrol-position: left;\
44subcontrol-origin: margin;\
45}\
46QScrollBar:vertical {\
47border: 0px solid grey;\
48background-color: rgb(240, 240, 240);\
49width: 50px;\
50margin: 1px 0px 1px 0px;\
51}\
52QScrollBar::handle:vertical {\
53background-color: rgb(200, 200, 200);\
54min-height: 50px;\
55border-radius: 10px;\
56}\
57QScrollBar::add-line:vertical {\
58border: 0px solid grey;\
59background: #32CC99;\
60height: 0px;\
61subcontrol-position: top;\
62subcontrol-origin: margin;\
63}\
64QScrollBar::sub-line:vertical {\
65border: 0px solid grey;\
66background: #32CC99;\
67height: 0px;\
68subcontrol-position: bottom;\
69subcontrol-origin: margin;\
70}\
71QCheckBox {\
72spacing: 25px;\
73}\
74QCheckBox::indicator {\
75width: 30px;\
76height: 30px;\
77}\
78";
79
80#endif
81
82#ifdef __OCPN__ANDROID__
83#include <QtWidgets/QScroller>
84#include "qdebug.h"
85#endif
86
87extern chartdldr_pi* g_pi;
88
89class DLDR_ChartDirPanelHardBreakWrapper : public wxTextWrapper {
90public:
91 DLDR_ChartDirPanelHardBreakWrapper(wxWindow* win, const wxString& text,
92 int widthMax) {
93 m_lineCount = 0;
94
95 // Replace all spaces in the string with a token character '^'
96 wxString textMod = text;
97 textMod.Replace(" ", "^");
98
99 // Replace all path separators with spaces
100 wxString sep = wxFileName::GetPathSeparator();
101 textMod.Replace(sep, " ");
102
103 Wrap(win, textMod, widthMax);
104
105 // walk the output array, repairing the substitutions
106 for (size_t i = 0; i < m_array.GetCount(); i++) {
107 wxString a = m_array[i];
108 a.Replace(" ", sep);
109 if (m_array.GetCount() > 1) {
110 if (i < m_array.GetCount() - 1) a += sep;
111 }
112 a.Replace("^", " ");
113 m_array[i] = a;
114 }
115 }
116 wxString const& GetWrapped() const { return m_wrapped; }
117 int const GetLineCount() const { return m_lineCount; }
118 wxArrayString GetLineArray() { return m_array; }
119
120protected:
121 virtual void OnOutputLine(const wxString& line) {
122 m_wrapped += line;
123 m_array.Add(line);
124 }
125 virtual void OnNewLine() {
126 m_wrapped += '\n';
127 m_lineCount++;
128 }
129
130private:
131 wxString m_wrapped;
132 int m_lineCount;
133 wxArrayString m_array;
134};
135
136BEGIN_EVENT_TABLE(DLDR_OCPNChartDirPanel, wxPanel)
137EVT_PAINT(DLDR_OCPNChartDirPanel::OnPaint)
138END_EVENT_TABLE()
139
140DLDR_OCPNChartDirPanel::DLDR_OCPNChartDirPanel(wxWindow* parent, wxWindowID id,
141 const wxPoint& pos,
142 const wxSize& size)
143 : wxPanel(parent, id, pos, size, wxBORDER_NONE) {
144 // On Android, shorten the displayed path name by removing well-known prefix
145 // if
146 // (cdi.fullpath.StartsWith("/storage/emulated/0/Android/data/org.opencpn.opencpn/files"))
147 // m_ChartDir = "..." + cdi.fullpath.Mid(58);
148
149 m_refHeight = GetCharHeight();
150
151 m_unselectedHeight = 2 * m_refHeight;
152
153 SetMinSize(wxSize(-1, m_unselectedHeight));
154
155 wxColour colour;
156 GetGlobalColor(_T("UIBCK"), &colour);
157 m_boxColour = colour;
158}
159
160DLDR_OCPNChartDirPanel::~DLDR_OCPNChartDirPanel() {}
161
162void DLDR_OCPNChartDirPanel::SetText(wxString text) {
163 m_ChartDir = text;
164
165 int maxWidth = GetParent()->GetSize().x * 75 / 100;
166 DLDR_ChartDirPanelHardBreakWrapper wrapper(this, m_ChartDir, maxWidth);
167 wxArrayString nameWrapped = wrapper.GetLineArray();
168 int lineCount = nameWrapped.GetCount();
169 if (lineCount > 1) lineCount++;
170 SetMinSize(wxSize(-1, (lineCount * m_refHeight * 3 / 2)));
171 GetParent()->Layout();
172 Refresh();
173}
174
175void DLDR_OCPNChartDirPanel::OnPaint(wxPaintEvent& event) {
176 int width, height;
177 GetSize(&width, &height);
178 wxPaintDC dc(this);
179
180 dc.SetPen(*wxTRANSPARENT_PEN);
181 dc.SetBrush(wxBrush(GetBackgroundColour()));
182 dc.DrawRectangle(GetVirtualSize());
183
184 wxColour c;
185
186 wxString nameString = m_ChartDir;
187 int maxWidth = GetParent()->GetSize().x * 75 / 100;
188
189 DLDR_ChartDirPanelHardBreakWrapper wrapper(this, nameString, maxWidth);
190 wxArrayString nameWrapped = wrapper.GetLineArray();
191
192 if (height < (int)(nameWrapped.GetCount() + 1) * m_refHeight) {
193 SetMinSize(wxSize(-1, (nameWrapped.GetCount() + 1) * m_refHeight));
194 GetParent()->GetSizer()->Layout();
195 }
196
197 if (1) {
198 dc.SetBrush(wxBrush(m_boxColour));
199
200 GetGlobalColor(_T ( "UITX1" ), &c);
201 dc.SetPen(wxPen(wxColor(0xCE, 0xD5, 0xD6), 3));
202
203 dc.DrawRoundedRectangle(0, 0, width - 1, height - 1, height / 10);
204
205 int offset = height / 10;
206 int text_x = offset;
207
208 wxFont* dFont = GetOCPNScaledFont_PlugIn(_("Dialog"));
209 dc.SetFont(*dFont);
210
211 dc.SetTextForeground(wxColour(64, 64, 64));
212
213 int yd = height * 5 / 100;
214 for (size_t i = 0; i < nameWrapped.GetCount(); i++) {
215 if (i == 0)
216 dc.DrawText(nameWrapped[i], text_x, yd);
217 else
218 dc.DrawText(nameWrapped[i], text_x + GetCharWidth() / 2, yd);
219 yd += GetCharHeight();
220 }
221 } // selected
222}
223
224void AddSourceDlg::applyStyle() {
225#ifdef __OCPN__ANDROID__
226 m_panelPredefined->GetHandle()->setStyleSheet(qtStyleSheet);
227 QScroller::ungrabGesture(m_panelPredefined->GetHandle());
229#endif
230}
231
232AddSourceDlg::AddSourceDlg(wxWindow* parent, wxWindowID id,
233 const wxString& title, const wxPoint& pos,
234 const wxSize& size, long style)
235 : wxDialog(parent, id, title, pos, size, style | wxRESIZE_BORDER) {
236 this->SetSizeHints(wxSize(500, -1), wxDefaultSize);
237
238 wxBoxSizer* bSizerMain = new wxBoxSizer(wxVERTICAL);
239 this->SetSizer(bSizerMain);
240
241 wxStaticBoxSizer* sbSizerSourceSel = new wxStaticBoxSizer(
242 new wxStaticBox(this, wxID_ANY, _("Catalog")), wxVERTICAL);
243 bSizerMain->Add(sbSizerSourceSel, 1, wxALL | wxEXPAND, 5);
244
245 m_nbChoice = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
246 wxNB_TOP);
247 sbSizerSourceSel->Add(m_nbChoice, 1, wxEXPAND | wxALL, 5);
248 m_nbChoice->SetMinSize(wxSize(-1, 6 * GetCharHeight()));
249#ifdef __WXOSX__
250 m_nbChoice->SetMinSize(wxSize(-1, 8 * GetCharHeight()));
251#endif
252
253 m_panelPredefined = new wxPanel(m_nbChoice, wxID_ANY, wxDefaultPosition,
254 wxDefaultSize, wxTAB_TRAVERSAL);
255 m_nbChoice->AddPage(m_panelPredefined, _("Predefined"), false);
256
257 wxBoxSizer* bSizerPredefTree = new wxBoxSizer(wxVERTICAL);
258
259 m_treeCtrlPredefSrcs = new wxTreeCtrl(
260 m_panelPredefined, wxID_ANY, wxDefaultPosition, wxDefaultSize,
261 wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS);
262 bSizerPredefTree->Add(m_treeCtrlPredefSrcs, 1, wxALL | wxEXPAND, 5);
263#ifdef __OCPN__ANDROID__
264 m_treeCtrlPredefSrcs->SetScrollRate(0, 1);
265#endif
266 m_panelPredefined->SetSizer(bSizerPredefTree);
267 m_panelPredefined->Layout();
268 bSizerPredefTree->Fit(m_treeCtrlPredefSrcs /*m_panelPredefined*/);
269
270 m_panelCustom = new wxPanel(m_nbChoice, wxID_ANY, wxDefaultPosition,
271 wxDefaultSize, wxTAB_TRAVERSAL);
272 wxFlexGridSizer* fgSizerSourceSel;
273 fgSizerSourceSel = new wxFlexGridSizer(0, 2, 0, 0);
274 fgSizerSourceSel->AddGrowableCol(1);
275 fgSizerSourceSel->SetFlexibleDirection(wxBOTH);
276 fgSizerSourceSel->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
277
278 m_stName = new wxStaticText(m_panelCustom, wxID_ANY, _("Name"),
279 wxDefaultPosition, wxDefaultSize, 0);
280 m_stName->Wrap(-1);
281 fgSizerSourceSel->Add(m_stName, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
282
283 m_tSourceName = new wxTextCtrl(m_panelCustom, wxID_ANY, wxEmptyString,
284 wxDefaultPosition, wxDefaultSize, 0);
285 m_tSourceName->SetMaxLength(0);
286 fgSizerSourceSel->Add(m_tSourceName, 0, wxALL | wxEXPAND, 5);
287
288 m_stUrl = new wxStaticText(m_panelCustom, wxID_ANY, _("URL"),
289 wxDefaultPosition, wxDefaultSize, 0);
290 m_stUrl->Wrap(-1);
291 fgSizerSourceSel->Add(m_stUrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
292
293 m_tChartSourceUrl = new wxTextCtrl(m_panelCustom, wxID_ANY, wxEmptyString,
294 wxDefaultPosition, wxSize(-1, -1), 0);
295 m_tChartSourceUrl->SetMaxLength(0);
296 fgSizerSourceSel->Add(m_tChartSourceUrl, 0, wxALL | wxEXPAND, 5);
297
298 m_panelCustom->SetSizer(fgSizerSourceSel);
299 m_panelCustom->Layout();
300 fgSizerSourceSel->Fit(m_panelCustom);
301 m_nbChoice->AddPage(m_panelCustom, _("Custom"), true);
302
303 wxStaticBoxSizer* sbSizerChartDir;
304 sbSizerChartDir = new wxStaticBoxSizer(
305 new wxStaticBox(this, wxID_ANY,
306 _("Proposed chart installation directory")),
307 wxVERTICAL);
308 bSizerMain->Add(sbSizerChartDir, 0, wxALL | wxEXPAND, 5);
309
310 wxBoxSizer* dirbox = new wxBoxSizer(wxVERTICAL);
311 sbSizerChartDir->Add(dirbox, 0, wxEXPAND);
312
313 m_tcChartDirectory = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition,
314 wxSize(200, -1), wxTE_READONLY);
315 dirbox->Add(m_tcChartDirectory, 1, wxALL | wxEXPAND, 5);
316 m_tcChartDirectory->Hide();
317
318 m_panelChartDirectory = new DLDR_OCPNChartDirPanel(
319 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1));
320 // m_panelChartDirectory->SetSizeHints(5000, -1);
321 dirbox->Add(m_panelChartDirectory, 1, wxALL | wxEXPAND, 5);
322
323 wxBoxSizer* dirbox1 = new wxBoxSizer(wxHORIZONTAL);
324 sbSizerChartDir->Add(dirbox1, 0, wxALIGN_RIGHT);
325 m_buttonChartDirectory =
326 new wxButton(this, wxID_ANY, _("Select a different directory"));
327 dirbox1->Add(m_buttonChartDirectory, 0, wxALL | wxEXPAND, 5);
328 m_buttonChartDirectory->Disable();
329
330 wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL);
331 bSizerMain->Add(buttons, 0, wxALIGN_RIGHT);
332
333 m_sdbSizerBtnsOK = new wxButton(this, wxID_OK, _("OK"));
334 buttons->Add(m_sdbSizerBtnsOK, 1, wxALL, 5);
335 m_sdbSizerBtnsCancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
336 buttons->Add(m_sdbSizerBtnsCancel, 1, wxALL, 5);
337
338 this->Layout();
339
340 m_sourceswin = NULL;
341
342 // Connect Events
343 m_treeCtrlPredefSrcs->Connect(
344 wxEVT_COMMAND_TREE_SEL_CHANGED,
345 wxTreeEventHandler(AddSourceDlg::OnSourceSelected), NULL, this);
346 m_sdbSizerBtnsOK->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
347 wxCommandEventHandler(AddSourceDlg::OnOkClick),
348 NULL, this);
349 m_sdbSizerBtnsCancel->Connect(
350 wxEVT_COMMAND_BUTTON_CLICKED,
351 wxCommandEventHandler(AddSourceDlg::OnCancelClick), NULL, this);
352 m_buttonChartDirectory->Connect(
353 wxEVT_COMMAND_BUTTON_CLICKED,
354 wxCommandEventHandler(AddSourceDlg::OnDirSelClick), NULL, this);
355 m_nbChoice->Connect(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
356 wxNotebookEventHandler(AddSourceDlg::OnNbPage), NULL,
357 this);
358}
359
360void AddSourceDlg::OnNbPage(wxNotebookEvent& event) {
361 if (event.GetSelection() == 1) {
362 m_buttonChartDirectory->Enable();
363 } else {
364 wxTreeItemId item = m_treeCtrlPredefSrcs->GetSelection();
365 ChartSource* cs = nullptr;
366 if (item.IsOk())
367 cs = (ChartSource*)(m_treeCtrlPredefSrcs->GetItemData(item));
368 if (!cs) m_buttonChartDirectory->Disable();
369 }
370}
371
372AddSourceDlg::~AddSourceDlg() {
373 // Disconnect Events
374 m_treeCtrlPredefSrcs->Disconnect(
375 wxEVT_COMMAND_TREE_SEL_CHANGED,
376 wxTreeEventHandler(AddSourceDlg::OnSourceSelected), NULL, this);
377 m_sdbSizerBtnsOK->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
378 wxCommandEventHandler(AddSourceDlg::OnOkClick),
379 NULL, this);
380 m_sdbSizerBtnsCancel->Disconnect(
381 wxEVT_COMMAND_BUTTON_CLICKED,
382 wxCommandEventHandler(AddSourceDlg::OnCancelClick), NULL, this);
383 m_buttonChartDirectory->Disconnect(
384 wxEVT_COMMAND_BUTTON_CLICKED,
385 wxCommandEventHandler(AddSourceDlg::OnDirSelClick), NULL, this);
386 m_nbChoice->Disconnect(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
387 wxNotebookEventHandler(AddSourceDlg::OnNbPage), NULL,
388 this);
389}
390
391void AddSourceDlg::OnDirSelClick(wxCommandEvent& event) {
392 wxString dir_spec;
393 int response = PlatformDirSelectorDialog(this, &dir_spec,
394 _("Choose Chart File Directory"),
395 m_tcChartDirectory->GetValue());
396
397 if (response == wxID_OK) {
398 wxFileName fn(m_dirExpanded);
399
400 if (!dir_spec.EndsWith(fn.GetName())) {
401 dir_spec += wxFileName::GetPathSeparator();
402 dir_spec += fn.GetName();
403 }
404
405 m_tcChartDirectory->SetValue(dir_spec);
406 m_panelChartDirectory->SetText(dir_spec);
407 }
408}
409
410ChartDldrPanel::ChartDldrPanel(wxWindow* parent, wxWindowID id,
411 const wxPoint& pos, const wxSize& size,
412 long style)
413 : wxPanel(parent, id, pos, size, style) {
414 int border_size = 2;
415
416 // Main Sizer
417 wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
418 SetSizer(mainSizer);
419
420 mainSizer->AddSpacer(GetCharHeight());
421
422 m_DLoadNB = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
423 wxNB_TOP);
424 mainSizer->Add(m_DLoadNB, 1, wxEXPAND);
425
426 // Catalogs
427 wxPanel* catalogPanel =
428 new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition, wxDefaultSize);
429 m_DLoadNB->AddPage(catalogPanel, _("Select Catalog..."));
430
431 wxBoxSizer* catalogPanelBoxSizer = new wxBoxSizer(wxVERTICAL);
432 catalogPanel->SetSizer(catalogPanelBoxSizer);
433
434 wxStaticText* catalogLabel =
435 new wxStaticText(catalogPanel, wxID_ANY, _("Chart Catalogs Available"));
436 catalogLabel->Wrap(-1);
437 catalogPanelBoxSizer->Add(catalogLabel, 0, wxTOP | wxRIGHT | wxLEFT,
438 border_size);
439
440 // Sources list box
441 wxBoxSizer* activeListSizer = new wxBoxSizer(wxVERTICAL);
442 catalogPanelBoxSizer->Add(activeListSizer, 0, wxALL | wxEXPAND, 5);
443
444 m_lbChartSources =
445 new wxListCtrl(catalogPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
446 wxLC_NO_SORT_HEADER | wxLC_REPORT | wxLC_SINGLE_SEL);
447 activeListSizer->Add(m_lbChartSources, 1, wxEXPAND | wxRIGHT, 60);
449
450 // Buttons
451
452 wxBoxSizer* bSizerCatalogBtns = new wxBoxSizer(wxHORIZONTAL);
453 catalogPanelBoxSizer->Add(bSizerCatalogBtns, 0, wxALL | wxEXPAND,
454 border_size);
455
456 m_bAddSource = new wxButton(catalogPanel, wxID_ANY, _("Add Catalog"),
457 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
458 m_bAddSource->SetToolTip(_("Add a new chart catalog."));
459
460 bSizerCatalogBtns->Add(m_bAddSource, 0, wxALL | wxEXPAND, 5);
461
462 m_bDeleteSource = new wxButton(catalogPanel, wxID_ANY, _("Delete"),
463 wxDefaultPosition, wxDefaultSize, 0);
464 m_bDeleteSource->SetToolTip(
465 _("Delete the chart catalog. The downloaded charts are not deleted."));
466
467 bSizerCatalogBtns->Add(m_bDeleteSource, 0, wxALL | wxEXPAND, 5);
468
469 m_bEditSource = new wxButton(catalogPanel, wxID_ANY, _("Edit..."),
470 wxDefaultPosition, wxDefaultSize, 0);
471 bSizerCatalogBtns->Add(m_bEditSource, 0, wxALL | wxEXPAND, 5);
472
473#ifdef __OCPN__ANDROID__
474 m_bEditSource->Hide();
475#endif
476
477 m_bUpdateChartList = new wxButton(catalogPanel, wxID_ANY, _("Update"),
478 wxDefaultPosition, wxDefaultSize, 0);
479 m_bUpdateChartList->SetDefault();
480 m_bUpdateChartList->SetToolTip(
481 _("Download the current chart catalog and update the data."));
482
483 bSizerCatalogBtns->Add(m_bUpdateChartList, 0, wxALL | wxEXPAND, 5);
484
485 m_bUpdateAllCharts = new wxButton(catalogPanel, wxID_ANY, _("Update All"),
486 wxDefaultPosition, wxDefaultSize, 0);
487 m_bUpdateAllCharts->SetToolTip(
488 _("Download all chart catalogs, and then update charts."));
489 bSizerCatalogBtns->Add(m_bUpdateAllCharts, 0, wxALL | wxEXPAND, 5);
490
491 // Charts
492 wxPanel* chartsPanel = new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition,
493 wxDefaultSize, wxBG_STYLE_ERASE);
494 m_DLoadNB->AddPage(chartsPanel, _("Download Charts..."));
495
496 wxBoxSizer* chartsPanelBoxSizer = new wxBoxSizer(wxVERTICAL);
497 chartsPanel->SetSizer(chartsPanelBoxSizer);
498
499 // Chart list
500 m_chartsLabel = new wxStaticText(chartsPanel, wxID_ANY, _("Charts"));
501 chartsPanelBoxSizer->Add(m_chartsLabel, 0, wxALL, 4 * border_size);
502
503#if defined(CHART_LIST)
504 m_scrollWinChartList = new wxDataViewListCtrl(
505 chartsPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_ROW_LINES);
506 chartsPanelBoxSizer->Add(m_scrollWinChartList, 0, wxEXPAND);
507
508 int h = m_scrollWinChartList->GetCharHeight();
509 int w = m_scrollWinChartList->GetCharWidth();
510
511 m_scrollWinChartList->SetMinSize(wxSize(-1, 12 * h));
512 m_scrollWinChartList->SetRowHeight(m_scrollWinChartList->GetCharHeight() + 6);
513 // Add 4 columns (checkbox, chart status, update date, description)
514 wxDataViewColumn* colFlag = m_scrollWinChartList->AppendToggleColumn(
515 _T(" "), wxDATAVIEW_CELL_ACTIVATABLE, wxDVC_TOGGLE_DEFAULT_WIDTH,
516 wxALIGN_LEFT);
517
518 wxDataViewColumn* colStat = m_scrollWinChartList->AppendTextColumn(
519 _("Status"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_CENTER,
520 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
521
522 wxDataViewColumn* colLast = m_scrollWinChartList->AppendTextColumn(
523 _("Date"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_LEFT,
524 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
525
526 wxDataViewColumn* colDesc = m_scrollWinChartList->AppendTextColumn(
527 _("Chart Description"), wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
528 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
529
530#else
531
532 m_scrollWinChartList = new wxScrolledWindow(
533 chartsPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
534 chartsPanelBoxSizer->Add(m_scrollWinChartList, 0, wxEXPAND);
535 m_scrollWinChartList->SetScrollRate(5, 5);
536 m_scrollWinChartList->SetMinSize(wxSize(-1, 12 * GetCharHeight()));
537
538#ifdef HAVE_WX_GESTURE_EVENTS
539 if (!m_scrollWinChartList->EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
540 wxLogError("Failed to enable touch events on chart downloader");
541 }
542 Bind(wxEVT_LONG_PRESS, &ChartDldrPanel::OnLongPress, this);
543#endif
544
545 m_boxSizerCharts = new wxBoxSizer(wxVERTICAL);
546 m_scrollWinChartList->SetSizer(m_boxSizerCharts);
547
548#endif /* CHART_LIST */
549 // Buttons
550
551 chartsPanelBoxSizer->AddSpacer(GetCharHeight());
552
553#if defined(CHART_LIST)
554 wxBoxSizer* chartsButtonBoxSizer = new wxBoxSizer(wxHORIZONTAL);
555 chartsPanelBoxSizer->Add(chartsButtonBoxSizer, 0, wxEXPAND);
556
557 m_bDnldCharts =
558 new wxButton(chartsPanel, wxID_ANY, _("Download selected charts"),
559 wxDefaultPosition, wxDefaultSize, 0);
560 chartsButtonBoxSizer->Add(m_bDnldCharts, 0, wxALL, 5);
561
562 m_bSelectNew = new wxButton(chartsPanel, wxID_ANY, _("Select New"),
563 wxDefaultPosition, wxDefaultSize, 0);
564 m_bSelectNew->SetToolTip(_("Check all charts that are 'New' in the list."));
565 chartsButtonBoxSizer->Add(m_bSelectNew, 0, wxALL, 5);
566
567 m_bSelectUpdated = new wxButton(chartsPanel, wxID_ANY, _("Select Updated"),
568 wxDefaultPosition, wxDefaultSize, 0);
569 m_bSelectUpdated->SetToolTip(
570 _("Select all charts that are 'Out of Date' in the list."));
571 chartsButtonBoxSizer->Add(m_bSelectUpdated, 0, wxALL, 5);
572
573 // Set text to longest string so it sizes right
574 m_bSelectAll = new wxButton(chartsPanel, wxID_ANY, _("Select All"),
575 wxDefaultPosition, wxDefaultSize, 0);
576 // Now change button size
577 m_bSelectAll->SetSize(m_bSelectAll->GetSizeFromTextSize(
578 m_bSelectAll->GetTextExtent(_("Select None"))));
579 m_bSelectAll->SetToolTip(_("Select all charts in the list."));
580 chartsButtonBoxSizer->Add(m_bSelectAll, 0, wxALL, 5);
581
582 m_stCatalogInfo =
583 new wxStaticText(chartsPanel, wxID_ANY,
584 _("%u charts total, %u updated, %u new, %u selected"),
585 wxDefaultPosition, wxDefaultSize, 0);
586 chartsPanelBoxSizer->Add(m_stCatalogInfo, 1, wxEXPAND | wxALL, 5);
587
588#else
589 m_bDnldCharts =
590 new wxButton(chartsPanel, wxID_ANY, _("Download selected charts"),
591 wxDefaultPosition, wxDefaultSize, 0);
592 chartsPanelBoxSizer->Add(m_bDnldCharts, 0, wxALIGN_LEFT | wxALL, 5);
593
594 m_stCatalogInfo = new wxStaticText(chartsPanel, wxID_ANY, "",
595 wxDefaultPosition, wxDefaultSize, 0);
596 chartsPanelBoxSizer->Add(m_stCatalogInfo, 1, wxEXPAND | wxALL, 5);
598
599#endif /* CHART_LIST */
600
601 this->Layout();
602
603 // m_lbChartSources->GetHandle()->setStyleSheet( qtStyleSheet);
604 // m_clCharts->GetHandle()->setStyleSheet( qtStyleSheet);
605
606 // Connect Events
607 this->Connect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
608 m_lbChartSources->Connect(wxEVT_LEFT_DCLICK,
609 wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
610 NULL, this);
611 m_lbChartSources->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
612 wxListEventHandler(ChartDldrPanel::SelectSource),
613 NULL, this);
614 m_bAddSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
615 wxCommandEventHandler(ChartDldrPanel::AddSource), NULL,
616 this);
617 m_bDeleteSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
618 wxCommandEventHandler(ChartDldrPanel::DeleteSource),
619 NULL, this);
620 m_bEditSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
621 wxCommandEventHandler(ChartDldrPanel::EditSource),
622 NULL, this);
623 m_bUpdateChartList->Connect(
624 wxEVT_COMMAND_BUTTON_CLICKED,
625 wxCommandEventHandler(ChartDldrPanel::UpdateChartList), NULL, this);
626 m_bUpdateAllCharts->Connect(
627 wxEVT_COMMAND_BUTTON_CLICKED,
628 wxCommandEventHandler(ChartDldrPanel::UpdateAllCharts), NULL, this);
629#if defined(CHART_LIST)
630 m_bSelectAll->SetSize(m_bSelectAll->GetSizeFromTextSize(
631 m_bSelectAll->GetTextExtent(_("Select None"))));
632 m_bSelectNew->Connect(
633 wxEVT_COMMAND_BUTTON_CLICKED,
634 wxCommandEventHandler(ChartDldrPanel::OnSelectNewCharts), NULL, this);
635 m_bSelectUpdated->Connect(
636 wxEVT_COMMAND_BUTTON_CLICKED,
637 wxCommandEventHandler(ChartDldrPanel::OnSelectUpdatedCharts), NULL, this);
638 m_bSelectAll->Connect(
639 wxEVT_COMMAND_BUTTON_CLICKED,
640 wxCommandEventHandler(ChartDldrPanel::OnSelectAllCharts), NULL, this);
641#if !defined(__WXOSX__) // This event is not available under OSX and is seldom,
642 // if ever, used
643 m_scrollWinChartList->Connect(
644 wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
645 wxMouseEventHandler(ChartDldrPanel::OnContextMenu), NULL, this);
646#endif /* __WXOSX__ */
647 m_scrollWinChartList->Connect(
648 wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,
649 wxCommandEventHandler(ChartDldrPanel::OnSelectChartItem), NULL, this);
650 m_scrollWinChartList->Connect(
651 wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
652 wxMouseEventHandler(ChartDldrPanel::OnContextMenu), NULL, this);
653#else
654 m_scrollWinChartList->Connect(
655 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
656 NULL, this);
657#endif /* CHART_LIST */
658 m_bDnldCharts->Connect(
659 wxEVT_COMMAND_BUTTON_CLICKED,
660 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts), NULL, this);
661 // m_bShowLocal->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(
662 // ChartDldrPanel::OnShowLocalDir ), NULL, this );
663
664 this->Connect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
665}
666ChartDldrPanel::~ChartDldrPanel() {
667 // Disconnect Events
668 this->Disconnect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
669 m_lbChartSources->Disconnect(
670 wxEVT_LEFT_DCLICK, wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
671 NULL, this);
672 m_lbChartSources->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
673 wxListEventHandler(ChartDldrPanel::SelectSource),
674 NULL, this);
675 m_bAddSource->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
676 wxCommandEventHandler(ChartDldrPanel::AddSource),
677 NULL, this);
678 m_bDeleteSource->Disconnect(
679 wxEVT_COMMAND_BUTTON_CLICKED,
680 wxCommandEventHandler(ChartDldrPanel::DeleteSource), NULL, this);
681 m_bEditSource->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
682 wxCommandEventHandler(ChartDldrPanel::EditSource),
683 NULL, this);
684 m_bUpdateChartList->Disconnect(
685 wxEVT_COMMAND_BUTTON_CLICKED,
686 wxCommandEventHandler(ChartDldrPanel::UpdateChartList), NULL, this);
687 m_bUpdateAllCharts->Disconnect(
688 wxEVT_COMMAND_BUTTON_CLICKED,
689 wxCommandEventHandler(ChartDldrPanel::UpdateAllCharts), NULL, this);
690
691#if defined(CHART_LIST)
692 m_bSelectNew->Disconnect(
693 wxEVT_COMMAND_BUTTON_CLICKED,
694 wxCommandEventHandler(ChartDldrPanel::OnSelectNewCharts), NULL, this);
695 m_bSelectUpdated->Disconnect(
696 wxEVT_COMMAND_BUTTON_CLICKED,
697 wxCommandEventHandler(ChartDldrPanel::OnSelectUpdatedCharts), NULL, this);
698 m_bSelectAll->Disconnect(
699 wxEVT_COMMAND_BUTTON_CLICKED,
700 wxCommandEventHandler(ChartDldrPanel::OnSelectAllCharts), NULL, this);
701#if !defined(__WXOSX__)
702 m_scrollWinChartList->Disconnect(
703 wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
704 wxMouseEventHandler(ChartDldrPanel::OnContextMenu), NULL, this);
705#endif /* __WXOSX__ */
706 m_scrollWinChartList->Disconnect(
707 wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,
708 wxCommandEventHandler(ChartDldrPanel::OnSelectChartItem), NULL, this);
709 m_scrollWinChartList->Disconnect(
710 wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
711 wxMouseEventHandler(ChartDldrPanel::OnContextMenu), NULL, this);
712#else
713 m_scrollWinChartList->Disconnect(
714 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
715 NULL, this);
716#endif /* CHART_LIST */
717 m_bDnldCharts->Disconnect(
718 wxEVT_COMMAND_BUTTON_CLICKED,
719 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts), NULL, this);
720 // m_bShowLocal->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
721 // wxCommandEventHandler( ChartDldrPanel::OnShowLocalDir ), NULL, this );
722 this->Disconnect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
723}
724
725#ifdef HAVE_WX_GESTURE_EVENTS
726void ChartDldrPanel::OnLongPress(wxLongPressEvent& event) {
727 printf(" OnLongPress\n");
728 if (1) {
729 wxPoint pos = event.GetPosition();
730 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
731 ev.m_x = pos.x;
732 ev.m_y = pos.y;
733
734 // MouseEvent(ev);
735 }
736}
737#endif
738
739void ChartDldrPanel::OnSize(wxSizeEvent& event) {
740 // wxSize newSize = event.GetSize();
741 // qDebug() << "Size: " << newSize.x << newSize.y;
742 //
743 // int width, height;
744 // ::wxDisplaySize(&width, &height);
745 // qDebug() << "wxDisplaySize: " << width << height;
746
747 // We want the variable sized windows to to be small enough so that
748 // no vertical scroll bar is necessary to access the control buttons.
749 // Use this method to estimate the available vertical size to allow this
750 wxWindow* win = GetOCPNCanvasWindow();
751 wxSize sz = win->GetSize();
752 // qDebug() << "CanvasSize: " << sz.x << sz.y;
753
754 if (GetGrandParent()) sz = GetGrandParent()->GetSize();
755 // qDebug() << "MetricSize: " << sz.x << sz.y;
756
757 int yAvail = sz.y - (8 * GetCharHeight()); // Roughly 8 chars of decoration
758 // on-screen for this dialog.
759 double ratio = 0.7;
760 if (sz.y > sz.x) // Portait mode
761 ratio = 0.8;
762
763 m_lbChartSources->SetMinSize(wxSize(-1, yAvail * ratio));
764 m_scrollWinChartList->SetMinSize(wxSize(-1, yAvail * ratio));
765 Layout();
766
767 event.Skip();
768}
769
770#if !defined(CHART_LIST)
771ChartPanel::ChartPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos,
772 const wxSize& size, wxString Name, wxString stat,
773 wxString latest, ChartDldrPanel* DldrPanel, bool bcheck)
774 : wxPanel(parent, id, pos, size, wxBORDER_NONE) {
775 wxString Descriptor = Name + _T("\n ") + stat + _T(" ") + latest;
776 wxColour bColor;
777 GetGlobalColor(_T("DILG0"), &bColor);
778 bool bUseSysColors = false;
779#ifdef __WXOSX__
780 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) bUseSysColors = true;
781#endif
782#ifdef __WXGTK__
783 bUseSysColors = true;
784#endif
785
786 if (bUseSysColors) {
787 wxColour bg = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
788 if (bg.Red() < 128) {
789 bColor = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
790 }
791 }
792
793#ifndef __WXOSX__
794 SetBackgroundColour(bColor);
795#endif
796
797 wxBoxSizer* m_sizer = new wxBoxSizer(wxVERTICAL);
798 SetSizer(m_sizer);
799 m_cb = new wxCheckBox(this, wxID_ANY, Descriptor);
800 m_cb->SetValue(bcheck);
801 m_sizer->Add(m_cb, 0, wxTOP | wxLEFT | wxRIGHT, 4);
802 m_cb->Connect(wxEVT_RIGHT_DOWN,
803 wxMouseEventHandler(ChartPanel::OnContextMenu), NULL, this);
804
805 m_stat = stat;
806 m_latest = latest;
807
808 // wxBoxSizer* statSizer = new wxBoxSizer(wxHORIZONTAL);
809 // m_sizer->Add(statSizer, 0, wxALIGN_LEFT | wxALL, 1);
810
811 // m_chartInfo = new wxStaticText( this, wxID_ANY, stat );
812 // statSizer->Add(m_chartInfo, 0, wxLEFT, 4 * GetCharHeight());
813 // m_chartInfo->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler(
814 // ChartPanel::OnContextMenu ), NULL, this );
815
816 // m_chartInfo2 = new wxStaticText( this, wxID_ANY, latest );
817 // statSizer->Add(m_chartInfo2, 0, wxLEFT, 2 * GetCharHeight());
818 // m_chartInfo2->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler(
819 // ChartPanel::OnContextMenu ), NULL, this );
820
821 // wxString info = _T(" ") + stat + _T(" ") + latest;
822 // m_chartInfo = new wxStaticText( this, wxID_ANY, info );
823 // m_chartInfo->Wrap(-1);
824 // m_sizer->Add( m_chartInfo, 0, wxALL, 1 );
825
826 // wxStaticLine *divLine = new wxStaticLine( this, wxID_ANY,
827 // wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); m_sizer->Add(
828 // divLine, 0, wxEXPAND | wxALL, 5 );
829
830 m_dldrPanel = DldrPanel;
831
832#ifdef HAVE_WX_GESTURE_EVENTS
833 Connect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartPanel::OnContextMenu),
834 NULL, this);
835
836 if (!EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
837 wxLogError("Failed to enable touch events on chart downloader");
838 }
839
840 Bind(wxEVT_LONG_PRESS, &ChartPanel::OnLongPress, this);
841 Bind(wxEVT_LEFT_UP, &ChartPanel::OnLeftUp, this);
842#endif
843 m_popupWanted = false;
844}
845
846ChartPanel::~ChartPanel() {
847 m_cb->Disconnect(wxEVT_RIGHT_DOWN,
848 wxMouseEventHandler(ChartPanel::OnContextMenu), NULL, this);
849 // m_chartInfo->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler(
850 // ChartPanel::OnContextMenu ), NULL, this ); m_chartInfo2->Disconnect(
851 // wxEVT_RIGHT_DOWN, wxMouseEventHandler( ChartPanel::OnContextMenu ),
852 // NULL, this );
853
854 delete m_cb;
855 // delete m_chartInfo;
856 // delete m_chartInfo2;
857}
858
859void ChartPanel::OnContextMenu(wxMouseEvent& event) {
860 if (m_dldrPanel) return m_dldrPanel->OnContextMenu(event);
861 event.Skip();
862}
863
864#ifdef HAVE_WX_GESTURE_EVENTS
865void ChartPanel::OnLongPress(wxLongPressEvent& event) {
866 /* we defer the popup menu call upon the leftup event
867 else the menu disappears immediately, */
868 m_popupWanted = true;
869}
870#endif
871
872void ChartPanel::OnLeftUp(wxMouseEvent& event) {
873 wxPoint pos = event.GetPosition();
874
875 if (m_popupWanted) {
876 m_popupWanted = false;
877 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
878 ev.m_x = pos.x;
879 ev.m_y = pos.y;
880 wxPostEvent(this, ev);
881 }
882}
883
884#endif /* CHART_LIST */
885
886ChartDldrPrefsDlg::ChartDldrPrefsDlg(wxWindow* parent, wxWindowID id,
887 const wxString& title, const wxPoint& pos,
888 const wxSize& size, long style)
889 : wxDialog(parent, id, title, pos, size, style) {
890 wxFont* pFont = OCPNGetFont(_("Dialog"), 0);
891 if (pFont) SetFont(*pFont);
892
893 this->SetSizeHints(wxDefaultSize, wxDefaultSize);
894
895 wxBoxSizer* itemBoxSizerMainPanel = new wxBoxSizer(wxVERTICAL);
896 SetSizer(itemBoxSizerMainPanel);
897
898 wxScrolledWindow* scrollWin = new wxScrolledWindow(
899 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1), wxVSCROLL);
900
901 scrollWin->SetScrollRate(1, 1);
902 itemBoxSizerMainPanel->Add(scrollWin, 1, wxEXPAND | wxALL, 0);
903
904 m_sdbSizerBtns = new wxStdDialogButtonSizer();
905 m_bHelp = new wxButton(this, wxID_HELP);
906 m_sdbSizerBtns->Add(m_bHelp);
907 m_sdbSizerBtnsOK = new wxButton(this, wxID_OK);
908 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsOK);
909 m_sdbSizerBtnsCancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
910 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsCancel);
911 m_sdbSizerBtns->Realize();
912
913 itemBoxSizerMainPanel->Add(m_sdbSizerBtns, 0, wxALL | wxEXPAND, 5);
914
915 wxBoxSizer* bSizerPrefsMain = new wxBoxSizer(wxVERTICAL);
916 scrollWin->SetSizer(bSizerPrefsMain);
917
918 wxStaticBoxSizer* sbSizerPaths;
919 sbSizerPaths = new wxStaticBoxSizer(
920 new wxStaticBox(scrollWin, wxID_ANY, _("Default Path to Charts")),
921 wxVERTICAL);
922
923 // m_dpDefaultDir = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString,
924 // _("Select a root folder for your charts"), wxDefaultPosition,
925 // wxDefaultSize, wxDIRP_USE_TEXTCTRL ); sbSizerPaths->Add(
926 // m_dpDefaultDir, 0, wxALL|wxEXPAND, 5 );
927
928 m_tcDefaultDir = new wxTextCtrl(scrollWin, wxID_ANY, _T(""),
929 wxDefaultPosition, wxSize(-1, -1), wxHSCROLL);
930 sbSizerPaths->Add(m_tcDefaultDir, 3, wxALL | wxEXPAND, 5);
931
932 m_buttonChartDirectory =
933 new wxButton(scrollWin, wxID_ANY, _("Select a folder"));
934 sbSizerPaths->Add(m_buttonChartDirectory, 1, wxALIGN_RIGHT | wxALL, 5);
935
936 bSizerPrefsMain->Add(sbSizerPaths, 0, wxALL | wxEXPAND, 5);
937
938 wxStaticBoxSizer* sbSizerBehavior;
939 sbSizerBehavior = new wxStaticBoxSizer(
940 new wxStaticBox(scrollWin, wxID_ANY, _("Preferences")), wxVERTICAL);
941
942 sbSizerBehavior->SetMinSize(-1, 200);
943
944 m_stPreselect = new wxStaticText(
945 scrollWin, wxID_ANY, _("After catalog update select for download"),
946 wxDefaultPosition, wxDefaultSize, 0);
947 m_stPreselect->Wrap(-1);
948 sbSizerBehavior->Add(m_stPreselect, 0, wxALL, 5);
949
950 m_cbSelectUpdated =
951 new wxCheckBox(scrollWin, wxID_ANY, _("All updated charts"),
952 wxDefaultPosition, wxDefaultSize, 0);
953 m_cbSelectUpdated->SetValue(true);
954 sbSizerBehavior->Add(m_cbSelectUpdated, 0, wxALL, 5);
955
956 m_cbSelectNew = new wxCheckBox(scrollWin, wxID_ANY, _("All new charts"),
957 wxDefaultPosition, wxDefaultSize, 0);
958 sbSizerBehavior->Add(m_cbSelectNew, 0, wxALL, 5);
959
960 m_staticline1 = new wxStaticLine(scrollWin, wxID_ANY, wxDefaultPosition,
961 wxDefaultSize, wxLI_HORIZONTAL);
962 sbSizerBehavior->Add(m_staticline1, 0, wxEXPAND | wxALL, 5);
963
964 m_cbBulkUpdate = new wxCheckBox(
965 scrollWin, wxID_ANY,
966 _("Allow bulk update of all configured chart sources and charts"),
967 wxDefaultPosition, wxDefaultSize, 0);
968 sbSizerBehavior->Add(m_cbBulkUpdate, 0, wxALL, 5);
969
970 m_buttonDownloadMasterCatalog =
971 new wxButton(scrollWin, wxID_ANY, _("Update chart source catalog"),
972 wxDefaultPosition, wxDefaultSize, 0);
973
974 sbSizerBehavior->Add(m_buttonDownloadMasterCatalog, 0, wxALL, 5);
975
976 bSizerPrefsMain->Add(sbSizerBehavior, 1, wxALL | wxEXPAND, 5);
977
978 this->Fit();
979
980 // Constrain size on small displays
981 int display_width, display_height;
982 wxDisplaySize(&display_width, &display_height);
983
984 wxSize canvas_size = GetOCPNCanvasWindow()->GetSize();
985 if (display_height < 600) {
986 SetMaxSize(GetOCPNCanvasWindow()->GetSize());
987 SetSize(wxSize(60 * GetCharWidth(), canvas_size.y * 8 / 10));
988 } else {
989 SetMaxSize(GetOCPNCanvasWindow()->GetSize());
990 SetSize(wxSize(60 * GetCharWidth(), canvas_size.y * 8 / 10));
991 }
992 this->CentreOnScreen();
993
994 // Connect Events
995 m_sdbSizerBtnsCancel->Connect(
996 wxEVT_COMMAND_BUTTON_CLICKED,
997 wxCommandEventHandler(ChartDldrPrefsDlg::OnCancelClick), NULL, this);
998 m_sdbSizerBtnsOK->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
999 wxCommandEventHandler(ChartDldrPrefsDlg::OnOkClick),
1000 NULL, this);
1001 m_buttonChartDirectory->Connect(
1002 wxEVT_COMMAND_BUTTON_CLICKED,
1003 wxCommandEventHandler(ChartDldrPrefsDlg::OnDirSelClick), NULL, this);
1004 m_buttonDownloadMasterCatalog->Connect(
1005 wxEVT_COMMAND_BUTTON_CLICKED,
1006 wxCommandEventHandler(ChartDldrPrefsDlg::OnDownloadMasterCatalog), NULL,
1007 this);
1008 m_bHelp->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](wxCommandEvent) {
1009 wxString datadir = GetPluginDataDir("manual_pi");
1010 Manual manual(this, datadir.ToStdString());
1011 manual.Launch("Chartdldr");
1012 });
1013}
1014
1015void ChartDldrPrefsDlg::OnDownloadMasterCatalog(wxCommandEvent& event) {
1016 wxFileName tfn = wxFileName::CreateTempFileName(_T("chartdldr"));
1017 wxString url =
1018 "https://raw.githubusercontent.com/OpenCPN/OpenCPN/master/plugins/"
1019 "chartdldr_pi/data/chart_sources.xml";
1020
1021 _OCPN_DLStatus ret = OCPN_downloadFile(
1022 url, tfn.GetFullPath(), _("Downloading chart sources"),
1023 _("Downloading chart sources"), wxNullBitmap, this,
1028 15);
1029 wxFileName fn;
1030 fn.SetPath(*GetpPrivateApplicationDataLocation());
1031 fn.SetFullName(_T("chartdldr_pi-chart_sources.xml"));
1032
1033 switch (ret) {
1034 case OCPN_DL_NO_ERROR: {
1035 if (!wxCopyFile(tfn.GetFullPath(), fn.GetFullPath())) {
1036 OCPNMessageBox_PlugIn(this,
1037 wxString::Format(_("Failed to save: %s "),
1038 fn.GetFullPath().c_str()),
1039 _("Chart downloader"), wxOK | wxICON_ERROR);
1040 }
1041 break;
1042 }
1043 case OCPN_DL_FAILED: {
1044 OCPNMessageBox_PlugIn(
1045 this,
1046 wxString::Format(_("Failed to download: %s \nVerify there is a "
1047 "working Internet connection."),
1048 url.c_str()),
1049 _("Chart downloader"), wxOK | wxICON_ERROR);
1050 break;
1051 }
1052 case OCPN_DL_USER_TIMEOUT:
1053 case OCPN_DL_ABORTED: {
1054 break;
1055 }
1056 case OCPN_DL_UNKNOWN:
1057 case OCPN_DL_STARTED: {
1058 break;
1059 }
1060
1061 default:
1062 wxASSERT(false); // This should never happen because we handle all
1063 // possible cases of ret
1064 }
1065 if (wxFileExists(tfn.GetFullPath())) wxRemoveFile(tfn.GetFullPath());
1066}
1067
1068void ChartDldrPrefsDlg::OnDirSelClick(wxCommandEvent& event) {
1069 wxString dir_spec;
1070 int response = PlatformDirSelectorDialog(this, &dir_spec,
1071 _("Choose Chart File Directory"),
1072 m_tcDefaultDir->GetValue());
1073
1074 if (response == wxID_OK) {
1075 m_tcDefaultDir->SetValue(dir_spec);
1076 }
1077}
1078
1079ChartDldrPrefsDlg::~ChartDldrPrefsDlg() {
1080 // Disconnect Events
1081 m_sdbSizerBtnsCancel->Disconnect(
1082 wxEVT_COMMAND_BUTTON_CLICKED,
1083 wxCommandEventHandler(ChartDldrPrefsDlg::OnCancelClick), NULL, this);
1084 m_sdbSizerBtnsOK->Disconnect(
1085 wxEVT_COMMAND_BUTTON_CLICKED,
1086 wxCommandEventHandler(ChartDldrPrefsDlg::OnOkClick), NULL, this);
1087 m_buttonChartDirectory->Disconnect(
1088 wxEVT_COMMAND_BUTTON_CLICKED,
1089 wxCommandEventHandler(ChartDldrPrefsDlg::OnDirSelClick), NULL, this);
1090 m_buttonDownloadMasterCatalog->Disconnect(
1091 wxEVT_COMMAND_BUTTON_CLICKED,
1092 wxCommandEventHandler(ChartDldrPrefsDlg::OnDownloadMasterCatalog), NULL,
1093 this);
1094}
Class ChartDldrPanel.
ChartDldrPanel(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1, -1), long style=wxTAB_TRAVERSAL)
@ OCPN_DLDS_URL
The dialog shows the URL involved in the transfer.
@ OCPN_DLDS_AUTO_CLOSE
The dialog auto closes when transfer is complete.
@ OCPN_DLDS_CAN_ABORT
The transfer can be aborted by the user.
@ OCPN_DLDS_ESTIMATED_TIME
The dialog shows the estimated total time.
@ OCPN_DLDS_SIZE
The dialog shows the size of the resource to download/upload.
@ OCPN_DLDS_REMAINING_TIME
The dialog shows the remaining time.
@ OCPN_DLDS_SPEED
The dialog shows the transfer speed.
@ OCPN_DLDS_ELAPSED_TIME
The dialog shows the elapsed time.
@ OCPN_DLDS_CAN_PAUSE
The transfer can be paused.
wxFont * OCPNGetFont(wxString TextElement, int default_size)
Gets a font for UI elements.