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