8#include "chartdldrgui.h"
11#include <wx/scrolwin.h>
12#include <wx/textwrapper.h>
14#include "manual/manual.h"
23 "QScrollBar:horizontal {\
24border: 0px solid grey;\
25background-color: rgb(240, 240, 240);\
27margin: 0px 1px 0 1px;\
29QScrollBar::handle:horizontal {\
30background-color: rgb(200, 200, 200);\
34QScrollBar::add-line:horizontal {\
35border: 0px solid grey;\
38subcontrol-position: right;\
39subcontrol-origin: margin;\
41QScrollBar::sub-line:horizontal {\
42border: 0px solid grey;\
45subcontrol-position: left;\
46subcontrol-origin: margin;\
49border: 0px solid grey;\
50background-color: rgb(240, 240, 240);\
52margin: 1px 0px 1px 0px;\
54QScrollBar::handle:vertical {\
55background-color: rgb(200, 200, 200);\
59QScrollBar::add-line:vertical {\
60border: 0px solid grey;\
63subcontrol-position: top;\
64subcontrol-origin: margin;\
66QScrollBar::sub-line:vertical {\
67border: 0px solid grey;\
70subcontrol-position: bottom;\
71subcontrol-origin: margin;\
76QCheckBox::indicator {\
85#include <QtWidgets/QScroller>
98 wxString textMod = text;
99 textMod.Replace(
" ",
"^");
102 wxString sep = wxFileName::GetPathSeparator();
103 textMod.Replace(sep,
" ");
105 Wrap(win, textMod, widthMax);
108 for (
size_t i = 0; i < m_array.GetCount(); i++) {
109 wxString a = m_array[i];
111 if (m_array.GetCount() > 1) {
112 if (i < m_array.GetCount() - 1) a += sep;
118 wxArrayString GetLineArray() {
return m_array; }
121 void OnOutputLine(
const wxString& line)
override {
125 void OnNewLine()
override {
133 wxArrayString m_array;
137EVT_PAINT(DLDR_OCPNChartDirPanel::OnPaint)
143 : wxPanel(parent,
id, pos, size, wxBORDER_NONE) {
149 m_refHeight = wxWindow::GetCharHeight();
151 m_unselectedHeight = 2 * m_refHeight;
153 wxWindow::SetMinSize(wxSize(-1, m_unselectedHeight));
156 GetGlobalColor(
"UIBCK", &colour);
157 m_boxColour = colour;
160DLDR_OCPNChartDirPanel::~DLDR_OCPNChartDirPanel() =
default;
162void DLDR_OCPNChartDirPanel::SetText(wxString text) {
165 int maxWidth = GetParent()->GetSize().x * 75 / 100;
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();
175void DLDR_OCPNChartDirPanel::OnPaint(wxPaintEvent& event) {
177 GetSize(&width, &height);
180 dc.SetPen(*wxTRANSPARENT_PEN);
181 dc.SetBrush(wxBrush(GetBackgroundColour()));
182 dc.DrawRectangle(GetVirtualSize());
186 wxString nameString = m_ChartDir;
187 int maxWidth = GetParent()->GetSize().x * 75 / 100;
190 wxArrayString nameWrapped = wrapper.GetLineArray();
192 if (height <
static_cast<int>(nameWrapped.GetCount() + 1) * m_refHeight) {
194 wxSize(-1,
static_cast<int>(nameWrapped.GetCount() + 1) * m_refHeight));
195 GetParent()->GetSizer()->Layout();
199 dc.SetBrush(wxBrush(m_boxColour));
201 GetGlobalColor(
"UITX1", &c);
202 dc.SetPen(wxPen(wxColor(0xCE, 0xD5, 0xD6), 3));
204 dc.DrawRoundedRectangle(0, 0, width - 1, height - 1, height / 10.0);
206 int offset = height / 10;
209 wxFont* dFont = GetOCPNScaledFont_PlugIn(_(
"Dialog"));
212 dc.SetTextForeground(wxColour(64, 64, 64));
214 int yd = height * 5 / 100;
215 for (
size_t i = 0; i < nameWrapped.GetCount(); i++) {
217 dc.DrawText(nameWrapped[i], text_x, yd);
219 dc.DrawText(nameWrapped[i], text_x + GetCharWidth() / 2, yd);
220 yd += GetCharHeight();
225void AddSourceDlg::applyStyle() {
227 m_panelPredefined->GetHandle()->setStyleSheet(qtStyleSheet);
228 QScroller::ungrabGesture(m_panelPredefined->GetHandle());
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);
239 auto* bSizerMain =
new wxBoxSizer(wxVERTICAL);
240 this->SetSizer(bSizerMain);
242 auto* sbSizerSourceSel =
new wxStaticBoxSizer(
243 new wxStaticBox(
this, wxID_ANY, _(
"Catalog")), wxVERTICAL);
244 bSizerMain->Add(sbSizerSourceSel, 1, wxALL | wxEXPAND, 5);
246 m_nbChoice =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
248 sbSizerSourceSel->Add(m_nbChoice, 1, wxEXPAND | wxALL, 5);
249 m_nbChoice->SetMinSize(wxSize(-1, 6 * wxWindow::GetCharHeight()));
251 m_nbChoice->SetMinSize(wxSize(-1, 8 * wxWindow::GetCharHeight()));
254 m_panelPredefined =
new wxPanel(m_nbChoice, wxID_ANY, wxDefaultPosition,
255 wxDefaultSize, wxTAB_TRAVERSAL);
256 m_nbChoice->AddPage(m_panelPredefined, _(
"Predefined"),
false);
258 auto* bSizerPredefTree =
new wxBoxSizer(wxVERTICAL);
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);
265 m_treeCtrlPredefSrcs->SetScrollRate(0, 1);
267 m_panelPredefined->SetSizer(bSizerPredefTree);
268 m_panelPredefined->Layout();
269 bSizerPredefTree->Fit(m_treeCtrlPredefSrcs );
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);
279 m_stName =
new wxStaticText(m_panelCustom, wxID_ANY, _(
"Name"),
280 wxDefaultPosition, wxDefaultSize, 0);
282 fgSizerSourceSel->Add(m_stName, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
284 m_tSourceName =
new wxTextCtrl(m_panelCustom, wxID_ANY,
"", wxDefaultPosition,
286 m_tSourceName->SetMaxLength(0);
287 fgSizerSourceSel->Add(m_tSourceName, 0, wxALL | wxEXPAND, 5);
289 m_stUrl =
new wxStaticText(m_panelCustom, wxID_ANY, _(
"URL"),
290 wxDefaultPosition, wxDefaultSize, 0);
292 fgSizerSourceSel->Add(m_stUrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
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);
299 m_panelCustom->SetSizer(fgSizerSourceSel);
300 m_panelCustom->Layout();
301 fgSizerSourceSel->Fit(m_panelCustom);
302 m_nbChoice->AddPage(m_panelCustom, _(
"Custom"),
true);
304 wxStaticBoxSizer* sbSizerChartDir;
305 sbSizerChartDir =
new wxStaticBoxSizer(
306 new wxStaticBox(
this, wxID_ANY,
307 _(
"Proposed chart installation directory")),
309 bSizerMain->Add(sbSizerChartDir, 0, wxALL | wxEXPAND, 5);
311 auto* dirbox =
new wxBoxSizer(wxVERTICAL);
312 sbSizerChartDir->Add(dirbox, 0, wxEXPAND);
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();
320 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1));
322 dirbox->Add(m_panelChartDirectory, 1, wxALL | wxEXPAND, 5);
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();
331 auto* buttons =
new wxBoxSizer(wxHORIZONTAL);
332 bSizerMain->Add(buttons, 0, wxALIGN_RIGHT);
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);
341 m_sourceswin =
nullptr;
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),
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,
361void AddSourceDlg::OnNbPage(wxNotebookEvent& event) {
362 if (event.GetSelection() == 1) {
363 m_buttonChartDirectory->Enable();
365 wxTreeItemId item = m_treeCtrlPredefSrcs->GetSelection();
368 cs = (
ChartSource*)(m_treeCtrlPredefSrcs->GetItemData(item));
369 if (!cs) m_buttonChartDirectory->Disable();
373AddSourceDlg::~AddSourceDlg() {
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),
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),
392void AddSourceDlg::OnDirSelClick(wxCommandEvent& event) {
395 _(
"Choose Chart File Directory"),
396 m_tcChartDirectory->GetValue());
398 if (response == wxID_OK) {
399 wxFileName fn(m_dirExpanded);
401 if (!dir_spec.EndsWith(fn.GetName())) {
402 dir_spec += wxFileName::GetPathSeparator();
403 dir_spec += fn.GetName();
406 m_tcChartDirectory->SetValue(dir_spec);
407 m_panelChartDirectory->SetText(dir_spec);
412 const wxPoint& pos,
const wxSize& size,
414 : wxPanel(parent, id, pos, size, style) {
418 auto* mainSizer =
new wxBoxSizer(wxVERTICAL);
421 mainSizer->AddSpacer(wxWindow::GetCharHeight());
423 m_DLoadNB =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
425 mainSizer->Add(m_DLoadNB, 1, wxEXPAND);
429 new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition, wxDefaultSize);
430 m_DLoadNB->AddPage(catalogPanel, _(
"Select Catalog..."));
432 auto* catalogPanelBoxSizer =
new wxBoxSizer(wxVERTICAL);
433 catalogPanel->SetSizer(catalogPanelBoxSizer);
436 new wxStaticText(catalogPanel, wxID_ANY, _(
"Chart Catalogs Available"));
437 catalogLabel->Wrap(-1);
438 catalogPanelBoxSizer->Add(catalogLabel, 0, wxTOP | wxRIGHT | wxLEFT,
442 auto* activeListSizer =
new wxBoxSizer(wxVERTICAL);
443 catalogPanelBoxSizer->Add(activeListSizer, 0, wxALL | wxEXPAND, 5);
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);
453 auto* bSizerCatalogBtns =
new wxBoxSizer(wxHORIZONTAL);
454 catalogPanelBoxSizer->Add(bSizerCatalogBtns, 0, wxALL | wxEXPAND,
457 m_bAddSource =
new wxButton(catalogPanel, wxID_ANY, _(
"Add Catalog"),
458 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
459 m_bAddSource->SetToolTip(_(
"Add a new chart catalog."));
461 bSizerCatalogBtns->Add(m_bAddSource, 0, wxALL | wxEXPAND, 5);
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."));
468 bSizerCatalogBtns->Add(m_bDeleteSource, 0, wxALL | wxEXPAND, 5);
470 m_bEditSource =
new wxButton(catalogPanel, wxID_ANY, _(
"Edit..."),
471 wxDefaultPosition, wxDefaultSize, 0);
472 bSizerCatalogBtns->Add(m_bEditSource, 0, wxALL | wxEXPAND, 5);
475 m_bEditSource->Hide();
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."));
484 bSizerCatalogBtns->Add(m_bUpdateChartList, 0, wxALL | wxEXPAND, 5);
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);
493 auto* chartsPanel =
new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition,
494 wxDefaultSize, wxBG_STYLE_ERASE);
495 m_DLoadNB->AddPage(chartsPanel, _(
"Download Charts..."));
497 auto* chartsPanelBoxSizer =
new wxBoxSizer(wxVERTICAL);
498 chartsPanel->SetSizer(chartsPanelBoxSizer);
501 m_chartsLabel =
new wxStaticText(chartsPanel, wxID_ANY, _(
"Charts"));
502 chartsPanelBoxSizer->Add(m_chartsLabel, 0, wxALL, 4 * border_size);
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);
509 int h = m_scrollWinChartList->GetCharHeight();
510 int w = m_scrollWinChartList->GetCharWidth();
512 m_scrollWinChartList->SetMinSize(wxSize(-1, 12 * h));
513 m_scrollWinChartList->SetRowHeight(m_scrollWinChartList->GetCharHeight() + 6);
515 wxDataViewColumn* colFlag = m_scrollWinChartList->AppendToggleColumn(
516 " ", wxDATAVIEW_CELL_ACTIVATABLE, wxDVC_TOGGLE_DEFAULT_WIDTH,
519 wxDataViewColumn* colStat = m_scrollWinChartList->AppendTextColumn(
520 _(
"Status"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_CENTER,
521 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
523 wxDataViewColumn* colLast = m_scrollWinChartList->AppendTextColumn(
524 _(
"Date"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_LEFT,
525 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
527 wxDataViewColumn* colDesc = m_scrollWinChartList->AppendTextColumn(
528 _(
"Chart Description"), wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
529 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
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()));
539#ifdef HAVE_WX_GESTURE_EVENTS
540 if (!m_scrollWinChartList->EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
541 wxLogError(
"Failed to enable touch events on chart downloader");
543 Bind(wxEVT_LONG_PRESS, &ChartDldrPanel::OnLongPress,
this);
546 m_boxSizerCharts =
new wxBoxSizer(wxVERTICAL);
547 m_scrollWinChartList->SetSizer(m_boxSizerCharts);
552 chartsPanelBoxSizer->AddSpacer(wxWindow::GetCharHeight());
554#if defined(CHART_LIST)
555 wxBoxSizer* chartsButtonBoxSizer =
new wxBoxSizer(wxHORIZONTAL);
556 chartsPanelBoxSizer->Add(chartsButtonBoxSizer, 0, wxEXPAND);
559 new wxButton(chartsPanel, wxID_ANY, _(
"Download selected charts"),
560 wxDefaultPosition, wxDefaultSize, 0);
561 chartsButtonBoxSizer->Add(m_bDnldCharts, 0, wxALL, 5);
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);
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);
575 m_bSelectAll =
new wxButton(chartsPanel, wxID_ANY, _(
"Select All"),
576 wxDefaultPosition, wxDefaultSize, 0);
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);
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);
591 new wxButton(chartsPanel, wxID_ANY, _(
"Download selected charts"),
592 wxDefaultPosition, wxDefaultSize, 0);
593 chartsPanelBoxSizer->Add(m_bDnldCharts, 0, wxALIGN_LEFT | wxALL, 5);
595 m_stCatalogInfo =
new wxStaticText(chartsPanel, wxID_ANY,
"",
596 wxDefaultPosition, wxDefaultSize, 0);
597 chartsPanelBoxSizer->Add(m_stCatalogInfo, 1, wxEXPAND | wxALL, 5);
608 this->Connect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
609 m_lbChartSources->Connect(wxEVT_LEFT_DCLICK,
610 wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
612 m_lbChartSources->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
613 wxListEventHandler(ChartDldrPanel::SelectSource),
615 m_bAddSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
616 wxCommandEventHandler(ChartDldrPanel::AddSource),
618 m_bDeleteSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
619 wxCommandEventHandler(ChartDldrPanel::DeleteSource),
621 m_bEditSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
622 wxCommandEventHandler(ChartDldrPanel::EditSource),
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,
640 m_bSelectAll->Connect(
641 wxEVT_COMMAND_BUTTON_CLICKED,
642 wxCommandEventHandler(ChartDldrPanel::OnSelectAllCharts),
nullptr,
this);
643#if !defined(__WXOSX__)
645 m_scrollWinChartList->Connect(
646 wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
647 wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
nullptr,
this);
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);
656 m_scrollWinChartList->Connect(
657 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
660 m_bDnldCharts->Connect(
661 wxEVT_COMMAND_BUTTON_CLICKED,
662 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts),
nullptr,
this);
666 this->Connect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
668ChartDldrPanel::~ChartDldrPanel() {
670 this->Disconnect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
671 m_lbChartSources->Disconnect(
672 wxEVT_LEFT_DCLICK, wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
674 m_lbChartSources->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
675 wxListEventHandler(ChartDldrPanel::SelectSource),
677 m_bAddSource->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
678 wxCommandEventHandler(ChartDldrPanel::AddSource),
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),
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);
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,
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);
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);
716 m_scrollWinChartList->Disconnect(
717 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
720 m_bDnldCharts->Disconnect(
721 wxEVT_COMMAND_BUTTON_CLICKED,
722 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts),
nullptr,
this);
725 this->Disconnect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
728#ifdef HAVE_WX_GESTURE_EVENTS
729void ChartDldrPanel::OnLongPress(wxLongPressEvent& event) {
730 printf(
" OnLongPress\n");
732 wxPoint pos =
event.GetPosition();
733 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
742void ChartDldrPanel::OnSize(wxSizeEvent& event) {
754 wxSize sz = win->GetSize();
757 if (GetGrandParent()) sz = GetGrandParent()->GetSize();
760 int yAvail = sz.y - (8 * GetCharHeight());
766 m_lbChartSources->SetMinSize(wxSize(-1,
static_cast<int>(yAvail * ratio)));
767 m_scrollWinChartList->SetMinSize(
768 wxSize(-1,
static_cast<int>(yAvail * ratio)));
774#if !defined(CHART_LIST)
775ChartPanel::ChartPanel(wxWindow* parent, wxWindowID
id,
const wxPoint& pos,
776 const wxSize& size, wxString Name, wxString stat,
778 : wxPanel(parent, id, pos, size, wxBORDER_NONE) {
779 wxString Descriptor = Name +
"\n " + stat +
" " + latest;
781 GetGlobalColor(
"DILG0", &bColor);
782 bool bUseSysColors =
false;
784 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) bUseSysColors =
true;
787 bUseSysColors =
true;
791 wxColour bg = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
792 if (bg.Red() < 128) {
793 bColor = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
798 wxWindow::SetBackgroundColour(bColor);
801 auto* m_sizer =
new wxBoxSizer(wxVERTICAL);
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);
834 m_dldrPanel = DldrPanel;
836#ifdef HAVE_WX_GESTURE_EVENTS
837 Connect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartPanel::OnContextMenu),
840 if (!wxWindow::EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
841 wxLogError(
"Failed to enable touch events on chart downloader");
844 Bind(wxEVT_LONG_PRESS, &ChartPanel::OnLongPress,
this);
845 Bind(wxEVT_LEFT_UP, &ChartPanel::OnLeftUp,
this);
847 m_popupWanted =
false;
850ChartPanel::~ChartPanel() {
851 m_cb->Disconnect(wxEVT_RIGHT_DOWN,
852 wxMouseEventHandler(ChartPanel::OnContextMenu),
nullptr,
864void ChartPanel::OnContextMenu(wxMouseEvent& event) {
865 if (m_dldrPanel)
return m_dldrPanel->OnContextMenu(event);
869#ifdef HAVE_WX_GESTURE_EVENTS
870void ChartPanel::OnLongPress(wxLongPressEvent& event) {
873 m_popupWanted =
true;
877void ChartPanel::OnLeftUp(wxMouseEvent& event) {
878 wxPoint pos =
event.GetPosition();
881 m_popupWanted =
false;
882 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
885 wxPostEvent(
this, ev);
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) {
896 if (pFont) wxWindow::SetFont(*pFont);
898 this->SetSizeHints(wxDefaultSize, wxDefaultSize);
900 auto* itemBoxSizerMainPanel =
new wxBoxSizer(wxVERTICAL);
901 SetSizer(itemBoxSizerMainPanel);
903 auto* scrollWin =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
904 wxSize(-1, -1), wxVSCROLL);
906 scrollWin->SetScrollRate(1, 1);
907 itemBoxSizerMainPanel->Add(scrollWin, 1, wxEXPAND | wxALL, 0);
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();
918 itemBoxSizerMainPanel->Add(m_sdbSizerBtns, 0, wxALL | wxEXPAND, 5);
920 auto* bSizerPrefsMain =
new wxBoxSizer(wxVERTICAL);
921 scrollWin->SetSizer(bSizerPrefsMain);
923 auto* sbSizerPaths =
new wxStaticBoxSizer(
924 new wxStaticBox(scrollWin, wxID_ANY, _(
"Default Path to Charts")),
932 m_tcDefaultDir =
new wxTextCtrl(scrollWin, wxID_ANY,
"", wxDefaultPosition,
933 wxSize(-1, -1), wxHSCROLL);
934 sbSizerPaths->Add(m_tcDefaultDir, 3, wxALL | wxEXPAND, 5);
936 m_buttonChartDirectory =
937 new wxButton(scrollWin, wxID_ANY, _(
"Select a folder"));
938 sbSizerPaths->Add(m_buttonChartDirectory, 1, wxALIGN_RIGHT | wxALL, 5);
940 bSizerPrefsMain->Add(sbSizerPaths, 0, wxALL | wxEXPAND, 5);
942 wxStaticBoxSizer* sbSizerBehavior;
943 sbSizerBehavior =
new wxStaticBoxSizer(
944 new wxStaticBox(scrollWin, wxID_ANY, _(
"Preferences")), wxVERTICAL);
946 sbSizerBehavior->SetMinSize(-1, 200);
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);
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);
960 m_cbSelectNew =
new wxCheckBox(scrollWin, wxID_ANY, _(
"All new charts"),
961 wxDefaultPosition, wxDefaultSize, 0);
962 sbSizerBehavior->Add(m_cbSelectNew, 0, wxALL, 5);
964 m_staticline1 =
new wxStaticLine(scrollWin, wxID_ANY, wxDefaultPosition,
965 wxDefaultSize, wxLI_HORIZONTAL);
966 sbSizerBehavior->Add(m_staticline1, 0, wxEXPAND | wxALL, 5);
968 m_cbBulkUpdate =
new wxCheckBox(
970 _(
"Allow bulk update of all configured chart sources and charts"),
971 wxDefaultPosition, wxDefaultSize, 0);
972 sbSizerBehavior->Add(m_cbBulkUpdate, 0, wxALL, 5);
974 m_buttonDownloadMasterCatalog =
975 new wxButton(scrollWin, wxID_ANY, _(
"Update chart source catalog"),
976 wxDefaultPosition, wxDefaultSize, 0);
978 sbSizerBehavior->Add(m_buttonDownloadMasterCatalog, 0, wxALL, 5);
980 bSizerPrefsMain->Add(sbSizerBehavior, 1, wxALL | wxEXPAND, 5);
985 int display_width, display_height;
986 wxDisplaySize(&display_width, &display_height);
989 if (display_height < 600) {
991 SetSize(wxSize(60 * wxWindow::GetCharWidth(), canvas_size.y * 8 / 10));
994 SetSize(wxSize(60 * wxWindow::GetCharWidth(), canvas_size.y * 8 / 10));
996 this->CentreOnScreen();
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),
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),
1012 m_bHelp->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [&](wxCommandEvent) {
1014 Manual manual(
this, datadir.ToStdString());
1015 manual.Launch(
"Chartdldr");
1019void ChartDldrPrefsDlg::OnDownloadMasterCatalog(wxCommandEvent& event) {
1020 wxFileName tfn = wxFileName::CreateTempFileName(
"chartdldr");
1022 "https://raw.githubusercontent.com/OpenCPN/OpenCPN/master/plugins/"
1023 "chartdldr_pi/data/chart_sources.xml";
1026 url, tfn.GetFullPath(), _(
"Downloading chart sources"),
1027 _(
"Downloading chart sources"), wxNullBitmap,
this,
1035 fn.SetFullName(
"chartdldr_pi-chart_sources.xml");
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);
1050 wxString::Format(_(
"Failed to download: %s \nVerify there is a "
1051 "working Internet connection."),
1053 _(
"Chart downloader"), wxOK | wxICON_ERROR);
1065 if (wxFileExists(tfn.GetFullPath())) wxRemoveFile(tfn.GetFullPath());
1068void ChartDldrPrefsDlg::OnDirSelClick(wxCommandEvent& event) {
1071 _(
"Choose Chart File Directory"),
1072 m_tcDefaultDir->GetValue());
1074 if (response == wxID_OK) {
1075 m_tcDefaultDir->SetValue(dir_spec);
1079ChartDldrPrefsDlg::~ChartDldrPrefsDlg() {
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),
Chart Downloader Plugin – plugin implementation header.
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.