42#include <wx/filename.h>
43#include <wx/stdpaths.h>
44#include <wx/progdlg.h>
45#include <wx/clipbrd.h>
46#include <wx/statline.h>
84#include "androidUTIL.h"
87#define DIALOG_MARGIN 10
89enum { rmVISIBLE = 0, rmROUTENAME, rmROUTEDESC };
90enum { colTRKVISIBLE = 0, colTRKNAME, colTRKLENGTH, colTRKDATE };
91enum { colLAYVISIBLE = 0, colLAYNAME, colLAYITEMS, colLAYPERSIST };
92enum { colWPTICON = 0, colWPTSCALE, colWPTNAME, colWPTDIST };
97void appendOSDirSlash(wxString *pString);
99static int SortRouteTrack(
const int order,
const wxString &it1,
100 const wxString &it2) {
101 if (order & 1)
return it2.CmpNoCase(it1);
103 return it1.CmpNoCase(it2);
107static int sort_route_name_dir;
108#if wxCHECK_VERSION(2, 9, 0)
109static int wxCALLBACK SortRoutesOnName(wxIntPtr item1, wxIntPtr item2,
112int wxCALLBACK SortRoutesOnName(
long item1,
long item2,
long list)
115 return SortRouteTrack(sort_route_name_dir, ((
Route *)item1)->GetName(),
116 ((
Route *)item2)->GetName());
120static int sort_route_to_dir;
121#if wxCHECK_VERSION(2, 9, 0)
122static int wxCALLBACK SortRoutesOnTo(wxIntPtr item1, wxIntPtr item2,
125int wxCALLBACK SortRoutesOnTo(
long item1,
long item2,
long list)
128 return SortRouteTrack(sort_route_to_dir, ((
Route *)item1)->GetTo(),
129 ((
Route *)item2)->GetTo());
133static int sort_track_name_dir;
134#if wxCHECK_VERSION(2, 9, 0)
135static int wxCALLBACK SortTracksOnName(wxIntPtr item1, wxIntPtr item2,
138int wxCALLBACK SortTracksOnName(
long item1,
long item2,
long list)
141 return SortRouteTrack(sort_track_name_dir, ((
Track *)item1)->GetName(),
142 ((
Track *)item2)->GetName());
145static int SortDouble(
const int order,
const double &it1,
const double &it2) {
157 if (l1 == l2)
return 0;
158 if (l2 < l1)
return 1;
163static int sort_track_len_dir;
164#if wxCHECK_VERSION(2, 9, 0)
165static int wxCALLBACK SortTracksOnDistance(wxIntPtr item1, wxIntPtr item2,
168int wxCALLBACK SortTracksOnDistance(
long item1,
long item2,
long list)
171 return SortDouble(sort_track_len_dir, ((
Track *)item1)->Length(),
172 ((
Track *)item2)->Length());
176static int sort_track_date_dir;
177#if wxCHECK_VERSION(2, 9, 0)
178static int wxCALLBACK SortTracksOnDate(wxIntPtr item1, wxIntPtr item2,
181int wxCALLBACK SortTracksOnDate(
long item1,
long item2,
long list)
185 return SortRouteTrack(sort_track_date_dir, ((
Track *)item1)->GetIsoDateTime(),
186 ((
Track *)item2)->GetIsoDateTime());
189static int sort_wp_key;
190static int sort_track_key;
193static int sort_wp_name_dir;
194#if wxCHECK_VERSION(2, 9, 0)
195static int wxCALLBACK SortWaypointsOnName(wxIntPtr item1, wxIntPtr item2,
198int wxCALLBACK SortWaypointsOnName(
long item1,
long item2,
long list)
206 if (sort_wp_name_dir & 1)
207 return pRP2->GetName().CmpNoCase(pRP1->GetName());
209 return pRP1->GetName().CmpNoCase(pRP2->GetName());
215static int sort_wp_len_dir;
216#if wxCHECK_VERSION(2, 9, 0)
217static int wxCALLBACK SortWaypointsOnDistance(wxIntPtr item1, wxIntPtr item2,
220int wxCALLBACK SortWaypointsOnDistance(
long item1,
long item2,
long list)
224 DistanceBearingMercator(((
RoutePoint *)item1)->m_lat,
227 DistanceBearingMercator(((
RoutePoint *)item2)->m_lat,
230 return SortDouble(sort_wp_len_dir, dst1, dst2);
234static int sort_layer_name_dir;
235#if wxCHECK_VERSION(2, 9, 0)
236static int wxCALLBACK SortLayersOnName(wxIntPtr item1, wxIntPtr item2,
239int wxCALLBACK SortLayersOnName(
long item1,
long item2,
long list)
242 return SortRouteTrack(sort_layer_name_dir, ((
Layer *)item1)->m_LayerName,
243 ((
Layer *)item2)->m_LayerName);
247static int sort_layer_len_dir;
248#if wxCHECK_VERSION(2, 9, 0)
249static int wxCALLBACK SortLayersOnSize(wxIntPtr item1, wxIntPtr item2,
252int wxCALLBACK SortLayersOnSize(
long item1,
long item2,
long list)
255 return SortDouble(sort_layer_len_dir, ((
Layer *)item1)->m_NoOfItems,
256 ((
Layer *)item2)->m_NoOfItems);
263EVT_NOTEBOOK_PAGE_CHANGED(
265 RouteManagerDialog::OnTabSwitch)
266EVT_CLOSE(RouteManagerDialog::OnClose)
267EVT_COMMAND(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, RouteManagerDialog::OnOK)
268EVT_CHAR_HOOK(RouteManagerDialog::OnKey)
272 if (ke.GetKeyCode() == WXK_ESCAPE)
278void RouteManagerDialog::OnTabSwitch(wxNotebookEvent &event) {
279 if (!m_pNotebook)
return;
280 int current_page = m_pNotebook->GetSelection();
281 if (current_page == 3) {
282 if (btnImport) btnImport->Enable(
false);
283 if (btnExport) btnExport->Enable(
false);
284 if (btnExportViz) btnExportViz->Enable(
false);
286 if (btnImport) btnImport->Enable(
true);
287 if (btnExport) btnExport->Enable(
true);
288 if (btnExportViz) btnExportViz->Enable(
true);
295bool RouteManagerDialog::instanceFlag =
false;
308RouteManagerDialog::RouteManagerDialog(wxWindow *parent) {
310 wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
312 wxFrame::Create(parent, -1, wxString(_(
"Route & Mark Manager")),
313 wxDefaultPosition, wxDefaultSize, style);
321 sort_wp_key = SORT_ON_NAME;
322 sort_track_key = SORT_ON_NAME;
329 routes_update_listener.
Init(GuiEvents::GetInstance().on_routes_update,
330 [&](wxCommandEvent) { UpdateRouteListCtrl(); });
333void RouteManagerDialog::Create() {
335 int char_width, char_height;
336 GetTextExtent(
"W", &char_width, &char_height);
337 m_charWidth = char_width;
339 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
340 SetSizer(itemBoxSizer1);
342 m_pNotebook =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition,
343 wxSize(-1, -1), wxNB_TOP);
344 itemBoxSizer1->Add(m_pNotebook, 1, wxALL | wxEXPAND, 5);
347 m_pPanelRte =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
348 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
350 wxBoxSizer *sbsRoutes =
new wxBoxSizer(wxHORIZONTAL);
351 m_pPanelRte->SetSizer(sbsRoutes);
352 m_pNotebook->AddPage(m_pPanelRte, _(
"Routes"));
355 sort_wp_name_dir = 0;
356 sort_track_len_dir = 1;
357 sort_route_to_dir = 0;
358 sort_track_name_dir = 0;
359 sort_route_name_dir = 0;
360 sort_layer_name_dir = 0;
361 sort_layer_len_dir = 1;
363 m_listIconSize = 2 * GetCharHeight();
366 wxBoxSizer *bSizerRteContents;
367 bSizerRteContents =
new wxBoxSizer(wxVERTICAL);
369 wxFlexGridSizer *fgSizerFilterRte;
370 fgSizerFilterRte =
new wxFlexGridSizer(0, 2, 0, 0);
371 fgSizerFilterRte->AddGrowableCol(1);
372 fgSizerFilterRte->SetFlexibleDirection(wxBOTH);
373 fgSizerFilterRte->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
375 m_stFilterRte =
new wxStaticText(m_pPanelRte, wxID_ANY, _(
"Filter"),
376 wxDefaultPosition, wxDefaultSize, 0);
377 m_stFilterRte->Wrap(-1);
378 fgSizerFilterRte->Add(m_stFilterRte, 0, wxALL, 5);
380 m_tFilterRte =
new wxTextCtrl(m_pPanelRte, wxID_ANY,
"", wxDefaultPosition,
382 fgSizerFilterRte->Add(m_tFilterRte, 1, wxALL | wxEXPAND, 5);
384 bSizerRteContents->Add(fgSizerFilterRte, 0, wxEXPAND, 5);
385 m_tFilterRte->Connect(
386 wxEVT_COMMAND_TEXT_UPDATED,
387 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
389 m_cbShowAllRte =
new wxCheckBox(m_pPanelRte, wxID_ANY, _(
"Show all routes"));
390 bSizerRteContents->Add(m_cbShowAllRte, 0, wxEXPAND | wxLEFT, 5);
391 m_cbShowAllRte->Connect(
392 wxEVT_COMMAND_CHECKBOX_CLICKED,
393 wxCommandEventHandler(RouteManagerDialog::OnShowAllRteCBClicked), NULL,
397 new wxListCtrl(m_pPanelRte, -1, wxDefaultPosition, wxSize(-1, -1),
398 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
401 m_pRouteListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
404 m_pRouteListCtrl->Connect(
405 wxEVT_COMMAND_LIST_ITEM_SELECTED,
406 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
407 m_pRouteListCtrl->Connect(
408 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
409 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
410 m_pRouteListCtrl->Connect(
411 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
412 wxListEventHandler(RouteManagerDialog::OnRteDefaultAction), NULL,
this);
413 m_pRouteListCtrl->Connect(
415 wxMouseEventHandler(RouteManagerDialog::OnRteToggleVisibility), NULL,
417 m_pRouteListCtrl->Connect(
418 wxEVT_COMMAND_LIST_COL_CLICK,
419 wxListEventHandler(RouteManagerDialog::OnRteColumnClicked), NULL,
this);
420 bSizerRteContents->Add(m_pRouteListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
421 sbsRoutes->Add(bSizerRteContents, 1, wxEXPAND, 5);
426 m_pRouteListCtrl->InsertColumn(rmVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
428 m_pRouteListCtrl->InsertColumn(rmROUTENAME, _(
"Route Name"),
429 wxLIST_FORMAT_LEFT, 15 * char_width);
430 m_pRouteListCtrl->InsertColumn(rmROUTEDESC, _(
"From <-> To"),
431 wxLIST_FORMAT_LEFT, 10 * char_width);
434 wxBoxSizer *bsRouteButtons =
new wxBoxSizer(wxVERTICAL);
435 sbsRoutes->Add(bsRouteButtons, 0, wxEXPAND);
437 wxScrolledWindow *winr =
new wxScrolledWindow(
438 m_pPanelRte, wxID_ANY, wxDefaultPosition, wxDefaultSize,
439 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
440 winr->SetScrollRate(0, 5);
442 bsRouteButtons->Add(winr, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
444 wxBoxSizer *bsRouteButtonsInner =
new wxBoxSizer(wxVERTICAL);
445 winr->SetSizer(bsRouteButtonsInner);
447 btnRteProperties =
new wxButton(winr, -1, _(
"&Properties") +
"...");
448 bsRouteButtonsInner->Add(btnRteProperties, 0, wxALL | wxEXPAND,
450 btnRteProperties->Connect(
451 wxEVT_COMMAND_BUTTON_CLICKED,
452 wxCommandEventHandler(RouteManagerDialog::OnRtePropertiesClick), NULL,
455 btnRteActivate =
new wxButton(winr, -1, _(
"&Activate"));
456 bsRouteButtonsInner->Add(btnRteActivate, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
457 btnRteActivate->Connect(
458 wxEVT_COMMAND_BUTTON_CLICKED,
459 wxCommandEventHandler(RouteManagerDialog::OnRteActivateClick), NULL,
461 btnRteActivate->Connect(
463 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
465 btnRteZoomto =
new wxButton(winr, -1, _(
"&Center View"));
466 bsRouteButtonsInner->Add(btnRteZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
467 btnRteZoomto->Connect(
468 wxEVT_COMMAND_BUTTON_CLICKED,
469 wxCommandEventHandler(RouteManagerDialog::OnRteZoomtoClick), NULL,
this);
470 btnRteZoomto->Connect(
472 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
474 btnRteReverse =
new wxButton(winr, -1, _(
"&Reverse"));
475 bsRouteButtonsInner->Add(btnRteReverse, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
476 btnRteReverse->Connect(
477 wxEVT_COMMAND_BUTTON_CLICKED,
478 wxCommandEventHandler(RouteManagerDialog::OnRteReverseClick), NULL,
this);
480 btnRteDelete =
new wxButton(winr, -1, _(
"&Delete"));
481 bsRouteButtonsInner->Add(btnRteDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
482 btnRteDelete->Connect(
483 wxEVT_COMMAND_BUTTON_CLICKED,
484 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteClick), NULL,
this);
486 wxString reseq_label(_(
"&Resequence Waypoints"));
487 wxString export_label(_(
"&Export selected..."));
488 wxString send_to_gps_label(_(
"&Send to GPS..."));
489 wxString send_to_peer_label(_(
"Send to &Peer..."));
492 reseq_label = wxString(_(
"Resequence"));
493 export_label = wxString(_(
"Export"));
494 send_to_gps_label = wxString(_(
"Send to GPS"));
495 send_to_peer_label = wxString(_(
"Send to Peer"));
498 btnRteExport =
new wxButton(winr, -1, export_label);
499 bsRouteButtonsInner->Add(btnRteExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
500 btnRteExport->Connect(
501 wxEVT_COMMAND_BUTTON_CLICKED,
502 wxCommandEventHandler(RouteManagerDialog::OnRteExportClick), NULL,
this);
504 btnRteResequence =
new wxButton(winr, -1, reseq_label);
505 bsRouteButtonsInner->Add(btnRteResequence, 0, wxALL | wxEXPAND,
507 btnRteResequence->Connect(
508 wxEVT_COMMAND_BUTTON_CLICKED,
509 wxCommandEventHandler(RouteManagerDialog::OnRteResequenceClick), NULL,
512 btnRteSendToPeer =
new wxButton(winr, -1, send_to_peer_label);
513 bsRouteButtonsInner->Add(btnRteSendToPeer, 0, wxALL | wxEXPAND,
515 btnRteSendToPeer->Connect(
516 wxEVT_COMMAND_BUTTON_CLICKED,
517 wxCommandEventHandler(RouteManagerDialog::OnRteSendToPeerClick), NULL,
520 btnRteSendToGPS =
new wxButton(winr, -1, send_to_gps_label);
521 bsRouteButtonsInner->Add(btnRteSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
522 btnRteSendToGPS->Connect(
523 wxEVT_COMMAND_BUTTON_CLICKED,
524 wxCommandEventHandler(RouteManagerDialog::OnRteSendToGPSClick), NULL,
527 bsRouteButtonsInner->AddSpacer(10);
529 btnRteDeleteAll =
new wxButton(winr, -1, _(
"&Delete All"));
530 bsRouteButtonsInner->Add(btnRteDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
531 btnRteDeleteAll->Connect(
532 wxEVT_COMMAND_BUTTON_CLICKED,
533 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteAllClick), NULL,
537 m_pPanelTrk =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
538 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
539 wxBoxSizer *sbsTracks =
new wxBoxSizer(wxHORIZONTAL);
540 m_pPanelTrk->SetSizer(sbsTracks);
541 m_pNotebook->AddPage(m_pPanelTrk, _(
"Tracks"));
543 wxBoxSizer *bSizerTrkContents;
544 bSizerTrkContents =
new wxBoxSizer(wxVERTICAL);
546 wxFlexGridSizer *fgSizerFilterTrk;
547 fgSizerFilterTrk =
new wxFlexGridSizer(0, 2, 0, 0);
548 fgSizerFilterTrk->AddGrowableCol(1);
549 fgSizerFilterTrk->SetFlexibleDirection(wxBOTH);
550 fgSizerFilterTrk->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
552 m_stFilterTrk =
new wxStaticText(m_pPanelTrk, wxID_ANY, _(
"Filter"),
553 wxDefaultPosition, wxDefaultSize, 0);
554 m_stFilterTrk->Wrap(-1);
555 fgSizerFilterTrk->Add(m_stFilterTrk, 0, wxALL, 5);
557 m_tFilterTrk =
new wxTextCtrl(m_pPanelTrk, wxID_ANY,
"", wxDefaultPosition,
559 fgSizerFilterTrk->Add(m_tFilterTrk, 1, wxALL | wxEXPAND, 5);
561 bSizerTrkContents->Add(fgSizerFilterTrk, 0, wxEXPAND, 5);
562 m_tFilterTrk->Connect(
563 wxEVT_COMMAND_TEXT_UPDATED,
564 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
566 m_cbShowAllTrk =
new wxCheckBox(m_pPanelTrk, wxID_ANY, _(
"Show all tracks"));
567 bSizerTrkContents->Add(m_cbShowAllTrk, 0, wxEXPAND | wxLEFT, 5);
568 m_cbShowAllTrk->Connect(
569 wxEVT_COMMAND_CHECKBOX_CLICKED,
570 wxCommandEventHandler(RouteManagerDialog::OnShowAllTrkCBClicked), NULL,
574 new wxListCtrl(m_pPanelTrk, -1, wxDefaultPosition, wxDefaultSize,
575 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
579 m_pTrkListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
582 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
583 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
585 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
586 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
588 m_pTrkListCtrl->Connect(
589 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
590 wxListEventHandler(RouteManagerDialog::OnTrkDefaultAction), NULL,
this);
591 m_pTrkListCtrl->Connect(
593 wxMouseEventHandler(RouteManagerDialog::OnTrkToggleVisibility), NULL,
595 m_pTrkListCtrl->Connect(
596 wxEVT_COMMAND_LIST_COL_CLICK,
597 wxListEventHandler(RouteManagerDialog::OnTrkColumnClicked), NULL,
this);
598 m_pTrkListCtrl->Connect(
599 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
600 wxListEventHandler(RouteManagerDialog::OnTrkRightClick), NULL,
this);
601 this->Connect(wxEVT_COMMAND_MENU_SELECTED,
602 wxCommandEventHandler(RouteManagerDialog::OnTrkMenuSelected),
605 bSizerTrkContents->Add(m_pTrkListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
606 sbsTracks->Add(bSizerTrkContents, 1, wxEXPAND, 5);
608 m_pTrkListCtrl->InsertColumn(colTRKVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
610 m_pTrkListCtrl->InsertColumn(colTRKNAME, _(
"Track Name"), wxLIST_FORMAT_LEFT,
612 m_pTrkListCtrl->InsertColumn(colTRKDATE, _(
"Start Date"), wxLIST_FORMAT_LEFT,
614 m_pTrkListCtrl->InsertColumn(colTRKLENGTH, _(
"Length"), wxLIST_FORMAT_LEFT,
617 wxBoxSizer *bsTrkButtons =
new wxBoxSizer(wxVERTICAL);
618 sbsTracks->Add(bsTrkButtons, 0, wxEXPAND);
620 wxScrolledWindow *wint =
new wxScrolledWindow(
621 m_pPanelTrk, wxID_ANY, wxDefaultPosition, wxDefaultSize,
622 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
623 wint->SetScrollRate(0, 5);
625 bsTrkButtons->Add(wint, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
627 wxBoxSizer *bsTrkButtonsInner =
new wxBoxSizer(wxVERTICAL);
628 wint->SetSizer(bsTrkButtonsInner);
630 btnTrkNew =
new wxButton(wint, -1, _(
"&Start Track"));
631 bsTrkButtonsInner->Add(btnTrkNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
632 btnTrkNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
633 wxCommandEventHandler(RouteManagerDialog::OnTrkNewClick),
636 btnTrkProperties =
new wxButton(wint, -1, _(
"&Properties"));
637 bsTrkButtonsInner->Add(btnTrkProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
638 btnTrkProperties->Connect(
639 wxEVT_COMMAND_BUTTON_CLICKED,
640 wxCommandEventHandler(RouteManagerDialog::OnTrkPropertiesClick), NULL,
643 btnTrkDelete =
new wxButton(wint, -1, _(
"&Delete"));
644 bsTrkButtonsInner->Add(btnTrkDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
645 btnTrkDelete->Connect(
646 wxEVT_COMMAND_BUTTON_CLICKED,
647 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteClick), NULL,
this);
649 btnTrkExport =
new wxButton(wint, -1, _(
"&Export selected..."));
650 bsTrkButtonsInner->Add(btnTrkExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
651 btnTrkExport->Connect(
652 wxEVT_COMMAND_BUTTON_CLICKED,
653 wxCommandEventHandler(RouteManagerDialog::OnTrkExportClick), NULL,
this);
655 btnTrkRouteFromTrack =
new wxButton(wint, -1, _(
"Route from Track"));
656 bsTrkButtonsInner->Add(btnTrkRouteFromTrack, 0, wxALL | wxEXPAND,
658 btnTrkRouteFromTrack->Connect(
659 wxEVT_COMMAND_BUTTON_CLICKED,
660 wxCommandEventHandler(RouteManagerDialog::OnTrkRouteFromTrackClick), NULL,
663 btnTrkSendToPeer =
new wxButton(wint, -1, _(
"Send to &Peer"));
664 bsTrkButtonsInner->Add(btnTrkSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
665 btnTrkSendToPeer->Connect(
666 wxEVT_COMMAND_BUTTON_CLICKED,
667 wxCommandEventHandler(RouteManagerDialog::OnTrkSendToPeerClick), NULL,
670 bsTrkButtonsInner->AddSpacer(10);
672 btnTrkDeleteAll =
new wxButton(wint, -1, _(
"&Delete All"));
673 bsTrkButtonsInner->Add(btnTrkDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
674 btnTrkDeleteAll->Connect(
675 wxEVT_COMMAND_BUTTON_CLICKED,
676 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteAllClick), NULL,
680 m_pPanelWpt =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
681 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
682 wxBoxSizer *sbsWpts =
new wxBoxSizer(wxHORIZONTAL);
683 m_pPanelWpt->SetSizer(sbsWpts);
684 m_pNotebook->AddPage(m_pPanelWpt, _(
"Marks"));
686 wxBoxSizer *bSizerWptContents;
687 bSizerWptContents =
new wxBoxSizer(wxVERTICAL);
689 wxFlexGridSizer *fgSizerFilterWpt;
690 fgSizerFilterWpt =
new wxFlexGridSizer(0, 2, 0, 0);
691 fgSizerFilterWpt->AddGrowableCol(1);
692 fgSizerFilterWpt->SetFlexibleDirection(wxBOTH);
693 fgSizerFilterWpt->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
695 m_stFilterWpt =
new wxStaticText(m_pPanelWpt, wxID_ANY, _(
"Filter"),
696 wxDefaultPosition, wxDefaultSize, 0);
697 m_stFilterWpt->Wrap(-1);
698 fgSizerFilterWpt->Add(m_stFilterWpt, 0, wxALL, 5);
700 m_tFilterWpt =
new wxTextCtrl(m_pPanelWpt, wxID_ANY,
"", wxDefaultPosition,
702 fgSizerFilterWpt->Add(m_tFilterWpt, 1, wxALL | wxEXPAND, 5);
704 bSizerWptContents->Add(fgSizerFilterWpt, 0, wxEXPAND, 5);
705 m_tFilterWpt->Connect(
706 wxEVT_COMMAND_TEXT_UPDATED,
707 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
709 m_cbShowAllWP =
new wxCheckBox(m_pPanelWpt, wxID_ANY, _(
"Show all marks"));
710 bSizerWptContents->Add(m_cbShowAllWP, 0, wxEXPAND | wxLEFT, 5);
711 m_cbShowAllWP->Connect(
712 wxEVT_COMMAND_CHECKBOX_CLICKED,
713 wxCommandEventHandler(RouteManagerDialog::OnShowAllWpCBClicked), NULL,
717 new wxListCtrl(m_pPanelWpt, -1, wxDefaultPosition, wxDefaultSize,
718 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
721 m_pWptListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
724 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
725 wxListEventHandler(RouteManagerDialog::OnWptSelected),
727 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
728 wxListEventHandler(RouteManagerDialog::OnWptSelected),
730 m_pWptListCtrl->Connect(
731 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
732 wxListEventHandler(RouteManagerDialog::OnWptDefaultAction), NULL,
this);
733 m_pWptListCtrl->Connect(
735 wxMouseEventHandler(RouteManagerDialog::OnWptToggleVisibility), NULL,
737 m_pWptListCtrl->Connect(
738 wxEVT_COMMAND_LIST_COL_CLICK,
739 wxListEventHandler(RouteManagerDialog::OnWptColumnClicked), NULL,
this);
740 bSizerWptContents->Add(m_pWptListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
741 sbsWpts->Add(bSizerWptContents, 1, wxEXPAND, 5);
743 m_pWptListCtrl->InsertColumn(colWPTICON, _(
"Icon"), wxLIST_FORMAT_LEFT,
745 m_pWptListCtrl->InsertColumn(colWPTSCALE, _(
"Scale"), wxLIST_FORMAT_LEFT,
747 m_pWptListCtrl->InsertColumn(colWPTNAME, _(
"Mark Name"), wxLIST_FORMAT_LEFT,
749 m_pWptListCtrl->InsertColumn(colWPTDIST, _(
"Distance from own ship"),
750 wxLIST_FORMAT_LEFT, 14 * char_width);
752 wxBoxSizer *bsWptButtons =
new wxBoxSizer(wxVERTICAL);
753 sbsWpts->Add(bsWptButtons, 0, wxEXPAND);
755 wxScrolledWindow *winw =
new wxScrolledWindow(
756 m_pPanelWpt, wxID_ANY, wxDefaultPosition, wxDefaultSize,
757 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
758 winw->SetScrollRate(0, 5);
760 bsWptButtons->Add(winw, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
762 wxBoxSizer *bsWptButtonsInner =
new wxBoxSizer(wxVERTICAL);
763 winw->SetSizer(bsWptButtonsInner);
765 btnWptNew =
new wxButton(winw, -1, _(
"&New"));
766 bsWptButtonsInner->Add(btnWptNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
767 btnWptNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
768 wxCommandEventHandler(RouteManagerDialog::OnWptNewClick),
771 btnWptProperties =
new wxButton(winw, -1, _(
"&Properties"));
772 bsWptButtonsInner->Add(btnWptProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
773 btnWptProperties->Connect(
774 wxEVT_COMMAND_BUTTON_CLICKED,
775 wxCommandEventHandler(RouteManagerDialog::OnWptPropertiesClick), NULL,
778 btnWptZoomto =
new wxButton(winw, -1, _(
"&Center View"));
779 bsWptButtonsInner->Add(btnWptZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
780 btnWptZoomto->Connect(
781 wxEVT_COMMAND_BUTTON_CLICKED,
782 wxCommandEventHandler(RouteManagerDialog::OnWptZoomtoClick), NULL,
this);
784 btnWptDelete =
new wxButton(winw, -1, _(
"&Delete"));
785 bsWptButtonsInner->Add(btnWptDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
786 btnWptDelete->Connect(
787 wxEVT_COMMAND_BUTTON_CLICKED,
788 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteClick), NULL,
this);
790 btnWptGoTo =
new wxButton(winw, -1, _(
"&Go To"));
791 bsWptButtonsInner->Add(btnWptGoTo, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
792 btnWptGoTo->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
793 wxCommandEventHandler(RouteManagerDialog::OnWptGoToClick),
796 btnWptExport =
new wxButton(winw, -1, _(
"&Export selected..."));
797 bsWptButtonsInner->Add(btnWptExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
798 btnWptExport->Connect(
799 wxEVT_COMMAND_BUTTON_CLICKED,
800 wxCommandEventHandler(RouteManagerDialog::OnWptExportClick), NULL,
this);
802 btnWptSendToGPS =
new wxButton(winw, -1, _(
"&Send to GPS"));
803 bsWptButtonsInner->Add(btnWptSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
804 btnWptSendToGPS->Connect(
805 wxEVT_COMMAND_BUTTON_CLICKED,
806 wxCommandEventHandler(RouteManagerDialog::OnWptSendToGPSClick), NULL,
809 btnWptSendToPeer =
new wxButton(winw, -1, _(
"Send to &Peer"));
810 bsWptButtonsInner->Add(btnWptSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
811 btnWptSendToPeer->Connect(
812 wxEVT_COMMAND_BUTTON_CLICKED,
813 wxCommandEventHandler(RouteManagerDialog::OnWptSendToPeerClick), NULL,
816 bsWptButtonsInner->AddSpacer(10);
818 btnWptDeleteAll =
new wxButton(winw, -1, _(
"Delete All"));
819 bsWptButtonsInner->Add(btnWptDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
820 btnWptDeleteAll->Connect(
821 wxEVT_COMMAND_BUTTON_CLICKED,
822 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteAllClick), NULL,
825 wxBoxSizer *itemBoxSizer5 =
new wxBoxSizer(wxHORIZONTAL);
826 itemBoxSizer1->Add(itemBoxSizer5, 0, wxALL | wxEXPAND);
828 wxBoxSizer *itemBoxSizer6 =
new wxBoxSizer(wxHORIZONTAL);
829 itemBoxSizer5->Add(itemBoxSizer6, 1, wxALL | wxEXPAND);
831 btnImport =
new wxButton(
this, -1, _(
"I&mport GPX..."));
832 itemBoxSizer6->Add(btnImport, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
833 btnImport->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
834 wxCommandEventHandler(RouteManagerDialog::OnImportClick),
843 btnExportViz =
new wxButton(
this, -1, _(
"Export All Visible..."));
844 itemBoxSizer6->Add(btnExportViz, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
845 btnExportViz->Connect(
846 wxEVT_COMMAND_BUTTON_CLICKED,
847 wxCommandEventHandler(RouteManagerDialog::OnExportVizClick), NULL,
this);
849 btnBackup =
new wxButton(
this, -1, _(
"Backup..."));
850 itemBoxSizer6->Add(btnBackup, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
851 btnBackup->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
852 wxCommandEventHandler(RouteManagerDialog::OnBackupClick),
855 wxSize sz = ::wxGetDisplaySize();
857 itemBoxSizer6->Add(0, 0, 1, wxEXPAND, 5);
858 itemBoxSizer6->Add(
new wxButton(
this, wxID_OK), 0, wxALL, DIALOG_MARGIN);
860 wxStaticLine *staticLine121 =
new wxStaticLine(
861 this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
862 itemBoxSizer1->Add(staticLine121, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
864 wxBoxSizer *itemBoxSizer7 =
new wxBoxSizer(wxHORIZONTAL);
865 itemBoxSizer1->Add(itemBoxSizer7, 0, wxEXPAND);
867 wxBoxSizer *itemBoxSizer7a =
new wxBoxSizer(wxHORIZONTAL);
868 itemBoxSizer7->Add(itemBoxSizer7a, 1, wxEXPAND);
870 itemBoxSizer7a->AddStretchSpacer();
871 itemBoxSizer7a->Add(
new wxButton(
this, wxID_OK), 0, wxRIGHT | wxALIGN_RIGHT,
876 m_pPanelLay =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
877 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
878 wxBoxSizer *sbsLayers =
new wxBoxSizer(wxHORIZONTAL);
879 m_pPanelLay->SetSizer(sbsLayers);
880 m_pNotebook->AddPage(m_pPanelLay, _(
"Layers"));
882 wxBoxSizer *bSizerLayContents;
883 bSizerLayContents =
new wxBoxSizer(wxVERTICAL);
885 wxFlexGridSizer *fgSizerFilterLay;
886 fgSizerFilterLay =
new wxFlexGridSizer(0, 2, 0, 0);
887 fgSizerFilterLay->AddGrowableCol(1);
888 fgSizerFilterLay->SetFlexibleDirection(wxBOTH);
889 fgSizerFilterLay->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
891 m_stFilterLay =
new wxStaticText(m_pPanelLay, wxID_ANY, _(
"Filter"),
892 wxDefaultPosition, wxDefaultSize, 0);
893 m_stFilterLay->Wrap(-1);
894 fgSizerFilterLay->Add(m_stFilterLay, 0, wxALL, 5);
896 m_tFilterLay =
new wxTextCtrl(m_pPanelLay, wxID_ANY,
"", wxDefaultPosition,
898 fgSizerFilterLay->Add(m_tFilterLay, 1, wxALL | wxEXPAND, 5);
900 bSizerLayContents->Add(fgSizerFilterLay, 0, wxEXPAND, 5);
901 m_tFilterLay->Connect(
902 wxEVT_COMMAND_TEXT_UPDATED,
903 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
905 m_cbShowAllLay =
new wxCheckBox(m_pPanelLay, wxID_ANY, _(
"Show all layers"));
906 bSizerLayContents->Add(m_cbShowAllLay, 0, wxEXPAND | wxLEFT, 5);
907 m_cbShowAllLay->Connect(
908 wxEVT_COMMAND_CHECKBOX_CLICKED,
909 wxCommandEventHandler(RouteManagerDialog::OnShowAllLayCBClicked), NULL,
913 new wxListCtrl(m_pPanelLay, -1, wxDefaultPosition, wxDefaultSize,
914 wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING |
915 wxLC_HRULES | wxBORDER_SUNKEN );
917 m_pLayListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
920 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
921 wxListEventHandler(RouteManagerDialog::OnLaySelected),
923 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
924 wxListEventHandler(RouteManagerDialog::OnLaySelected),
926 m_pLayListCtrl->Connect(
927 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
928 wxListEventHandler(RouteManagerDialog::OnLayDefaultAction), NULL,
this);
929 m_pLayListCtrl->Connect(
931 wxMouseEventHandler(RouteManagerDialog::OnLayToggleVisibility), NULL,
933 m_pLayListCtrl->Connect(
934 wxEVT_COMMAND_LIST_COL_CLICK,
935 wxListEventHandler(RouteManagerDialog::OnLayColumnClicked), NULL,
this);
936 bSizerLayContents->Add(m_pLayListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
937 sbsLayers->Add(bSizerLayContents, 1, wxEXPAND, 5);
939 m_pLayListCtrl->InsertColumn(colLAYVISIBLE,
"", wxLIST_FORMAT_LEFT,
941 m_pLayListCtrl->InsertColumn(colLAYNAME, _(
"Layer Name"), wxLIST_FORMAT_LEFT,
943 m_pLayListCtrl->InsertColumn(colLAYITEMS, _(
"No. of items"),
944 wxLIST_FORMAT_LEFT, 10 * char_width);
945 m_pLayListCtrl->InsertColumn(colLAYPERSIST, _(
"Layer type"),
946 wxLIST_FORMAT_LEFT, 10 * char_width);
948 wxBoxSizer *bsLayButtons =
new wxBoxSizer(wxVERTICAL);
949 sbsLayers->Add(bsLayButtons, 0, wxEXPAND);
951 wxScrolledWindow *winl =
new wxScrolledWindow(
952 m_pPanelLay, wxID_ANY, wxDefaultPosition, wxDefaultSize,
953 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
954 winl->SetScrollRate(0, 5);
956 bsLayButtons->Add(winl, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
958 wxBoxSizer *bsLayButtonsInner =
new wxBoxSizer(wxVERTICAL);
959 winl->SetSizer(bsLayButtonsInner);
961 btnLayNew =
new wxButton(winl, -1, _(
"Create Temporary layer"));
962 bsLayButtonsInner->Add(btnLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
963 btnLayNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
964 wxCommandEventHandler(RouteManagerDialog::OnLayNewClick),
967 btnPerLayNew =
new wxButton(winl, -1, _(
"Create Persistent layer"));
968 bsLayButtonsInner->Add(btnPerLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
969 btnPerLayNew->Connect(
970 wxEVT_COMMAND_BUTTON_CLICKED,
971 wxCommandEventHandler(RouteManagerDialog::OnPerLayNewClick), NULL,
this);
973 btnLayDelete =
new wxButton(winl, -1, _(
"&Delete"));
974 bsLayButtonsInner->Add(btnLayDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
975 btnLayDelete->Connect(
976 wxEVT_COMMAND_BUTTON_CLICKED,
977 wxCommandEventHandler(RouteManagerDialog::OnLayDeleteClick), NULL,
this);
979 cbLayToggleChart =
new wxCheckBox(winl, -1, _(
"Show on chart"));
980 bsLayButtonsInner->Add(cbLayToggleChart, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
981 cbLayToggleChart->Connect(
982 wxEVT_COMMAND_CHECKBOX_CLICKED,
983 wxCommandEventHandler(RouteManagerDialog::OnLayToggleChartClick), NULL,
987 new wxCheckBox(winl, -1, _(
"Show WPT names"), wxDefaultPosition,
988 wxDefaultSize, wxCHK_3STATE);
990 bsLayButtonsInner->Add(cbLayToggleNames, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
991 cbLayToggleNames->Connect(
992 wxEVT_COMMAND_CHECKBOX_CLICKED,
993 wxCommandEventHandler(RouteManagerDialog::OnLayToggleNamesClick), NULL,
996 cbLayToggleListing =
new wxCheckBox(winl, -1, _(
"List contents"));
997 bsLayButtonsInner->Add(cbLayToggleListing, 0, wxALL | wxEXPAND,
999 cbLayToggleListing->Connect(
1000 wxEVT_COMMAND_CHECKBOX_CLICKED,
1001 wxCommandEventHandler(RouteManagerDialog::OnLayToggleListingClick), NULL,
1006 int imageRefSize = m_charWidth * 2;
1007 wxImageList *imglist =
new wxImageList(imageRefSize, imageRefSize,
true, 1);
1010 wxString UserIconPath = g_Platform->GetSharedDataDir() +
"uidata" +
1011 wxFileName::GetPathSeparator();
1013 LoadSVG(UserIconPath +
"eye.svg", imageRefSize, imageRefSize)
1015 if (iconSVG.IsOk()) {
1016 iconSVG.Resize(wxSize(imageRefSize, imageRefSize),
1018 imglist->Add(wxBitmap(iconSVG));
1021 iconSVG =
LoadSVG(UserIconPath +
"eyex.svg", imageRefSize, imageRefSize)
1023 if (iconSVG.IsOk()) {
1024 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1025 imglist->Add(wxBitmap(iconSVG));
1028 iconSVG =
LoadSVG(UserIconPath +
"eyeGray.svg", imageRefSize, imageRefSize)
1030 if (iconSVG.IsOk()) {
1031 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1032 imglist->Add(wxBitmap(iconSVG));
1035 m_pRouteListCtrl->AssignImageList(imglist, wxIMAGE_LIST_SMALL);
1038 m_pRouteListCtrl->GetHandle()->setIconSize(QSize(imageRefSize, imageRefSize));
1042 m_pTrkListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1043 m_pWptListCtrl->SetImageList(
1044 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
1045 wxIMAGE_LIST_SMALL);
1046 m_pLayListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1056 m_bNeedConfigFlush =
false;
1059RouteManagerDialog::~RouteManagerDialog() {
1060 delete m_pRouteListCtrl;
1061 delete m_pTrkListCtrl;
1062 delete m_pWptListCtrl;
1063 delete m_pLayListCtrl;
1065 delete btnRteDelete;
1066 delete btnRteResequence;
1067 delete btnRteExport;
1068 delete btnRteZoomto;
1069 delete btnRteProperties;
1070 delete btnRteActivate;
1071 delete btnRteReverse;
1072 delete btnRteSendToGPS;
1073 delete btnRteDeleteAll;
1075 delete btnTrkProperties;
1076 delete btnTrkDelete;
1077 delete btnTrkExport;
1078 delete btnTrkRouteFromTrack;
1079 delete btnTrkDeleteAll;
1081 delete btnWptProperties;
1082 delete btnWptZoomto;
1083 delete btnWptDelete;
1085 delete btnWptExport;
1086 delete btnWptSendToGPS;
1087 delete btnWptDeleteAll;
1090 delete cbLayToggleChart;
1091 delete cbLayToggleListing;
1092 delete cbLayToggleNames;
1093 delete btnLayDelete;
1096 delete btnExportViz;
1099 btnExportViz = NULL;
1102 instanceFlag =
false;
1105void RouteManagerDialog::RecalculateSize() {
1111 int char_width, char_height;
1112 GetTextExtent(
"W", &char_width, &char_height);
1115 sz.x = 60 * char_width;
1116 sz.y = 30 * char_height;
1118 wxSize dsize = GetParent()->GetClientSize();
1119 sz.y = wxMin(sz.y, dsize.y);
1120 sz.x = wxMin(sz.x, dsize.x);
1123 wxSize fsize = GetSize();
1124 fsize.y = wxMin(fsize.y, dsize.y);
1125 fsize.x = wxMin(fsize.x, dsize.x);
1131void RouteManagerDialog::OnClose(wxCloseEvent &event) {
1139void RouteManagerDialog::OnOK(wxCommandEvent &event) {
1146void RouteManagerDialog::SetColorScheme() { DimeControl(
this); }
1148void RouteManagerDialog::OnShowAllRteCBClicked(wxCommandEvent &event) {
1149 bool viz = m_cbShowAllRte->GetValue();
1151 int item_count = m_pRouteListCtrl->GetItemCount();
1153 if (item_count > 50) {
1155 ::wxBeginBusyCursor();
1158 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1159 wxLIST_STATE_DONTCARE);
1160 if (item == -1)
break;
1162 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1164 pR->SetVisible(viz, viz);
1165 pR->SetSharedWPViz(viz);
1167 m_pRouteListCtrl->SetItemImage(item, !viz);
1169 NavObj_dB::GetInstance().UpdateRouteViz(pR);
1172 if (busy) ::wxEndBusyCursor();
1174 UpdateWptListCtrlViz();
1175 gFrame->RefreshAllCanvas();
1178void RouteManagerDialog::OnShowAllWpCBClicked(wxCommandEvent &event) {
1179 bool viz = m_cbShowAllWP->GetValue();
1181 int item_count = m_pWptListCtrl->GetItemCount();
1183 if (item_count > 100) {
1185 ::wxBeginBusyCursor();
1189 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1190 wxLIST_STATE_DONTCARE);
1191 if (item == -1)
break;
1195 if (!pRP->IsSharedInVisibleRoute()) {
1196 pRP->SetVisible(viz);
1198 pRP->SetVisible(
true);
1200 m_pWptListCtrl->SetItemImage(item,
RoutePointGui(*pRP).GetIconImageIndex());
1201 NavObj_dB::GetInstance().UpdateDBRoutePointViz(pRP);
1204 if (busy) ::wxEndBusyCursor();
1206 gFrame->RefreshAllCanvas();
1209void RouteManagerDialog::OnShowAllTrkCBClicked(wxCommandEvent &event) {
1210 bool viz = m_cbShowAllTrk->GetValue();
1213 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1214 wxLIST_STATE_DONTCARE);
1215 if (item == -1)
break;
1217 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1219 track->SetVisible(viz);
1220 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
1221 m_pTrkListCtrl->SetItemImage(item, track->IsVisible() ? 0 : 1);
1224 gFrame->RefreshAllCanvas();
1227void RouteManagerDialog::OnShowAllLayCBClicked(wxCommandEvent &event) {
1228 bool viz = m_cbShowAllLay->GetValue();
1231 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1232 wxLIST_STATE_DONTCARE);
1233 if (item == -1)
break;
1235 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
1237 layer->SetVisibleOnChart(viz);
1238 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
1240 ToggleLayerContentsOnChart(layer);
1243 gFrame->RefreshAllCanvas();
1246void RouteManagerDialog::UpdateRouteListCtrl() {
1249 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1250 wxLIST_STATE_SELECTED);
1251 wxUIntPtr selected_id = wxUIntPtr(0);
1252 if (item != -1) selected_id = m_pRouteListCtrl->GetItemData(item);
1255 m_pRouteListCtrl->DeleteAllItems();
1258 RouteList::iterator it;
1261 bool bpartialViz =
false;
1263 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1264 if (!(*it)->IsListed())
continue;
1266 if (!(*it)->GetName().Upper().Contains(m_tFilterRte->GetValue().Upper())) {
1271 li.SetId(list_index);
1272 li.SetImage((*it)->IsVisible() ? 0 : 1);
1275 li.SetAlign(wxLIST_FORMAT_LEFT);
1277 if ((*it)->m_bRtIsActive) {
1278 wxFont font = *wxNORMAL_FONT;
1279 font.SetWeight(wxFONTWEIGHT_BOLD);
1283 long idx = m_pRouteListCtrl->InsertItem(li);
1285 wxString name = (*it)->m_RouteNameString;
1286 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
1287 m_pRouteListCtrl->SetItem(idx, rmROUTENAME, name);
1289 wxString startend = (*it)->m_RouteStartString;
1290 if (!(*it)->m_RouteEndString.IsEmpty())
1291 startend.append(_(
" - ") + (*it)->m_RouteEndString);
1292 m_pRouteListCtrl->SetItem(idx, rmROUTEDESC, startend);
1295 lic.SetId(list_index);
1297 lic.SetAlign(wxLIST_FORMAT_LEFT);
1298 m_pRouteListCtrl->SetItem(lic);
1301 lic.SetAlign(wxLIST_FORMAT_LEFT);
1302 m_pRouteListCtrl->SetItem(lic);
1305 if (!(*it)->IsVisible()) bpartialViz =
true;
1310 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1312 m_pRouteListCtrl->SetColumnWidth(0, 4 * m_charWidth);
1317 if (selected_id != wxUIntPtr(0)) {
1318 item = m_pRouteListCtrl->FindItem(-1, selected_id);
1319 m_pRouteListCtrl->SetItemState(
1320 item, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
1321 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
1324 if ((m_lastRteItem >= 0) && (m_pRouteListCtrl->GetItemCount()))
1325 m_pRouteListCtrl->EnsureVisible(m_lastRteItem);
1329 m_cbShowAllRte->SetValue(!bpartialViz);
1332void RouteManagerDialog::UpdateRteButtons() {
1334 long selected_index_index =
1335 m_pRouteListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1336 bool enable1 = m_pRouteListCtrl->GetSelectedItemCount() == 1;
1337 bool enablemultiple = m_pRouteListCtrl->GetSelectedItemCount() >= 1;
1339 m_lastRteItem = selected_index_index;
1341 btnRteDelete->Enable(m_pRouteListCtrl->GetSelectedItemCount() > 0);
1342 btnRteZoomto->Enable(enable1);
1343 btnRteProperties->Enable(enable1);
1344 btnRteReverse->Enable(enable1);
1345 btnRteExport->Enable(enablemultiple);
1346 btnRteResequence->Enable(enable1);
1347 btnRteSendToGPS->Enable(enable1);
1348 btnRteDeleteAll->Enable(m_pRouteListCtrl->GetItemCount() > 0);
1349 btnRteSendToPeer->Enable(enablemultiple);
1352 Route *route = NULL;
1354 route = (
Route *)m_pRouteListCtrl->GetItemData(selected_index_index);
1357 btnRteActivate->Enable(enable1);
1358 if (enable1) btnRteActivate->SetLabel(_(
"Activate"));
1363 btnRteActivate->Enable(enable1);
1364 btnRteActivate->SetLabel(_(
"Deactivate"));
1366 btnRteActivate->Enable(
false);
1368 btnRteActivate->Enable(
false);
1372void RouteManagerDialog::MakeAllRoutesInvisible() {
1373 RouteList::iterator it;
1375 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1376 if ((*it)->IsVisible()) {
1377 (*it)->SetVisible(
false);
1378 m_pRouteListCtrl->SetItemImage(m_pRouteListCtrl->FindItem(-1, index),
1380 NavObj_dB::GetInstance().UpdateRoute(*it);
1385void RouteManagerDialog::ZoomtoRoute(
Route *route) {
1387 LLBBox RBBox = route->GetBBox();
1388 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
1389 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
1395 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1396 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
1398 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1399 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
1401 if (gFrame->GetFocusCanvas()) {
1402 gFrame->GetFocusCanvas()->GetSize(&ww, &wh);
1403 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
1404 ppm = wxMin(ppm, 1.0);
1406 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), clat, clon, ppm);
1409 m_bNeedConfigFlush =
true;
1413void RouteManagerDialog::OnRteDeleteClick(wxCommandEvent &event) {
1414 int count = m_pRouteListCtrl->GetSelectedItemCount();
1415 bool confirmed = RouteGui::OnDelete(
this, count);
1417 if (confirmed && count > 0) {
1418 ::wxBeginBusyCursor();
1421 gFrame->CancelAllMouseRoute();
1422 m_bNeedConfigFlush =
true;
1426 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1427 wxLIST_STATE_SELECTED);
1428 if (item == -1)
break;
1430 Route *proute_to_delete = (
Route *)m_pRouteListCtrl->GetItemData(item);
1432 if (proute_to_delete) list.push_back(proute_to_delete);
1434 for (
Route *route : list) {
1436 NavObj_dB::GetInstance().DeleteRoute(route);
1442 UpdateRouteListCtrl();
1443 UpdateTrkListCtrl();
1445 gFrame->InvalidateAllCanvasUndo();
1446 gFrame->RefreshAllCanvas();
1447 ::wxEndBusyCursor();
1451void RouteManagerDialog::OnRteDeleteAllClick(wxCommandEvent &event) {
1453 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> routes?"),
1454 wxString(_(
"OpenCPN Alert")), wxYES_NO);
1456 if (dialog_ret == wxID_YES) {
1459 gFrame->CancelAllMouseRoute();
1464 UpdateRouteListCtrl();
1468 UpdateTrkListCtrl();
1471 gFrame->InvalidateAllCanvasUndo();
1472 gFrame->RefreshAllCanvas();
1474 m_bNeedConfigFlush =
true;
1478void RouteManagerDialog::OnRtePropertiesClick(wxCommandEvent &event) {
1481 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1482 wxLIST_STATE_SELECTED);
1483 if (item == -1)
return;
1485 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1497 m_bNeedConfigFlush =
true;
1500void RouteManagerDialog::OnRteZoomtoClick(wxCommandEvent &event) {
1503 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1504 wxLIST_STATE_SELECTED);
1505 if (item == -1)
return;
1508 if (m_bCtrlDown) MakeAllRoutesInvisible();
1510 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1515 if (!route->IsVisible()) {
1516 route->SetVisible(
true);
1517 m_pRouteListCtrl->SetItemImage(item, route->IsVisible() ? 0 : 1);
1518 NavObj_dB::GetInstance().UpdateRoute(route);
1524void RouteManagerDialog::OnRteReverseClick(wxCommandEvent &event) {
1527 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1528 wxLIST_STATE_SELECTED);
1529 if (item == -1)
return;
1531 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1536 int ask_return = OCPNMessageBox(
this,
g_pRouteMan->GetRouteReverseMessage(),
1537 _(
"Rename Waypoints?"), wxYES_NO | wxCANCEL);
1538 if (ask_return != wxID_CANCEL) {
1539 bool rename = (ask_return == wxID_YES);
1541 pSelect->DeleteAllSelectableRouteSegments(route);
1542 route->Reverse(rename);
1543 pSelect->AddAllSelectableRouteSegments(route);
1549 m_pRouteListCtrl->SetItem(item, 2, startend);
1551 NavObj_dB::GetInstance().UpdateRoute(route);
1553 gFrame->RefreshAllCanvas();
1556 m_bNeedConfigFlush =
true;
1559void RouteManagerDialog::OnRteExportClick(wxCommandEvent &event) {
1562 wxString suggested_name =
"routes";
1566 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1567 wxLIST_STATE_SELECTED);
1568 if (item == -1)
break;
1570 Route *proute_to_export = (
Route *)m_pRouteListCtrl->GetItemData(item);
1572 if (proute_to_export) {
1573 list.push_back(proute_to_export);
1579 ExportGPXRoutes(
this, &list, suggested_name);
1582void RouteManagerDialog::OnRteResequenceClick(wxCommandEvent &event) {
1584 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1585 wxLIST_STATE_SELECTED);
1586 if (item == -1)
return;
1588 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1592 route->RenameRoutePoints();
1595void RouteManagerDialog::OnRteSendToPeerClick(wxCommandEvent &event) {
1596 std::vector<Route *> list;
1599 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1600 wxLIST_STATE_SELECTED);
1601 if (item == -1)
break;
1603 Route *proute = (
Route *)m_pRouteListCtrl->GetItemData(item);
1606 list.push_back(proute);
1609 if (!list.empty()) {
1611 for (
auto r : list) {
1618 MdnsCache::GetInstance().
Validate();
1619 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1622 dlg.Create(NULL, -1, _(
"Send Route(s) to OpenCPN Peer") +
"...",
"");
1627void RouteManagerDialog::OnWptSendToPeerClick(wxCommandEvent &event) {
1628 std::vector<RoutePoint *> list;
1631 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1632 wxLIST_STATE_SELECTED);
1633 if (item == -1)
break;
1638 list.push_back(proutep);
1641 if (!list.empty()) {
1643 for (
auto r : list) {
1650 MdnsCache::GetInstance().
Validate();
1651 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1654 dlg.Create(NULL, -1, _(
"Send Waypoint(s) to OpenCPN Peer") +
"...",
"");
1659void RouteManagerDialog::OnTrkSendToPeerClick(wxCommandEvent &event) {
1660 std::vector<Track *> list;
1663 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1664 wxLIST_STATE_SELECTED);
1665 if (item == -1)
break;
1667 Track *ptrk = (
Track *)m_pTrkListCtrl->GetItemData(item);
1670 list.push_back(ptrk);
1673 if (!list.empty()) {
1675 for (
auto r : list) {
1682 MdnsCache::GetInstance().
Validate();
1683 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1686 dlg.Create(NULL, -1, _(
"Send Track(s) to OpenCPN Peer") +
"...",
"");
1691void RouteManagerDialog::OnRteActivateClick(wxCommandEvent &event) {
1694 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1695 wxLIST_STATE_SELECTED);
1696 if (item == -1)
return;
1698 if (m_bCtrlDown) MakeAllRoutesInvisible();
1700 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1705 if (!route->IsVisible()) {
1706 route->SetVisible(
true);
1707 m_pRouteListCtrl->SetItemImage(item, 0, 0);
1719 UpdateRouteListCtrl();
1721 NavObj_dB::GetInstance().UpdateRoute(route);
1723 gFrame->RefreshAllCanvas();
1728 m_bNeedConfigFlush =
true;
1731void RouteManagerDialog::OnRteToggleVisibility(wxMouseEvent &event) {
1732 wxPoint pos =
event.GetPosition();
1734 long clicked_index = m_pRouteListCtrl->HitTest(pos, flags);
1737 if (clicked_index > -1 &&
1738 event.GetX() < m_pRouteListCtrl->GetColumnWidth(rmVISIBLE)) {
1740 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1742 route->SetVisible(!route->IsVisible());
1744 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1746 ::wxBeginBusyCursor();
1748 NavObj_dB::GetInstance().UpdateRoute(route);
1750 gFrame->RefreshAllCanvas();
1754 if (
g_pRouteMan->DoesRouteContainSharedPoints(route))
1755 UpdateWptListCtrlViz();
1761 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1762 wxLIST_STATE_DONTCARE);
1763 if (item == -1)
break;
1765 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1767 if (!pR->IsVisible()) {
1772 m_cbShowAllRte->SetValue(viz);
1774 ::wxEndBusyCursor();
1781void RouteManagerDialog::OnRteBtnLeftDown(wxMouseEvent &event) {
1782 m_bCtrlDown =
event.ControlDown();
1786void RouteManagerDialog::OnRteSelected(wxListEvent &event) {
1787 long clicked_index =
event.m_itemIndex;
1789 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1791 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1793 gFrame->RefreshAllCanvas();
1798void RouteManagerDialog::OnRteColumnClicked(wxListEvent &event) {
1799 if (event.m_col == 1) {
1800 sort_route_name_dir++;
1802 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1803 }
else if (event.m_col == 2) {
1804 sort_route_to_dir++;
1805 m_pRouteListCtrl->SortItems(SortRoutesOnTo, (wxIntPtr)NULL);
1809void RouteManagerDialog::OnRteSendToGPSClick(wxCommandEvent &event) {
1811 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1812 wxLIST_STATE_SELECTED);
1813 if (item == -1)
return;
1815 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1820 pdlg->SetRoute(route);
1826 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
1829 HideWithEffect(wxSHOW_EFFECT_BLEND);
1835 ShowWithEffect(wxSHOW_EFFECT_BLEND);
1841void RouteManagerDialog::OnRteDefaultAction(wxListEvent &event) {
1843 OnRtePropertiesClick(evt);
1846void RouteManagerDialog::OnTrkDefaultAction(wxListEvent &event) {
1848 OnTrkPropertiesClick(evt);
1851void RouteManagerDialog::OnTrkRightClick(wxListEvent &event) {
1853 wxMenuItem *mergeItem = menu.Append(TRACK_MERGE, _(
"&Merge Selected Tracks"));
1854 mergeItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 1);
1855 wxMenuItem *cleanItem = menu.Append(TRACK_CLEAN, _(
"Reduce Data..."));
1856 cleanItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() == 1);
1857 wxMenuItem *copyItem = menu.Append(TRACK_COPY_TEXT, _(
"&Copy as text"));
1858 copyItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 0);
1862static bool CompareTracks(
Track *track1,
Track *track2) {
1868void RouteManagerDialog::OnTrkMenuSelected(wxCommandEvent &event) {
1871 switch (event.GetId()) {
1873 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1874 wxLIST_STATE_SELECTED);
1875 if (item == -1)
break;
1876 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1877 if (track->IsRunning()) {
1882 const wxString choices[] = {
"5.0",
"10.0",
"20.0",
"50.0",
"100.0"};
1884 wxSingleChoiceDialog precisionDlg(
this,
1885 _(
"Select the maximum error allowed "
1886 "(in meters)\nafter data reduction:"),
1887 _(
"Reduce Data Precision"), 5, choices);
1889 precisionDlg.ShowWindowModal();
1890 while (precisionDlg.IsShown()) {
1894 int result = precisionDlg.GetReturnCode();
1896 int result = precisionDlg.ShowModal();
1898 if (result == wxID_CANCEL)
break;
1899 double precision = 5.0;
1900 switch (precisionDlg.GetSelection()) {
1918 int pointsBefore = track->GetnPoints();
1920 int reduction = track->Simplify(precision);
1921 gFrame->Refresh(
false);
1923 reduction = 100 * reduction / pointsBefore;
1924 wxString msg = wxString::Format(
1925 _(
"The amount of data used by the track\n was reduced by %d%%."),
1927 OCPNMessageBox(
this, msg, _(
"OpenCPN info"), wxICON_INFORMATION | wxOK);
1929 UpdateTrkListCtrl();
1930 UpdateRouteListCtrl();
1935 case TRACK_COPY_TEXT: {
1938 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1939 wxLIST_STATE_SELECTED);
1940 if (item == -1)
break;
1941 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1942 csvString << track->GetName() <<
"\t"
1943 << wxString::Format(
"%.1f", track->Length()) <<
"\t"
1947 if (wxTheClipboard->Open()) {
1948 wxTextDataObject *data =
new wxTextDataObject;
1949 data->SetText(csvString);
1950 wxTheClipboard->SetData(data);
1951 wxTheClipboard->Close();
1958 Track *targetTrack = NULL;
1962 std::vector<Track *> mergeList;
1963 std::vector<Track *> deleteList;
1964 bool runningSkipped =
false;
1966 ::wxBeginBusyCursor();
1969 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1970 wxLIST_STATE_SELECTED);
1971 if (item == -1)
break;
1972 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1973 mergeList.push_back(track);
1976 if (!mergeList.size()) {
1977 ::wxEndBusyCursor();
1981 std::sort(mergeList.begin(), mergeList.end(), CompareTracks);
1983 targetTrack = mergeList[0];
1984 lastPoint = targetTrack->GetLastPoint();
1986 for (
auto const &mergeTrack : mergeList) {
1987 if (mergeTrack == *mergeList.begin())
continue;
1989 if (mergeTrack->IsRunning()) {
1990 runningSkipped =
true;
1994 for (
int i = 0; i < mergeTrack->GetnPoints(); i++) {
1995 tPoint = mergeTrack->GetPoint(i);
1996 newPoint =
new TrackPoint(tPoint->m_lat, tPoint->m_lon,
1999 targetTrack->AddPoint(newPoint);
2000 NavObj_dB::GetInstance().AddTrackPoint(targetTrack, newPoint);
2002 pSelect->AddSelectableTrackSegment(lastPoint->m_lat, lastPoint->m_lon,
2003 newPoint->m_lat, newPoint->m_lon,
2004 lastPoint, newPoint, targetTrack);
2005 lastPoint = newPoint;
2007 deleteList.push_back(mergeTrack);
2010 for (
auto const &deleteTrack : deleteList) {
2011 g_pAIS->DeletePersistentTrack(deleteTrack);
2012 NavObj_dB::GetInstance().DeleteTrack(deleteTrack);
2013 RoutemanGui(*g_pRouteMan).DeleteTrack(deleteTrack);
2019 ::wxEndBusyCursor();
2021 UpdateTrkListCtrl();
2022 UpdateRouteListCtrl();
2023 gFrame->RefreshAllCanvas();
2025 if (runningSkipped) {
2026 wxMessageDialog skipWarning(
2028 _(
"The currently running Track was not merged.\nYou can merge it "
2029 "later when it is completed."),
2030 "Warning", wxCANCEL | wxICON_WARNING);
2031 skipWarning.ShowModal();
2039void RouteManagerDialog::UpdateTrkListCtrl() {
2043 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2045 wxUIntPtr selected_id = wxUIntPtr(0);
2046 if (item != -1) selected_id = m_pTrkListCtrl->GetItemData(item);
2049 m_pTrkListCtrl->DeleteAllItems();
2052 std::vector<Track *>::iterator it;
2055 bool bpartialViz =
false;
2058 if (!trk->IsVisible()) bpartialViz =
true;
2060 if (!trk->IsListed())
continue;
2062 if (!trk->GetName(
true).Upper().Contains(
2063 m_tFilterTrk->GetValue().Upper())) {
2068 li.SetId(list_index);
2069 li.SetImage(trk->IsVisible() ? 0 : 1);
2074 wxFont font = *wxNORMAL_FONT;
2075 font.SetWeight(wxFONTWEIGHT_BOLD);
2078 long idx = m_pTrkListCtrl->InsertItem(li);
2080 m_pTrkListCtrl->SetItem(idx, colTRKNAME, trk->GetName(
true));
2083 m_pTrkListCtrl->SetItem(idx, colTRKDATE, trk->GetDateTime());
2086 len.Printf(
"%5.2f", trk->Length());
2087 m_pTrkListCtrl->SetItem(idx, colTRKLENGTH, len);
2090 lic.SetId(list_index);
2092 lic.SetAlign(wxLIST_FORMAT_LEFT);
2093 m_pTrkListCtrl->SetItem(lic);
2096 lic.SetAlign(wxLIST_FORMAT_LEFT);
2097 m_pTrkListCtrl->SetItem(lic);
2102 switch (sort_track_key) {
2103 case SORT_ON_DISTANCE:
2104 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2107 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2111 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2115 m_pTrkListCtrl->SetColumnWidth(0, 4 * m_charWidth);
2120 if (selected_id != wxUIntPtr(0)) {
2121 item = m_pTrkListCtrl->FindItem(-1, selected_id);
2122 m_pTrkListCtrl->SetItemState(item,
2123 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2124 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2127 if ((m_lastTrkItem >= 0) && (m_pTrkListCtrl->GetItemCount()))
2128 m_pTrkListCtrl->EnsureVisible(m_lastTrkItem);
2130 m_cbShowAllTrk->SetValue(!bpartialViz);
2134void RouteManagerDialog::OnTrkSelected(wxListEvent &event) {
2138void RouteManagerDialog::OnTrkColumnClicked(wxListEvent &event) {
2139 if (event.m_col == 1) {
2140 sort_track_key = SORT_ON_NAME;
2141 sort_track_name_dir++;
2142 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2143 }
else if (event.m_col == 2) {
2144 sort_track_key = SORT_ON_DISTANCE;
2145 sort_track_len_dir++;
2146 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2147 }
else if (event.m_col == 3) {
2148 sort_track_key = SORT_ON_DATE;
2149 sort_track_date_dir++;
2150 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2154void RouteManagerDialog::UpdateTrkButtons() {
2157 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2158 int items = m_pTrkListCtrl->GetSelectedItemCount();
2160 m_lastTrkItem = item;
2162 btnTrkProperties->Enable(items == 1);
2163 btnTrkDelete->Enable(items >= 1);
2164 btnTrkExport->Enable(items >= 1);
2165 btnTrkRouteFromTrack->Enable(items == 1);
2166 btnTrkDeleteAll->Enable(m_pTrkListCtrl->GetItemCount() > 0);
2167 btnTrkSendToPeer->Enable(items >= 1);
2170void RouteManagerDialog::OnTrkToggleVisibility(wxMouseEvent &event) {
2171 wxPoint pos =
event.GetPosition();
2173 long clicked_index = m_pTrkListCtrl->HitTest(pos, flags);
2176 if (clicked_index > -1 &&
2177 event.GetX() < m_pTrkListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2179 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(clicked_index);
2181 track->SetVisible(!track->IsVisible());
2182 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
2183 m_pTrkListCtrl->SetItemImage(clicked_index, track->IsVisible() ? 0 : 1);
2190 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2191 wxLIST_STATE_DONTCARE);
2192 if (item == -1)
break;
2194 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2196 if (!track->IsVisible()) {
2201 m_cbShowAllTrk->SetValue(viz);
2203 gFrame->RefreshAllCanvas();
2210void RouteManagerDialog::OnTrkNewClick(wxCommandEvent &event) {
2214 UpdateTrkListCtrl();
2217void RouteManagerDialog::OnTrkPropertiesClick(wxCommandEvent &event) {
2221 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2222 if (item == -1)
return;
2224 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2232 UpdateTrkListCtrl();
2234 m_bNeedConfigFlush =
true;
2237void RouteManagerDialog::OnTrkDeleteClick(wxCommandEvent &event) {
2238 std::vector<Track *> list;
2240 int answer = OCPNMessageBox(
2241 this, _(
"Are you sure you want to delete the selected object(s)"),
2242 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2243 if (answer != wxID_YES)
return;
2246 if (m_pTrkListCtrl->GetSelectedItemCount()) {
2247 ::wxBeginBusyCursor();
2254 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2255 wxLIST_STATE_SELECTED);
2256 if (item == -1)
break;
2258 Track *ptrack_to_delete = (
Track *)m_pTrkListCtrl->GetItemData(item);
2260 if (ptrack_to_delete) list.push_back(ptrack_to_delete);
2264 for (
unsigned int i = 0; i < list.size(); i++) {
2265 Track *track = list.at(i);
2267 g_pAIS->DeletePersistentTrack(track);
2268 NavObj_dB::GetInstance().DeleteTrack(track);
2275 UpdateTrkListCtrl();
2277 gFrame->InvalidateAllCanvasUndo();
2278 gFrame->RefreshAllCanvas();
2279 ::wxEndBusyCursor();
2283void RouteManagerDialog::OnTrkExportClick(wxCommandEvent &event) {
2284 std::vector<Track *> list;
2285 wxString suggested_name =
"tracks";
2289 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2290 wxLIST_STATE_SELECTED);
2291 if (item == -1)
break;
2293 Track *ptrack_to_export = (
Track *)m_pTrkListCtrl->GetItemData(item);
2295 if (ptrack_to_export) {
2296 list.push_back(ptrack_to_export);
2297 if (ptrack_to_export->GetName() !=
"")
2298 suggested_name = ptrack_to_export->GetName();
2302 ExportGPXTracks(
this, &list, suggested_name);
2305void RouteManagerDialog::TrackToRoute(
Track *track) {
2307 if (track->m_bIsInLayer)
return;
2309 wxGenericProgressDialog pprog(_(
"OpenCPN Converting Track to Route...."),
2310 _(
"Processing Waypoints..."), 101, NULL,
2311 wxPD_AUTO_HIDE | wxPD_SMOOTH |
2312 wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2313 wxPD_REMAINING_TIME);
2315 ::wxBeginBusyCursor();
2317 Route *route = track->RouteFromTrack(&pprog);
2321 pprog.Update(101, _(
"Done."));
2323 gFrame->RefreshAllCanvas();
2325 ::wxEndBusyCursor();
2328void RouteManagerDialog::OnTrkRouteFromTrackClick(wxCommandEvent &event) {
2331 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2332 if (item == -1)
return;
2334 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2336 TrackToRoute(track);
2338 UpdateRouteListCtrl();
2341void RouteManagerDialog::OnTrkDeleteAllClick(wxCommandEvent &event) {
2343 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> tracks?"),
2344 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2346 if (dialog_ret == wxID_YES) {
2353 UpdateTrkListCtrl();
2357 UpdateRouteListCtrl();
2361 gFrame->RefreshAllCanvas();
2363 m_bNeedConfigFlush =
true;
2366void RouteManagerDialog::UpdateWptListCtrl(
RoutePoint *rp_select,
2367 bool b_retain_sort) {
2368 wxIntPtr selected_id = wxUIntPtr(0);
2371 if (NULL == rp_select) {
2373 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2374 wxLIST_STATE_SELECTED);
2376 if (item != -1) selected_id = m_pWptListCtrl->GetItemData(item);
2380 m_pWptListCtrl->SetImageList(
2381 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
2382 wxIMAGE_LIST_SMALL);
2384 m_pWptListCtrl->DeleteAllItems();
2387 bool b_anyHidden =
false;
2389 auto node = pWayPointMan->GetWaypointList()->begin();
2391 while (node != pWayPointMan->GetWaypointList()->end()) {
2393 if (rp && rp->IsListed()) {
2399 if (!rp->GetName().Upper().Contains(m_tFilterWpt->GetValue().Upper())) {
2409 long idx = m_pWptListCtrl->InsertItem(li);
2411 wxString scamin = wxString::Format(
"%i", (
int)rp->GetScaMin());
2412 if (!rp->GetUseSca()) scamin = _(
"Always");
2413 if (g_bOverruleScaMin) scamin = _(
"Overruled");
2414 m_pWptListCtrl->SetItem(idx, colWPTSCALE, scamin);
2416 wxString name = rp->GetName();
2417 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2418 m_pWptListCtrl->SetItem(idx, colWPTNAME, name);
2421 DistanceBearingMercator(rp->m_lat, rp->m_lon,
gLat,
gLon, NULL, &dst);
2423 dist.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(dst));
2424 m_pWptListCtrl->SetItem(idx, colWPTDIST, dist);
2426 if (rp == rp_select) selected_id = (wxIntPtr)rp_select;
2431 lic.SetAlign(wxLIST_FORMAT_LEFT);
2432 m_pWptListCtrl->SetItem(lic);
2435 lic.SetAlign(wxLIST_FORMAT_LEFT);
2436 m_pWptListCtrl->SetItem(lic);
2438 if (!rp->IsVisible()) b_anyHidden =
true;
2445 if (!b_retain_sort) {
2446 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2447 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2448 sort_wp_key = SORT_ON_NAME;
2450 switch (sort_wp_key) {
2452 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2453 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2455 case SORT_ON_DISTANCE:
2456 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2457 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2462 if (selected_id != wxUIntPtr(0)) {
2463 item = m_pWptListCtrl->FindItem(-1, selected_id);
2464 m_pWptListCtrl->SetItemState(item,
2465 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2466 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2469 if ((m_lastWptItem >= 0) && (m_pWptListCtrl->GetItemCount()))
2470 m_pWptListCtrl->EnsureVisible(m_lastWptItem);
2472 if (pWayPointMan->Getpmarkicon_image_list(m_listIconSize)->GetImageCount()) {
2473 int iwidth, iheight;
2474 pWayPointMan->Getpmarkicon_image_list(m_listIconSize)
2475 ->GetSize(0, iwidth, iheight);
2477 m_pWptListCtrl->SetColumnWidth(0, wxMax(iwidth + 4, 4 * m_charWidth));
2482 m_cbShowAllWP->SetValue(!b_anyHidden);
2485void RouteManagerDialog::UpdateWptListCtrlViz() {
2488 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2489 wxLIST_STATE_DONTCARE);
2490 if (item == -1)
break;
2495 m_pWptListCtrl->SetItemImage(item, imageIndex);
2499void RouteManagerDialog::OnWptDefaultAction(wxListEvent &event) {
2501 OnWptPropertiesClick(evt);
2504void RouteManagerDialog::OnWptSelected(wxListEvent &event) {
2508void RouteManagerDialog::OnWptColumnClicked(wxListEvent &event) {
2509 if (event.m_col == NAME_COLUMN) {
2511 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2512 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2513 sort_wp_key = SORT_ON_NAME;
2515 if (event.m_col == DISTANCE_COLUMN) {
2517 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2518 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2519 sort_wp_key = SORT_ON_DISTANCE;
2522 UpdateWptListCtrl();
2525void RouteManagerDialog::UpdateWptButtons() {
2528 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2529 bool enable1 = (m_pWptListCtrl->GetSelectedItemCount() == 1);
2530 bool enablemultiple = (m_pWptListCtrl->GetSelectedItemCount() >= 1);
2533 m_lastWptItem = item;
2539 bool b_delete_enable =
true;
2542 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2543 wxLIST_STATE_SELECTED);
2544 if (item == -1)
break;
2549 b_delete_enable =
false;
2554 btnWptProperties->Enable(enablemultiple);
2555 btnWptZoomto->Enable(enable1);
2556 btnWptDeleteAll->Enable(m_pWptListCtrl->GetItemCount() > 0);
2557 btnWptDelete->Enable(b_delete_enable && enablemultiple);
2558 btnWptGoTo->Enable(enable1);
2559 btnWptExport->Enable(enablemultiple);
2560 btnWptSendToGPS->Enable(enable1);
2561 btnWptSendToPeer->Enable(enablemultiple);
2564void RouteManagerDialog::OnWptToggleVisibility(wxMouseEvent &event) {
2565 wxPoint pos =
event.GetPosition();
2567 long clicked_index = m_pWptListCtrl->HitTest(pos, flags);
2570 if (clicked_index > -1 &&
2571 event.GetX() < m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2575 if (!wp->IsSharedInVisibleRoute()) {
2576 wp->SetVisible(!wp->IsVisible());
2577 m_pWptListCtrl->SetItemImage(clicked_index,
2580 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2587 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2588 wxLIST_STATE_DONTCARE);
2589 if (item == -1)
break;
2593 if (!wp->IsVisible()) {
2598 m_cbShowAllWP->SetValue(viz);
2600 gFrame->RefreshAllCanvas();
2602 if (clicked_index > -1 &&
2603 event.GetX() > m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) &&
2604 event.GetX() < (m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) +
2605 m_pWptListCtrl->GetColumnWidth(colWPTSCALE)) &&
2606 !g_bOverruleScaMin) {
2608 wp->SetUseSca(!wp->GetUseSca());
2609 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2610 gFrame->RefreshAllCanvas();
2611 wxString scamin = wxString::Format(
"%i", (
int)wp->GetScaMin());
2612 if (!wp->GetUseSca()) scamin = _(
"Always");
2613 m_pWptListCtrl->SetItem(clicked_index, colWPTSCALE, scamin);
2620void RouteManagerDialog::OnWptNewClick(wxCommandEvent &event) {
2624 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2626 gFrame->RefreshAllCanvas();
2632 WptShowPropertiesDialog(pWP, GetParent());
2635void RouteManagerDialog::OnWptPropertiesClick(wxCommandEvent &event) {
2636 long item = wxNOT_FOUND;
2638 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2639 if (item == wxNOT_FOUND)
return;
2641 auto pWP = (
RoutePoint *)m_pWptListCtrl->GetItemData(item);
2642 WptShowPropertiesDialog(pWP, GetParent());
2644 UpdateWptListCtrl();
2645 m_bNeedConfigFlush =
true;
2648void RouteManagerDialog::WptShowPropertiesDialog(
RoutePoint *pWP,
2657 wxString base_title = _(
"Waypoint Properties");
2660 wxString caption(wxString::Format(
"%s, %s: %s", base_title, _(
"Layer"),
2671void RouteManagerDialog::OnWptZoomtoClick(wxCommandEvent &event) {
2674 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2675 if (item == -1)
return;
2681 if (gFrame->GetFocusCanvas()) {
2682 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), wp->m_lat, wp->m_lon,
2687void RouteManagerDialog::OnWptDeleteClick(wxCommandEvent &event) {
2688 RoutePointList list;
2690 int answer = OCPNMessageBox(
2691 this, _(
"Are you sure you want to delete the selected object(s)"),
2692 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2693 if (answer != wxID_YES)
return;
2696 if (m_pWptListCtrl->GetSelectedItemCount()) {
2697 ::wxBeginBusyCursor();
2698 m_bNeedConfigFlush =
true;
2703 long item_last_selected = -1;
2705 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2706 wxLIST_STATE_SELECTED);
2707 if (item == -1)
break;
2709 item_last_selected = item;
2720 OCPNMessageBox(
this,
2721 _(
"The waypoint you want to delete is used in a "
2722 "route, do you really want to delete it?"),
2723 _(
"OpenCPN Alert"), wxYES_NO)) {
2724 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2725 pWayPointMan->DestroyWaypoint(wp);
2728 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2729 pWayPointMan->DestroyWaypoint(wp);
2735 m_pWptListCtrl->GetNextItem(item_last_selected);
2738 wp_next = (
RoutePoint *)m_pWptListCtrl->GetItemData(item_next);
2740 m_lastWptItem = item_next;
2742 UpdateRouteListCtrl();
2743 UpdateTrkListCtrl();
2744 UpdateWptListCtrl(wp_next,
true);
2750 gFrame->InvalidateAllCanvasUndo();
2751 gFrame->RefreshAllCanvas();
2752 ::wxEndBusyCursor();
2756void RouteManagerDialog::OnWptGoToClick(wxCommandEvent &event) {
2759 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2760 if (item == -1)
return;
2772 temp_route->AddPoint(pWP_src);
2773 temp_route->AddPoint(wp);
2775 pSelect->AddSelectableRouteSegment(
gLat,
gLon, wp->m_lat, wp->m_lon, pWP_src,
2778 wxString name = wp->GetName();
2779 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2780 wxString rteName = _(
"Go to ");
2781 rteName.Append(name);
2792 UpdateRouteListCtrl();
2795void RouteManagerDialog::OnWptExportClick(wxCommandEvent &event) {
2796 RoutePointList list;
2798 wxString suggested_name =
"waypoints";
2802 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2803 wxLIST_STATE_SELECTED);
2804 if (item == -1)
break;
2810 if (wp->GetName() !=
"") suggested_name = wp->GetName();
2814 ExportGPXWaypoints(
this, &list, suggested_name);
2817void RouteManagerDialog::OnWptSendToGPSClick(wxCommandEvent &event) {
2820 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2821 if (item == -1)
return;
2828 pdlg->SetWaypoint(wp);
2831 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
2834 HideWithEffect(wxSHOW_EFFECT_BLEND);
2838 ShowWithEffect(wxSHOW_EFFECT_BLEND);
2844void RouteManagerDialog::OnWptDeleteAllClick(wxCommandEvent &event) {
2847 if (!pWayPointMan->SharedWptsExist()) {
2848 prompt = _(
"Are you sure you want to delete <ALL> waypoints?");
2853 _(
"There are some waypoints used in routes or anchor alarms.\n Do you "
2854 "want to delete them as well?\n This will change the routes and "
2855 "disable the anchor alarms.\n Answering No keeps the waypoints used "
2856 "in routes or alarms.");
2857 buttons = wxYES_NO | wxCANCEL;
2861 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), buttons);
2862 if (answer == wxID_YES) pWayPointMan->DeleteAllWaypoints(
true);
2863 if (answer == wxID_NO && type == 2)
2864 pWayPointMan->DeleteAllWaypoints(
false);
2871 UpdateRouteListCtrl();
2872 UpdateWptListCtrl();
2873 gFrame->InvalidateAllCanvasUndo();
2874 gFrame->RefreshAllCanvas();
2877void RouteManagerDialog::OnLaySelected(wxListEvent &event) {
2881void RouteManagerDialog::OnLayColumnClicked(wxListEvent &event) {
2882 if (event.m_col == 1) {
2883 sort_layer_name_dir++;
2884 m_pLayListCtrl->SortItems(SortLayersOnName, (wxIntPtr)NULL);
2885 }
else if (event.m_col == 2) {
2886 sort_layer_len_dir++;
2887 m_pLayListCtrl->SortItems(SortLayersOnSize, (wxIntPtr)NULL);
2891void RouteManagerDialog::UpdateLayButtons() {
2894 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2895 bool enable = (item != -1);
2898 btnLayDelete->Enable(enable);
2899 cbLayToggleChart->Enable(enable);
2900 cbLayToggleListing->Enable(enable);
2901 cbLayToggleNames->Enable(enable);
2904 cbLayToggleChart->SetValue(
2905 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnChart());
2907 cbLayToggleNames->Set3StateValue(
2908 ((
Layer *)m_pLayListCtrl->GetItemData(item))->HasVisibleNames());
2910 cbLayToggleListing->SetValue(
2911 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnListing());
2914 cbLayToggleChart->SetValue(
true);
2915 cbLayToggleNames->Set3StateValue(wxCHK_UNDETERMINED);
2916 cbLayToggleListing->SetValue(
true);
2920void RouteManagerDialog::OnLayToggleVisibility(wxMouseEvent &event) {
2921 wxPoint pos =
event.GetPosition();
2923 long clicked_index = m_pLayListCtrl->HitTest(pos, flags);
2926 if (clicked_index > -1 &&
2927 event.GetX() < m_pLayListCtrl->GetColumnWidth(colLAYVISIBLE)) {
2929 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(clicked_index);
2931 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
2932 m_pLayListCtrl->SetItemImage(clicked_index,
2933 layer->IsVisibleOnChart() ? 0 : 1);
2939 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2940 wxLIST_STATE_DONTCARE);
2941 if (item == -1)
break;
2943 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
2945 if (!layer->IsVisibleOnChart()) {
2950 m_cbShowAllLay->SetValue(viz);
2952 ToggleLayerContentsOnChart(layer);
2959void RouteManagerDialog::UpdateLists() {
2960 UpdateRouteListCtrl();
2961 UpdateTrkListCtrl();
2962 UpdateWptListCtrl();
2963 UpdateLayListCtrl();
2966void RouteManagerDialog::OnLayNewClick(wxCommandEvent &event) {
2970void RouteManagerDialog::OnPerLayNewClick(wxCommandEvent &event) {
2974void RouteManagerDialog::AddNewLayer(
bool isPersistent) {
2975 bool show_flag = g_bShowLayers;
2976 g_bShowLayers =
true;
2978 UI_ImportGPX(
this,
true,
"",
true, isPersistent);
2980 g_bShowLayers = show_flag;
2982 gFrame->RefreshAllCanvas();
2985void RouteManagerDialog::OnLayPropertiesClick(wxCommandEvent &event) {
2989 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2990 if (item == -1)
return;
2993void RouteManagerDialog::OnLayDeleteClick(wxCommandEvent &event) {
2996 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2997 if (item == -1)
return;
2999 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3005 bool ispers =
false;
3006 wxString destf, f, name, ext;
3007 f = layer->m_LayerFileName;
3008 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3010 appendOSDirSlash(&destf);
3011 destf.Append(
"layers");
3012 appendOSDirSlash(&destf);
3013 destf << name <<
"." << ext;
3015 wxString prompt = _(
3016 "Are you sure you want to delete this layer and <ALL> of its contents?");
3017 if (wxFileExists(destf)) {
3018 prompt.Append(
"\n");
3020 _(
"The file will also be deleted from OpenCPN's layer directory."));
3021 prompt.Append(
"\n (" + destf +
")");
3025 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), wxYES_NO);
3026 if (answer == wxID_NO)
return;
3031 if (wxRemoveFile(destf))
3032 remMSG.sprintf(
"Layer file: %s is deleted", destf);
3034 remMSG.sprintf(
"Error deleting Layer file: %s", destf);
3036 wxLogMessage(remMSG);
3041 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3042 pRoute->m_bIsInLayer =
false;
3043 pRoute->m_LayerID = 0;
3049 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3050 pTrack->m_bIsInLayer =
false;
3051 pTrack->m_LayerID = 0;
3052 NavObj_dB::GetInstance().DeleteTrack(pTrack);
3058 std::vector<RoutePoint *> to_be_destroyed;
3059 auto node = pWayPointMan->GetWaypointList()->begin();
3060 while (node != pWayPointMan->GetWaypointList()->end()) {
3062 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3066 to_be_destroyed.push_back(rp);
3070 for (
auto rp : to_be_destroyed) pWayPointMan->DestroyWaypoint(rp, false);
3076 auto found = std::find(pLayerList->begin(), pLayerList->end(), layer);
3077 if (found != pLayerList->end()) pLayerList->erase(found);
3081 gFrame->RefreshAllCanvas();
3083 m_bNeedConfigFlush =
false;
3086void RouteManagerDialog::OnLayToggleChartClick(wxCommandEvent &event) {
3090 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3091 if (item == -1)
return;
3093 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3097 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
3098 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
3100 ToggleLayerContentsOnChart(layer);
3103void RouteManagerDialog::ToggleLayerContentsOnChart(
Layer *layer) {
3106 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3107 pRoute->SetVisible(layer->IsVisibleOnChart());
3112 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3113 pTrack->SetVisible(layer->IsVisibleOnChart());
3114 NavObj_dB::GetInstance().UpdateDBTrackAttributes(pTrack);
3119 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3120 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3121 rp->SetVisible(layer->IsVisibleOnChart());
3128 gFrame->RefreshAllCanvas();
3131void RouteManagerDialog::OnLayToggleNamesClick(wxCommandEvent &event) {
3135 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3136 if (item == -1)
return;
3138 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3142 layer->SetVisibleNames(cbLayToggleNames->Get3StateValue());
3144 ToggleLayerContentsNames(layer);
3147void RouteManagerDialog::ToggleLayerContentsNames(
Layer *layer) {
3150 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3151 for (
RoutePoint *prp1 : *pRoute->pRoutePointList) {
3152 if (layer->HasVisibleNames() == wxCHK_UNDETERMINED) {
3153 prp1->m_bShowName = prp1->m_bShowNameData;
3155 prp1->m_bShowName = (layer->HasVisibleNames() == wxCHK_CHECKED);
3162 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3163 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3164 rp->SetNameShown(layer->HasVisibleNames() == wxCHK_CHECKED ||
3166 layer->HasVisibleNames() == wxCHK_UNDETERMINED));
3172 gFrame->RefreshAllCanvas();
3175void RouteManagerDialog::OnLayToggleListingClick(wxCommandEvent &event) {
3179 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3180 if (item == -1)
return;
3182 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3186 layer->SetVisibleOnListing(!layer->IsVisibleOnListing());
3188 ToggleLayerContentsOnListing(layer);
3191void RouteManagerDialog::ToggleLayerContentsOnListing(
Layer *layer) {
3192 ::wxBeginBusyCursor();
3196 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3197 pRoute->SetListed(layer->IsVisibleOnListing());
3202 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID))
3203 pTrack->SetListed(layer->IsVisibleOnListing());
3209 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3211 rp->SetListed(layer->IsVisibleOnListing());
3217 ::wxEndBusyCursor();
3219 gFrame->RefreshAllCanvas();
3222void RouteManagerDialog::OnLayDefaultAction(wxListEvent &event) {
3224 OnLayPropertiesClick(evt);
3227void RouteManagerDialog::UpdateLayListCtrl() {
3231 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3233 wxUIntPtr selected_id = wxUIntPtr(0);
3234 if (item != -1) selected_id = m_pLayListCtrl->GetItemData(item);
3237 m_pLayListCtrl->DeleteAllItems();
3240 LayerList::iterator it;
3242 bool b_anyHidden =
false;
3243 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
3246 if (!lay->m_LayerName.Upper().Contains(m_tFilterLay->GetValue().Upper())) {
3252 li.SetImage(lay->IsVisibleOnChart() ? 0 : 1);
3256 long idx = m_pLayListCtrl->InsertItem(li);
3258 wxString name = lay->m_LayerName;
3259 if (name.IsEmpty()) {
3266 name = _(
"(Unnamed Layer)");
3268 m_pLayListCtrl->SetItem(idx, colLAYNAME, name);
3271 len.Printf(
"%d", (
int)lay->m_NoOfItems);
3272 m_pLayListCtrl->SetItem(idx, colLAYITEMS, len);
3273 m_pLayListCtrl->SetItem(idx, colLAYPERSIST, lay->m_LayerType);
3278 lic.SetAlign(wxLIST_FORMAT_LEFT);
3279 m_pLayListCtrl->SetItem(lic);
3282 lic.SetAlign(wxLIST_FORMAT_LEFT);
3283 m_pLayListCtrl->SetItem(lic);
3285 if (!lay->IsVisibleOnChart()) b_anyHidden =
true;
3288 m_pLayListCtrl->SortItems(SortLayersOnName,
3289 reinterpret_cast<wxIntPtr
>(m_pLayListCtrl));
3290 m_pLayListCtrl->SetColumnWidth(0, 4 * m_charWidth);
3295 if (selected_id != wxUIntPtr(0)) {
3296 item = m_pLayListCtrl->FindItem(-1, selected_id);
3297 m_pLayListCtrl->SetItemState(item,
3298 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
3299 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
3303 m_cbShowAllLay->SetValue(!b_anyHidden);
3306void RouteManagerDialog::OnImportClick(wxCommandEvent &event) {
3315 gFrame->RefreshAllCanvas();
3317void RouteManagerDialog::OnExportClick(wxCommandEvent &event) {
3322void RouteManagerDialog::OnBackupClick(wxCommandEvent &event) {
3323 int result = BackupDatabase(
this);
3324 if (result == wxID_YES) {
3325 OCPNMessageBox(NULL, _(
"Backup successful"), _(
"Backup result"),
3326 wxICON_INFORMATION | wxOK);
3327 }
else if (result == wxID_NO) {
3328 OCPNMessageBox(NULL, _(
"Backup Failed\nCheck the OpenCPN Logs"),
3329 _(
"Backup result"), wxICON_INFORMATION | wxOK);
3334void RouteManagerDialog::OnExportVizClick(wxCommandEvent &event) {
3335 ExportGPX(
this,
true,
true);
3338void RouteManagerDialog::OnFilterChanged(wxCommandEvent &event) {
3339 if (event.GetEventObject() == m_tFilterWpt) {
3340 UpdateWptListCtrl(NULL,
true);
3341 }
else if (event.GetEventObject() == m_tFilterRte) {
3342 UpdateRouteListCtrl();
3343 }
else if (event.GetEventObject() == m_tFilterTrk) {
3344 UpdateTrkListCtrl();
3345 }
else if (event.GetEventObject() == m_tFilterLay) {
3346 UpdateLayListCtrl();
AisDecoder * g_pAIS
Global instance.
Class AisDecoder and helpers.
General chart base definitions.
Generic Chart canvas base.
float GetVPScale()
Return the ViewPort scale factor, in physical pixels per meter.
Represents a layer of chart objects in OpenCPN.
Dialog for displaying and editing waypoint properties.
void Validate()
Check that all entries are accessible, remove stale ones.
void Init(const KeyProvider &kp, const std::function< void(ObservedEvt &ev)> &action)
Initiate an object yet not listening.
Represents a waypoint or mark within the navigation system.
bool m_bIsolatedMark
Flag indicating if the waypoint is a standalone mark.
bool m_bShowNameData
Flag indicating if waypoint data should be shown with the name.
bool m_bIsInRoute
Flag indicating if this waypoint is part of a route.
bool m_bIsInLayer
Flag indicating if the waypoint belongs to a layer.
int m_LayerID
Layer identifier if the waypoint belongs to a layer.
Represents a navigational route in the navigation system.
wxString m_RouteStartString
Name or description of the route's starting point.
bool m_bRtIsActive
Flag indicating whether this route is currently active for navigation.
bool m_bDeleteOnArrival
Flag indicating whether the route should be deleted once navigation reaches the end.
wxString m_RouteEndString
Name or description of the route's ending point.
wxString m_RouteNameString
User-assigned name for the route.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
bool DeleteRoute(Route *pRoute)
bool ActivateRoute(Route *pRouteToActivate, RoutePoint *pStartPoint=NULL)
Activates a route for navigation.
Dialog for sending routes/waypoints to a GPS device.
Dialog for sending navigation objects to peer devices.
Represents a single point in a track.
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Represents a track, which is a series of connected track points.
Global variables stored in configuration file.
Misc GUI event vars, a singleton.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
MarkInfoDlg * g_pMarkInfoDialog
global instance
Waypoint properties maintenance dialog.
MySQL based storage for routes, tracks, etc.
double toUsrDistance(double nm_distance, int unit)
Convert a distance from nautical miles (NMi) to user display units.
Navigation Utility Functions without GUI dependencies.
double gLat
Vessel's current latitude in decimal degrees.
double gCog
Course over ground in degrees (0-359.99).
double gSog
Speed over ground in knots.
double gLon
Vessel's current longitude in decimal degrees.
Position, course, speed, etc.
Purpose: Track and Trackpoint drawing stuff.
RoutePropDlgImpl * pRoutePropDialog
Global instance.
Routeman * g_pRouteMan
Global instance.
RouteList * pRouteList
Global instance.
RouteManagerDialog * pRouteManagerDialog
Global instance.
Select * pSelect
Global instance.
Selected route, segment, waypoint, etc.
Send route/waypoint to GPS dialog.
Send Route/Waypoint/Track to peer dialog.
wxBitmap LoadSVG(const wxString filename, const unsigned int width, const unsigned int height, wxBitmap *default_bitmap, bool use_cache)
Load SVG file and return it's bitmap representation of requested size In case file can't be loaded an...
ActiveTrack * g_pActiveTrack
global instance
std::vector< Track * > g_TrackList
Global instance.
Recorded track abstraction.
TrackPropDlg * pTrackPropDialog
Global instance.