40#include <wx/filename.h>
41#include <wx/stdpaths.h>
42#include <wx/progdlg.h>
43#include <wx/clipbrd.h>
44#include <wx/statline.h>
81#include "androidUTIL.h"
84#define DIALOG_MARGIN 10
86enum { rmVISIBLE = 0, rmROUTENAME, rmROUTEDESC };
87enum { colTRKVISIBLE = 0, colTRKNAME, colTRKLENGTH, colTRKDATE };
88enum { colLAYVISIBLE = 0, colLAYNAME, colLAYITEMS, colLAYPERSIST };
89enum { colWPTICON = 0, colWPTSCALE, colWPTNAME, colWPTDIST };
94void appendOSDirSlash(wxString *pString);
96static int SortRouteTrack(
const int order,
const wxString &it1,
97 const wxString &it2) {
98 if (order & 1)
return it2.CmpNoCase(it1);
100 return it1.CmpNoCase(it2);
104static int sort_route_name_dir;
105#if wxCHECK_VERSION(2, 9, 0)
106static int wxCALLBACK SortRoutesOnName(wxIntPtr item1, wxIntPtr item2,
109int wxCALLBACK SortRoutesOnName(
long item1,
long item2,
long list)
112 return SortRouteTrack(sort_route_name_dir, ((
Route *)item1)->GetName(),
113 ((
Route *)item2)->GetName());
117static int sort_route_to_dir;
118#if wxCHECK_VERSION(2, 9, 0)
119static int wxCALLBACK SortRoutesOnTo(wxIntPtr item1, wxIntPtr item2,
122int wxCALLBACK SortRoutesOnTo(
long item1,
long item2,
long list)
125 return SortRouteTrack(sort_route_to_dir, ((
Route *)item1)->GetTo(),
126 ((
Route *)item2)->GetTo());
130static int sort_track_name_dir;
131#if wxCHECK_VERSION(2, 9, 0)
132static int wxCALLBACK SortTracksOnName(wxIntPtr item1, wxIntPtr item2,
135int wxCALLBACK SortTracksOnName(
long item1,
long item2,
long list)
138 return SortRouteTrack(sort_track_name_dir, ((
Track *)item1)->GetName(),
139 ((
Track *)item2)->GetName());
142static int SortDouble(
const int order,
const double &it1,
const double &it2) {
154 if (l1 == l2)
return 0;
155 if (l2 < l1)
return 1;
160static int sort_track_len_dir;
161#if wxCHECK_VERSION(2, 9, 0)
162static int wxCALLBACK SortTracksOnDistance(wxIntPtr item1, wxIntPtr item2,
165int wxCALLBACK SortTracksOnDistance(
long item1,
long item2,
long list)
168 return SortDouble(sort_track_len_dir, ((
Track *)item1)->Length(),
169 ((
Track *)item2)->Length());
173static int sort_track_date_dir;
174#if wxCHECK_VERSION(2, 9, 0)
175static int wxCALLBACK SortTracksOnDate(wxIntPtr item1, wxIntPtr item2,
178int wxCALLBACK SortTracksOnDate(
long item1,
long item2,
long list)
182 return SortRouteTrack(sort_track_date_dir, ((
Track *)item1)->GetIsoDateTime(),
183 ((
Track *)item2)->GetIsoDateTime());
186static int sort_wp_key;
187static int sort_track_key;
190static int sort_wp_name_dir;
191#if wxCHECK_VERSION(2, 9, 0)
192static int wxCALLBACK SortWaypointsOnName(wxIntPtr item1, wxIntPtr item2,
195int wxCALLBACK SortWaypointsOnName(
long item1,
long item2,
long list)
203 if (sort_wp_name_dir & 1)
204 return pRP2->GetName().CmpNoCase(pRP1->GetName());
206 return pRP1->GetName().CmpNoCase(pRP2->GetName());
212static int sort_wp_len_dir;
213#if wxCHECK_VERSION(2, 9, 0)
214static int wxCALLBACK SortWaypointsOnDistance(wxIntPtr item1, wxIntPtr item2,
217int wxCALLBACK SortWaypointsOnDistance(
long item1,
long item2,
long list)
221 DistanceBearingMercator(((
RoutePoint *)item1)->m_lat,
224 DistanceBearingMercator(((
RoutePoint *)item2)->m_lat,
227 return SortDouble(sort_wp_len_dir, dst1, dst2);
231static int sort_layer_name_dir;
232#if wxCHECK_VERSION(2, 9, 0)
233static int wxCALLBACK SortLayersOnName(wxIntPtr item1, wxIntPtr item2,
236int wxCALLBACK SortLayersOnName(
long item1,
long item2,
long list)
239 return SortRouteTrack(sort_layer_name_dir, ((
Layer *)item1)->m_LayerName,
240 ((
Layer *)item2)->m_LayerName);
244static int sort_layer_len_dir;
245#if wxCHECK_VERSION(2, 9, 0)
246static int wxCALLBACK SortLayersOnSize(wxIntPtr item1, wxIntPtr item2,
249int wxCALLBACK SortLayersOnSize(
long item1,
long item2,
long list)
252 return SortDouble(sort_layer_len_dir, ((
Layer *)item1)->m_NoOfItems,
253 ((
Layer *)item2)->m_NoOfItems);
260EVT_NOTEBOOK_PAGE_CHANGED(
262 RouteManagerDialog::OnTabSwitch)
263EVT_CLOSE(RouteManagerDialog::OnClose)
264EVT_COMMAND(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, RouteManagerDialog::OnOK)
265EVT_CHAR_HOOK(RouteManagerDialog::OnKey)
269 if (ke.GetKeyCode() == WXK_ESCAPE)
275void RouteManagerDialog::OnTabSwitch(wxNotebookEvent &event) {
276 if (!m_pNotebook)
return;
277 int current_page = m_pNotebook->GetSelection();
278 if (current_page == 3) {
279 if (btnImport) btnImport->Enable(
false);
280 if (btnExport) btnExport->Enable(
false);
281 if (btnExportViz) btnExportViz->Enable(
false);
283 if (btnImport) btnImport->Enable(
true);
284 if (btnExport) btnExport->Enable(
true);
285 if (btnExportViz) btnExportViz->Enable(
true);
292bool RouteManagerDialog::instanceFlag =
false;
305RouteManagerDialog::RouteManagerDialog(wxWindow *parent) {
307 wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
309 wxFrame::Create(parent, -1, wxString(_(
"Route & Mark Manager")),
310 wxDefaultPosition, wxDefaultSize, style);
318 sort_wp_key = SORT_ON_NAME;
319 sort_track_key = SORT_ON_NAME;
327 [&](wxCommandEvent) { UpdateRouteListCtrl(); });
330void RouteManagerDialog::Create() {
332 int char_width, char_height;
333 GetTextExtent(
"W", &char_width, &char_height);
334 m_charWidth = char_width;
336 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
337 SetSizer(itemBoxSizer1);
339 m_pNotebook =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition,
340 wxSize(-1, -1), wxNB_TOP);
341 itemBoxSizer1->Add(m_pNotebook, 1, wxALL | wxEXPAND, 5);
344 m_pPanelRte =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
345 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
347 wxBoxSizer *sbsRoutes =
new wxBoxSizer(wxHORIZONTAL);
348 m_pPanelRte->SetSizer(sbsRoutes);
349 m_pNotebook->AddPage(m_pPanelRte, _(
"Routes"));
352 sort_wp_name_dir = 0;
353 sort_track_len_dir = 1;
354 sort_route_to_dir = 0;
355 sort_track_name_dir = 0;
356 sort_route_name_dir = 0;
357 sort_layer_name_dir = 0;
358 sort_layer_len_dir = 1;
360 m_listIconSize = 2 * GetCharHeight();
363 wxBoxSizer *bSizerRteContents;
364 bSizerRteContents =
new wxBoxSizer(wxVERTICAL);
366 wxFlexGridSizer *fgSizerFilterRte;
367 fgSizerFilterRte =
new wxFlexGridSizer(0, 2, 0, 0);
368 fgSizerFilterRte->AddGrowableCol(1);
369 fgSizerFilterRte->SetFlexibleDirection(wxBOTH);
370 fgSizerFilterRte->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
372 m_stFilterRte =
new wxStaticText(m_pPanelRte, wxID_ANY, _(
"Filter"),
373 wxDefaultPosition, wxDefaultSize, 0);
374 m_stFilterRte->Wrap(-1);
375 fgSizerFilterRte->Add(m_stFilterRte, 0, wxALL, 5);
377 m_tFilterRte =
new wxTextCtrl(m_pPanelRte, wxID_ANY,
"", wxDefaultPosition,
379 fgSizerFilterRte->Add(m_tFilterRte, 1, wxALL | wxEXPAND, 5);
381 bSizerRteContents->Add(fgSizerFilterRte, 0, wxEXPAND, 5);
382 m_tFilterRte->Connect(
383 wxEVT_COMMAND_TEXT_UPDATED,
384 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
386 m_cbShowAllRte =
new wxCheckBox(m_pPanelRte, wxID_ANY, _(
"Show all routes"));
387 bSizerRteContents->Add(m_cbShowAllRte, 0, wxEXPAND | wxLEFT, 5);
388 m_cbShowAllRte->Connect(
389 wxEVT_COMMAND_CHECKBOX_CLICKED,
390 wxCommandEventHandler(RouteManagerDialog::OnShowAllRteCBClicked), NULL,
394 new wxListCtrl(m_pPanelRte, -1, wxDefaultPosition, wxSize(-1, -1),
395 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
398 m_pRouteListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
401 m_pRouteListCtrl->Connect(
402 wxEVT_COMMAND_LIST_ITEM_SELECTED,
403 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
404 m_pRouteListCtrl->Connect(
405 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
406 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
407 m_pRouteListCtrl->Connect(
408 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
409 wxListEventHandler(RouteManagerDialog::OnRteDefaultAction), NULL,
this);
410 m_pRouteListCtrl->Connect(
412 wxMouseEventHandler(RouteManagerDialog::OnRteToggleVisibility), NULL,
414 m_pRouteListCtrl->Connect(
415 wxEVT_COMMAND_LIST_COL_CLICK,
416 wxListEventHandler(RouteManagerDialog::OnRteColumnClicked), NULL,
this);
417 bSizerRteContents->Add(m_pRouteListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
418 sbsRoutes->Add(bSizerRteContents, 1, wxEXPAND, 5);
423 m_pRouteListCtrl->InsertColumn(rmVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
425 m_pRouteListCtrl->InsertColumn(rmROUTENAME, _(
"Route Name"),
426 wxLIST_FORMAT_LEFT, 15 * char_width);
427 m_pRouteListCtrl->InsertColumn(rmROUTEDESC, _(
"From <-> To"),
428 wxLIST_FORMAT_LEFT, 10 * char_width);
431 wxBoxSizer *bsRouteButtons =
new wxBoxSizer(wxVERTICAL);
432 sbsRoutes->Add(bsRouteButtons, 0, wxEXPAND);
434 wxScrolledWindow *winr =
new wxScrolledWindow(
435 m_pPanelRte, wxID_ANY, wxDefaultPosition, wxDefaultSize,
436 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
437 winr->SetScrollRate(0, 5);
439 bsRouteButtons->Add(winr, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
441 wxBoxSizer *bsRouteButtonsInner =
new wxBoxSizer(wxVERTICAL);
442 winr->SetSizer(bsRouteButtonsInner);
444 btnRteProperties =
new wxButton(winr, -1, _(
"&Properties") +
"...");
445 bsRouteButtonsInner->Add(btnRteProperties, 0, wxALL | wxEXPAND,
447 btnRteProperties->Connect(
448 wxEVT_COMMAND_BUTTON_CLICKED,
449 wxCommandEventHandler(RouteManagerDialog::OnRtePropertiesClick), NULL,
452 btnRteActivate =
new wxButton(winr, -1, _(
"&Activate"));
453 bsRouteButtonsInner->Add(btnRteActivate, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
454 btnRteActivate->Connect(
455 wxEVT_COMMAND_BUTTON_CLICKED,
456 wxCommandEventHandler(RouteManagerDialog::OnRteActivateClick), NULL,
458 btnRteActivate->Connect(
460 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
462 btnRteZoomto =
new wxButton(winr, -1, _(
"&Center View"));
463 bsRouteButtonsInner->Add(btnRteZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
464 btnRteZoomto->Connect(
465 wxEVT_COMMAND_BUTTON_CLICKED,
466 wxCommandEventHandler(RouteManagerDialog::OnRteZoomtoClick), NULL,
this);
467 btnRteZoomto->Connect(
469 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
471 btnRteReverse =
new wxButton(winr, -1, _(
"&Reverse"));
472 bsRouteButtonsInner->Add(btnRteReverse, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
473 btnRteReverse->Connect(
474 wxEVT_COMMAND_BUTTON_CLICKED,
475 wxCommandEventHandler(RouteManagerDialog::OnRteReverseClick), NULL,
this);
477 btnRteDelete =
new wxButton(winr, -1, _(
"&Delete"));
478 bsRouteButtonsInner->Add(btnRteDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
479 btnRteDelete->Connect(
480 wxEVT_COMMAND_BUTTON_CLICKED,
481 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteClick), NULL,
this);
483 wxString reseq_label(_(
"&Resequence Waypoints"));
484 wxString export_label(_(
"&Export selected..."));
485 wxString send_to_gps_label(_(
"&Send to GPS..."));
486 wxString send_to_peer_label(_(
"Send to &Peer..."));
489 reseq_label = wxString(_(
"Resequence"));
490 export_label = wxString(_(
"Export"));
491 send_to_gps_label = wxString(_(
"Send to GPS"));
492 send_to_peer_label = wxString(_(
"Send to Peer"));
495 btnRteExport =
new wxButton(winr, -1, export_label);
496 bsRouteButtonsInner->Add(btnRteExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
497 btnRteExport->Connect(
498 wxEVT_COMMAND_BUTTON_CLICKED,
499 wxCommandEventHandler(RouteManagerDialog::OnRteExportClick), NULL,
this);
501 btnRteResequence =
new wxButton(winr, -1, reseq_label);
502 bsRouteButtonsInner->Add(btnRteResequence, 0, wxALL | wxEXPAND,
504 btnRteResequence->Connect(
505 wxEVT_COMMAND_BUTTON_CLICKED,
506 wxCommandEventHandler(RouteManagerDialog::OnRteResequenceClick), NULL,
509 btnRteSendToPeer =
new wxButton(winr, -1, send_to_peer_label);
510 bsRouteButtonsInner->Add(btnRteSendToPeer, 0, wxALL | wxEXPAND,
512 btnRteSendToPeer->Connect(
513 wxEVT_COMMAND_BUTTON_CLICKED,
514 wxCommandEventHandler(RouteManagerDialog::OnRteSendToPeerClick), NULL,
517 btnRteSendToGPS =
new wxButton(winr, -1, send_to_gps_label);
518 bsRouteButtonsInner->Add(btnRteSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
519 btnRteSendToGPS->Connect(
520 wxEVT_COMMAND_BUTTON_CLICKED,
521 wxCommandEventHandler(RouteManagerDialog::OnRteSendToGPSClick), NULL,
524 bsRouteButtonsInner->AddSpacer(10);
526 btnRteDeleteAll =
new wxButton(winr, -1, _(
"&Delete All"));
527 bsRouteButtonsInner->Add(btnRteDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
528 btnRteDeleteAll->Connect(
529 wxEVT_COMMAND_BUTTON_CLICKED,
530 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteAllClick), NULL,
534 m_pPanelTrk =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
535 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
536 wxBoxSizer *sbsTracks =
new wxBoxSizer(wxHORIZONTAL);
537 m_pPanelTrk->SetSizer(sbsTracks);
538 m_pNotebook->AddPage(m_pPanelTrk, _(
"Tracks"));
540 wxBoxSizer *bSizerTrkContents;
541 bSizerTrkContents =
new wxBoxSizer(wxVERTICAL);
543 wxFlexGridSizer *fgSizerFilterTrk;
544 fgSizerFilterTrk =
new wxFlexGridSizer(0, 2, 0, 0);
545 fgSizerFilterTrk->AddGrowableCol(1);
546 fgSizerFilterTrk->SetFlexibleDirection(wxBOTH);
547 fgSizerFilterTrk->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
549 m_stFilterTrk =
new wxStaticText(m_pPanelTrk, wxID_ANY, _(
"Filter"),
550 wxDefaultPosition, wxDefaultSize, 0);
551 m_stFilterTrk->Wrap(-1);
552 fgSizerFilterTrk->Add(m_stFilterTrk, 0, wxALL, 5);
554 m_tFilterTrk =
new wxTextCtrl(m_pPanelTrk, wxID_ANY,
"", wxDefaultPosition,
556 fgSizerFilterTrk->Add(m_tFilterTrk, 1, wxALL | wxEXPAND, 5);
558 bSizerTrkContents->Add(fgSizerFilterTrk, 0, wxEXPAND, 5);
559 m_tFilterTrk->Connect(
560 wxEVT_COMMAND_TEXT_UPDATED,
561 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
563 m_cbShowAllTrk =
new wxCheckBox(m_pPanelTrk, wxID_ANY, _(
"Show all tracks"));
564 bSizerTrkContents->Add(m_cbShowAllTrk, 0, wxEXPAND | wxLEFT, 5);
565 m_cbShowAllTrk->Connect(
566 wxEVT_COMMAND_CHECKBOX_CLICKED,
567 wxCommandEventHandler(RouteManagerDialog::OnShowAllTrkCBClicked), NULL,
571 new wxListCtrl(m_pPanelTrk, -1, wxDefaultPosition, wxDefaultSize,
572 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
576 m_pTrkListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
579 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
580 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
582 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
583 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
585 m_pTrkListCtrl->Connect(
586 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
587 wxListEventHandler(RouteManagerDialog::OnTrkDefaultAction), NULL,
this);
588 m_pTrkListCtrl->Connect(
590 wxMouseEventHandler(RouteManagerDialog::OnTrkToggleVisibility), NULL,
592 m_pTrkListCtrl->Connect(
593 wxEVT_COMMAND_LIST_COL_CLICK,
594 wxListEventHandler(RouteManagerDialog::OnTrkColumnClicked), NULL,
this);
595 m_pTrkListCtrl->Connect(
596 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
597 wxListEventHandler(RouteManagerDialog::OnTrkRightClick), NULL,
this);
598 this->Connect(wxEVT_COMMAND_MENU_SELECTED,
599 wxCommandEventHandler(RouteManagerDialog::OnTrkMenuSelected),
602 bSizerTrkContents->Add(m_pTrkListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
603 sbsTracks->Add(bSizerTrkContents, 1, wxEXPAND, 5);
605 m_pTrkListCtrl->InsertColumn(colTRKVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
607 m_pTrkListCtrl->InsertColumn(colTRKNAME, _(
"Track Name"), wxLIST_FORMAT_LEFT,
609 m_pTrkListCtrl->InsertColumn(colTRKDATE, _(
"Start Date"), wxLIST_FORMAT_LEFT,
611 m_pTrkListCtrl->InsertColumn(colTRKLENGTH, _(
"Length"), wxLIST_FORMAT_LEFT,
614 wxBoxSizer *bsTrkButtons =
new wxBoxSizer(wxVERTICAL);
615 sbsTracks->Add(bsTrkButtons, 0, wxEXPAND);
617 wxScrolledWindow *wint =
new wxScrolledWindow(
618 m_pPanelTrk, wxID_ANY, wxDefaultPosition, wxDefaultSize,
619 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
620 wint->SetScrollRate(0, 5);
622 bsTrkButtons->Add(wint, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
624 wxBoxSizer *bsTrkButtonsInner =
new wxBoxSizer(wxVERTICAL);
625 wint->SetSizer(bsTrkButtonsInner);
627 btnTrkNew =
new wxButton(wint, -1, _(
"&Start Track"));
628 bsTrkButtonsInner->Add(btnTrkNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
629 btnTrkNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
630 wxCommandEventHandler(RouteManagerDialog::OnTrkNewClick),
633 btnTrkProperties =
new wxButton(wint, -1, _(
"&Properties"));
634 bsTrkButtonsInner->Add(btnTrkProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
635 btnTrkProperties->Connect(
636 wxEVT_COMMAND_BUTTON_CLICKED,
637 wxCommandEventHandler(RouteManagerDialog::OnTrkPropertiesClick), NULL,
640 btnTrkDelete =
new wxButton(wint, -1, _(
"&Delete"));
641 bsTrkButtonsInner->Add(btnTrkDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
642 btnTrkDelete->Connect(
643 wxEVT_COMMAND_BUTTON_CLICKED,
644 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteClick), NULL,
this);
646 btnTrkExport =
new wxButton(wint, -1, _(
"&Export selected..."));
647 bsTrkButtonsInner->Add(btnTrkExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
648 btnTrkExport->Connect(
649 wxEVT_COMMAND_BUTTON_CLICKED,
650 wxCommandEventHandler(RouteManagerDialog::OnTrkExportClick), NULL,
this);
652 btnTrkRouteFromTrack =
new wxButton(wint, -1, _(
"Route from Track"));
653 bsTrkButtonsInner->Add(btnTrkRouteFromTrack, 0, wxALL | wxEXPAND,
655 btnTrkRouteFromTrack->Connect(
656 wxEVT_COMMAND_BUTTON_CLICKED,
657 wxCommandEventHandler(RouteManagerDialog::OnTrkRouteFromTrackClick), NULL,
660 btnTrkSendToPeer =
new wxButton(wint, -1, _(
"Send to &Peer"));
661 bsTrkButtonsInner->Add(btnTrkSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
662 btnTrkSendToPeer->Connect(
663 wxEVT_COMMAND_BUTTON_CLICKED,
664 wxCommandEventHandler(RouteManagerDialog::OnTrkSendToPeerClick), NULL,
667 bsTrkButtonsInner->AddSpacer(10);
669 btnTrkDeleteAll =
new wxButton(wint, -1, _(
"&Delete All"));
670 bsTrkButtonsInner->Add(btnTrkDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
671 btnTrkDeleteAll->Connect(
672 wxEVT_COMMAND_BUTTON_CLICKED,
673 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteAllClick), NULL,
677 m_pPanelWpt =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
678 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
679 wxBoxSizer *sbsWpts =
new wxBoxSizer(wxHORIZONTAL);
680 m_pPanelWpt->SetSizer(sbsWpts);
681 m_pNotebook->AddPage(m_pPanelWpt, _(
"Marks"));
683 wxBoxSizer *bSizerWptContents;
684 bSizerWptContents =
new wxBoxSizer(wxVERTICAL);
686 wxFlexGridSizer *fgSizerFilterWpt;
687 fgSizerFilterWpt =
new wxFlexGridSizer(0, 2, 0, 0);
688 fgSizerFilterWpt->AddGrowableCol(1);
689 fgSizerFilterWpt->SetFlexibleDirection(wxBOTH);
690 fgSizerFilterWpt->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
692 m_stFilterWpt =
new wxStaticText(m_pPanelWpt, wxID_ANY, _(
"Filter"),
693 wxDefaultPosition, wxDefaultSize, 0);
694 m_stFilterWpt->Wrap(-1);
695 fgSizerFilterWpt->Add(m_stFilterWpt, 0, wxALL, 5);
697 m_tFilterWpt =
new wxTextCtrl(m_pPanelWpt, wxID_ANY,
"", wxDefaultPosition,
699 fgSizerFilterWpt->Add(m_tFilterWpt, 1, wxALL | wxEXPAND, 5);
701 bSizerWptContents->Add(fgSizerFilterWpt, 0, wxEXPAND, 5);
702 m_tFilterWpt->Connect(
703 wxEVT_COMMAND_TEXT_UPDATED,
704 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
706 m_cbShowAllWP =
new wxCheckBox(m_pPanelWpt, wxID_ANY, _(
"Show all marks"));
707 bSizerWptContents->Add(m_cbShowAllWP, 0, wxEXPAND | wxLEFT, 5);
708 m_cbShowAllWP->Connect(
709 wxEVT_COMMAND_CHECKBOX_CLICKED,
710 wxCommandEventHandler(RouteManagerDialog::OnShowAllWpCBClicked), NULL,
714 new wxListCtrl(m_pPanelWpt, -1, wxDefaultPosition, wxDefaultSize,
715 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
718 m_pWptListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
721 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
722 wxListEventHandler(RouteManagerDialog::OnWptSelected),
724 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
725 wxListEventHandler(RouteManagerDialog::OnWptSelected),
727 m_pWptListCtrl->Connect(
728 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
729 wxListEventHandler(RouteManagerDialog::OnWptDefaultAction), NULL,
this);
730 m_pWptListCtrl->Connect(
732 wxMouseEventHandler(RouteManagerDialog::OnWptToggleVisibility), NULL,
734 m_pWptListCtrl->Connect(
735 wxEVT_COMMAND_LIST_COL_CLICK,
736 wxListEventHandler(RouteManagerDialog::OnWptColumnClicked), NULL,
this);
737 bSizerWptContents->Add(m_pWptListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
738 sbsWpts->Add(bSizerWptContents, 1, wxEXPAND, 5);
740 m_pWptListCtrl->InsertColumn(colWPTICON, _(
"Icon"), wxLIST_FORMAT_LEFT,
742 m_pWptListCtrl->InsertColumn(colWPTSCALE, _(
"Scale"), wxLIST_FORMAT_LEFT,
744 m_pWptListCtrl->InsertColumn(colWPTNAME, _(
"Mark Name"), wxLIST_FORMAT_LEFT,
746 m_pWptListCtrl->InsertColumn(colWPTDIST, _(
"Distance from own ship"),
747 wxLIST_FORMAT_LEFT, 14 * char_width);
749 wxBoxSizer *bsWptButtons =
new wxBoxSizer(wxVERTICAL);
750 sbsWpts->Add(bsWptButtons, 0, wxEXPAND);
752 wxScrolledWindow *winw =
new wxScrolledWindow(
753 m_pPanelWpt, wxID_ANY, wxDefaultPosition, wxDefaultSize,
754 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
755 winw->SetScrollRate(0, 5);
757 bsWptButtons->Add(winw, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
759 wxBoxSizer *bsWptButtonsInner =
new wxBoxSizer(wxVERTICAL);
760 winw->SetSizer(bsWptButtonsInner);
762 btnWptNew =
new wxButton(winw, -1, _(
"&New"));
763 bsWptButtonsInner->Add(btnWptNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
764 btnWptNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
765 wxCommandEventHandler(RouteManagerDialog::OnWptNewClick),
768 btnWptProperties =
new wxButton(winw, -1, _(
"&Properties"));
769 bsWptButtonsInner->Add(btnWptProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
770 btnWptProperties->Connect(
771 wxEVT_COMMAND_BUTTON_CLICKED,
772 wxCommandEventHandler(RouteManagerDialog::OnWptPropertiesClick), NULL,
775 btnWptZoomto =
new wxButton(winw, -1, _(
"&Center View"));
776 bsWptButtonsInner->Add(btnWptZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
777 btnWptZoomto->Connect(
778 wxEVT_COMMAND_BUTTON_CLICKED,
779 wxCommandEventHandler(RouteManagerDialog::OnWptZoomtoClick), NULL,
this);
781 btnWptDelete =
new wxButton(winw, -1, _(
"&Delete"));
782 bsWptButtonsInner->Add(btnWptDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
783 btnWptDelete->Connect(
784 wxEVT_COMMAND_BUTTON_CLICKED,
785 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteClick), NULL,
this);
787 btnWptGoTo =
new wxButton(winw, -1, _(
"&Go To"));
788 bsWptButtonsInner->Add(btnWptGoTo, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
789 btnWptGoTo->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
790 wxCommandEventHandler(RouteManagerDialog::OnWptGoToClick),
793 btnWptExport =
new wxButton(winw, -1, _(
"&Export selected..."));
794 bsWptButtonsInner->Add(btnWptExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
795 btnWptExport->Connect(
796 wxEVT_COMMAND_BUTTON_CLICKED,
797 wxCommandEventHandler(RouteManagerDialog::OnWptExportClick), NULL,
this);
799 btnWptSendToGPS =
new wxButton(winw, -1, _(
"&Send to GPS"));
800 bsWptButtonsInner->Add(btnWptSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
801 btnWptSendToGPS->Connect(
802 wxEVT_COMMAND_BUTTON_CLICKED,
803 wxCommandEventHandler(RouteManagerDialog::OnWptSendToGPSClick), NULL,
806 btnWptSendToPeer =
new wxButton(winw, -1, _(
"Send to &Peer"));
807 bsWptButtonsInner->Add(btnWptSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
808 btnWptSendToPeer->Connect(
809 wxEVT_COMMAND_BUTTON_CLICKED,
810 wxCommandEventHandler(RouteManagerDialog::OnWptSendToPeerClick), NULL,
813 bsWptButtonsInner->AddSpacer(10);
815 btnWptDeleteAll =
new wxButton(winw, -1, _(
"Delete All"));
816 bsWptButtonsInner->Add(btnWptDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
817 btnWptDeleteAll->Connect(
818 wxEVT_COMMAND_BUTTON_CLICKED,
819 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteAllClick), NULL,
822 wxBoxSizer *itemBoxSizer5 =
new wxBoxSizer(wxHORIZONTAL);
823 itemBoxSizer1->Add(itemBoxSizer5, 0, wxALL | wxEXPAND);
825 wxBoxSizer *itemBoxSizer6 =
new wxBoxSizer(wxHORIZONTAL);
826 itemBoxSizer5->Add(itemBoxSizer6, 1, wxALL | wxEXPAND);
828 btnImport =
new wxButton(
this, -1, _(
"I&mport GPX..."));
829 itemBoxSizer6->Add(btnImport, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
830 btnImport->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
831 wxCommandEventHandler(RouteManagerDialog::OnImportClick),
840 btnExportViz =
new wxButton(
this, -1, _(
"Export All Visible..."));
841 itemBoxSizer6->Add(btnExportViz, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
842 btnExportViz->Connect(
843 wxEVT_COMMAND_BUTTON_CLICKED,
844 wxCommandEventHandler(RouteManagerDialog::OnExportVizClick), NULL,
this);
846 btnBackup =
new wxButton(
this, -1, _(
"Backup..."));
847 itemBoxSizer6->Add(btnBackup, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
848 btnBackup->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
849 wxCommandEventHandler(RouteManagerDialog::OnBackupClick),
852 wxSize sz = ::wxGetDisplaySize();
854 itemBoxSizer6->Add(0, 0, 1, wxEXPAND, 5);
855 itemBoxSizer6->Add(
new wxButton(
this, wxID_OK), 0, wxALL, DIALOG_MARGIN);
857 wxStaticLine *staticLine121 =
new wxStaticLine(
858 this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
859 itemBoxSizer1->Add(staticLine121, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
861 wxBoxSizer *itemBoxSizer7 =
new wxBoxSizer(wxHORIZONTAL);
862 itemBoxSizer1->Add(itemBoxSizer7, 0, wxEXPAND);
864 wxBoxSizer *itemBoxSizer7a =
new wxBoxSizer(wxHORIZONTAL);
865 itemBoxSizer7->Add(itemBoxSizer7a, 1, wxEXPAND);
867 itemBoxSizer7a->AddStretchSpacer();
868 itemBoxSizer7a->Add(
new wxButton(
this, wxID_OK), 0, wxRIGHT | wxALIGN_RIGHT,
873 m_pPanelLay =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
874 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
875 wxBoxSizer *sbsLayers =
new wxBoxSizer(wxHORIZONTAL);
876 m_pPanelLay->SetSizer(sbsLayers);
877 m_pNotebook->AddPage(m_pPanelLay, _(
"Layers"));
879 wxBoxSizer *bSizerLayContents;
880 bSizerLayContents =
new wxBoxSizer(wxVERTICAL);
882 wxFlexGridSizer *fgSizerFilterLay;
883 fgSizerFilterLay =
new wxFlexGridSizer(0, 2, 0, 0);
884 fgSizerFilterLay->AddGrowableCol(1);
885 fgSizerFilterLay->SetFlexibleDirection(wxBOTH);
886 fgSizerFilterLay->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
888 m_stFilterLay =
new wxStaticText(m_pPanelLay, wxID_ANY, _(
"Filter"),
889 wxDefaultPosition, wxDefaultSize, 0);
890 m_stFilterLay->Wrap(-1);
891 fgSizerFilterLay->Add(m_stFilterLay, 0, wxALL, 5);
893 m_tFilterLay =
new wxTextCtrl(m_pPanelLay, wxID_ANY,
"", wxDefaultPosition,
895 fgSizerFilterLay->Add(m_tFilterLay, 1, wxALL | wxEXPAND, 5);
897 bSizerLayContents->Add(fgSizerFilterLay, 0, wxEXPAND, 5);
898 m_tFilterLay->Connect(
899 wxEVT_COMMAND_TEXT_UPDATED,
900 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
902 m_cbShowAllLay =
new wxCheckBox(m_pPanelLay, wxID_ANY, _(
"Show all layers"));
903 bSizerLayContents->Add(m_cbShowAllLay, 0, wxEXPAND | wxLEFT, 5);
904 m_cbShowAllLay->Connect(
905 wxEVT_COMMAND_CHECKBOX_CLICKED,
906 wxCommandEventHandler(RouteManagerDialog::OnShowAllLayCBClicked), NULL,
910 new wxListCtrl(m_pPanelLay, -1, wxDefaultPosition, wxDefaultSize,
911 wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING |
912 wxLC_HRULES | wxBORDER_SUNKEN );
914 m_pLayListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
917 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
918 wxListEventHandler(RouteManagerDialog::OnLaySelected),
920 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
921 wxListEventHandler(RouteManagerDialog::OnLaySelected),
923 m_pLayListCtrl->Connect(
924 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
925 wxListEventHandler(RouteManagerDialog::OnLayDefaultAction), NULL,
this);
926 m_pLayListCtrl->Connect(
928 wxMouseEventHandler(RouteManagerDialog::OnLayToggleVisibility), NULL,
930 m_pLayListCtrl->Connect(
931 wxEVT_COMMAND_LIST_COL_CLICK,
932 wxListEventHandler(RouteManagerDialog::OnLayColumnClicked), NULL,
this);
933 bSizerLayContents->Add(m_pLayListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
934 sbsLayers->Add(bSizerLayContents, 1, wxEXPAND, 5);
936 m_pLayListCtrl->InsertColumn(colLAYVISIBLE,
"", wxLIST_FORMAT_LEFT,
938 m_pLayListCtrl->InsertColumn(colLAYNAME, _(
"Layer Name"), wxLIST_FORMAT_LEFT,
940 m_pLayListCtrl->InsertColumn(colLAYITEMS, _(
"No. of items"),
941 wxLIST_FORMAT_LEFT, 10 * char_width);
942 m_pLayListCtrl->InsertColumn(colLAYPERSIST, _(
"Layer type"),
943 wxLIST_FORMAT_LEFT, 10 * char_width);
945 wxBoxSizer *bsLayButtons =
new wxBoxSizer(wxVERTICAL);
946 sbsLayers->Add(bsLayButtons, 0, wxEXPAND);
948 wxScrolledWindow *winl =
new wxScrolledWindow(
949 m_pPanelLay, wxID_ANY, wxDefaultPosition, wxDefaultSize,
950 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
951 winl->SetScrollRate(0, 5);
953 bsLayButtons->Add(winl, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
955 wxBoxSizer *bsLayButtonsInner =
new wxBoxSizer(wxVERTICAL);
956 winl->SetSizer(bsLayButtonsInner);
958 btnLayNew =
new wxButton(winl, -1, _(
"Create Temporary layer"));
959 bsLayButtonsInner->Add(btnLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
960 btnLayNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
961 wxCommandEventHandler(RouteManagerDialog::OnLayNewClick),
964 btnPerLayNew =
new wxButton(winl, -1, _(
"Create Persistent layer"));
965 bsLayButtonsInner->Add(btnPerLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
966 btnPerLayNew->Connect(
967 wxEVT_COMMAND_BUTTON_CLICKED,
968 wxCommandEventHandler(RouteManagerDialog::OnPerLayNewClick), NULL,
this);
970 btnLayDelete =
new wxButton(winl, -1, _(
"&Delete"));
971 bsLayButtonsInner->Add(btnLayDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
972 btnLayDelete->Connect(
973 wxEVT_COMMAND_BUTTON_CLICKED,
974 wxCommandEventHandler(RouteManagerDialog::OnLayDeleteClick), NULL,
this);
976 cbLayToggleChart =
new wxCheckBox(winl, -1, _(
"Show on chart"));
977 bsLayButtonsInner->Add(cbLayToggleChart, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
978 cbLayToggleChart->Connect(
979 wxEVT_COMMAND_CHECKBOX_CLICKED,
980 wxCommandEventHandler(RouteManagerDialog::OnLayToggleChartClick), NULL,
984 new wxCheckBox(winl, -1, _(
"Show WPT names"), wxDefaultPosition,
985 wxDefaultSize, wxCHK_3STATE);
987 bsLayButtonsInner->Add(cbLayToggleNames, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
988 cbLayToggleNames->Connect(
989 wxEVT_COMMAND_CHECKBOX_CLICKED,
990 wxCommandEventHandler(RouteManagerDialog::OnLayToggleNamesClick), NULL,
993 cbLayToggleListing =
new wxCheckBox(winl, -1, _(
"List contents"));
994 bsLayButtonsInner->Add(cbLayToggleListing, 0, wxALL | wxEXPAND,
996 cbLayToggleListing->Connect(
997 wxEVT_COMMAND_CHECKBOX_CLICKED,
998 wxCommandEventHandler(RouteManagerDialog::OnLayToggleListingClick), NULL,
1003 int imageRefSize = m_charWidth * 2;
1004 wxImageList *imglist =
new wxImageList(imageRefSize, imageRefSize,
true, 1);
1007 wxString UserIconPath = g_Platform->GetSharedDataDir() +
"uidata" +
1008 wxFileName::GetPathSeparator();
1010 LoadSVG(UserIconPath +
"eye.svg", imageRefSize, imageRefSize)
1012 if (iconSVG.IsOk()) {
1013 iconSVG.Resize(wxSize(imageRefSize, imageRefSize),
1015 imglist->Add(wxBitmap(iconSVG));
1018 iconSVG =
LoadSVG(UserIconPath +
"eyex.svg", imageRefSize, imageRefSize)
1020 if (iconSVG.IsOk()) {
1021 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1022 imglist->Add(wxBitmap(iconSVG));
1025 iconSVG =
LoadSVG(UserIconPath +
"eyeGray.svg", imageRefSize, imageRefSize)
1027 if (iconSVG.IsOk()) {
1028 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1029 imglist->Add(wxBitmap(iconSVG));
1032 m_pRouteListCtrl->AssignImageList(imglist, wxIMAGE_LIST_SMALL);
1035 m_pRouteListCtrl->GetHandle()->setIconSize(QSize(imageRefSize, imageRefSize));
1039 m_pTrkListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1040 m_pWptListCtrl->SetImageList(
1041 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
1042 wxIMAGE_LIST_SMALL);
1043 m_pLayListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1053 m_bNeedConfigFlush =
false;
1056RouteManagerDialog::~RouteManagerDialog() {
1057 delete m_pRouteListCtrl;
1058 delete m_pTrkListCtrl;
1059 delete m_pWptListCtrl;
1060 delete m_pLayListCtrl;
1062 delete btnRteDelete;
1063 delete btnRteResequence;
1064 delete btnRteExport;
1065 delete btnRteZoomto;
1066 delete btnRteProperties;
1067 delete btnRteActivate;
1068 delete btnRteReverse;
1069 delete btnRteSendToGPS;
1070 delete btnRteDeleteAll;
1072 delete btnTrkProperties;
1073 delete btnTrkDelete;
1074 delete btnTrkExport;
1075 delete btnTrkRouteFromTrack;
1076 delete btnTrkDeleteAll;
1078 delete btnWptProperties;
1079 delete btnWptZoomto;
1080 delete btnWptDelete;
1082 delete btnWptExport;
1083 delete btnWptSendToGPS;
1084 delete btnWptDeleteAll;
1087 delete cbLayToggleChart;
1088 delete cbLayToggleListing;
1089 delete cbLayToggleNames;
1090 delete btnLayDelete;
1093 delete btnExportViz;
1096 btnExportViz = NULL;
1099 instanceFlag =
false;
1102void RouteManagerDialog::RecalculateSize() {
1108 int char_width, char_height;
1109 GetTextExtent(
"W", &char_width, &char_height);
1112 sz.x = 60 * char_width;
1113 sz.y = 30 * char_height;
1115 wxSize dsize = GetParent()->GetClientSize();
1116 sz.y = wxMin(sz.y, dsize.y);
1117 sz.x = wxMin(sz.x, dsize.x);
1120 wxSize fsize = GetSize();
1121 fsize.y = wxMin(fsize.y, dsize.y);
1122 fsize.x = wxMin(fsize.x, dsize.x);
1128void RouteManagerDialog::OnClose(wxCloseEvent &event) {
1136void RouteManagerDialog::OnOK(wxCommandEvent &event) {
1143void RouteManagerDialog::SetColorScheme() { DimeControl(
this); }
1145void RouteManagerDialog::OnShowAllRteCBClicked(wxCommandEvent &event) {
1146 bool viz = m_cbShowAllRte->GetValue();
1148 int item_count = m_pRouteListCtrl->GetItemCount();
1150 if (item_count > 50) {
1152 ::wxBeginBusyCursor();
1155 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1156 wxLIST_STATE_DONTCARE);
1157 if (item == -1)
break;
1159 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1161 pR->SetVisible(viz, viz);
1162 pR->SetSharedWPViz(viz);
1164 m_pRouteListCtrl->SetItemImage(item, !viz);
1166 NavObj_dB::GetInstance().UpdateRouteViz(pR);
1169 if (busy) ::wxEndBusyCursor();
1171 UpdateWptListCtrlViz();
1172 gFrame->RefreshAllCanvas();
1175void RouteManagerDialog::OnShowAllWpCBClicked(wxCommandEvent &event) {
1176 bool viz = m_cbShowAllWP->GetValue();
1178 int item_count = m_pWptListCtrl->GetItemCount();
1180 if (item_count > 100) {
1182 ::wxBeginBusyCursor();
1186 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1187 wxLIST_STATE_DONTCARE);
1188 if (item == -1)
break;
1192 if (!pRP->IsSharedInVisibleRoute()) {
1193 pRP->SetVisible(viz);
1195 pRP->SetVisible(
true);
1197 m_pWptListCtrl->SetItemImage(item,
RoutePointGui(*pRP).GetIconImageIndex());
1198 NavObj_dB::GetInstance().UpdateDBRoutePointViz(pRP);
1201 if (busy) ::wxEndBusyCursor();
1203 gFrame->RefreshAllCanvas();
1206void RouteManagerDialog::OnShowAllTrkCBClicked(wxCommandEvent &event) {
1207 bool viz = m_cbShowAllTrk->GetValue();
1210 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1211 wxLIST_STATE_DONTCARE);
1212 if (item == -1)
break;
1214 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1216 track->SetVisible(viz);
1217 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
1218 m_pTrkListCtrl->SetItemImage(item, track->IsVisible() ? 0 : 1);
1221 gFrame->RefreshAllCanvas();
1224void RouteManagerDialog::OnShowAllLayCBClicked(wxCommandEvent &event) {
1225 bool viz = m_cbShowAllLay->GetValue();
1228 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1229 wxLIST_STATE_DONTCARE);
1230 if (item == -1)
break;
1232 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
1234 layer->SetVisibleOnChart(viz);
1235 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
1237 ToggleLayerContentsOnChart(layer);
1240 gFrame->RefreshAllCanvas();
1243void RouteManagerDialog::UpdateRouteListCtrl() {
1246 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1247 wxLIST_STATE_SELECTED);
1248 wxUIntPtr selected_id = wxUIntPtr(0);
1249 if (item != -1) selected_id = m_pRouteListCtrl->GetItemData(item);
1252 m_pRouteListCtrl->DeleteAllItems();
1255 RouteList::iterator it;
1258 bool bpartialViz =
false;
1260 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1261 if (!(*it)->IsListed())
continue;
1263 if (!(*it)->GetName().Upper().Contains(m_tFilterRte->GetValue().Upper())) {
1268 li.SetId(list_index);
1269 li.SetImage((*it)->IsVisible() ? 0 : 1);
1272 li.SetAlign(wxLIST_FORMAT_LEFT);
1274 if ((*it)->m_bRtIsActive) {
1275 wxFont font = *wxNORMAL_FONT;
1276 font.SetWeight(wxFONTWEIGHT_BOLD);
1280 long idx = m_pRouteListCtrl->InsertItem(li);
1282 wxString name = (*it)->m_RouteNameString;
1283 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
1284 m_pRouteListCtrl->SetItem(idx, rmROUTENAME, name);
1286 wxString startend = (*it)->m_RouteStartString;
1287 if (!(*it)->m_RouteEndString.IsEmpty())
1288 startend.append(_(
" - ") + (*it)->m_RouteEndString);
1289 m_pRouteListCtrl->SetItem(idx, rmROUTEDESC, startend);
1292 lic.SetId(list_index);
1294 lic.SetAlign(wxLIST_FORMAT_LEFT);
1295 m_pRouteListCtrl->SetItem(lic);
1298 lic.SetAlign(wxLIST_FORMAT_LEFT);
1299 m_pRouteListCtrl->SetItem(lic);
1302 if (!(*it)->IsVisible()) bpartialViz =
true;
1307 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1309 m_pRouteListCtrl->SetColumnWidth(0, 4 * m_charWidth);
1314 if (selected_id != wxUIntPtr(0)) {
1315 item = m_pRouteListCtrl->FindItem(-1, selected_id);
1316 m_pRouteListCtrl->SetItemState(
1317 item, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
1318 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
1321 if ((m_lastRteItem >= 0) && (m_pRouteListCtrl->GetItemCount()))
1322 m_pRouteListCtrl->EnsureVisible(m_lastRteItem);
1326 m_cbShowAllRte->SetValue(!bpartialViz);
1329void RouteManagerDialog::UpdateRteButtons() {
1331 long selected_index_index =
1332 m_pRouteListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1333 bool enable1 = m_pRouteListCtrl->GetSelectedItemCount() == 1;
1334 bool enablemultiple = m_pRouteListCtrl->GetSelectedItemCount() >= 1;
1336 m_lastRteItem = selected_index_index;
1338 btnRteDelete->Enable(m_pRouteListCtrl->GetSelectedItemCount() > 0);
1339 btnRteZoomto->Enable(enable1);
1340 btnRteProperties->Enable(enable1);
1341 btnRteReverse->Enable(enable1);
1342 btnRteExport->Enable(enablemultiple);
1343 btnRteResequence->Enable(enable1);
1344 btnRteSendToGPS->Enable(enable1);
1345 btnRteDeleteAll->Enable(m_pRouteListCtrl->GetItemCount() > 0);
1346 btnRteSendToPeer->Enable(enablemultiple);
1349 Route *route = NULL;
1351 route = (
Route *)m_pRouteListCtrl->GetItemData(selected_index_index);
1354 btnRteActivate->Enable(enable1);
1355 if (enable1) btnRteActivate->SetLabel(_(
"Activate"));
1360 btnRteActivate->Enable(enable1);
1361 btnRteActivate->SetLabel(_(
"Deactivate"));
1363 btnRteActivate->Enable(
false);
1365 btnRteActivate->Enable(
false);
1369void RouteManagerDialog::MakeAllRoutesInvisible() {
1370 RouteList::iterator it;
1372 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1373 if ((*it)->IsVisible()) {
1374 (*it)->SetVisible(
false);
1375 m_pRouteListCtrl->SetItemImage(m_pRouteListCtrl->FindItem(-1, index),
1377 NavObj_dB::GetInstance().UpdateRoute(*it);
1382void RouteManagerDialog::ZoomtoRoute(
Route *route) {
1384 LLBBox RBBox = route->GetBBox();
1385 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
1386 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
1392 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1393 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
1395 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1396 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
1398 if (gFrame->GetFocusCanvas()) {
1399 gFrame->GetFocusCanvas()->GetSize(&ww, &wh);
1400 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
1401 ppm = wxMin(ppm, 1.0);
1403 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), clat, clon, ppm);
1406 m_bNeedConfigFlush =
true;
1410void RouteManagerDialog::OnRteDeleteClick(wxCommandEvent &event) {
1411 int count = m_pRouteListCtrl->GetSelectedItemCount();
1412 bool confirmed = RouteGui::OnDelete(
this, count);
1414 if (confirmed && count > 0) {
1415 ::wxBeginBusyCursor();
1418 gFrame->CancelAllMouseRoute();
1419 m_bNeedConfigFlush =
true;
1423 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1424 wxLIST_STATE_SELECTED);
1425 if (item == -1)
break;
1427 Route *proute_to_delete = (
Route *)m_pRouteListCtrl->GetItemData(item);
1429 if (proute_to_delete) list.push_back(proute_to_delete);
1431 for (
Route *route : list) {
1433 NavObj_dB::GetInstance().DeleteRoute(route);
1439 UpdateRouteListCtrl();
1440 UpdateTrkListCtrl();
1442 gFrame->InvalidateAllCanvasUndo();
1443 gFrame->RefreshAllCanvas();
1444 ::wxEndBusyCursor();
1448void RouteManagerDialog::OnRteDeleteAllClick(wxCommandEvent &event) {
1450 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> routes?"),
1451 wxString(_(
"OpenCPN Alert")), wxYES_NO);
1453 if (dialog_ret == wxID_YES) {
1456 gFrame->CancelAllMouseRoute();
1461 UpdateRouteListCtrl();
1465 UpdateTrkListCtrl();
1468 gFrame->InvalidateAllCanvasUndo();
1469 gFrame->RefreshAllCanvas();
1471 m_bNeedConfigFlush =
true;
1475void RouteManagerDialog::OnRtePropertiesClick(wxCommandEvent &event) {
1478 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1479 wxLIST_STATE_SELECTED);
1480 if (item == -1)
return;
1482 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1494 m_bNeedConfigFlush =
true;
1497void RouteManagerDialog::OnRteZoomtoClick(wxCommandEvent &event) {
1500 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1501 wxLIST_STATE_SELECTED);
1502 if (item == -1)
return;
1505 if (m_bCtrlDown) MakeAllRoutesInvisible();
1507 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1512 if (!route->IsVisible()) {
1513 route->SetVisible(
true);
1514 m_pRouteListCtrl->SetItemImage(item, route->IsVisible() ? 0 : 1);
1515 NavObj_dB::GetInstance().UpdateRoute(route);
1521void RouteManagerDialog::OnRteReverseClick(wxCommandEvent &event) {
1524 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1525 wxLIST_STATE_SELECTED);
1526 if (item == -1)
return;
1528 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1533 int ask_return = OCPNMessageBox(
this,
g_pRouteMan->GetRouteReverseMessage(),
1534 _(
"Rename Waypoints?"), wxYES_NO | wxCANCEL);
1535 if (ask_return != wxID_CANCEL) {
1536 bool rename = (ask_return == wxID_YES);
1538 pSelect->DeleteAllSelectableRouteSegments(route);
1539 route->Reverse(rename);
1540 pSelect->AddAllSelectableRouteSegments(route);
1546 m_pRouteListCtrl->SetItem(item, 2, startend);
1548 NavObj_dB::GetInstance().UpdateRoute(route);
1550 gFrame->RefreshAllCanvas();
1553 m_bNeedConfigFlush =
true;
1556void RouteManagerDialog::OnRteExportClick(wxCommandEvent &event) {
1559 wxString suggested_name =
"routes";
1563 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1564 wxLIST_STATE_SELECTED);
1565 if (item == -1)
break;
1567 Route *proute_to_export = (
Route *)m_pRouteListCtrl->GetItemData(item);
1569 if (proute_to_export) {
1570 list.push_back(proute_to_export);
1576 ExportGPXRoutes(
this, &list, suggested_name);
1579void RouteManagerDialog::OnRteResequenceClick(wxCommandEvent &event) {
1581 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1582 wxLIST_STATE_SELECTED);
1583 if (item == -1)
return;
1585 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1589 route->RenameRoutePoints();
1592void RouteManagerDialog::OnRteSendToPeerClick(wxCommandEvent &event) {
1593 std::vector<Route *> list;
1596 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1597 wxLIST_STATE_SELECTED);
1598 if (item == -1)
break;
1600 Route *proute = (
Route *)m_pRouteListCtrl->GetItemData(item);
1603 list.push_back(proute);
1606 if (!list.empty()) {
1608 for (
auto r : list) {
1615 MdnsCache::GetInstance().
Validate();
1616 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1619 dlg.Create(NULL, -1, _(
"Send Route(s) to OpenCPN Peer") +
"...",
"");
1624void RouteManagerDialog::OnWptSendToPeerClick(wxCommandEvent &event) {
1625 std::vector<RoutePoint *> list;
1628 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1629 wxLIST_STATE_SELECTED);
1630 if (item == -1)
break;
1635 list.push_back(proutep);
1638 if (!list.empty()) {
1640 for (
auto r : list) {
1647 MdnsCache::GetInstance().
Validate();
1648 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1651 dlg.Create(NULL, -1, _(
"Send Waypoint(s) to OpenCPN Peer") +
"...",
"");
1656void RouteManagerDialog::OnTrkSendToPeerClick(wxCommandEvent &event) {
1657 std::vector<Track *> list;
1660 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1661 wxLIST_STATE_SELECTED);
1662 if (item == -1)
break;
1664 Track *ptrk = (
Track *)m_pTrkListCtrl->GetItemData(item);
1667 list.push_back(ptrk);
1670 if (!list.empty()) {
1672 for (
auto r : list) {
1679 MdnsCache::GetInstance().
Validate();
1680 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1683 dlg.Create(NULL, -1, _(
"Send Track(s) to OpenCPN Peer") +
"...",
"");
1688void RouteManagerDialog::OnRteActivateClick(wxCommandEvent &event) {
1691 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1692 wxLIST_STATE_SELECTED);
1693 if (item == -1)
return;
1695 if (m_bCtrlDown) MakeAllRoutesInvisible();
1697 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1702 if (!route->IsVisible()) {
1703 route->SetVisible(
true);
1704 m_pRouteListCtrl->SetItemImage(item, 0, 0);
1716 UpdateRouteListCtrl();
1718 NavObj_dB::GetInstance().UpdateRoute(route);
1720 gFrame->RefreshAllCanvas();
1725 m_bNeedConfigFlush =
true;
1728void RouteManagerDialog::OnRteToggleVisibility(wxMouseEvent &event) {
1729 wxPoint pos =
event.GetPosition();
1731 long clicked_index = m_pRouteListCtrl->HitTest(pos, flags);
1734 if (clicked_index > -1 &&
1735 event.GetX() < m_pRouteListCtrl->GetColumnWidth(rmVISIBLE)) {
1737 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1739 route->SetVisible(!route->IsVisible());
1741 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1743 ::wxBeginBusyCursor();
1745 NavObj_dB::GetInstance().UpdateRoute(route);
1747 gFrame->RefreshAllCanvas();
1751 if (
g_pRouteMan->DoesRouteContainSharedPoints(route))
1752 UpdateWptListCtrlViz();
1758 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1759 wxLIST_STATE_DONTCARE);
1760 if (item == -1)
break;
1762 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1764 if (!pR->IsVisible()) {
1769 m_cbShowAllRte->SetValue(viz);
1771 ::wxEndBusyCursor();
1778void RouteManagerDialog::OnRteBtnLeftDown(wxMouseEvent &event) {
1779 m_bCtrlDown =
event.ControlDown();
1783void RouteManagerDialog::OnRteSelected(wxListEvent &event) {
1784 long clicked_index =
event.m_itemIndex;
1786 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1788 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1790 gFrame->RefreshAllCanvas();
1795void RouteManagerDialog::OnRteColumnClicked(wxListEvent &event) {
1796 if (event.m_col == 1) {
1797 sort_route_name_dir++;
1799 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1800 }
else if (event.m_col == 2) {
1801 sort_route_to_dir++;
1802 m_pRouteListCtrl->SortItems(SortRoutesOnTo, (wxIntPtr)NULL);
1806void RouteManagerDialog::OnRteSendToGPSClick(wxCommandEvent &event) {
1808 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1809 wxLIST_STATE_SELECTED);
1810 if (item == -1)
return;
1812 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1817 pdlg->SetRoute(route);
1823 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
1826 HideWithEffect(wxSHOW_EFFECT_BLEND);
1832 ShowWithEffect(wxSHOW_EFFECT_BLEND);
1838void RouteManagerDialog::OnRteDefaultAction(wxListEvent &event) {
1840 OnRtePropertiesClick(evt);
1843void RouteManagerDialog::OnTrkDefaultAction(wxListEvent &event) {
1845 OnTrkPropertiesClick(evt);
1848void RouteManagerDialog::OnTrkRightClick(wxListEvent &event) {
1850 wxMenuItem *mergeItem = menu.Append(TRACK_MERGE, _(
"&Merge Selected Tracks"));
1851 mergeItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 1);
1852 wxMenuItem *cleanItem = menu.Append(TRACK_CLEAN, _(
"Reduce Data..."));
1853 cleanItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() == 1);
1854 wxMenuItem *copyItem = menu.Append(TRACK_COPY_TEXT, _(
"&Copy as text"));
1855 copyItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 0);
1859static bool CompareTracks(
Track *track1,
Track *track2) {
1865void RouteManagerDialog::OnTrkMenuSelected(wxCommandEvent &event) {
1868 switch (event.GetId()) {
1870 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1871 wxLIST_STATE_SELECTED);
1872 if (item == -1)
break;
1873 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1874 if (track->IsRunning()) {
1879 const wxString choices[] = {
"5.0",
"10.0",
"20.0",
"50.0",
"100.0"};
1881 wxSingleChoiceDialog precisionDlg(
this,
1882 _(
"Select the maximum error allowed "
1883 "(in meters)\nafter data reduction:"),
1884 _(
"Reduce Data Precision"), 5, choices);
1886 precisionDlg.ShowWindowModal();
1887 while (precisionDlg.IsShown()) {
1891 int result = precisionDlg.GetReturnCode();
1893 int result = precisionDlg.ShowModal();
1895 if (result == wxID_CANCEL)
break;
1896 double precision = 5.0;
1897 switch (precisionDlg.GetSelection()) {
1915 int pointsBefore = track->GetnPoints();
1917 int reduction = track->Simplify(precision);
1918 gFrame->Refresh(
false);
1920 reduction = 100 * reduction / pointsBefore;
1921 wxString msg = wxString::Format(
1922 _(
"The amount of data used by the track\n was reduced by %d%%."),
1924 OCPNMessageBox(
this, msg, _(
"OpenCPN info"), wxICON_INFORMATION | wxOK);
1926 UpdateTrkListCtrl();
1927 UpdateRouteListCtrl();
1932 case TRACK_COPY_TEXT: {
1935 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1936 wxLIST_STATE_SELECTED);
1937 if (item == -1)
break;
1938 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1939 csvString << track->GetName() <<
"\t"
1940 << wxString::Format(
"%.1f", track->Length()) <<
"\t"
1944 if (wxTheClipboard->Open()) {
1945 wxTextDataObject *data =
new wxTextDataObject;
1946 data->SetText(csvString);
1947 wxTheClipboard->SetData(data);
1948 wxTheClipboard->Close();
1955 Track *targetTrack = NULL;
1959 std::vector<Track *> mergeList;
1960 std::vector<Track *> deleteList;
1961 bool runningSkipped =
false;
1963 ::wxBeginBusyCursor();
1966 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1967 wxLIST_STATE_SELECTED);
1968 if (item == -1)
break;
1969 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1970 mergeList.push_back(track);
1973 if (!mergeList.size()) {
1974 ::wxEndBusyCursor();
1978 std::sort(mergeList.begin(), mergeList.end(), CompareTracks);
1980 targetTrack = mergeList[0];
1981 lastPoint = targetTrack->GetLastPoint();
1983 for (
auto const &mergeTrack : mergeList) {
1984 if (mergeTrack == *mergeList.begin())
continue;
1986 if (mergeTrack->IsRunning()) {
1987 runningSkipped =
true;
1991 for (
int i = 0; i < mergeTrack->GetnPoints(); i++) {
1992 tPoint = mergeTrack->GetPoint(i);
1993 newPoint =
new TrackPoint(tPoint->m_lat, tPoint->m_lon,
1996 targetTrack->AddPoint(newPoint);
1997 NavObj_dB::GetInstance().AddTrackPoint(targetTrack, newPoint);
1999 pSelect->AddSelectableTrackSegment(lastPoint->m_lat, lastPoint->m_lon,
2000 newPoint->m_lat, newPoint->m_lon,
2001 lastPoint, newPoint, targetTrack);
2002 lastPoint = newPoint;
2004 deleteList.push_back(mergeTrack);
2007 for (
auto const &deleteTrack : deleteList) {
2008 g_pAIS->DeletePersistentTrack(deleteTrack);
2009 NavObj_dB::GetInstance().DeleteTrack(deleteTrack);
2010 RoutemanGui(*g_pRouteMan).DeleteTrack(deleteTrack);
2016 ::wxEndBusyCursor();
2018 UpdateTrkListCtrl();
2019 UpdateRouteListCtrl();
2020 gFrame->RefreshAllCanvas();
2022 if (runningSkipped) {
2023 wxMessageDialog skipWarning(
2025 _(
"The currently running Track was not merged.\nYou can merge it "
2026 "later when it is completed."),
2027 "Warning", wxCANCEL | wxICON_WARNING);
2028 skipWarning.ShowModal();
2036void RouteManagerDialog::UpdateTrkListCtrl() {
2040 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2042 wxUIntPtr selected_id = wxUIntPtr(0);
2043 if (item != -1) selected_id = m_pTrkListCtrl->GetItemData(item);
2046 m_pTrkListCtrl->DeleteAllItems();
2049 std::vector<Track *>::iterator it;
2052 bool bpartialViz =
false;
2055 if (!trk->IsVisible()) bpartialViz =
true;
2057 if (!trk->IsListed())
continue;
2059 if (!trk->GetName(
true).Upper().Contains(
2060 m_tFilterTrk->GetValue().Upper())) {
2065 li.SetId(list_index);
2066 li.SetImage(trk->IsVisible() ? 0 : 1);
2071 wxFont font = *wxNORMAL_FONT;
2072 font.SetWeight(wxFONTWEIGHT_BOLD);
2075 long idx = m_pTrkListCtrl->InsertItem(li);
2077 m_pTrkListCtrl->SetItem(idx, colTRKNAME, trk->GetName(
true));
2080 m_pTrkListCtrl->SetItem(idx, colTRKDATE, trk->GetDateTime());
2083 len.Printf(
"%5.2f", trk->Length());
2084 m_pTrkListCtrl->SetItem(idx, colTRKLENGTH, len);
2087 lic.SetId(list_index);
2089 lic.SetAlign(wxLIST_FORMAT_LEFT);
2090 m_pTrkListCtrl->SetItem(lic);
2093 lic.SetAlign(wxLIST_FORMAT_LEFT);
2094 m_pTrkListCtrl->SetItem(lic);
2099 switch (sort_track_key) {
2100 case SORT_ON_DISTANCE:
2101 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2104 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2108 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2112 m_pTrkListCtrl->SetColumnWidth(0, 4 * m_charWidth);
2117 if (selected_id != wxUIntPtr(0)) {
2118 item = m_pTrkListCtrl->FindItem(-1, selected_id);
2119 m_pTrkListCtrl->SetItemState(item,
2120 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2121 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2124 if ((m_lastTrkItem >= 0) && (m_pTrkListCtrl->GetItemCount()))
2125 m_pTrkListCtrl->EnsureVisible(m_lastTrkItem);
2127 m_cbShowAllTrk->SetValue(!bpartialViz);
2131void RouteManagerDialog::OnTrkSelected(wxListEvent &event) {
2135void RouteManagerDialog::OnTrkColumnClicked(wxListEvent &event) {
2136 if (event.m_col == 1) {
2137 sort_track_key = SORT_ON_NAME;
2138 sort_track_name_dir++;
2139 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2140 }
else if (event.m_col == 2) {
2141 sort_track_key = SORT_ON_DISTANCE;
2142 sort_track_len_dir++;
2143 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2144 }
else if (event.m_col == 3) {
2145 sort_track_key = SORT_ON_DATE;
2146 sort_track_date_dir++;
2147 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2151void RouteManagerDialog::UpdateTrkButtons() {
2154 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2155 int items = m_pTrkListCtrl->GetSelectedItemCount();
2157 m_lastTrkItem = item;
2159 btnTrkProperties->Enable(items == 1);
2160 btnTrkDelete->Enable(items >= 1);
2161 btnTrkExport->Enable(items >= 1);
2162 btnTrkRouteFromTrack->Enable(items == 1);
2163 btnTrkDeleteAll->Enable(m_pTrkListCtrl->GetItemCount() > 0);
2164 btnTrkSendToPeer->Enable(items >= 1);
2167void RouteManagerDialog::OnTrkToggleVisibility(wxMouseEvent &event) {
2168 wxPoint pos =
event.GetPosition();
2170 long clicked_index = m_pTrkListCtrl->HitTest(pos, flags);
2173 if (clicked_index > -1 &&
2174 event.GetX() < m_pTrkListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2176 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(clicked_index);
2178 track->SetVisible(!track->IsVisible());
2179 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
2180 m_pTrkListCtrl->SetItemImage(clicked_index, track->IsVisible() ? 0 : 1);
2187 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2188 wxLIST_STATE_DONTCARE);
2189 if (item == -1)
break;
2191 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2193 if (!track->IsVisible()) {
2198 m_cbShowAllTrk->SetValue(viz);
2200 gFrame->RefreshAllCanvas();
2207void RouteManagerDialog::OnTrkNewClick(wxCommandEvent &event) {
2211 UpdateTrkListCtrl();
2214void RouteManagerDialog::OnTrkPropertiesClick(wxCommandEvent &event) {
2218 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2219 if (item == -1)
return;
2221 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2229 UpdateTrkListCtrl();
2231 m_bNeedConfigFlush =
true;
2234void RouteManagerDialog::OnTrkDeleteClick(wxCommandEvent &event) {
2235 std::vector<Track *> list;
2237 int answer = OCPNMessageBox(
2238 this, _(
"Are you sure you want to delete the selected object(s)"),
2239 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2240 if (answer != wxID_YES)
return;
2243 if (m_pTrkListCtrl->GetSelectedItemCount()) {
2244 ::wxBeginBusyCursor();
2251 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2252 wxLIST_STATE_SELECTED);
2253 if (item == -1)
break;
2255 Track *ptrack_to_delete = (
Track *)m_pTrkListCtrl->GetItemData(item);
2257 if (ptrack_to_delete) list.push_back(ptrack_to_delete);
2261 for (
unsigned int i = 0; i < list.size(); i++) {
2262 Track *track = list.at(i);
2264 g_pAIS->DeletePersistentTrack(track);
2265 NavObj_dB::GetInstance().DeleteTrack(track);
2272 UpdateTrkListCtrl();
2274 gFrame->InvalidateAllCanvasUndo();
2275 gFrame->RefreshAllCanvas();
2276 ::wxEndBusyCursor();
2280void RouteManagerDialog::OnTrkExportClick(wxCommandEvent &event) {
2281 std::vector<Track *> list;
2282 wxString suggested_name =
"tracks";
2286 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2287 wxLIST_STATE_SELECTED);
2288 if (item == -1)
break;
2290 Track *ptrack_to_export = (
Track *)m_pTrkListCtrl->GetItemData(item);
2292 if (ptrack_to_export) {
2293 list.push_back(ptrack_to_export);
2294 if (ptrack_to_export->GetName() !=
"")
2295 suggested_name = ptrack_to_export->GetName();
2299 ExportGPXTracks(
this, &list, suggested_name);
2302void RouteManagerDialog::TrackToRoute(
Track *track) {
2304 if (track->m_bIsInLayer)
return;
2306 wxGenericProgressDialog pprog(_(
"OpenCPN Converting Track to Route...."),
2307 _(
"Processing Waypoints..."), 101, NULL,
2308 wxPD_AUTO_HIDE | wxPD_SMOOTH |
2309 wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2310 wxPD_REMAINING_TIME);
2312 ::wxBeginBusyCursor();
2314 Route *route = track->RouteFromTrack(&pprog);
2318 pprog.Update(101, _(
"Done."));
2320 gFrame->RefreshAllCanvas();
2322 ::wxEndBusyCursor();
2325void RouteManagerDialog::OnTrkRouteFromTrackClick(wxCommandEvent &event) {
2328 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2329 if (item == -1)
return;
2331 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2333 TrackToRoute(track);
2335 UpdateRouteListCtrl();
2338void RouteManagerDialog::OnTrkDeleteAllClick(wxCommandEvent &event) {
2340 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> tracks?"),
2341 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2343 if (dialog_ret == wxID_YES) {
2350 UpdateTrkListCtrl();
2354 UpdateRouteListCtrl();
2358 gFrame->RefreshAllCanvas();
2360 m_bNeedConfigFlush =
true;
2363void RouteManagerDialog::UpdateWptListCtrl(
RoutePoint *rp_select,
2364 bool b_retain_sort) {
2365 wxIntPtr selected_id = wxUIntPtr(0);
2368 if (NULL == rp_select) {
2370 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2371 wxLIST_STATE_SELECTED);
2373 if (item != -1) selected_id = m_pWptListCtrl->GetItemData(item);
2377 m_pWptListCtrl->SetImageList(
2378 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
2379 wxIMAGE_LIST_SMALL);
2381 m_pWptListCtrl->DeleteAllItems();
2384 bool b_anyHidden =
false;
2386 auto node = pWayPointMan->GetWaypointList()->begin();
2388 while (node != pWayPointMan->GetWaypointList()->end()) {
2390 if (rp && rp->IsListed()) {
2396 if (!rp->GetName().Upper().Contains(m_tFilterWpt->GetValue().Upper())) {
2406 long idx = m_pWptListCtrl->InsertItem(li);
2408 wxString scamin = wxString::Format(
"%i", (
int)rp->GetScaMin());
2409 if (!rp->GetUseSca()) scamin = _(
"Always");
2410 if (g_bOverruleScaMin) scamin = _(
"Overruled");
2411 m_pWptListCtrl->SetItem(idx, colWPTSCALE, scamin);
2413 wxString name = rp->GetName();
2414 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2415 m_pWptListCtrl->SetItem(idx, colWPTNAME, name);
2418 DistanceBearingMercator(rp->m_lat, rp->m_lon,
gLat,
gLon, NULL, &dst);
2420 dist.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(dst));
2421 m_pWptListCtrl->SetItem(idx, colWPTDIST, dist);
2423 if (rp == rp_select) selected_id = (wxIntPtr)rp_select;
2428 lic.SetAlign(wxLIST_FORMAT_LEFT);
2429 m_pWptListCtrl->SetItem(lic);
2432 lic.SetAlign(wxLIST_FORMAT_LEFT);
2433 m_pWptListCtrl->SetItem(lic);
2435 if (!rp->IsVisible()) b_anyHidden =
true;
2442 if (!b_retain_sort) {
2443 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2444 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2445 sort_wp_key = SORT_ON_NAME;
2447 switch (sort_wp_key) {
2449 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2450 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2452 case SORT_ON_DISTANCE:
2453 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2454 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2459 if (selected_id != wxUIntPtr(0)) {
2460 item = m_pWptListCtrl->FindItem(-1, selected_id);
2461 m_pWptListCtrl->SetItemState(item,
2462 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2463 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2466 if ((m_lastWptItem >= 0) && (m_pWptListCtrl->GetItemCount()))
2467 m_pWptListCtrl->EnsureVisible(m_lastWptItem);
2469 if (pWayPointMan->Getpmarkicon_image_list(m_listIconSize)->GetImageCount()) {
2470 int iwidth, iheight;
2471 pWayPointMan->Getpmarkicon_image_list(m_listIconSize)
2472 ->GetSize(0, iwidth, iheight);
2474 m_pWptListCtrl->SetColumnWidth(0, wxMax(iwidth + 4, 4 * m_charWidth));
2479 m_cbShowAllWP->SetValue(!b_anyHidden);
2482void RouteManagerDialog::UpdateWptListCtrlViz() {
2485 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2486 wxLIST_STATE_DONTCARE);
2487 if (item == -1)
break;
2492 m_pWptListCtrl->SetItemImage(item, imageIndex);
2496void RouteManagerDialog::OnWptDefaultAction(wxListEvent &event) {
2498 OnWptPropertiesClick(evt);
2501void RouteManagerDialog::OnWptSelected(wxListEvent &event) {
2505void RouteManagerDialog::OnWptColumnClicked(wxListEvent &event) {
2506 if (event.m_col == NAME_COLUMN) {
2508 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2509 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2510 sort_wp_key = SORT_ON_NAME;
2512 if (event.m_col == DISTANCE_COLUMN) {
2514 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2515 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2516 sort_wp_key = SORT_ON_DISTANCE;
2519 UpdateWptListCtrl();
2522void RouteManagerDialog::UpdateWptButtons() {
2525 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2526 bool enable1 = (m_pWptListCtrl->GetSelectedItemCount() == 1);
2527 bool enablemultiple = (m_pWptListCtrl->GetSelectedItemCount() >= 1);
2530 m_lastWptItem = item;
2536 bool b_delete_enable =
true;
2539 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2540 wxLIST_STATE_SELECTED);
2541 if (item == -1)
break;
2546 b_delete_enable =
false;
2551 btnWptProperties->Enable(enablemultiple);
2552 btnWptZoomto->Enable(enable1);
2553 btnWptDeleteAll->Enable(m_pWptListCtrl->GetItemCount() > 0);
2554 btnWptDelete->Enable(b_delete_enable && enablemultiple);
2555 btnWptGoTo->Enable(enable1);
2556 btnWptExport->Enable(enablemultiple);
2557 btnWptSendToGPS->Enable(enable1);
2558 btnWptSendToPeer->Enable(enablemultiple);
2561void RouteManagerDialog::OnWptToggleVisibility(wxMouseEvent &event) {
2562 wxPoint pos =
event.GetPosition();
2564 long clicked_index = m_pWptListCtrl->HitTest(pos, flags);
2567 if (clicked_index > -1 &&
2568 event.GetX() < m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2572 if (!wp->IsSharedInVisibleRoute()) {
2573 wp->SetVisible(!wp->IsVisible());
2574 m_pWptListCtrl->SetItemImage(clicked_index,
2577 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2584 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2585 wxLIST_STATE_DONTCARE);
2586 if (item == -1)
break;
2590 if (!wp->IsVisible()) {
2595 m_cbShowAllWP->SetValue(viz);
2597 gFrame->RefreshAllCanvas();
2599 if (clicked_index > -1 &&
2600 event.GetX() > m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) &&
2601 event.GetX() < (m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) +
2602 m_pWptListCtrl->GetColumnWidth(colWPTSCALE)) &&
2603 !g_bOverruleScaMin) {
2605 wp->SetUseSca(!wp->GetUseSca());
2606 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2607 gFrame->RefreshAllCanvas();
2608 wxString scamin = wxString::Format(
"%i", (
int)wp->GetScaMin());
2609 if (!wp->GetUseSca()) scamin = _(
"Always");
2610 m_pWptListCtrl->SetItem(clicked_index, colWPTSCALE, scamin);
2617void RouteManagerDialog::OnWptNewClick(wxCommandEvent &event) {
2621 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2623 gFrame->RefreshAllCanvas();
2629 WptShowPropertiesDialog(pWP, GetParent());
2632void RouteManagerDialog::OnWptPropertiesClick(wxCommandEvent &event) {
2633 long item = wxNOT_FOUND;
2635 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2636 if (item == wxNOT_FOUND)
return;
2638 auto pWP = (
RoutePoint *)m_pWptListCtrl->GetItemData(item);
2639 WptShowPropertiesDialog(pWP, GetParent());
2641 UpdateWptListCtrl();
2642 m_bNeedConfigFlush =
true;
2645void RouteManagerDialog::WptShowPropertiesDialog(
RoutePoint *pWP,
2654 wxString base_title = _(
"Waypoint Properties");
2657 wxString caption(wxString::Format(
"%s, %s: %s", base_title, _(
"Layer"),
2668void RouteManagerDialog::OnWptZoomtoClick(wxCommandEvent &event) {
2671 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2672 if (item == -1)
return;
2678 if (gFrame->GetFocusCanvas()) {
2679 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), wp->m_lat, wp->m_lon,
2684void RouteManagerDialog::OnWptDeleteClick(wxCommandEvent &event) {
2685 RoutePointList list;
2687 int answer = OCPNMessageBox(
2688 this, _(
"Are you sure you want to delete the selected object(s)"),
2689 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2690 if (answer != wxID_YES)
return;
2693 if (m_pWptListCtrl->GetSelectedItemCount()) {
2694 ::wxBeginBusyCursor();
2695 m_bNeedConfigFlush =
true;
2700 long item_last_selected = -1;
2702 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2703 wxLIST_STATE_SELECTED);
2704 if (item == -1)
break;
2706 item_last_selected = item;
2717 OCPNMessageBox(
this,
2718 _(
"The waypoint you want to delete is used in a "
2719 "route, do you really want to delete it?"),
2720 _(
"OpenCPN Alert"), wxYES_NO)) {
2721 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2722 pWayPointMan->DestroyWaypoint(wp);
2725 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2726 pWayPointMan->DestroyWaypoint(wp);
2732 m_pWptListCtrl->GetNextItem(item_last_selected);
2735 wp_next = (
RoutePoint *)m_pWptListCtrl->GetItemData(item_next);
2737 m_lastWptItem = item_next;
2739 UpdateRouteListCtrl();
2740 UpdateTrkListCtrl();
2741 UpdateWptListCtrl(wp_next,
true);
2747 gFrame->InvalidateAllCanvasUndo();
2748 gFrame->RefreshAllCanvas();
2749 ::wxEndBusyCursor();
2753void RouteManagerDialog::OnWptGoToClick(wxCommandEvent &event) {
2756 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2757 if (item == -1)
return;
2769 temp_route->AddPoint(pWP_src);
2770 temp_route->AddPoint(wp);
2772 pSelect->AddSelectableRouteSegment(
gLat,
gLon, wp->m_lat, wp->m_lon, pWP_src,
2775 wxString name = wp->GetName();
2776 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2777 wxString rteName = _(
"Go to ");
2778 rteName.Append(name);
2789 UpdateRouteListCtrl();
2792void RouteManagerDialog::OnWptExportClick(wxCommandEvent &event) {
2793 RoutePointList list;
2795 wxString suggested_name =
"waypoints";
2799 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2800 wxLIST_STATE_SELECTED);
2801 if (item == -1)
break;
2807 if (wp->GetName() !=
"") suggested_name = wp->GetName();
2811 ExportGPXWaypoints(
this, &list, suggested_name);
2814void RouteManagerDialog::OnWptSendToGPSClick(wxCommandEvent &event) {
2817 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2818 if (item == -1)
return;
2825 pdlg->SetWaypoint(wp);
2828 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
2831 HideWithEffect(wxSHOW_EFFECT_BLEND);
2835 ShowWithEffect(wxSHOW_EFFECT_BLEND);
2841void RouteManagerDialog::OnWptDeleteAllClick(wxCommandEvent &event) {
2844 if (!pWayPointMan->SharedWptsExist()) {
2845 prompt = _(
"Are you sure you want to delete <ALL> waypoints?");
2850 _(
"There are some waypoints used in routes or anchor alarms.\n Do you "
2851 "want to delete them as well?\n This will change the routes and "
2852 "disable the anchor alarms.\n Answering No keeps the waypoints used "
2853 "in routes or alarms.");
2854 buttons = wxYES_NO | wxCANCEL;
2858 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), buttons);
2859 if (answer == wxID_YES) pWayPointMan->DeleteAllWaypoints(
true);
2860 if (answer == wxID_NO && type == 2)
2861 pWayPointMan->DeleteAllWaypoints(
false);
2868 UpdateRouteListCtrl();
2869 UpdateWptListCtrl();
2870 gFrame->InvalidateAllCanvasUndo();
2871 gFrame->RefreshAllCanvas();
2874void RouteManagerDialog::OnLaySelected(wxListEvent &event) {
2878void RouteManagerDialog::OnLayColumnClicked(wxListEvent &event) {
2879 if (event.m_col == 1) {
2880 sort_layer_name_dir++;
2881 m_pLayListCtrl->SortItems(SortLayersOnName, (wxIntPtr)NULL);
2882 }
else if (event.m_col == 2) {
2883 sort_layer_len_dir++;
2884 m_pLayListCtrl->SortItems(SortLayersOnSize, (wxIntPtr)NULL);
2888void RouteManagerDialog::UpdateLayButtons() {
2891 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2892 bool enable = (item != -1);
2895 btnLayDelete->Enable(enable);
2896 cbLayToggleChart->Enable(enable);
2897 cbLayToggleListing->Enable(enable);
2898 cbLayToggleNames->Enable(enable);
2901 cbLayToggleChart->SetValue(
2902 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnChart());
2904 cbLayToggleNames->Set3StateValue(
2905 ((
Layer *)m_pLayListCtrl->GetItemData(item))->HasVisibleNames());
2907 cbLayToggleListing->SetValue(
2908 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnListing());
2911 cbLayToggleChart->SetValue(
true);
2912 cbLayToggleNames->Set3StateValue(wxCHK_UNDETERMINED);
2913 cbLayToggleListing->SetValue(
true);
2917void RouteManagerDialog::OnLayToggleVisibility(wxMouseEvent &event) {
2918 wxPoint pos =
event.GetPosition();
2920 long clicked_index = m_pLayListCtrl->HitTest(pos, flags);
2923 if (clicked_index > -1 &&
2924 event.GetX() < m_pLayListCtrl->GetColumnWidth(colLAYVISIBLE)) {
2926 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(clicked_index);
2928 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
2929 m_pLayListCtrl->SetItemImage(clicked_index,
2930 layer->IsVisibleOnChart() ? 0 : 1);
2936 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2937 wxLIST_STATE_DONTCARE);
2938 if (item == -1)
break;
2940 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
2942 if (!layer->IsVisibleOnChart()) {
2947 m_cbShowAllLay->SetValue(viz);
2949 ToggleLayerContentsOnChart(layer);
2956void RouteManagerDialog::UpdateLists() {
2957 UpdateRouteListCtrl();
2958 UpdateTrkListCtrl();
2959 UpdateWptListCtrl();
2960 UpdateLayListCtrl();
2963void RouteManagerDialog::OnLayNewClick(wxCommandEvent &event) {
2967void RouteManagerDialog::OnPerLayNewClick(wxCommandEvent &event) {
2971void RouteManagerDialog::AddNewLayer(
bool isPersistent) {
2972 bool show_flag = g_bShowLayers;
2973 g_bShowLayers =
true;
2975 UI_ImportGPX(
this,
true,
"",
true, isPersistent);
2977 g_bShowLayers = show_flag;
2979 gFrame->RefreshAllCanvas();
2982void RouteManagerDialog::OnLayPropertiesClick(wxCommandEvent &event) {
2986 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2987 if (item == -1)
return;
2990void RouteManagerDialog::OnLayDeleteClick(wxCommandEvent &event) {
2993 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2994 if (item == -1)
return;
2996 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3002 bool ispers =
false;
3003 wxString destf, f, name, ext;
3004 f = layer->m_LayerFileName;
3005 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3007 appendOSDirSlash(&destf);
3008 destf.Append(
"layers");
3009 appendOSDirSlash(&destf);
3010 destf << name <<
"." << ext;
3012 wxString prompt = _(
3013 "Are you sure you want to delete this layer and <ALL> of its contents?");
3014 if (wxFileExists(destf)) {
3015 prompt.Append(
"\n");
3017 _(
"The file will also be deleted from OpenCPN's layer directory."));
3018 prompt.Append(
"\n (" + destf +
")");
3022 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), wxYES_NO);
3023 if (answer == wxID_NO)
return;
3028 if (wxRemoveFile(destf))
3029 remMSG.sprintf(
"Layer file: %s is deleted", destf);
3031 remMSG.sprintf(
"Error deleting Layer file: %s", destf);
3033 wxLogMessage(remMSG);
3038 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3039 pRoute->m_bIsInLayer =
false;
3040 pRoute->m_LayerID = 0;
3046 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3047 pTrack->m_bIsInLayer =
false;
3048 pTrack->m_LayerID = 0;
3049 NavObj_dB::GetInstance().DeleteTrack(pTrack);
3055 auto node = pWayPointMan->GetWaypointList()->begin();
3057 while (node != pWayPointMan->GetWaypointList()->end()) {
3059 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3063 pWayPointMan->DestroyWaypoint(rp,
false);
3072 auto found = std::find(pLayerList->begin(), pLayerList->end(), layer);
3073 if (found != pLayerList->end()) pLayerList->erase(found);
3077 gFrame->RefreshAllCanvas();
3079 m_bNeedConfigFlush =
false;
3082void RouteManagerDialog::OnLayToggleChartClick(wxCommandEvent &event) {
3086 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3087 if (item == -1)
return;
3089 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3093 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
3094 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
3096 ToggleLayerContentsOnChart(layer);
3099void RouteManagerDialog::ToggleLayerContentsOnChart(
Layer *layer) {
3102 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3103 pRoute->SetVisible(layer->IsVisibleOnChart());
3108 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3109 pTrack->SetVisible(layer->IsVisibleOnChart());
3110 NavObj_dB::GetInstance().UpdateDBTrackAttributes(pTrack);
3115 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3116 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3117 rp->SetVisible(layer->IsVisibleOnChart());
3124 gFrame->RefreshAllCanvas();
3127void RouteManagerDialog::OnLayToggleNamesClick(wxCommandEvent &event) {
3131 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3132 if (item == -1)
return;
3134 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3138 layer->SetVisibleNames(cbLayToggleNames->Get3StateValue());
3140 ToggleLayerContentsNames(layer);
3143void RouteManagerDialog::ToggleLayerContentsNames(
Layer *layer) {
3146 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3147 for (
RoutePoint *prp1 : *pRoute->pRoutePointList) {
3148 if (layer->HasVisibleNames() == wxCHK_UNDETERMINED) {
3149 prp1->m_bShowName = prp1->m_bShowNameData;
3151 prp1->m_bShowName = (layer->HasVisibleNames() == wxCHK_CHECKED);
3158 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3159 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3160 rp->SetNameShown(layer->HasVisibleNames() == wxCHK_CHECKED ||
3162 layer->HasVisibleNames() == wxCHK_UNDETERMINED));
3168 gFrame->RefreshAllCanvas();
3171void RouteManagerDialog::OnLayToggleListingClick(wxCommandEvent &event) {
3175 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3176 if (item == -1)
return;
3178 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3182 layer->SetVisibleOnListing(!layer->IsVisibleOnListing());
3184 ToggleLayerContentsOnListing(layer);
3187void RouteManagerDialog::ToggleLayerContentsOnListing(
Layer *layer) {
3188 ::wxBeginBusyCursor();
3192 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3193 pRoute->SetListed(layer->IsVisibleOnListing());
3198 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID))
3199 pTrack->SetListed(layer->IsVisibleOnListing());
3205 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3207 rp->SetListed(layer->IsVisibleOnListing());
3213 ::wxEndBusyCursor();
3215 gFrame->RefreshAllCanvas();
3218void RouteManagerDialog::OnLayDefaultAction(wxListEvent &event) {
3220 OnLayPropertiesClick(evt);
3223void RouteManagerDialog::UpdateLayListCtrl() {
3227 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3229 wxUIntPtr selected_id = wxUIntPtr(0);
3230 if (item != -1) selected_id = m_pLayListCtrl->GetItemData(item);
3233 m_pLayListCtrl->DeleteAllItems();
3236 LayerList::iterator it;
3238 bool b_anyHidden =
false;
3239 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
3242 if (!lay->m_LayerName.Upper().Contains(m_tFilterLay->GetValue().Upper())) {
3248 li.SetImage(lay->IsVisibleOnChart() ? 0 : 1);
3252 long idx = m_pLayListCtrl->InsertItem(li);
3254 wxString name = lay->m_LayerName;
3255 if (name.IsEmpty()) {
3262 name = _(
"(Unnamed Layer)");
3264 m_pLayListCtrl->SetItem(idx, colLAYNAME, name);
3267 len.Printf(
"%d", (
int)lay->m_NoOfItems);
3268 m_pLayListCtrl->SetItem(idx, colLAYITEMS, len);
3269 m_pLayListCtrl->SetItem(idx, colLAYPERSIST, lay->m_LayerType);
3274 lic.SetAlign(wxLIST_FORMAT_LEFT);
3275 m_pLayListCtrl->SetItem(lic);
3278 lic.SetAlign(wxLIST_FORMAT_LEFT);
3279 m_pLayListCtrl->SetItem(lic);
3281 if (!lay->IsVisibleOnChart()) b_anyHidden =
true;
3284 m_pLayListCtrl->SortItems(SortLayersOnName,
3285 reinterpret_cast<wxIntPtr
>(m_pLayListCtrl));
3286 m_pLayListCtrl->SetColumnWidth(0, 4 * m_charWidth);
3291 if (selected_id != wxUIntPtr(0)) {
3292 item = m_pLayListCtrl->FindItem(-1, selected_id);
3293 m_pLayListCtrl->SetItemState(item,
3294 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
3295 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
3299 m_cbShowAllLay->SetValue(!b_anyHidden);
3302void RouteManagerDialog::OnImportClick(wxCommandEvent &event) {
3311 gFrame->RefreshAllCanvas();
3313void RouteManagerDialog::OnExportClick(wxCommandEvent &event) {
3318void RouteManagerDialog::OnBackupClick(wxCommandEvent &event) {
3319 int result = BackupDatabase(
this);
3320 if (result == wxID_YES) {
3321 OCPNMessageBox(NULL, _(
"Backup successful"), _(
"Backup result"),
3322 wxICON_INFORMATION | wxOK);
3323 }
else if (result == wxID_NO) {
3324 OCPNMessageBox(NULL, _(
"Backup Failed\nCheck the OpenCPN Logs"),
3325 _(
"Backup result"), wxICON_INFORMATION | wxOK);
3330void RouteManagerDialog::OnExportVizClick(wxCommandEvent &event) {
3331 ExportGPX(
this,
true,
true);
3334void RouteManagerDialog::OnFilterChanged(wxCommandEvent &event) {
3335 if (event.GetEventObject() == m_tFilterWpt) {
3336 UpdateWptListCtrl(NULL,
true);
3337 }
else if (event.GetEventObject() == m_tFilterRte) {
3338 UpdateRouteListCtrl();
3339 }
else if (event.GetEventObject() == m_tFilterTrk) {
3340 UpdateTrkListCtrl();
3341 }
else if (event.GetEventObject() == m_tFilterLay) {
3342 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)
EventVar on_routes_update
Notified when list of routes is updated (no data in event)
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.
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.