8#include "chartdldr_pi.h"
9#include "chartdldrgui.h"
11#include "../../../libs/manual/include/manual.h"
13#include <wx/scrolwin.h>
14#include <wx/textwrapper.h>
18#ifdef __OCPN__ANDROID__
21 "QScrollBar:horizontal {\
22border: 0px solid grey;\
23background-color: rgb(240, 240, 240);\
25margin: 0px 1px 0 1px;\
27QScrollBar::handle:horizontal {\
28background-color: rgb(200, 200, 200);\
32QScrollBar::add-line:horizontal {\
33border: 0px solid grey;\
36subcontrol-position: right;\
37subcontrol-origin: margin;\
39QScrollBar::sub-line:horizontal {\
40border: 0px solid grey;\
43subcontrol-position: left;\
44subcontrol-origin: margin;\
47border: 0px solid grey;\
48background-color: rgb(240, 240, 240);\
50margin: 1px 0px 1px 0px;\
52QScrollBar::handle:vertical {\
53background-color: rgb(200, 200, 200);\
57QScrollBar::add-line:vertical {\
58border: 0px solid grey;\
61subcontrol-position: top;\
62subcontrol-origin: margin;\
64QScrollBar::sub-line:vertical {\
65border: 0px solid grey;\
68subcontrol-position: bottom;\
69subcontrol-origin: margin;\
74QCheckBox::indicator {\
82#ifdef __OCPN__ANDROID__
83#include <QtWidgets/QScroller>
96 wxString textMod = text;
97 textMod.Replace(
" ",
"^");
100 wxString sep = wxFileName::GetPathSeparator();
101 textMod.Replace(sep,
" ");
103 Wrap(win, textMod, widthMax);
106 for (
size_t i = 0; i < m_array.GetCount(); i++) {
107 wxString a = m_array[i];
109 if (m_array.GetCount() > 1) {
110 if (i < m_array.GetCount() - 1) a += sep;
116 wxString
const& GetWrapped()
const {
return m_wrapped; }
117 int const GetLineCount()
const {
return m_lineCount; }
118 wxArrayString GetLineArray() {
return m_array; }
121 virtual void OnOutputLine(
const wxString& line) {
125 virtual void OnNewLine() {
133 wxArrayString m_array;
137EVT_PAINT(DLDR_OCPNChartDirPanel::OnPaint)
143 : wxPanel(parent,
id, pos, size, wxBORDER_NONE) {
149 m_refHeight = GetCharHeight();
151 m_unselectedHeight = 2 * m_refHeight;
153 SetMinSize(wxSize(-1, m_unselectedHeight));
156 GetGlobalColor(_T(
"UIBCK"), &colour);
157 m_boxColour = colour;
160DLDR_OCPNChartDirPanel::~DLDR_OCPNChartDirPanel() {}
162void DLDR_OCPNChartDirPanel::SetText(wxString text) {
165 int maxWidth = GetParent()->GetSize().x * 75 / 100;
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();
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 < (
int)(nameWrapped.GetCount() + 1) * m_refHeight) {
193 SetMinSize(wxSize(-1, (nameWrapped.GetCount() + 1) * m_refHeight));
194 GetParent()->GetSizer()->Layout();
198 dc.SetBrush(wxBrush(m_boxColour));
200 GetGlobalColor(_T (
"UITX1" ), &c);
201 dc.SetPen(wxPen(wxColor(0xCE, 0xD5, 0xD6), 3));
203 dc.DrawRoundedRectangle(0, 0, width - 1, height - 1, height / 10);
205 int offset = height / 10;
208 wxFont* dFont = GetOCPNScaledFont_PlugIn(_(
"Dialog"));
211 dc.SetTextForeground(wxColour(64, 64, 64));
213 int yd = height * 5 / 100;
214 for (
size_t i = 0; i < nameWrapped.GetCount(); i++) {
216 dc.DrawText(nameWrapped[i], text_x, yd);
218 dc.DrawText(nameWrapped[i], text_x + GetCharWidth() / 2, yd);
219 yd += GetCharHeight();
224void AddSourceDlg::applyStyle() {
225#ifdef __OCPN__ANDROID__
226 m_panelPredefined->GetHandle()->setStyleSheet(qtStyleSheet);
227 QScroller::ungrabGesture(m_panelPredefined->GetHandle());
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);
238 wxBoxSizer* bSizerMain =
new wxBoxSizer(wxVERTICAL);
239 this->SetSizer(bSizerMain);
241 wxStaticBoxSizer* sbSizerSourceSel =
new wxStaticBoxSizer(
242 new wxStaticBox(
this, wxID_ANY, _(
"Catalog")), wxVERTICAL);
243 bSizerMain->Add(sbSizerSourceSel, 1, wxALL | wxEXPAND, 5);
245 m_nbChoice =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
247 sbSizerSourceSel->Add(m_nbChoice, 1, wxEXPAND | wxALL, 5);
248 m_nbChoice->SetMinSize(wxSize(-1, 6 * GetCharHeight()));
250 m_nbChoice->SetMinSize(wxSize(-1, 8 * GetCharHeight()));
253 m_panelPredefined =
new wxPanel(m_nbChoice, wxID_ANY, wxDefaultPosition,
254 wxDefaultSize, wxTAB_TRAVERSAL);
255 m_nbChoice->AddPage(m_panelPredefined, _(
"Predefined"),
false);
257 wxBoxSizer* bSizerPredefTree =
new wxBoxSizer(wxVERTICAL);
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);
266 m_panelPredefined->SetSizer(bSizerPredefTree);
267 m_panelPredefined->Layout();
268 bSizerPredefTree->Fit(m_treeCtrlPredefSrcs );
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);
278 m_stName =
new wxStaticText(m_panelCustom, wxID_ANY, _(
"Name"),
279 wxDefaultPosition, wxDefaultSize, 0);
281 fgSizerSourceSel->Add(m_stName, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
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);
288 m_stUrl =
new wxStaticText(m_panelCustom, wxID_ANY, _(
"URL"),
289 wxDefaultPosition, wxDefaultSize, 0);
291 fgSizerSourceSel->Add(m_stUrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
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);
298 m_panelCustom->SetSizer(fgSizerSourceSel);
299 m_panelCustom->Layout();
300 fgSizerSourceSel->Fit(m_panelCustom);
301 m_nbChoice->AddPage(m_panelCustom, _(
"Custom"),
true);
303 wxStaticBoxSizer* sbSizerChartDir;
304 sbSizerChartDir =
new wxStaticBoxSizer(
305 new wxStaticBox(
this, wxID_ANY,
306 _(
"Proposed chart installation directory")),
308 bSizerMain->Add(sbSizerChartDir, 0, wxALL | wxEXPAND, 5);
310 wxBoxSizer* dirbox =
new wxBoxSizer(wxVERTICAL);
311 sbSizerChartDir->Add(dirbox, 0, wxEXPAND);
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();
319 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1));
321 dirbox->Add(m_panelChartDirectory, 1, wxALL | wxEXPAND, 5);
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();
330 wxBoxSizer* buttons =
new wxBoxSizer(wxHORIZONTAL);
331 bSizerMain->Add(buttons, 0, wxALIGN_RIGHT);
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);
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),
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,
360void AddSourceDlg::OnNbPage(wxNotebookEvent& event) {
361 if (event.GetSelection() == 1) {
362 m_buttonChartDirectory->Enable();
364 wxTreeItemId item = m_treeCtrlPredefSrcs->GetSelection();
367 cs = (
ChartSource*)(m_treeCtrlPredefSrcs->GetItemData(item));
368 if (!cs) m_buttonChartDirectory->Disable();
372AddSourceDlg::~AddSourceDlg() {
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),
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,
391void AddSourceDlg::OnDirSelClick(wxCommandEvent& event) {
393 int response = PlatformDirSelectorDialog(
this, &dir_spec,
394 _(
"Choose Chart File Directory"),
395 m_tcChartDirectory->GetValue());
397 if (response == wxID_OK) {
398 wxFileName fn(m_dirExpanded);
400 if (!dir_spec.EndsWith(fn.GetName())) {
401 dir_spec += wxFileName::GetPathSeparator();
402 dir_spec += fn.GetName();
405 m_tcChartDirectory->SetValue(dir_spec);
406 m_panelChartDirectory->SetText(dir_spec);
411 const wxPoint& pos,
const wxSize& size,
413 : wxPanel(parent, id, pos, size, style) {
417 wxBoxSizer* mainSizer =
new wxBoxSizer(wxVERTICAL);
420 mainSizer->AddSpacer(GetCharHeight());
422 m_DLoadNB =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
424 mainSizer->Add(m_DLoadNB, 1, wxEXPAND);
427 wxPanel* catalogPanel =
428 new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition, wxDefaultSize);
429 m_DLoadNB->AddPage(catalogPanel, _(
"Select Catalog..."));
431 wxBoxSizer* catalogPanelBoxSizer =
new wxBoxSizer(wxVERTICAL);
432 catalogPanel->SetSizer(catalogPanelBoxSizer);
434 wxStaticText* catalogLabel =
435 new wxStaticText(catalogPanel, wxID_ANY, _(
"Chart Catalogs Available"));
436 catalogLabel->Wrap(-1);
437 catalogPanelBoxSizer->Add(catalogLabel, 0, wxTOP | wxRIGHT | wxLEFT,
441 wxBoxSizer* activeListSizer =
new wxBoxSizer(wxVERTICAL);
442 catalogPanelBoxSizer->Add(activeListSizer, 0, wxALL | wxEXPAND, 5);
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);
452 wxBoxSizer* bSizerCatalogBtns =
new wxBoxSizer(wxHORIZONTAL);
453 catalogPanelBoxSizer->Add(bSizerCatalogBtns, 0, wxALL | wxEXPAND,
456 m_bAddSource =
new wxButton(catalogPanel, wxID_ANY, _(
"Add Catalog"),
457 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
458 m_bAddSource->SetToolTip(_(
"Add a new chart catalog."));
460 bSizerCatalogBtns->Add(m_bAddSource, 0, wxALL | wxEXPAND, 5);
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."));
467 bSizerCatalogBtns->Add(m_bDeleteSource, 0, wxALL | wxEXPAND, 5);
469 m_bEditSource =
new wxButton(catalogPanel, wxID_ANY, _(
"Edit..."),
470 wxDefaultPosition, wxDefaultSize, 0);
471 bSizerCatalogBtns->Add(m_bEditSource, 0, wxALL | wxEXPAND, 5);
473#ifdef __OCPN__ANDROID__
474 m_bEditSource->Hide();
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."));
483 bSizerCatalogBtns->Add(m_bUpdateChartList, 0, wxALL | wxEXPAND, 5);
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);
492 wxPanel* chartsPanel =
new wxPanel(m_DLoadNB, wxID_ANY, wxDefaultPosition,
493 wxDefaultSize, wxBG_STYLE_ERASE);
494 m_DLoadNB->AddPage(chartsPanel, _(
"Download Charts..."));
496 wxBoxSizer* chartsPanelBoxSizer =
new wxBoxSizer(wxVERTICAL);
497 chartsPanel->SetSizer(chartsPanelBoxSizer);
500 m_chartsLabel =
new wxStaticText(chartsPanel, wxID_ANY, _(
"Charts"));
501 chartsPanelBoxSizer->Add(m_chartsLabel, 0, wxALL, 4 * border_size);
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);
508 int h = m_scrollWinChartList->GetCharHeight();
509 int w = m_scrollWinChartList->GetCharWidth();
511 m_scrollWinChartList->SetMinSize(wxSize(-1, 12 * h));
512 m_scrollWinChartList->SetRowHeight(m_scrollWinChartList->GetCharHeight() + 6);
514 wxDataViewColumn* colFlag = m_scrollWinChartList->AppendToggleColumn(
515 _T(
" "), wxDATAVIEW_CELL_ACTIVATABLE, wxDVC_TOGGLE_DEFAULT_WIDTH,
518 wxDataViewColumn* colStat = m_scrollWinChartList->AppendTextColumn(
519 _(
"Status"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_CENTER,
520 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
522 wxDataViewColumn* colLast = m_scrollWinChartList->AppendTextColumn(
523 _(
"Date"), wxDATAVIEW_CELL_INERT, w * 12, wxALIGN_LEFT,
524 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
526 wxDataViewColumn* colDesc = m_scrollWinChartList->AppendTextColumn(
527 _(
"Chart Description"), wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
528 wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
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()));
538#ifdef HAVE_WX_GESTURE_EVENTS
539 if (!m_scrollWinChartList->EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
540 wxLogError(
"Failed to enable touch events on chart downloader");
542 Bind(wxEVT_LONG_PRESS, &ChartDldrPanel::OnLongPress,
this);
545 m_boxSizerCharts =
new wxBoxSizer(wxVERTICAL);
546 m_scrollWinChartList->SetSizer(m_boxSizerCharts);
551 chartsPanelBoxSizer->AddSpacer(GetCharHeight());
553#if defined(CHART_LIST)
554 wxBoxSizer* chartsButtonBoxSizer =
new wxBoxSizer(wxHORIZONTAL);
555 chartsPanelBoxSizer->Add(chartsButtonBoxSizer, 0, wxEXPAND);
558 new wxButton(chartsPanel, wxID_ANY, _(
"Download selected charts"),
559 wxDefaultPosition, wxDefaultSize, 0);
560 chartsButtonBoxSizer->Add(m_bDnldCharts, 0, wxALL, 5);
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);
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);
574 m_bSelectAll =
new wxButton(chartsPanel, wxID_ANY, _(
"Select All"),
575 wxDefaultPosition, wxDefaultSize, 0);
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);
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);
590 new wxButton(chartsPanel, wxID_ANY, _(
"Download selected charts"),
591 wxDefaultPosition, wxDefaultSize, 0);
592 chartsPanelBoxSizer->Add(m_bDnldCharts, 0, wxALIGN_LEFT | wxALL, 5);
594 m_stCatalogInfo =
new wxStaticText(chartsPanel, wxID_ANY,
"",
595 wxDefaultPosition, wxDefaultSize, 0);
596 chartsPanelBoxSizer->Add(m_stCatalogInfo, 1, wxEXPAND | wxALL, 5);
607 this->Connect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
608 m_lbChartSources->Connect(wxEVT_LEFT_DCLICK,
609 wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
611 m_lbChartSources->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
612 wxListEventHandler(ChartDldrPanel::SelectSource),
614 m_bAddSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
615 wxCommandEventHandler(ChartDldrPanel::AddSource), NULL,
617 m_bDeleteSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
618 wxCommandEventHandler(ChartDldrPanel::DeleteSource),
620 m_bEditSource->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
621 wxCommandEventHandler(ChartDldrPanel::EditSource),
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__)
643 m_scrollWinChartList->Connect(
644 wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
645 wxMouseEventHandler(ChartDldrPanel::OnContextMenu), NULL,
this);
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);
654 m_scrollWinChartList->Connect(
655 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
658 m_bDnldCharts->Connect(
659 wxEVT_COMMAND_BUTTON_CLICKED,
660 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts), NULL,
this);
664 this->Connect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
666ChartDldrPanel::~ChartDldrPanel() {
668 this->Disconnect(wxEVT_PAINT, wxPaintEventHandler(ChartDldrPanel::OnPaint));
669 m_lbChartSources->Disconnect(
670 wxEVT_LEFT_DCLICK, wxMouseEventHandler(ChartDldrPanel::OnLeftDClick),
672 m_lbChartSources->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
673 wxListEventHandler(ChartDldrPanel::SelectSource),
675 m_bAddSource->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
676 wxCommandEventHandler(ChartDldrPanel::AddSource),
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),
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);
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);
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);
713 m_scrollWinChartList->Disconnect(
714 wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartDldrPanel::OnContextMenu),
717 m_bDnldCharts->Disconnect(
718 wxEVT_COMMAND_BUTTON_CLICKED,
719 wxCommandEventHandler(ChartDldrPanel::OnDownloadCharts), NULL,
this);
722 this->Disconnect(wxEVT_SIZE, wxSizeEventHandler(ChartDldrPanel::OnSize));
725#ifdef HAVE_WX_GESTURE_EVENTS
726void ChartDldrPanel::OnLongPress(wxLongPressEvent& event) {
727 printf(
" OnLongPress\n");
729 wxPoint pos =
event.GetPosition();
730 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
739void ChartDldrPanel::OnSize(wxSizeEvent& event) {
750 wxWindow* win = GetOCPNCanvasWindow();
751 wxSize sz = win->GetSize();
754 if (GetGrandParent()) sz = GetGrandParent()->GetSize();
757 int yAvail = sz.y - (8 * GetCharHeight());
763 m_lbChartSources->SetMinSize(wxSize(-1, yAvail * ratio));
764 m_scrollWinChartList->SetMinSize(wxSize(-1, yAvail * ratio));
770#if !defined(CHART_LIST)
771ChartPanel::ChartPanel(wxWindow* parent, wxWindowID
id,
const wxPoint& pos,
772 const wxSize& size, wxString Name, wxString stat,
774 : wxPanel(parent, id, pos, size, wxBORDER_NONE) {
775 wxString Descriptor = Name + _T(
"\n ") + stat + _T(
" ") + latest;
777 GetGlobalColor(_T(
"DILG0"), &bColor);
778 bool bUseSysColors =
false;
780 if (wxPlatformInfo::Get().CheckOSVersion(10, 14)) bUseSysColors =
true;
783 bUseSysColors =
true;
787 wxColour bg = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
788 if (bg.Red() < 128) {
789 bColor = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
794 SetBackgroundColour(bColor);
797 wxBoxSizer* m_sizer =
new wxBoxSizer(wxVERTICAL);
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);
830 m_dldrPanel = DldrPanel;
832#ifdef HAVE_WX_GESTURE_EVENTS
833 Connect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(ChartPanel::OnContextMenu),
836 if (!EnableTouchEvents(wxTOUCH_PRESS_GESTURES)) {
837 wxLogError(
"Failed to enable touch events on chart downloader");
840 Bind(wxEVT_LONG_PRESS, &ChartPanel::OnLongPress,
this);
841 Bind(wxEVT_LEFT_UP, &ChartPanel::OnLeftUp,
this);
843 m_popupWanted =
false;
846ChartPanel::~ChartPanel() {
847 m_cb->Disconnect(wxEVT_RIGHT_DOWN,
848 wxMouseEventHandler(ChartPanel::OnContextMenu), NULL,
this);
859void ChartPanel::OnContextMenu(wxMouseEvent& event) {
860 if (m_dldrPanel)
return m_dldrPanel->OnContextMenu(event);
864#ifdef HAVE_WX_GESTURE_EVENTS
865void ChartPanel::OnLongPress(wxLongPressEvent& event) {
868 m_popupWanted =
true;
872void ChartPanel::OnLeftUp(wxMouseEvent& event) {
873 wxPoint pos =
event.GetPosition();
876 m_popupWanted =
false;
877 wxMouseEvent ev(wxEVT_RIGHT_DOWN);
880 wxPostEvent(
this, ev);
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) {
891 if (pFont) SetFont(*pFont);
893 this->SetSizeHints(wxDefaultSize, wxDefaultSize);
895 wxBoxSizer* itemBoxSizerMainPanel =
new wxBoxSizer(wxVERTICAL);
896 SetSizer(itemBoxSizerMainPanel);
898 wxScrolledWindow* scrollWin =
new wxScrolledWindow(
899 this, wxID_ANY, wxDefaultPosition, wxSize(-1, -1), wxVSCROLL);
901 scrollWin->SetScrollRate(1, 1);
902 itemBoxSizerMainPanel->Add(scrollWin, 1, wxEXPAND | wxALL, 0);
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();
913 itemBoxSizerMainPanel->Add(m_sdbSizerBtns, 0, wxALL | wxEXPAND, 5);
915 wxBoxSizer* bSizerPrefsMain =
new wxBoxSizer(wxVERTICAL);
916 scrollWin->SetSizer(bSizerPrefsMain);
918 wxStaticBoxSizer* sbSizerPaths;
919 sbSizerPaths =
new wxStaticBoxSizer(
920 new wxStaticBox(scrollWin, wxID_ANY, _(
"Default Path to Charts")),
928 m_tcDefaultDir =
new wxTextCtrl(scrollWin, wxID_ANY, _T(
""),
929 wxDefaultPosition, wxSize(-1, -1), wxHSCROLL);
930 sbSizerPaths->Add(m_tcDefaultDir, 3, wxALL | wxEXPAND, 5);
932 m_buttonChartDirectory =
933 new wxButton(scrollWin, wxID_ANY, _(
"Select a folder"));
934 sbSizerPaths->Add(m_buttonChartDirectory, 1, wxALIGN_RIGHT | wxALL, 5);
936 bSizerPrefsMain->Add(sbSizerPaths, 0, wxALL | wxEXPAND, 5);
938 wxStaticBoxSizer* sbSizerBehavior;
939 sbSizerBehavior =
new wxStaticBoxSizer(
940 new wxStaticBox(scrollWin, wxID_ANY, _(
"Preferences")), wxVERTICAL);
942 sbSizerBehavior->SetMinSize(-1, 200);
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);
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);
956 m_cbSelectNew =
new wxCheckBox(scrollWin, wxID_ANY, _(
"All new charts"),
957 wxDefaultPosition, wxDefaultSize, 0);
958 sbSizerBehavior->Add(m_cbSelectNew, 0, wxALL, 5);
960 m_staticline1 =
new wxStaticLine(scrollWin, wxID_ANY, wxDefaultPosition,
961 wxDefaultSize, wxLI_HORIZONTAL);
962 sbSizerBehavior->Add(m_staticline1, 0, wxEXPAND | wxALL, 5);
964 m_cbBulkUpdate =
new wxCheckBox(
966 _(
"Allow bulk update of all configured chart sources and charts"),
967 wxDefaultPosition, wxDefaultSize, 0);
968 sbSizerBehavior->Add(m_cbBulkUpdate, 0, wxALL, 5);
970 m_buttonDownloadMasterCatalog =
971 new wxButton(scrollWin, wxID_ANY, _(
"Update chart source catalog"),
972 wxDefaultPosition, wxDefaultSize, 0);
974 sbSizerBehavior->Add(m_buttonDownloadMasterCatalog, 0, wxALL, 5);
976 bSizerPrefsMain->Add(sbSizerBehavior, 1, wxALL | wxEXPAND, 5);
981 int display_width, display_height;
982 wxDisplaySize(&display_width, &display_height);
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));
989 SetMaxSize(GetOCPNCanvasWindow()->GetSize());
990 SetSize(wxSize(60 * GetCharWidth(), canvas_size.y * 8 / 10));
992 this->CentreOnScreen();
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),
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,
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");
1015void ChartDldrPrefsDlg::OnDownloadMasterCatalog(wxCommandEvent& event) {
1016 wxFileName tfn = wxFileName::CreateTempFileName(_T(
"chartdldr"));
1018 "https://raw.githubusercontent.com/OpenCPN/OpenCPN/master/plugins/"
1019 "chartdldr_pi/data/chart_sources.xml";
1021 _OCPN_DLStatus ret = OCPN_downloadFile(
1022 url, tfn.GetFullPath(), _(
"Downloading chart sources"),
1023 _(
"Downloading chart sources"), wxNullBitmap,
this,
1030 fn.SetPath(*GetpPrivateApplicationDataLocation());
1031 fn.SetFullName(_T(
"chartdldr_pi-chart_sources.xml"));
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);
1043 case OCPN_DL_FAILED: {
1044 OCPNMessageBox_PlugIn(
1046 wxString::Format(_(
"Failed to download: %s \nVerify there is a "
1047 "working Internet connection."),
1049 _(
"Chart downloader"), wxOK | wxICON_ERROR);
1052 case OCPN_DL_USER_TIMEOUT:
1053 case OCPN_DL_ABORTED: {
1056 case OCPN_DL_UNKNOWN:
1057 case OCPN_DL_STARTED: {
1065 if (wxFileExists(tfn.GetFullPath())) wxRemoveFile(tfn.GetFullPath());
1068void ChartDldrPrefsDlg::OnDirSelClick(wxCommandEvent& event) {
1070 int response = PlatformDirSelectorDialog(
this, &dir_spec,
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), 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,
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.