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>
83#include "androidUTIL.h"
86#define DIALOG_MARGIN 10
88enum { rmVISIBLE = 0, rmROUTENAME, rmROUTEDESC };
89enum { colTRKVISIBLE = 0, colTRKNAME, colTRKLENGTH, colTRKDATE };
90enum { colLAYVISIBLE = 0, colLAYNAME, colLAYITEMS, colLAYPERSIST };
91enum { colWPTICON = 0, colWPTSCALE, colWPTNAME, colWPTDIST };
96void appendOSDirSlash(wxString *pString);
98static int SortRouteTrack(
const int order,
const wxString &it1,
99 const wxString &it2) {
100 if (order & 1)
return it2.CmpNoCase(it1);
102 return it1.CmpNoCase(it2);
106static int sort_route_name_dir;
107#if wxCHECK_VERSION(2, 9, 0)
108static int wxCALLBACK SortRoutesOnName(wxIntPtr item1, wxIntPtr item2,
111int wxCALLBACK SortRoutesOnName(
long item1,
long item2,
long list)
114 return SortRouteTrack(sort_route_name_dir, ((
Route *)item1)->GetName(),
115 ((
Route *)item2)->GetName());
119static int sort_route_to_dir;
120#if wxCHECK_VERSION(2, 9, 0)
121static int wxCALLBACK SortRoutesOnTo(wxIntPtr item1, wxIntPtr item2,
124int wxCALLBACK SortRoutesOnTo(
long item1,
long item2,
long list)
127 return SortRouteTrack(sort_route_to_dir, ((
Route *)item1)->GetTo(),
128 ((
Route *)item2)->GetTo());
132static int sort_track_name_dir;
133#if wxCHECK_VERSION(2, 9, 0)
134static int wxCALLBACK SortTracksOnName(wxIntPtr item1, wxIntPtr item2,
137int wxCALLBACK SortTracksOnName(
long item1,
long item2,
long list)
140 return SortRouteTrack(sort_track_name_dir, ((
Track *)item1)->GetName(),
141 ((
Track *)item2)->GetName());
144static int SortDouble(
const int order,
const double &it1,
const double &it2) {
156 if (l1 == l2)
return 0;
157 if (l2 < l1)
return 1;
162static int sort_track_len_dir;
163#if wxCHECK_VERSION(2, 9, 0)
164static int wxCALLBACK SortTracksOnDistance(wxIntPtr item1, wxIntPtr item2,
167int wxCALLBACK SortTracksOnDistance(
long item1,
long item2,
long list)
170 return SortDouble(sort_track_len_dir, ((
Track *)item1)->Length(),
171 ((
Track *)item2)->Length());
175static int sort_track_date_dir;
176#if wxCHECK_VERSION(2, 9, 0)
177static int wxCALLBACK SortTracksOnDate(wxIntPtr item1, wxIntPtr item2,
180int wxCALLBACK SortTracksOnDate(
long item1,
long item2,
long list)
184 return SortRouteTrack(sort_track_date_dir, ((
Track *)item1)->GetIsoDateTime(),
185 ((
Track *)item2)->GetIsoDateTime());
188static int sort_wp_key;
189static int sort_track_key;
192static int sort_wp_name_dir;
193#if wxCHECK_VERSION(2, 9, 0)
194static int wxCALLBACK SortWaypointsOnName(wxIntPtr item1, wxIntPtr item2,
197int wxCALLBACK SortWaypointsOnName(
long item1,
long item2,
long list)
205 if (sort_wp_name_dir & 1)
206 return pRP2->GetName().CmpNoCase(pRP1->GetName());
208 return pRP1->GetName().CmpNoCase(pRP2->GetName());
214static int sort_wp_len_dir;
215#if wxCHECK_VERSION(2, 9, 0)
216static int wxCALLBACK SortWaypointsOnDistance(wxIntPtr item1, wxIntPtr item2,
219int wxCALLBACK SortWaypointsOnDistance(
long item1,
long item2,
long list)
223 DistanceBearingMercator(((
RoutePoint *)item1)->m_lat,
226 DistanceBearingMercator(((
RoutePoint *)item2)->m_lat,
229 return SortDouble(sort_wp_len_dir, dst1, dst2);
233static int sort_layer_name_dir;
234#if wxCHECK_VERSION(2, 9, 0)
235static int wxCALLBACK SortLayersOnName(wxIntPtr item1, wxIntPtr item2,
238int wxCALLBACK SortLayersOnName(
long item1,
long item2,
long list)
241 return SortRouteTrack(sort_layer_name_dir, ((
Layer *)item1)->m_LayerName,
242 ((
Layer *)item2)->m_LayerName);
246static int sort_layer_len_dir;
247#if wxCHECK_VERSION(2, 9, 0)
248static int wxCALLBACK SortLayersOnSize(wxIntPtr item1, wxIntPtr item2,
251int wxCALLBACK SortLayersOnSize(
long item1,
long item2,
long list)
254 return SortDouble(sort_layer_len_dir, ((
Layer *)item1)->m_NoOfItems,
255 ((
Layer *)item2)->m_NoOfItems);
262EVT_NOTEBOOK_PAGE_CHANGED(
264 RouteManagerDialog::OnTabSwitch)
265EVT_CLOSE(RouteManagerDialog::OnClose)
266EVT_COMMAND(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, RouteManagerDialog::OnOK)
267EVT_CHAR_HOOK(RouteManagerDialog::OnKey)
271 if (ke.GetKeyCode() == WXK_ESCAPE)
277void RouteManagerDialog::OnTabSwitch(wxNotebookEvent &event) {
278 if (!m_pNotebook)
return;
279 int current_page = m_pNotebook->GetSelection();
280 if (current_page == 3) {
281 if (btnImport) btnImport->Enable(
false);
282 if (btnExport) btnExport->Enable(
false);
283 if (btnExportViz) btnExportViz->Enable(
false);
285 if (btnImport) btnImport->Enable(
true);
286 if (btnExport) btnExport->Enable(
true);
287 if (btnExportViz) btnExportViz->Enable(
true);
294bool RouteManagerDialog::instanceFlag =
false;
307RouteManagerDialog::RouteManagerDialog(wxWindow *parent) {
309 wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
311 wxFrame::Create(parent, -1, wxString(_(
"Route & Mark Manager")),
312 wxDefaultPosition, wxDefaultSize, style);
320 sort_wp_key = SORT_ON_NAME;
321 sort_track_key = SORT_ON_NAME;
329 [&](wxCommandEvent) { UpdateRouteListCtrl(); });
332void RouteManagerDialog::Create() {
334 int char_width, char_height;
335 GetTextExtent(
"W", &char_width, &char_height);
336 m_charWidth = char_width;
338 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
339 SetSizer(itemBoxSizer1);
341 m_pNotebook =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition,
342 wxSize(-1, -1), wxNB_TOP);
343 itemBoxSizer1->Add(m_pNotebook, 1, wxALL | wxEXPAND, 5);
346 m_pPanelRte =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
347 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
349 wxBoxSizer *sbsRoutes =
new wxBoxSizer(wxHORIZONTAL);
350 m_pPanelRte->SetSizer(sbsRoutes);
351 m_pNotebook->AddPage(m_pPanelRte, _(
"Routes"));
354 sort_wp_name_dir = 0;
355 sort_track_len_dir = 1;
356 sort_route_to_dir = 0;
357 sort_track_name_dir = 0;
358 sort_route_name_dir = 0;
359 sort_layer_name_dir = 0;
360 sort_layer_len_dir = 1;
362 m_listIconSize = 2 * GetCharHeight();
365 wxBoxSizer *bSizerRteContents;
366 bSizerRteContents =
new wxBoxSizer(wxVERTICAL);
368 wxFlexGridSizer *fgSizerFilterRte;
369 fgSizerFilterRte =
new wxFlexGridSizer(0, 2, 0, 0);
370 fgSizerFilterRte->AddGrowableCol(1);
371 fgSizerFilterRte->SetFlexibleDirection(wxBOTH);
372 fgSizerFilterRte->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
374 m_stFilterRte =
new wxStaticText(m_pPanelRte, wxID_ANY, _(
"Filter"),
375 wxDefaultPosition, wxDefaultSize, 0);
376 m_stFilterRte->Wrap(-1);
377 fgSizerFilterRte->Add(m_stFilterRte, 0, wxALL, 5);
379 m_tFilterRte =
new wxTextCtrl(m_pPanelRte, wxID_ANY,
"", wxDefaultPosition,
381 fgSizerFilterRte->Add(m_tFilterRte, 1, wxALL | wxEXPAND, 5);
383 bSizerRteContents->Add(fgSizerFilterRte, 0, wxEXPAND, 5);
384 m_tFilterRte->Connect(
385 wxEVT_COMMAND_TEXT_UPDATED,
386 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
388 m_cbShowAllRte =
new wxCheckBox(m_pPanelRte, wxID_ANY, _(
"Show all routes"));
389 bSizerRteContents->Add(m_cbShowAllRte, 0, wxEXPAND | wxLEFT, 5);
390 m_cbShowAllRte->Connect(
391 wxEVT_COMMAND_CHECKBOX_CLICKED,
392 wxCommandEventHandler(RouteManagerDialog::OnShowAllRteCBClicked), NULL,
396 new wxListCtrl(m_pPanelRte, -1, wxDefaultPosition, wxSize(-1, -1),
397 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
400 m_pRouteListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
403 m_pRouteListCtrl->Connect(
404 wxEVT_COMMAND_LIST_ITEM_SELECTED,
405 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
406 m_pRouteListCtrl->Connect(
407 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
408 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
409 m_pRouteListCtrl->Connect(
410 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
411 wxListEventHandler(RouteManagerDialog::OnRteDefaultAction), NULL,
this);
412 m_pRouteListCtrl->Connect(
414 wxMouseEventHandler(RouteManagerDialog::OnRteToggleVisibility), NULL,
416 m_pRouteListCtrl->Connect(
417 wxEVT_COMMAND_LIST_COL_CLICK,
418 wxListEventHandler(RouteManagerDialog::OnRteColumnClicked), NULL,
this);
419 bSizerRteContents->Add(m_pRouteListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
420 sbsRoutes->Add(bSizerRteContents, 1, wxEXPAND, 5);
425 m_pRouteListCtrl->InsertColumn(rmVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
427 m_pRouteListCtrl->InsertColumn(rmROUTENAME, _(
"Route Name"),
428 wxLIST_FORMAT_LEFT, 15 * char_width);
429 m_pRouteListCtrl->InsertColumn(rmROUTEDESC, _(
"From <-> To"),
430 wxLIST_FORMAT_LEFT, 10 * char_width);
433 wxBoxSizer *bsRouteButtons =
new wxBoxSizer(wxVERTICAL);
434 sbsRoutes->Add(bsRouteButtons, 0, wxEXPAND);
436 wxScrolledWindow *winr =
new wxScrolledWindow(
437 m_pPanelRte, wxID_ANY, wxDefaultPosition, wxDefaultSize,
438 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
439 winr->SetScrollRate(0, 5);
441 bsRouteButtons->Add(winr, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
443 wxBoxSizer *bsRouteButtonsInner =
new wxBoxSizer(wxVERTICAL);
444 winr->SetSizer(bsRouteButtonsInner);
446 btnRteProperties =
new wxButton(winr, -1, _(
"&Properties") +
"...");
447 bsRouteButtonsInner->Add(btnRteProperties, 0, wxALL | wxEXPAND,
449 btnRteProperties->Connect(
450 wxEVT_COMMAND_BUTTON_CLICKED,
451 wxCommandEventHandler(RouteManagerDialog::OnRtePropertiesClick), NULL,
454 btnRteActivate =
new wxButton(winr, -1, _(
"&Activate"));
455 bsRouteButtonsInner->Add(btnRteActivate, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
456 btnRteActivate->Connect(
457 wxEVT_COMMAND_BUTTON_CLICKED,
458 wxCommandEventHandler(RouteManagerDialog::OnRteActivateClick), NULL,
460 btnRteActivate->Connect(
462 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
464 btnRteZoomto =
new wxButton(winr, -1, _(
"&Center View"));
465 bsRouteButtonsInner->Add(btnRteZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
466 btnRteZoomto->Connect(
467 wxEVT_COMMAND_BUTTON_CLICKED,
468 wxCommandEventHandler(RouteManagerDialog::OnRteZoomtoClick), NULL,
this);
469 btnRteZoomto->Connect(
471 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
473 btnRteReverse =
new wxButton(winr, -1, _(
"&Reverse"));
474 bsRouteButtonsInner->Add(btnRteReverse, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
475 btnRteReverse->Connect(
476 wxEVT_COMMAND_BUTTON_CLICKED,
477 wxCommandEventHandler(RouteManagerDialog::OnRteReverseClick), NULL,
this);
479 btnRteDelete =
new wxButton(winr, -1, _(
"&Delete"));
480 bsRouteButtonsInner->Add(btnRteDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
481 btnRteDelete->Connect(
482 wxEVT_COMMAND_BUTTON_CLICKED,
483 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteClick), NULL,
this);
485 wxString reseq_label(_(
"&Resequence Waypoints"));
486 wxString export_label(_(
"&Export selected..."));
487 wxString send_to_gps_label(_(
"&Send to GPS..."));
488 wxString send_to_peer_label(_(
"Send to &Peer..."));
491 reseq_label = wxString(_(
"Resequence"));
492 export_label = wxString(_(
"Export"));
493 send_to_gps_label = wxString(_(
"Send to GPS"));
494 send_to_peer_label = wxString(_(
"Send to Peer"));
497 btnRteExport =
new wxButton(winr, -1, export_label);
498 bsRouteButtonsInner->Add(btnRteExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
499 btnRteExport->Connect(
500 wxEVT_COMMAND_BUTTON_CLICKED,
501 wxCommandEventHandler(RouteManagerDialog::OnRteExportClick), NULL,
this);
503 btnRteResequence =
new wxButton(winr, -1, reseq_label);
504 bsRouteButtonsInner->Add(btnRteResequence, 0, wxALL | wxEXPAND,
506 btnRteResequence->Connect(
507 wxEVT_COMMAND_BUTTON_CLICKED,
508 wxCommandEventHandler(RouteManagerDialog::OnRteResequenceClick), NULL,
511 btnRteSendToPeer =
new wxButton(winr, -1, send_to_peer_label);
512 bsRouteButtonsInner->Add(btnRteSendToPeer, 0, wxALL | wxEXPAND,
514 btnRteSendToPeer->Connect(
515 wxEVT_COMMAND_BUTTON_CLICKED,
516 wxCommandEventHandler(RouteManagerDialog::OnRteSendToPeerClick), NULL,
519 btnRteSendToGPS =
new wxButton(winr, -1, send_to_gps_label);
520 bsRouteButtonsInner->Add(btnRteSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
521 btnRteSendToGPS->Connect(
522 wxEVT_COMMAND_BUTTON_CLICKED,
523 wxCommandEventHandler(RouteManagerDialog::OnRteSendToGPSClick), NULL,
526 bsRouteButtonsInner->AddSpacer(10);
528 btnRteDeleteAll =
new wxButton(winr, -1, _(
"&Delete All"));
529 bsRouteButtonsInner->Add(btnRteDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
530 btnRteDeleteAll->Connect(
531 wxEVT_COMMAND_BUTTON_CLICKED,
532 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteAllClick), NULL,
536 m_pPanelTrk =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
537 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
538 wxBoxSizer *sbsTracks =
new wxBoxSizer(wxHORIZONTAL);
539 m_pPanelTrk->SetSizer(sbsTracks);
540 m_pNotebook->AddPage(m_pPanelTrk, _(
"Tracks"));
542 wxBoxSizer *bSizerTrkContents;
543 bSizerTrkContents =
new wxBoxSizer(wxVERTICAL);
545 wxFlexGridSizer *fgSizerFilterTrk;
546 fgSizerFilterTrk =
new wxFlexGridSizer(0, 2, 0, 0);
547 fgSizerFilterTrk->AddGrowableCol(1);
548 fgSizerFilterTrk->SetFlexibleDirection(wxBOTH);
549 fgSizerFilterTrk->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
551 m_stFilterTrk =
new wxStaticText(m_pPanelTrk, wxID_ANY, _(
"Filter"),
552 wxDefaultPosition, wxDefaultSize, 0);
553 m_stFilterTrk->Wrap(-1);
554 fgSizerFilterTrk->Add(m_stFilterTrk, 0, wxALL, 5);
556 m_tFilterTrk =
new wxTextCtrl(m_pPanelTrk, wxID_ANY,
"", wxDefaultPosition,
558 fgSizerFilterTrk->Add(m_tFilterTrk, 1, wxALL | wxEXPAND, 5);
560 bSizerTrkContents->Add(fgSizerFilterTrk, 0, wxEXPAND, 5);
561 m_tFilterTrk->Connect(
562 wxEVT_COMMAND_TEXT_UPDATED,
563 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
565 m_cbShowAllTrk =
new wxCheckBox(m_pPanelTrk, wxID_ANY, _(
"Show all tracks"));
566 bSizerTrkContents->Add(m_cbShowAllTrk, 0, wxEXPAND | wxLEFT, 5);
567 m_cbShowAllTrk->Connect(
568 wxEVT_COMMAND_CHECKBOX_CLICKED,
569 wxCommandEventHandler(RouteManagerDialog::OnShowAllTrkCBClicked), NULL,
573 new wxListCtrl(m_pPanelTrk, -1, wxDefaultPosition, wxDefaultSize,
574 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
578 m_pTrkListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
581 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
582 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
584 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
585 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
587 m_pTrkListCtrl->Connect(
588 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
589 wxListEventHandler(RouteManagerDialog::OnTrkDefaultAction), NULL,
this);
590 m_pTrkListCtrl->Connect(
592 wxMouseEventHandler(RouteManagerDialog::OnTrkToggleVisibility), NULL,
594 m_pTrkListCtrl->Connect(
595 wxEVT_COMMAND_LIST_COL_CLICK,
596 wxListEventHandler(RouteManagerDialog::OnTrkColumnClicked), NULL,
this);
597 m_pTrkListCtrl->Connect(
598 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
599 wxListEventHandler(RouteManagerDialog::OnTrkRightClick), NULL,
this);
600 this->Connect(wxEVT_COMMAND_MENU_SELECTED,
601 wxCommandEventHandler(RouteManagerDialog::OnTrkMenuSelected),
604 bSizerTrkContents->Add(m_pTrkListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
605 sbsTracks->Add(bSizerTrkContents, 1, wxEXPAND, 5);
607 m_pTrkListCtrl->InsertColumn(colTRKVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
609 m_pTrkListCtrl->InsertColumn(colTRKNAME, _(
"Track Name"), wxLIST_FORMAT_LEFT,
611 m_pTrkListCtrl->InsertColumn(colTRKDATE, _(
"Start Date"), wxLIST_FORMAT_LEFT,
613 m_pTrkListCtrl->InsertColumn(colTRKLENGTH, _(
"Length"), wxLIST_FORMAT_LEFT,
616 wxBoxSizer *bsTrkButtons =
new wxBoxSizer(wxVERTICAL);
617 sbsTracks->Add(bsTrkButtons, 0, wxEXPAND);
619 wxScrolledWindow *wint =
new wxScrolledWindow(
620 m_pPanelTrk, wxID_ANY, wxDefaultPosition, wxDefaultSize,
621 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
622 wint->SetScrollRate(0, 5);
624 bsTrkButtons->Add(wint, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
626 wxBoxSizer *bsTrkButtonsInner =
new wxBoxSizer(wxVERTICAL);
627 wint->SetSizer(bsTrkButtonsInner);
629 btnTrkNew =
new wxButton(wint, -1, _(
"&Start Track"));
630 bsTrkButtonsInner->Add(btnTrkNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
631 btnTrkNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
632 wxCommandEventHandler(RouteManagerDialog::OnTrkNewClick),
635 btnTrkProperties =
new wxButton(wint, -1, _(
"&Properties"));
636 bsTrkButtonsInner->Add(btnTrkProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
637 btnTrkProperties->Connect(
638 wxEVT_COMMAND_BUTTON_CLICKED,
639 wxCommandEventHandler(RouteManagerDialog::OnTrkPropertiesClick), NULL,
642 btnTrkDelete =
new wxButton(wint, -1, _(
"&Delete"));
643 bsTrkButtonsInner->Add(btnTrkDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
644 btnTrkDelete->Connect(
645 wxEVT_COMMAND_BUTTON_CLICKED,
646 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteClick), NULL,
this);
648 btnTrkExport =
new wxButton(wint, -1, _(
"&Export selected..."));
649 bsTrkButtonsInner->Add(btnTrkExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
650 btnTrkExport->Connect(
651 wxEVT_COMMAND_BUTTON_CLICKED,
652 wxCommandEventHandler(RouteManagerDialog::OnTrkExportClick), NULL,
this);
654 btnTrkRouteFromTrack =
new wxButton(wint, -1, _(
"Route from Track"));
655 bsTrkButtonsInner->Add(btnTrkRouteFromTrack, 0, wxALL | wxEXPAND,
657 btnTrkRouteFromTrack->Connect(
658 wxEVT_COMMAND_BUTTON_CLICKED,
659 wxCommandEventHandler(RouteManagerDialog::OnTrkRouteFromTrackClick), NULL,
662 btnTrkSendToPeer =
new wxButton(wint, -1, _(
"Send to &Peer"));
663 bsTrkButtonsInner->Add(btnTrkSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
664 btnTrkSendToPeer->Connect(
665 wxEVT_COMMAND_BUTTON_CLICKED,
666 wxCommandEventHandler(RouteManagerDialog::OnTrkSendToPeerClick), NULL,
669 bsTrkButtonsInner->AddSpacer(10);
671 btnTrkDeleteAll =
new wxButton(wint, -1, _(
"&Delete All"));
672 bsTrkButtonsInner->Add(btnTrkDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
673 btnTrkDeleteAll->Connect(
674 wxEVT_COMMAND_BUTTON_CLICKED,
675 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteAllClick), NULL,
679 m_pPanelWpt =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
680 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
681 wxBoxSizer *sbsWpts =
new wxBoxSizer(wxHORIZONTAL);
682 m_pPanelWpt->SetSizer(sbsWpts);
683 m_pNotebook->AddPage(m_pPanelWpt, _(
"Marks"));
685 wxBoxSizer *bSizerWptContents;
686 bSizerWptContents =
new wxBoxSizer(wxVERTICAL);
688 wxFlexGridSizer *fgSizerFilterWpt;
689 fgSizerFilterWpt =
new wxFlexGridSizer(0, 2, 0, 0);
690 fgSizerFilterWpt->AddGrowableCol(1);
691 fgSizerFilterWpt->SetFlexibleDirection(wxBOTH);
692 fgSizerFilterWpt->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
694 m_stFilterWpt =
new wxStaticText(m_pPanelWpt, wxID_ANY, _(
"Filter"),
695 wxDefaultPosition, wxDefaultSize, 0);
696 m_stFilterWpt->Wrap(-1);
697 fgSizerFilterWpt->Add(m_stFilterWpt, 0, wxALL, 5);
699 m_tFilterWpt =
new wxTextCtrl(m_pPanelWpt, wxID_ANY,
"", wxDefaultPosition,
701 fgSizerFilterWpt->Add(m_tFilterWpt, 1, wxALL | wxEXPAND, 5);
703 bSizerWptContents->Add(fgSizerFilterWpt, 0, wxEXPAND, 5);
704 m_tFilterWpt->Connect(
705 wxEVT_COMMAND_TEXT_UPDATED,
706 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
708 m_cbShowAllWP =
new wxCheckBox(m_pPanelWpt, wxID_ANY, _(
"Show all marks"));
709 bSizerWptContents->Add(m_cbShowAllWP, 0, wxEXPAND | wxLEFT, 5);
710 m_cbShowAllWP->Connect(
711 wxEVT_COMMAND_CHECKBOX_CLICKED,
712 wxCommandEventHandler(RouteManagerDialog::OnShowAllWpCBClicked), NULL,
716 new wxListCtrl(m_pPanelWpt, -1, wxDefaultPosition, wxDefaultSize,
717 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
720 m_pWptListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
723 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
724 wxListEventHandler(RouteManagerDialog::OnWptSelected),
726 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
727 wxListEventHandler(RouteManagerDialog::OnWptSelected),
729 m_pWptListCtrl->Connect(
730 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
731 wxListEventHandler(RouteManagerDialog::OnWptDefaultAction), NULL,
this);
732 m_pWptListCtrl->Connect(
734 wxMouseEventHandler(RouteManagerDialog::OnWptToggleVisibility), NULL,
736 m_pWptListCtrl->Connect(
737 wxEVT_COMMAND_LIST_COL_CLICK,
738 wxListEventHandler(RouteManagerDialog::OnWptColumnClicked), NULL,
this);
739 bSizerWptContents->Add(m_pWptListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
740 sbsWpts->Add(bSizerWptContents, 1, wxEXPAND, 5);
742 m_pWptListCtrl->InsertColumn(colWPTICON, _(
"Icon"), wxLIST_FORMAT_LEFT,
744 m_pWptListCtrl->InsertColumn(colWPTSCALE, _(
"Scale"), wxLIST_FORMAT_LEFT,
746 m_pWptListCtrl->InsertColumn(colWPTNAME, _(
"Mark Name"), wxLIST_FORMAT_LEFT,
748 m_pWptListCtrl->InsertColumn(colWPTDIST, _(
"Distance from own ship"),
749 wxLIST_FORMAT_LEFT, 14 * char_width);
751 wxBoxSizer *bsWptButtons =
new wxBoxSizer(wxVERTICAL);
752 sbsWpts->Add(bsWptButtons, 0, wxEXPAND);
754 wxScrolledWindow *winw =
new wxScrolledWindow(
755 m_pPanelWpt, wxID_ANY, wxDefaultPosition, wxDefaultSize,
756 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
757 winw->SetScrollRate(0, 5);
759 bsWptButtons->Add(winw, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
761 wxBoxSizer *bsWptButtonsInner =
new wxBoxSizer(wxVERTICAL);
762 winw->SetSizer(bsWptButtonsInner);
764 btnWptNew =
new wxButton(winw, -1, _(
"&New"));
765 bsWptButtonsInner->Add(btnWptNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
766 btnWptNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
767 wxCommandEventHandler(RouteManagerDialog::OnWptNewClick),
770 btnWptProperties =
new wxButton(winw, -1, _(
"&Properties"));
771 bsWptButtonsInner->Add(btnWptProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
772 btnWptProperties->Connect(
773 wxEVT_COMMAND_BUTTON_CLICKED,
774 wxCommandEventHandler(RouteManagerDialog::OnWptPropertiesClick), NULL,
777 btnWptZoomto =
new wxButton(winw, -1, _(
"&Center View"));
778 bsWptButtonsInner->Add(btnWptZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
779 btnWptZoomto->Connect(
780 wxEVT_COMMAND_BUTTON_CLICKED,
781 wxCommandEventHandler(RouteManagerDialog::OnWptZoomtoClick), NULL,
this);
783 btnWptDelete =
new wxButton(winw, -1, _(
"&Delete"));
784 bsWptButtonsInner->Add(btnWptDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
785 btnWptDelete->Connect(
786 wxEVT_COMMAND_BUTTON_CLICKED,
787 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteClick), NULL,
this);
789 btnWptGoTo =
new wxButton(winw, -1, _(
"&Go To"));
790 bsWptButtonsInner->Add(btnWptGoTo, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
791 btnWptGoTo->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
792 wxCommandEventHandler(RouteManagerDialog::OnWptGoToClick),
795 btnWptExport =
new wxButton(winw, -1, _(
"&Export selected..."));
796 bsWptButtonsInner->Add(btnWptExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
797 btnWptExport->Connect(
798 wxEVT_COMMAND_BUTTON_CLICKED,
799 wxCommandEventHandler(RouteManagerDialog::OnWptExportClick), NULL,
this);
801 btnWptSendToGPS =
new wxButton(winw, -1, _(
"&Send to GPS"));
802 bsWptButtonsInner->Add(btnWptSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
803 btnWptSendToGPS->Connect(
804 wxEVT_COMMAND_BUTTON_CLICKED,
805 wxCommandEventHandler(RouteManagerDialog::OnWptSendToGPSClick), NULL,
808 btnWptSendToPeer =
new wxButton(winw, -1, _(
"Send to &Peer"));
809 bsWptButtonsInner->Add(btnWptSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
810 btnWptSendToPeer->Connect(
811 wxEVT_COMMAND_BUTTON_CLICKED,
812 wxCommandEventHandler(RouteManagerDialog::OnWptSendToPeerClick), NULL,
815 bsWptButtonsInner->AddSpacer(10);
817 btnWptDeleteAll =
new wxButton(winw, -1, _(
"Delete All"));
818 bsWptButtonsInner->Add(btnWptDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
819 btnWptDeleteAll->Connect(
820 wxEVT_COMMAND_BUTTON_CLICKED,
821 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteAllClick), NULL,
824 wxBoxSizer *itemBoxSizer5 =
new wxBoxSizer(wxHORIZONTAL);
825 itemBoxSizer1->Add(itemBoxSizer5, 0, wxALL | wxEXPAND);
827 wxBoxSizer *itemBoxSizer6 =
new wxBoxSizer(wxHORIZONTAL);
828 itemBoxSizer5->Add(itemBoxSizer6, 1, wxALL | wxEXPAND);
830 btnImport =
new wxButton(
this, -1, _(
"I&mport GPX..."));
831 itemBoxSizer6->Add(btnImport, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
832 btnImport->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
833 wxCommandEventHandler(RouteManagerDialog::OnImportClick),
842 btnExportViz =
new wxButton(
this, -1, _(
"Export All Visible..."));
843 itemBoxSizer6->Add(btnExportViz, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
844 btnExportViz->Connect(
845 wxEVT_COMMAND_BUTTON_CLICKED,
846 wxCommandEventHandler(RouteManagerDialog::OnExportVizClick), NULL,
this);
848 btnBackup =
new wxButton(
this, -1, _(
"Backup..."));
849 itemBoxSizer6->Add(btnBackup, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
850 btnBackup->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
851 wxCommandEventHandler(RouteManagerDialog::OnBackupClick),
854 wxSize sz = ::wxGetDisplaySize();
856 itemBoxSizer6->Add(0, 0, 1, wxEXPAND, 5);
857 itemBoxSizer6->Add(
new wxButton(
this, wxID_OK), 0, wxALL, DIALOG_MARGIN);
859 wxStaticLine *staticLine121 =
new wxStaticLine(
860 this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
861 itemBoxSizer1->Add(staticLine121, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
863 wxBoxSizer *itemBoxSizer7 =
new wxBoxSizer(wxHORIZONTAL);
864 itemBoxSizer1->Add(itemBoxSizer7, 0, wxEXPAND);
866 wxBoxSizer *itemBoxSizer7a =
new wxBoxSizer(wxHORIZONTAL);
867 itemBoxSizer7->Add(itemBoxSizer7a, 1, wxEXPAND);
869 itemBoxSizer7a->AddStretchSpacer();
870 itemBoxSizer7a->Add(
new wxButton(
this, wxID_OK), 0, wxRIGHT | wxALIGN_RIGHT,
875 m_pPanelLay =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
876 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
877 wxBoxSizer *sbsLayers =
new wxBoxSizer(wxHORIZONTAL);
878 m_pPanelLay->SetSizer(sbsLayers);
879 m_pNotebook->AddPage(m_pPanelLay, _(
"Layers"));
881 wxBoxSizer *bSizerLayContents;
882 bSizerLayContents =
new wxBoxSizer(wxVERTICAL);
884 wxFlexGridSizer *fgSizerFilterLay;
885 fgSizerFilterLay =
new wxFlexGridSizer(0, 2, 0, 0);
886 fgSizerFilterLay->AddGrowableCol(1);
887 fgSizerFilterLay->SetFlexibleDirection(wxBOTH);
888 fgSizerFilterLay->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
890 m_stFilterLay =
new wxStaticText(m_pPanelLay, wxID_ANY, _(
"Filter"),
891 wxDefaultPosition, wxDefaultSize, 0);
892 m_stFilterLay->Wrap(-1);
893 fgSizerFilterLay->Add(m_stFilterLay, 0, wxALL, 5);
895 m_tFilterLay =
new wxTextCtrl(m_pPanelLay, wxID_ANY,
"", wxDefaultPosition,
897 fgSizerFilterLay->Add(m_tFilterLay, 1, wxALL | wxEXPAND, 5);
899 bSizerLayContents->Add(fgSizerFilterLay, 0, wxEXPAND, 5);
900 m_tFilterLay->Connect(
901 wxEVT_COMMAND_TEXT_UPDATED,
902 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
904 m_cbShowAllLay =
new wxCheckBox(m_pPanelLay, wxID_ANY, _(
"Show all layers"));
905 bSizerLayContents->Add(m_cbShowAllLay, 0, wxEXPAND | wxLEFT, 5);
906 m_cbShowAllLay->Connect(
907 wxEVT_COMMAND_CHECKBOX_CLICKED,
908 wxCommandEventHandler(RouteManagerDialog::OnShowAllLayCBClicked), NULL,
912 new wxListCtrl(m_pPanelLay, -1, wxDefaultPosition, wxDefaultSize,
913 wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING |
914 wxLC_HRULES | wxBORDER_SUNKEN );
916 m_pLayListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
919 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
920 wxListEventHandler(RouteManagerDialog::OnLaySelected),
922 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
923 wxListEventHandler(RouteManagerDialog::OnLaySelected),
925 m_pLayListCtrl->Connect(
926 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
927 wxListEventHandler(RouteManagerDialog::OnLayDefaultAction), NULL,
this);
928 m_pLayListCtrl->Connect(
930 wxMouseEventHandler(RouteManagerDialog::OnLayToggleVisibility), NULL,
932 m_pLayListCtrl->Connect(
933 wxEVT_COMMAND_LIST_COL_CLICK,
934 wxListEventHandler(RouteManagerDialog::OnLayColumnClicked), NULL,
this);
935 bSizerLayContents->Add(m_pLayListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
936 sbsLayers->Add(bSizerLayContents, 1, wxEXPAND, 5);
938 m_pLayListCtrl->InsertColumn(colLAYVISIBLE,
"", wxLIST_FORMAT_LEFT,
940 m_pLayListCtrl->InsertColumn(colLAYNAME, _(
"Layer Name"), wxLIST_FORMAT_LEFT,
942 m_pLayListCtrl->InsertColumn(colLAYITEMS, _(
"No. of items"),
943 wxLIST_FORMAT_LEFT, 10 * char_width);
944 m_pLayListCtrl->InsertColumn(colLAYPERSIST, _(
"Layer type"),
945 wxLIST_FORMAT_LEFT, 10 * char_width);
947 wxBoxSizer *bsLayButtons =
new wxBoxSizer(wxVERTICAL);
948 sbsLayers->Add(bsLayButtons, 0, wxEXPAND);
950 wxScrolledWindow *winl =
new wxScrolledWindow(
951 m_pPanelLay, wxID_ANY, wxDefaultPosition, wxDefaultSize,
952 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
953 winl->SetScrollRate(0, 5);
955 bsLayButtons->Add(winl, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
957 wxBoxSizer *bsLayButtonsInner =
new wxBoxSizer(wxVERTICAL);
958 winl->SetSizer(bsLayButtonsInner);
960 btnLayNew =
new wxButton(winl, -1, _(
"Create Temporary layer"));
961 bsLayButtonsInner->Add(btnLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
962 btnLayNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
963 wxCommandEventHandler(RouteManagerDialog::OnLayNewClick),
966 btnPerLayNew =
new wxButton(winl, -1, _(
"Create Persistent layer"));
967 bsLayButtonsInner->Add(btnPerLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
968 btnPerLayNew->Connect(
969 wxEVT_COMMAND_BUTTON_CLICKED,
970 wxCommandEventHandler(RouteManagerDialog::OnPerLayNewClick), NULL,
this);
972 btnLayDelete =
new wxButton(winl, -1, _(
"&Delete"));
973 bsLayButtonsInner->Add(btnLayDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
974 btnLayDelete->Connect(
975 wxEVT_COMMAND_BUTTON_CLICKED,
976 wxCommandEventHandler(RouteManagerDialog::OnLayDeleteClick), NULL,
this);
978 cbLayToggleChart =
new wxCheckBox(winl, -1, _(
"Show on chart"));
979 bsLayButtonsInner->Add(cbLayToggleChart, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
980 cbLayToggleChart->Connect(
981 wxEVT_COMMAND_CHECKBOX_CLICKED,
982 wxCommandEventHandler(RouteManagerDialog::OnLayToggleChartClick), NULL,
986 new wxCheckBox(winl, -1, _(
"Show WPT names"), wxDefaultPosition,
987 wxDefaultSize, wxCHK_3STATE);
989 bsLayButtonsInner->Add(cbLayToggleNames, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
990 cbLayToggleNames->Connect(
991 wxEVT_COMMAND_CHECKBOX_CLICKED,
992 wxCommandEventHandler(RouteManagerDialog::OnLayToggleNamesClick), NULL,
995 cbLayToggleListing =
new wxCheckBox(winl, -1, _(
"List contents"));
996 bsLayButtonsInner->Add(cbLayToggleListing, 0, wxALL | wxEXPAND,
998 cbLayToggleListing->Connect(
999 wxEVT_COMMAND_CHECKBOX_CLICKED,
1000 wxCommandEventHandler(RouteManagerDialog::OnLayToggleListingClick), NULL,
1005 int imageRefSize = m_charWidth * 2;
1006 wxImageList *imglist =
new wxImageList(imageRefSize, imageRefSize,
true, 1);
1009 wxString UserIconPath = g_Platform->GetSharedDataDir() +
"uidata" +
1010 wxFileName::GetPathSeparator();
1012 LoadSVG(UserIconPath +
"eye.svg", imageRefSize, imageRefSize)
1014 if (iconSVG.IsOk()) {
1015 iconSVG.Resize(wxSize(imageRefSize, imageRefSize),
1017 imglist->Add(wxBitmap(iconSVG));
1020 iconSVG =
LoadSVG(UserIconPath +
"eyex.svg", imageRefSize, imageRefSize)
1022 if (iconSVG.IsOk()) {
1023 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1024 imglist->Add(wxBitmap(iconSVG));
1027 iconSVG =
LoadSVG(UserIconPath +
"eyeGray.svg", imageRefSize, imageRefSize)
1029 if (iconSVG.IsOk()) {
1030 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1031 imglist->Add(wxBitmap(iconSVG));
1034 m_pRouteListCtrl->AssignImageList(imglist, wxIMAGE_LIST_SMALL);
1037 m_pRouteListCtrl->GetHandle()->setIconSize(QSize(imageRefSize, imageRefSize));
1041 m_pTrkListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1042 m_pWptListCtrl->SetImageList(
1043 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
1044 wxIMAGE_LIST_SMALL);
1045 m_pLayListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1055 m_bNeedConfigFlush =
false;
1058RouteManagerDialog::~RouteManagerDialog() {
1059 delete m_pRouteListCtrl;
1060 delete m_pTrkListCtrl;
1061 delete m_pWptListCtrl;
1062 delete m_pLayListCtrl;
1064 delete btnRteDelete;
1065 delete btnRteResequence;
1066 delete btnRteExport;
1067 delete btnRteZoomto;
1068 delete btnRteProperties;
1069 delete btnRteActivate;
1070 delete btnRteReverse;
1071 delete btnRteSendToGPS;
1072 delete btnRteDeleteAll;
1074 delete btnTrkProperties;
1075 delete btnTrkDelete;
1076 delete btnTrkExport;
1077 delete btnTrkRouteFromTrack;
1078 delete btnTrkDeleteAll;
1080 delete btnWptProperties;
1081 delete btnWptZoomto;
1082 delete btnWptDelete;
1084 delete btnWptExport;
1085 delete btnWptSendToGPS;
1086 delete btnWptDeleteAll;
1089 delete cbLayToggleChart;
1090 delete cbLayToggleListing;
1091 delete cbLayToggleNames;
1092 delete btnLayDelete;
1095 delete btnExportViz;
1098 btnExportViz = NULL;
1101 instanceFlag =
false;
1104void RouteManagerDialog::RecalculateSize() {
1110 int char_width, char_height;
1111 GetTextExtent(
"W", &char_width, &char_height);
1114 sz.x = 60 * char_width;
1115 sz.y = 30 * char_height;
1117 wxSize dsize = GetParent()->GetClientSize();
1118 sz.y = wxMin(sz.y, dsize.y);
1119 sz.x = wxMin(sz.x, dsize.x);
1122 wxSize fsize = GetSize();
1123 fsize.y = wxMin(fsize.y, dsize.y);
1124 fsize.x = wxMin(fsize.x, dsize.x);
1130void RouteManagerDialog::OnClose(wxCloseEvent &event) {
1138void RouteManagerDialog::OnOK(wxCommandEvent &event) {
1145void RouteManagerDialog::SetColorScheme() { DimeControl(
this); }
1147void RouteManagerDialog::OnShowAllRteCBClicked(wxCommandEvent &event) {
1148 bool viz = m_cbShowAllRte->GetValue();
1150 int item_count = m_pRouteListCtrl->GetItemCount();
1152 if (item_count > 50) {
1154 ::wxBeginBusyCursor();
1157 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1158 wxLIST_STATE_DONTCARE);
1159 if (item == -1)
break;
1161 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1163 pR->SetVisible(viz, viz);
1164 pR->SetSharedWPViz(viz);
1166 m_pRouteListCtrl->SetItemImage(item, !viz);
1168 NavObj_dB::GetInstance().UpdateRouteViz(pR);
1171 if (busy) ::wxEndBusyCursor();
1173 UpdateWptListCtrlViz();
1174 gFrame->RefreshAllCanvas();
1177void RouteManagerDialog::OnShowAllWpCBClicked(wxCommandEvent &event) {
1178 bool viz = m_cbShowAllWP->GetValue();
1180 int item_count = m_pWptListCtrl->GetItemCount();
1182 if (item_count > 100) {
1184 ::wxBeginBusyCursor();
1188 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1189 wxLIST_STATE_DONTCARE);
1190 if (item == -1)
break;
1194 if (!pRP->IsSharedInVisibleRoute()) {
1195 pRP->SetVisible(viz);
1197 pRP->SetVisible(
true);
1199 m_pWptListCtrl->SetItemImage(item,
RoutePointGui(*pRP).GetIconImageIndex());
1200 NavObj_dB::GetInstance().UpdateDBRoutePointViz(pRP);
1203 if (busy) ::wxEndBusyCursor();
1205 gFrame->RefreshAllCanvas();
1208void RouteManagerDialog::OnShowAllTrkCBClicked(wxCommandEvent &event) {
1209 bool viz = m_cbShowAllTrk->GetValue();
1212 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1213 wxLIST_STATE_DONTCARE);
1214 if (item == -1)
break;
1216 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1218 track->SetVisible(viz);
1219 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
1220 m_pTrkListCtrl->SetItemImage(item, track->IsVisible() ? 0 : 1);
1223 gFrame->RefreshAllCanvas();
1226void RouteManagerDialog::OnShowAllLayCBClicked(wxCommandEvent &event) {
1227 bool viz = m_cbShowAllLay->GetValue();
1230 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1231 wxLIST_STATE_DONTCARE);
1232 if (item == -1)
break;
1234 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
1236 layer->SetVisibleOnChart(viz);
1237 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
1239 ToggleLayerContentsOnChart(layer);
1242 gFrame->RefreshAllCanvas();
1245void RouteManagerDialog::UpdateRouteListCtrl() {
1248 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1249 wxLIST_STATE_SELECTED);
1250 wxUIntPtr selected_id = wxUIntPtr(0);
1251 if (item != -1) selected_id = m_pRouteListCtrl->GetItemData(item);
1254 m_pRouteListCtrl->DeleteAllItems();
1257 RouteList::iterator it;
1260 bool bpartialViz =
false;
1262 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1263 if (!(*it)->IsListed())
continue;
1265 if (!(*it)->GetName().Upper().Contains(m_tFilterRte->GetValue().Upper())) {
1270 li.SetId(list_index);
1271 li.SetImage((*it)->IsVisible() ? 0 : 1);
1274 li.SetAlign(wxLIST_FORMAT_LEFT);
1276 if ((*it)->m_bRtIsActive) {
1277 wxFont font = *wxNORMAL_FONT;
1278 font.SetWeight(wxFONTWEIGHT_BOLD);
1282 long idx = m_pRouteListCtrl->InsertItem(li);
1284 wxString name = (*it)->m_RouteNameString;
1285 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
1286 m_pRouteListCtrl->SetItem(idx, rmROUTENAME, name);
1288 wxString startend = (*it)->m_RouteStartString;
1289 if (!(*it)->m_RouteEndString.IsEmpty())
1290 startend.append(_(
" - ") + (*it)->m_RouteEndString);
1291 m_pRouteListCtrl->SetItem(idx, rmROUTEDESC, startend);
1294 lic.SetId(list_index);
1296 lic.SetAlign(wxLIST_FORMAT_LEFT);
1297 m_pRouteListCtrl->SetItem(lic);
1300 lic.SetAlign(wxLIST_FORMAT_LEFT);
1301 m_pRouteListCtrl->SetItem(lic);
1304 if (!(*it)->IsVisible()) bpartialViz =
true;
1309 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1311 m_pRouteListCtrl->SetColumnWidth(0, 4 * m_charWidth);
1316 if (selected_id != wxUIntPtr(0)) {
1317 item = m_pRouteListCtrl->FindItem(-1, selected_id);
1318 m_pRouteListCtrl->SetItemState(
1319 item, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
1320 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
1323 if ((m_lastRteItem >= 0) && (m_pRouteListCtrl->GetItemCount()))
1324 m_pRouteListCtrl->EnsureVisible(m_lastRteItem);
1328 m_cbShowAllRte->SetValue(!bpartialViz);
1331void RouteManagerDialog::UpdateRteButtons() {
1333 long selected_index_index =
1334 m_pRouteListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1335 bool enable1 = m_pRouteListCtrl->GetSelectedItemCount() == 1;
1336 bool enablemultiple = m_pRouteListCtrl->GetSelectedItemCount() >= 1;
1338 m_lastRteItem = selected_index_index;
1340 btnRteDelete->Enable(m_pRouteListCtrl->GetSelectedItemCount() > 0);
1341 btnRteZoomto->Enable(enable1);
1342 btnRteProperties->Enable(enable1);
1343 btnRteReverse->Enable(enable1);
1344 btnRteExport->Enable(enablemultiple);
1345 btnRteResequence->Enable(enable1);
1346 btnRteSendToGPS->Enable(enable1);
1347 btnRteDeleteAll->Enable(m_pRouteListCtrl->GetItemCount() > 0);
1348 btnRteSendToPeer->Enable(enablemultiple);
1351 Route *route = NULL;
1353 route = (
Route *)m_pRouteListCtrl->GetItemData(selected_index_index);
1356 btnRteActivate->Enable(enable1);
1357 if (enable1) btnRteActivate->SetLabel(_(
"Activate"));
1362 btnRteActivate->Enable(enable1);
1363 btnRteActivate->SetLabel(_(
"Deactivate"));
1365 btnRteActivate->Enable(
false);
1367 btnRteActivate->Enable(
false);
1371void RouteManagerDialog::MakeAllRoutesInvisible() {
1372 RouteList::iterator it;
1374 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1375 if ((*it)->IsVisible()) {
1376 (*it)->SetVisible(
false);
1377 m_pRouteListCtrl->SetItemImage(m_pRouteListCtrl->FindItem(-1, index),
1379 NavObj_dB::GetInstance().UpdateRoute(*it);
1384void RouteManagerDialog::ZoomtoRoute(
Route *route) {
1386 LLBBox RBBox = route->GetBBox();
1387 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
1388 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
1394 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1395 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
1397 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1398 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
1400 if (gFrame->GetFocusCanvas()) {
1401 gFrame->GetFocusCanvas()->GetSize(&ww, &wh);
1402 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
1403 ppm = wxMin(ppm, 1.0);
1405 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), clat, clon, ppm);
1408 m_bNeedConfigFlush =
true;
1412void RouteManagerDialog::OnRteDeleteClick(wxCommandEvent &event) {
1413 int count = m_pRouteListCtrl->GetSelectedItemCount();
1414 bool confirmed = RouteGui::OnDelete(
this, count);
1416 if (confirmed && count > 0) {
1417 ::wxBeginBusyCursor();
1420 gFrame->CancelAllMouseRoute();
1421 m_bNeedConfigFlush =
true;
1425 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1426 wxLIST_STATE_SELECTED);
1427 if (item == -1)
break;
1429 Route *proute_to_delete = (
Route *)m_pRouteListCtrl->GetItemData(item);
1431 if (proute_to_delete) list.push_back(proute_to_delete);
1433 for (
Route *route : list) {
1435 NavObj_dB::GetInstance().DeleteRoute(route);
1441 UpdateRouteListCtrl();
1442 UpdateTrkListCtrl();
1444 gFrame->InvalidateAllCanvasUndo();
1445 gFrame->RefreshAllCanvas();
1446 ::wxEndBusyCursor();
1450void RouteManagerDialog::OnRteDeleteAllClick(wxCommandEvent &event) {
1452 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> routes?"),
1453 wxString(_(
"OpenCPN Alert")), wxYES_NO);
1455 if (dialog_ret == wxID_YES) {
1458 gFrame->CancelAllMouseRoute();
1463 UpdateRouteListCtrl();
1467 UpdateTrkListCtrl();
1470 gFrame->InvalidateAllCanvasUndo();
1471 gFrame->RefreshAllCanvas();
1473 m_bNeedConfigFlush =
true;
1477void RouteManagerDialog::OnRtePropertiesClick(wxCommandEvent &event) {
1480 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1481 wxLIST_STATE_SELECTED);
1482 if (item == -1)
return;
1484 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1496 m_bNeedConfigFlush =
true;
1499void RouteManagerDialog::OnRteZoomtoClick(wxCommandEvent &event) {
1502 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1503 wxLIST_STATE_SELECTED);
1504 if (item == -1)
return;
1507 if (m_bCtrlDown) MakeAllRoutesInvisible();
1509 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1514 if (!route->IsVisible()) {
1515 route->SetVisible(
true);
1516 m_pRouteListCtrl->SetItemImage(item, route->IsVisible() ? 0 : 1);
1517 NavObj_dB::GetInstance().UpdateRoute(route);
1523void RouteManagerDialog::OnRteReverseClick(wxCommandEvent &event) {
1526 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1527 wxLIST_STATE_SELECTED);
1528 if (item == -1)
return;
1530 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1535 int ask_return = OCPNMessageBox(
this,
g_pRouteMan->GetRouteReverseMessage(),
1536 _(
"Rename Waypoints?"), wxYES_NO | wxCANCEL);
1537 if (ask_return != wxID_CANCEL) {
1538 bool rename = (ask_return == wxID_YES);
1540 pSelect->DeleteAllSelectableRouteSegments(route);
1541 route->Reverse(rename);
1542 pSelect->AddAllSelectableRouteSegments(route);
1548 m_pRouteListCtrl->SetItem(item, 2, startend);
1550 NavObj_dB::GetInstance().UpdateRoute(route);
1552 gFrame->RefreshAllCanvas();
1555 m_bNeedConfigFlush =
true;
1558void RouteManagerDialog::OnRteExportClick(wxCommandEvent &event) {
1561 wxString suggested_name =
"routes";
1565 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1566 wxLIST_STATE_SELECTED);
1567 if (item == -1)
break;
1569 Route *proute_to_export = (
Route *)m_pRouteListCtrl->GetItemData(item);
1571 if (proute_to_export) {
1572 list.push_back(proute_to_export);
1578 ExportGPXRoutes(
this, &list, suggested_name);
1581void RouteManagerDialog::OnRteResequenceClick(wxCommandEvent &event) {
1583 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1584 wxLIST_STATE_SELECTED);
1585 if (item == -1)
return;
1587 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1591 route->RenameRoutePoints();
1594void RouteManagerDialog::OnRteSendToPeerClick(wxCommandEvent &event) {
1595 std::vector<Route *> list;
1598 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1599 wxLIST_STATE_SELECTED);
1600 if (item == -1)
break;
1602 Route *proute = (
Route *)m_pRouteListCtrl->GetItemData(item);
1605 list.push_back(proute);
1608 if (!list.empty()) {
1610 for (
auto r : list) {
1617 MdnsCache::GetInstance().
Validate();
1618 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1621 dlg.Create(NULL, -1, _(
"Send Route(s) to OpenCPN Peer") +
"...",
"");
1626void RouteManagerDialog::OnWptSendToPeerClick(wxCommandEvent &event) {
1627 std::vector<RoutePoint *> list;
1630 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1631 wxLIST_STATE_SELECTED);
1632 if (item == -1)
break;
1637 list.push_back(proutep);
1640 if (!list.empty()) {
1642 for (
auto r : list) {
1649 MdnsCache::GetInstance().
Validate();
1650 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1653 dlg.Create(NULL, -1, _(
"Send Waypoint(s) to OpenCPN Peer") +
"...",
"");
1658void RouteManagerDialog::OnTrkSendToPeerClick(wxCommandEvent &event) {
1659 std::vector<Track *> list;
1662 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1663 wxLIST_STATE_SELECTED);
1664 if (item == -1)
break;
1666 Track *ptrk = (
Track *)m_pTrkListCtrl->GetItemData(item);
1669 list.push_back(ptrk);
1672 if (!list.empty()) {
1674 for (
auto r : list) {
1681 MdnsCache::GetInstance().
Validate();
1682 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1685 dlg.Create(NULL, -1, _(
"Send Track(s) to OpenCPN Peer") +
"...",
"");
1690void RouteManagerDialog::OnRteActivateClick(wxCommandEvent &event) {
1693 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1694 wxLIST_STATE_SELECTED);
1695 if (item == -1)
return;
1697 if (m_bCtrlDown) MakeAllRoutesInvisible();
1699 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1704 if (!route->IsVisible()) {
1705 route->SetVisible(
true);
1706 m_pRouteListCtrl->SetItemImage(item, 0, 0);
1718 UpdateRouteListCtrl();
1720 NavObj_dB::GetInstance().UpdateRoute(route);
1722 gFrame->RefreshAllCanvas();
1727 m_bNeedConfigFlush =
true;
1730void RouteManagerDialog::OnRteToggleVisibility(wxMouseEvent &event) {
1731 wxPoint pos =
event.GetPosition();
1733 long clicked_index = m_pRouteListCtrl->HitTest(pos, flags);
1736 if (clicked_index > -1 &&
1737 event.GetX() < m_pRouteListCtrl->GetColumnWidth(rmVISIBLE)) {
1739 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1741 route->SetVisible(!route->IsVisible());
1743 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1745 ::wxBeginBusyCursor();
1747 NavObj_dB::GetInstance().UpdateRoute(route);
1749 gFrame->RefreshAllCanvas();
1753 if (
g_pRouteMan->DoesRouteContainSharedPoints(route))
1754 UpdateWptListCtrlViz();
1760 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1761 wxLIST_STATE_DONTCARE);
1762 if (item == -1)
break;
1764 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1766 if (!pR->IsVisible()) {
1771 m_cbShowAllRte->SetValue(viz);
1773 ::wxEndBusyCursor();
1780void RouteManagerDialog::OnRteBtnLeftDown(wxMouseEvent &event) {
1781 m_bCtrlDown =
event.ControlDown();
1785void RouteManagerDialog::OnRteSelected(wxListEvent &event) {
1786 long clicked_index =
event.m_itemIndex;
1788 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1790 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1792 gFrame->RefreshAllCanvas();
1797void RouteManagerDialog::OnRteColumnClicked(wxListEvent &event) {
1798 if (event.m_col == 1) {
1799 sort_route_name_dir++;
1801 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1802 }
else if (event.m_col == 2) {
1803 sort_route_to_dir++;
1804 m_pRouteListCtrl->SortItems(SortRoutesOnTo, (wxIntPtr)NULL);
1808void RouteManagerDialog::OnRteSendToGPSClick(wxCommandEvent &event) {
1810 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1811 wxLIST_STATE_SELECTED);
1812 if (item == -1)
return;
1814 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1819 pdlg->SetRoute(route);
1825 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
1828 HideWithEffect(wxSHOW_EFFECT_BLEND);
1834 ShowWithEffect(wxSHOW_EFFECT_BLEND);
1840void RouteManagerDialog::OnRteDefaultAction(wxListEvent &event) {
1842 OnRtePropertiesClick(evt);
1845void RouteManagerDialog::OnTrkDefaultAction(wxListEvent &event) {
1847 OnTrkPropertiesClick(evt);
1850void RouteManagerDialog::OnTrkRightClick(wxListEvent &event) {
1852 wxMenuItem *mergeItem = menu.Append(TRACK_MERGE, _(
"&Merge Selected Tracks"));
1853 mergeItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 1);
1854 wxMenuItem *cleanItem = menu.Append(TRACK_CLEAN, _(
"Reduce Data..."));
1855 cleanItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() == 1);
1856 wxMenuItem *copyItem = menu.Append(TRACK_COPY_TEXT, _(
"&Copy as text"));
1857 copyItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 0);
1861static bool CompareTracks(
Track *track1,
Track *track2) {
1867void RouteManagerDialog::OnTrkMenuSelected(wxCommandEvent &event) {
1870 switch (event.GetId()) {
1872 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1873 wxLIST_STATE_SELECTED);
1874 if (item == -1)
break;
1875 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1876 if (track->IsRunning()) {
1881 const wxString choices[] = {
"5.0",
"10.0",
"20.0",
"50.0",
"100.0"};
1883 wxSingleChoiceDialog precisionDlg(
this,
1884 _(
"Select the maximum error allowed "
1885 "(in meters)\nafter data reduction:"),
1886 _(
"Reduce Data Precision"), 5, choices);
1888 precisionDlg.ShowWindowModal();
1889 while (precisionDlg.IsShown()) {
1893 int result = precisionDlg.GetReturnCode();
1895 int result = precisionDlg.ShowModal();
1897 if (result == wxID_CANCEL)
break;
1898 double precision = 5.0;
1899 switch (precisionDlg.GetSelection()) {
1917 int pointsBefore = track->GetnPoints();
1919 int reduction = track->Simplify(precision);
1920 gFrame->Refresh(
false);
1922 reduction = 100 * reduction / pointsBefore;
1923 wxString msg = wxString::Format(
1924 _(
"The amount of data used by the track\n was reduced by %d%%."),
1926 OCPNMessageBox(
this, msg, _(
"OpenCPN info"), wxICON_INFORMATION | wxOK);
1928 UpdateTrkListCtrl();
1929 UpdateRouteListCtrl();
1934 case TRACK_COPY_TEXT: {
1937 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1938 wxLIST_STATE_SELECTED);
1939 if (item == -1)
break;
1940 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1941 csvString << track->GetName() <<
"\t"
1942 << wxString::Format(
"%.1f", track->Length()) <<
"\t"
1946 if (wxTheClipboard->Open()) {
1947 wxTextDataObject *data =
new wxTextDataObject;
1948 data->SetText(csvString);
1949 wxTheClipboard->SetData(data);
1950 wxTheClipboard->Close();
1957 Track *targetTrack = NULL;
1961 std::vector<Track *> mergeList;
1962 std::vector<Track *> deleteList;
1963 bool runningSkipped =
false;
1965 ::wxBeginBusyCursor();
1968 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1969 wxLIST_STATE_SELECTED);
1970 if (item == -1)
break;
1971 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1972 mergeList.push_back(track);
1975 if (!mergeList.size()) {
1976 ::wxEndBusyCursor();
1980 std::sort(mergeList.begin(), mergeList.end(), CompareTracks);
1982 targetTrack = mergeList[0];
1983 lastPoint = targetTrack->GetLastPoint();
1985 for (
auto const &mergeTrack : mergeList) {
1986 if (mergeTrack == *mergeList.begin())
continue;
1988 if (mergeTrack->IsRunning()) {
1989 runningSkipped =
true;
1993 for (
int i = 0; i < mergeTrack->GetnPoints(); i++) {
1994 tPoint = mergeTrack->GetPoint(i);
1995 newPoint =
new TrackPoint(tPoint->m_lat, tPoint->m_lon,
1998 targetTrack->AddPoint(newPoint);
1999 NavObj_dB::GetInstance().AddTrackPoint(targetTrack, newPoint);
2001 pSelect->AddSelectableTrackSegment(lastPoint->m_lat, lastPoint->m_lon,
2002 newPoint->m_lat, newPoint->m_lon,
2003 lastPoint, newPoint, targetTrack);
2004 lastPoint = newPoint;
2006 deleteList.push_back(mergeTrack);
2009 for (
auto const &deleteTrack : deleteList) {
2010 g_pAIS->DeletePersistentTrack(deleteTrack);
2011 NavObj_dB::GetInstance().DeleteTrack(deleteTrack);
2012 RoutemanGui(*g_pRouteMan).DeleteTrack(deleteTrack);
2018 ::wxEndBusyCursor();
2020 UpdateTrkListCtrl();
2021 UpdateRouteListCtrl();
2022 gFrame->RefreshAllCanvas();
2024 if (runningSkipped) {
2025 wxMessageDialog skipWarning(
2027 _(
"The currently running Track was not merged.\nYou can merge it "
2028 "later when it is completed."),
2029 "Warning", wxCANCEL | wxICON_WARNING);
2030 skipWarning.ShowModal();
2038void RouteManagerDialog::UpdateTrkListCtrl() {
2042 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2044 wxUIntPtr selected_id = wxUIntPtr(0);
2045 if (item != -1) selected_id = m_pTrkListCtrl->GetItemData(item);
2048 m_pTrkListCtrl->DeleteAllItems();
2051 std::vector<Track *>::iterator it;
2054 bool bpartialViz =
false;
2057 if (!trk->IsVisible()) bpartialViz =
true;
2059 if (!trk->IsListed())
continue;
2061 if (!trk->GetName(
true).Upper().Contains(
2062 m_tFilterTrk->GetValue().Upper())) {
2067 li.SetId(list_index);
2068 li.SetImage(trk->IsVisible() ? 0 : 1);
2073 wxFont font = *wxNORMAL_FONT;
2074 font.SetWeight(wxFONTWEIGHT_BOLD);
2077 long idx = m_pTrkListCtrl->InsertItem(li);
2079 m_pTrkListCtrl->SetItem(idx, colTRKNAME, trk->GetName(
true));
2082 m_pTrkListCtrl->SetItem(idx, colTRKDATE, trk->GetDateTime());
2085 len.Printf(
"%5.2f", trk->Length());
2086 m_pTrkListCtrl->SetItem(idx, colTRKLENGTH, len);
2089 lic.SetId(list_index);
2091 lic.SetAlign(wxLIST_FORMAT_LEFT);
2092 m_pTrkListCtrl->SetItem(lic);
2095 lic.SetAlign(wxLIST_FORMAT_LEFT);
2096 m_pTrkListCtrl->SetItem(lic);
2101 switch (sort_track_key) {
2102 case SORT_ON_DISTANCE:
2103 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2106 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2110 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2114 m_pTrkListCtrl->SetColumnWidth(0, 4 * m_charWidth);
2119 if (selected_id != wxUIntPtr(0)) {
2120 item = m_pTrkListCtrl->FindItem(-1, selected_id);
2121 m_pTrkListCtrl->SetItemState(item,
2122 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2123 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2126 if ((m_lastTrkItem >= 0) && (m_pTrkListCtrl->GetItemCount()))
2127 m_pTrkListCtrl->EnsureVisible(m_lastTrkItem);
2129 m_cbShowAllTrk->SetValue(!bpartialViz);
2133void RouteManagerDialog::OnTrkSelected(wxListEvent &event) {
2137void RouteManagerDialog::OnTrkColumnClicked(wxListEvent &event) {
2138 if (event.m_col == 1) {
2139 sort_track_key = SORT_ON_NAME;
2140 sort_track_name_dir++;
2141 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2142 }
else if (event.m_col == 2) {
2143 sort_track_key = SORT_ON_DISTANCE;
2144 sort_track_len_dir++;
2145 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2146 }
else if (event.m_col == 3) {
2147 sort_track_key = SORT_ON_DATE;
2148 sort_track_date_dir++;
2149 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2153void RouteManagerDialog::UpdateTrkButtons() {
2156 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2157 int items = m_pTrkListCtrl->GetSelectedItemCount();
2159 m_lastTrkItem = item;
2161 btnTrkProperties->Enable(items == 1);
2162 btnTrkDelete->Enable(items >= 1);
2163 btnTrkExport->Enable(items >= 1);
2164 btnTrkRouteFromTrack->Enable(items == 1);
2165 btnTrkDeleteAll->Enable(m_pTrkListCtrl->GetItemCount() > 0);
2166 btnTrkSendToPeer->Enable(items >= 1);
2169void RouteManagerDialog::OnTrkToggleVisibility(wxMouseEvent &event) {
2170 wxPoint pos =
event.GetPosition();
2172 long clicked_index = m_pTrkListCtrl->HitTest(pos, flags);
2175 if (clicked_index > -1 &&
2176 event.GetX() < m_pTrkListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2178 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(clicked_index);
2180 track->SetVisible(!track->IsVisible());
2181 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
2182 m_pTrkListCtrl->SetItemImage(clicked_index, track->IsVisible() ? 0 : 1);
2189 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2190 wxLIST_STATE_DONTCARE);
2191 if (item == -1)
break;
2193 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2195 if (!track->IsVisible()) {
2200 m_cbShowAllTrk->SetValue(viz);
2202 gFrame->RefreshAllCanvas();
2209void RouteManagerDialog::OnTrkNewClick(wxCommandEvent &event) {
2213 UpdateTrkListCtrl();
2216void RouteManagerDialog::OnTrkPropertiesClick(wxCommandEvent &event) {
2220 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2221 if (item == -1)
return;
2223 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2231 UpdateTrkListCtrl();
2233 m_bNeedConfigFlush =
true;
2236void RouteManagerDialog::OnTrkDeleteClick(wxCommandEvent &event) {
2237 std::vector<Track *> list;
2239 int answer = OCPNMessageBox(
2240 this, _(
"Are you sure you want to delete the selected object(s)"),
2241 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2242 if (answer != wxID_YES)
return;
2245 if (m_pTrkListCtrl->GetSelectedItemCount()) {
2246 ::wxBeginBusyCursor();
2253 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2254 wxLIST_STATE_SELECTED);
2255 if (item == -1)
break;
2257 Track *ptrack_to_delete = (
Track *)m_pTrkListCtrl->GetItemData(item);
2259 if (ptrack_to_delete) list.push_back(ptrack_to_delete);
2263 for (
unsigned int i = 0; i < list.size(); i++) {
2264 Track *track = list.at(i);
2266 g_pAIS->DeletePersistentTrack(track);
2267 NavObj_dB::GetInstance().DeleteTrack(track);
2274 UpdateTrkListCtrl();
2276 gFrame->InvalidateAllCanvasUndo();
2277 gFrame->RefreshAllCanvas();
2278 ::wxEndBusyCursor();
2282void RouteManagerDialog::OnTrkExportClick(wxCommandEvent &event) {
2283 std::vector<Track *> list;
2284 wxString suggested_name =
"tracks";
2288 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2289 wxLIST_STATE_SELECTED);
2290 if (item == -1)
break;
2292 Track *ptrack_to_export = (
Track *)m_pTrkListCtrl->GetItemData(item);
2294 if (ptrack_to_export) {
2295 list.push_back(ptrack_to_export);
2296 if (ptrack_to_export->GetName() !=
"")
2297 suggested_name = ptrack_to_export->GetName();
2301 ExportGPXTracks(
this, &list, suggested_name);
2304void RouteManagerDialog::TrackToRoute(
Track *track) {
2306 if (track->m_bIsInLayer)
return;
2308 wxGenericProgressDialog pprog(_(
"OpenCPN Converting Track to Route...."),
2309 _(
"Processing Waypoints..."), 101, NULL,
2310 wxPD_AUTO_HIDE | wxPD_SMOOTH |
2311 wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2312 wxPD_REMAINING_TIME);
2314 ::wxBeginBusyCursor();
2316 Route *route = track->RouteFromTrack(&pprog);
2320 pprog.Update(101, _(
"Done."));
2322 gFrame->RefreshAllCanvas();
2324 ::wxEndBusyCursor();
2327void RouteManagerDialog::OnTrkRouteFromTrackClick(wxCommandEvent &event) {
2330 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2331 if (item == -1)
return;
2333 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2335 TrackToRoute(track);
2337 UpdateRouteListCtrl();
2340void RouteManagerDialog::OnTrkDeleteAllClick(wxCommandEvent &event) {
2342 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> tracks?"),
2343 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2345 if (dialog_ret == wxID_YES) {
2352 UpdateTrkListCtrl();
2356 UpdateRouteListCtrl();
2360 gFrame->RefreshAllCanvas();
2362 m_bNeedConfigFlush =
true;
2365void RouteManagerDialog::UpdateWptListCtrl(
RoutePoint *rp_select,
2366 bool b_retain_sort) {
2367 wxIntPtr selected_id = wxUIntPtr(0);
2370 if (NULL == rp_select) {
2372 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2373 wxLIST_STATE_SELECTED);
2375 if (item != -1) selected_id = m_pWptListCtrl->GetItemData(item);
2379 m_pWptListCtrl->SetImageList(
2380 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
2381 wxIMAGE_LIST_SMALL);
2383 m_pWptListCtrl->DeleteAllItems();
2386 bool b_anyHidden =
false;
2388 auto node = pWayPointMan->GetWaypointList()->begin();
2390 while (node != pWayPointMan->GetWaypointList()->end()) {
2392 if (rp && rp->IsListed()) {
2398 if (!rp->GetName().Upper().Contains(m_tFilterWpt->GetValue().Upper())) {
2408 long idx = m_pWptListCtrl->InsertItem(li);
2410 wxString scamin = wxString::Format(
"%i", (
int)rp->GetScaMin());
2411 if (!rp->GetUseSca()) scamin = _(
"Always");
2412 if (g_bOverruleScaMin) scamin = _(
"Overruled");
2413 m_pWptListCtrl->SetItem(idx, colWPTSCALE, scamin);
2415 wxString name = rp->GetName();
2416 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2417 m_pWptListCtrl->SetItem(idx, colWPTNAME, name);
2420 DistanceBearingMercator(rp->m_lat, rp->m_lon,
gLat,
gLon, NULL, &dst);
2422 dist.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(dst));
2423 m_pWptListCtrl->SetItem(idx, colWPTDIST, dist);
2425 if (rp == rp_select) selected_id = (wxIntPtr)rp_select;
2430 lic.SetAlign(wxLIST_FORMAT_LEFT);
2431 m_pWptListCtrl->SetItem(lic);
2434 lic.SetAlign(wxLIST_FORMAT_LEFT);
2435 m_pWptListCtrl->SetItem(lic);
2437 if (!rp->IsVisible()) b_anyHidden =
true;
2444 if (!b_retain_sort) {
2445 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2446 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2447 sort_wp_key = SORT_ON_NAME;
2449 switch (sort_wp_key) {
2451 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2452 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2454 case SORT_ON_DISTANCE:
2455 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2456 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2461 if (selected_id != wxUIntPtr(0)) {
2462 item = m_pWptListCtrl->FindItem(-1, selected_id);
2463 m_pWptListCtrl->SetItemState(item,
2464 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2465 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2468 if ((m_lastWptItem >= 0) && (m_pWptListCtrl->GetItemCount()))
2469 m_pWptListCtrl->EnsureVisible(m_lastWptItem);
2471 if (pWayPointMan->Getpmarkicon_image_list(m_listIconSize)->GetImageCount()) {
2472 int iwidth, iheight;
2473 pWayPointMan->Getpmarkicon_image_list(m_listIconSize)
2474 ->GetSize(0, iwidth, iheight);
2476 m_pWptListCtrl->SetColumnWidth(0, wxMax(iwidth + 4, 4 * m_charWidth));
2481 m_cbShowAllWP->SetValue(!b_anyHidden);
2484void RouteManagerDialog::UpdateWptListCtrlViz() {
2487 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2488 wxLIST_STATE_DONTCARE);
2489 if (item == -1)
break;
2494 m_pWptListCtrl->SetItemImage(item, imageIndex);
2498void RouteManagerDialog::OnWptDefaultAction(wxListEvent &event) {
2500 OnWptPropertiesClick(evt);
2503void RouteManagerDialog::OnWptSelected(wxListEvent &event) {
2507void RouteManagerDialog::OnWptColumnClicked(wxListEvent &event) {
2508 if (event.m_col == NAME_COLUMN) {
2510 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2511 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2512 sort_wp_key = SORT_ON_NAME;
2514 if (event.m_col == DISTANCE_COLUMN) {
2516 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2517 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2518 sort_wp_key = SORT_ON_DISTANCE;
2521 UpdateWptListCtrl();
2524void RouteManagerDialog::UpdateWptButtons() {
2527 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2528 bool enable1 = (m_pWptListCtrl->GetSelectedItemCount() == 1);
2529 bool enablemultiple = (m_pWptListCtrl->GetSelectedItemCount() >= 1);
2532 m_lastWptItem = item;
2538 bool b_delete_enable =
true;
2541 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2542 wxLIST_STATE_SELECTED);
2543 if (item == -1)
break;
2548 b_delete_enable =
false;
2553 btnWptProperties->Enable(enablemultiple);
2554 btnWptZoomto->Enable(enable1);
2555 btnWptDeleteAll->Enable(m_pWptListCtrl->GetItemCount() > 0);
2556 btnWptDelete->Enable(b_delete_enable && enablemultiple);
2557 btnWptGoTo->Enable(enable1);
2558 btnWptExport->Enable(enablemultiple);
2559 btnWptSendToGPS->Enable(enable1);
2560 btnWptSendToPeer->Enable(enablemultiple);
2563void RouteManagerDialog::OnWptToggleVisibility(wxMouseEvent &event) {
2564 wxPoint pos =
event.GetPosition();
2566 long clicked_index = m_pWptListCtrl->HitTest(pos, flags);
2569 if (clicked_index > -1 &&
2570 event.GetX() < m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2574 if (!wp->IsSharedInVisibleRoute()) {
2575 wp->SetVisible(!wp->IsVisible());
2576 m_pWptListCtrl->SetItemImage(clicked_index,
2579 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2586 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2587 wxLIST_STATE_DONTCARE);
2588 if (item == -1)
break;
2592 if (!wp->IsVisible()) {
2597 m_cbShowAllWP->SetValue(viz);
2599 gFrame->RefreshAllCanvas();
2601 if (clicked_index > -1 &&
2602 event.GetX() > m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) &&
2603 event.GetX() < (m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) +
2604 m_pWptListCtrl->GetColumnWidth(colWPTSCALE)) &&
2605 !g_bOverruleScaMin) {
2607 wp->SetUseSca(!wp->GetUseSca());
2608 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2609 gFrame->RefreshAllCanvas();
2610 wxString scamin = wxString::Format(
"%i", (
int)wp->GetScaMin());
2611 if (!wp->GetUseSca()) scamin = _(
"Always");
2612 m_pWptListCtrl->SetItem(clicked_index, colWPTSCALE, scamin);
2619void RouteManagerDialog::OnWptNewClick(wxCommandEvent &event) {
2623 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2625 gFrame->RefreshAllCanvas();
2631 WptShowPropertiesDialog(pWP, GetParent());
2634void RouteManagerDialog::OnWptPropertiesClick(wxCommandEvent &event) {
2635 long item = wxNOT_FOUND;
2637 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2638 if (item == wxNOT_FOUND)
return;
2640 auto pWP = (
RoutePoint *)m_pWptListCtrl->GetItemData(item);
2641 WptShowPropertiesDialog(pWP, GetParent());
2643 UpdateWptListCtrl();
2644 m_bNeedConfigFlush =
true;
2647void RouteManagerDialog::WptShowPropertiesDialog(
RoutePoint *pWP,
2656 wxString base_title = _(
"Waypoint Properties");
2659 wxString caption(wxString::Format(
"%s, %s: %s", base_title, _(
"Layer"),
2670void RouteManagerDialog::OnWptZoomtoClick(wxCommandEvent &event) {
2673 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2674 if (item == -1)
return;
2680 if (gFrame->GetFocusCanvas()) {
2681 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), wp->m_lat, wp->m_lon,
2686void RouteManagerDialog::OnWptDeleteClick(wxCommandEvent &event) {
2687 RoutePointList list;
2689 int answer = OCPNMessageBox(
2690 this, _(
"Are you sure you want to delete the selected object(s)"),
2691 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2692 if (answer != wxID_YES)
return;
2695 if (m_pWptListCtrl->GetSelectedItemCount()) {
2696 ::wxBeginBusyCursor();
2697 m_bNeedConfigFlush =
true;
2702 long item_last_selected = -1;
2704 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2705 wxLIST_STATE_SELECTED);
2706 if (item == -1)
break;
2708 item_last_selected = item;
2719 OCPNMessageBox(
this,
2720 _(
"The waypoint you want to delete is used in a "
2721 "route, do you really want to delete it?"),
2722 _(
"OpenCPN Alert"), wxYES_NO)) {
2723 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2724 pWayPointMan->DestroyWaypoint(wp);
2727 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2728 pWayPointMan->DestroyWaypoint(wp);
2734 m_pWptListCtrl->GetNextItem(item_last_selected);
2737 wp_next = (
RoutePoint *)m_pWptListCtrl->GetItemData(item_next);
2739 m_lastWptItem = item_next;
2741 UpdateRouteListCtrl();
2742 UpdateTrkListCtrl();
2743 UpdateWptListCtrl(wp_next,
true);
2749 gFrame->InvalidateAllCanvasUndo();
2750 gFrame->RefreshAllCanvas();
2751 ::wxEndBusyCursor();
2755void RouteManagerDialog::OnWptGoToClick(wxCommandEvent &event) {
2758 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2759 if (item == -1)
return;
2771 temp_route->AddPoint(pWP_src);
2772 temp_route->AddPoint(wp);
2774 pSelect->AddSelectableRouteSegment(
gLat,
gLon, wp->m_lat, wp->m_lon, pWP_src,
2777 wxString name = wp->GetName();
2778 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2779 wxString rteName = _(
"Go to ");
2780 rteName.Append(name);
2791 UpdateRouteListCtrl();
2794void RouteManagerDialog::OnWptExportClick(wxCommandEvent &event) {
2795 RoutePointList list;
2797 wxString suggested_name =
"waypoints";
2801 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2802 wxLIST_STATE_SELECTED);
2803 if (item == -1)
break;
2809 if (wp->GetName() !=
"") suggested_name = wp->GetName();
2813 ExportGPXWaypoints(
this, &list, suggested_name);
2816void RouteManagerDialog::OnWptSendToGPSClick(wxCommandEvent &event) {
2819 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2820 if (item == -1)
return;
2827 pdlg->SetWaypoint(wp);
2830 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
2833 HideWithEffect(wxSHOW_EFFECT_BLEND);
2837 ShowWithEffect(wxSHOW_EFFECT_BLEND);
2843void RouteManagerDialog::OnWptDeleteAllClick(wxCommandEvent &event) {
2846 if (!pWayPointMan->SharedWptsExist()) {
2847 prompt = _(
"Are you sure you want to delete <ALL> waypoints?");
2852 _(
"There are some waypoints used in routes or anchor alarms.\n Do you "
2853 "want to delete them as well?\n This will change the routes and "
2854 "disable the anchor alarms.\n Answering No keeps the waypoints used "
2855 "in routes or alarms.");
2856 buttons = wxYES_NO | wxCANCEL;
2860 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), buttons);
2861 if (answer == wxID_YES) pWayPointMan->DeleteAllWaypoints(
true);
2862 if (answer == wxID_NO && type == 2)
2863 pWayPointMan->DeleteAllWaypoints(
false);
2870 UpdateRouteListCtrl();
2871 UpdateWptListCtrl();
2872 gFrame->InvalidateAllCanvasUndo();
2873 gFrame->RefreshAllCanvas();
2876void RouteManagerDialog::OnLaySelected(wxListEvent &event) {
2880void RouteManagerDialog::OnLayColumnClicked(wxListEvent &event) {
2881 if (event.m_col == 1) {
2882 sort_layer_name_dir++;
2883 m_pLayListCtrl->SortItems(SortLayersOnName, (wxIntPtr)NULL);
2884 }
else if (event.m_col == 2) {
2885 sort_layer_len_dir++;
2886 m_pLayListCtrl->SortItems(SortLayersOnSize, (wxIntPtr)NULL);
2890void RouteManagerDialog::UpdateLayButtons() {
2893 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2894 bool enable = (item != -1);
2897 btnLayDelete->Enable(enable);
2898 cbLayToggleChart->Enable(enable);
2899 cbLayToggleListing->Enable(enable);
2900 cbLayToggleNames->Enable(enable);
2903 cbLayToggleChart->SetValue(
2904 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnChart());
2906 cbLayToggleNames->Set3StateValue(
2907 ((
Layer *)m_pLayListCtrl->GetItemData(item))->HasVisibleNames());
2909 cbLayToggleListing->SetValue(
2910 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnListing());
2913 cbLayToggleChart->SetValue(
true);
2914 cbLayToggleNames->Set3StateValue(wxCHK_UNDETERMINED);
2915 cbLayToggleListing->SetValue(
true);
2919void RouteManagerDialog::OnLayToggleVisibility(wxMouseEvent &event) {
2920 wxPoint pos =
event.GetPosition();
2922 long clicked_index = m_pLayListCtrl->HitTest(pos, flags);
2925 if (clicked_index > -1 &&
2926 event.GetX() < m_pLayListCtrl->GetColumnWidth(colLAYVISIBLE)) {
2928 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(clicked_index);
2930 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
2931 m_pLayListCtrl->SetItemImage(clicked_index,
2932 layer->IsVisibleOnChart() ? 0 : 1);
2938 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2939 wxLIST_STATE_DONTCARE);
2940 if (item == -1)
break;
2942 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
2944 if (!layer->IsVisibleOnChart()) {
2949 m_cbShowAllLay->SetValue(viz);
2951 ToggleLayerContentsOnChart(layer);
2958void RouteManagerDialog::UpdateLists() {
2959 UpdateRouteListCtrl();
2960 UpdateTrkListCtrl();
2961 UpdateWptListCtrl();
2962 UpdateLayListCtrl();
2965void RouteManagerDialog::OnLayNewClick(wxCommandEvent &event) {
2969void RouteManagerDialog::OnPerLayNewClick(wxCommandEvent &event) {
2973void RouteManagerDialog::AddNewLayer(
bool isPersistent) {
2974 bool show_flag = g_bShowLayers;
2975 g_bShowLayers =
true;
2977 UI_ImportGPX(
this,
true,
"",
true, isPersistent);
2979 g_bShowLayers = show_flag;
2981 gFrame->RefreshAllCanvas();
2984void RouteManagerDialog::OnLayPropertiesClick(wxCommandEvent &event) {
2988 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2989 if (item == -1)
return;
2992void RouteManagerDialog::OnLayDeleteClick(wxCommandEvent &event) {
2995 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2996 if (item == -1)
return;
2998 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3004 bool ispers =
false;
3005 wxString destf, f, name, ext;
3006 f = layer->m_LayerFileName;
3007 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3009 appendOSDirSlash(&destf);
3010 destf.Append(
"layers");
3011 appendOSDirSlash(&destf);
3012 destf << name <<
"." << ext;
3014 wxString prompt = _(
3015 "Are you sure you want to delete this layer and <ALL> of its contents?");
3016 if (wxFileExists(destf)) {
3017 prompt.Append(
"\n");
3019 _(
"The file will also be deleted from OpenCPN's layer directory."));
3020 prompt.Append(
"\n (" + destf +
")");
3024 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), wxYES_NO);
3025 if (answer == wxID_NO)
return;
3030 if (wxRemoveFile(destf))
3031 remMSG.sprintf(
"Layer file: %s is deleted", destf);
3033 remMSG.sprintf(
"Error deleting Layer file: %s", destf);
3035 wxLogMessage(remMSG);
3040 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3041 pRoute->m_bIsInLayer =
false;
3042 pRoute->m_LayerID = 0;
3048 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3049 pTrack->m_bIsInLayer =
false;
3050 pTrack->m_LayerID = 0;
3051 NavObj_dB::GetInstance().DeleteTrack(pTrack);
3057 std::vector<RoutePoint *> to_be_destroyed;
3058 auto node = pWayPointMan->GetWaypointList()->begin();
3059 while (node != pWayPointMan->GetWaypointList()->end()) {
3061 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3065 to_be_destroyed.push_back(rp);
3069 for (
auto rp : to_be_destroyed) pWayPointMan->DestroyWaypoint(rp, false);
3075 auto found = std::find(pLayerList->begin(), pLayerList->end(), layer);
3076 if (found != pLayerList->end()) pLayerList->erase(found);
3080 gFrame->RefreshAllCanvas();
3082 m_bNeedConfigFlush =
false;
3085void RouteManagerDialog::OnLayToggleChartClick(wxCommandEvent &event) {
3089 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3090 if (item == -1)
return;
3092 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3096 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
3097 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
3099 ToggleLayerContentsOnChart(layer);
3102void RouteManagerDialog::ToggleLayerContentsOnChart(
Layer *layer) {
3105 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3106 pRoute->SetVisible(layer->IsVisibleOnChart());
3111 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3112 pTrack->SetVisible(layer->IsVisibleOnChart());
3113 NavObj_dB::GetInstance().UpdateDBTrackAttributes(pTrack);
3118 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3119 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3120 rp->SetVisible(layer->IsVisibleOnChart());
3127 gFrame->RefreshAllCanvas();
3130void RouteManagerDialog::OnLayToggleNamesClick(wxCommandEvent &event) {
3134 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3135 if (item == -1)
return;
3137 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3141 layer->SetVisibleNames(cbLayToggleNames->Get3StateValue());
3143 ToggleLayerContentsNames(layer);
3146void RouteManagerDialog::ToggleLayerContentsNames(
Layer *layer) {
3149 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3150 for (
RoutePoint *prp1 : *pRoute->pRoutePointList) {
3151 if (layer->HasVisibleNames() == wxCHK_UNDETERMINED) {
3152 prp1->m_bShowName = prp1->m_bShowNameData;
3154 prp1->m_bShowName = (layer->HasVisibleNames() == wxCHK_CHECKED);
3161 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3162 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3163 rp->SetNameShown(layer->HasVisibleNames() == wxCHK_CHECKED ||
3165 layer->HasVisibleNames() == wxCHK_UNDETERMINED));
3171 gFrame->RefreshAllCanvas();
3174void RouteManagerDialog::OnLayToggleListingClick(wxCommandEvent &event) {
3178 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3179 if (item == -1)
return;
3181 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3185 layer->SetVisibleOnListing(!layer->IsVisibleOnListing());
3187 ToggleLayerContentsOnListing(layer);
3190void RouteManagerDialog::ToggleLayerContentsOnListing(
Layer *layer) {
3191 ::wxBeginBusyCursor();
3195 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3196 pRoute->SetListed(layer->IsVisibleOnListing());
3201 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID))
3202 pTrack->SetListed(layer->IsVisibleOnListing());
3208 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3210 rp->SetListed(layer->IsVisibleOnListing());
3216 ::wxEndBusyCursor();
3218 gFrame->RefreshAllCanvas();
3221void RouteManagerDialog::OnLayDefaultAction(wxListEvent &event) {
3223 OnLayPropertiesClick(evt);
3226void RouteManagerDialog::UpdateLayListCtrl() {
3230 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3232 wxUIntPtr selected_id = wxUIntPtr(0);
3233 if (item != -1) selected_id = m_pLayListCtrl->GetItemData(item);
3236 m_pLayListCtrl->DeleteAllItems();
3239 LayerList::iterator it;
3241 bool b_anyHidden =
false;
3242 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
3245 if (!lay->m_LayerName.Upper().Contains(m_tFilterLay->GetValue().Upper())) {
3251 li.SetImage(lay->IsVisibleOnChart() ? 0 : 1);
3255 long idx = m_pLayListCtrl->InsertItem(li);
3257 wxString name = lay->m_LayerName;
3258 if (name.IsEmpty()) {
3265 name = _(
"(Unnamed Layer)");
3267 m_pLayListCtrl->SetItem(idx, colLAYNAME, name);
3270 len.Printf(
"%d", (
int)lay->m_NoOfItems);
3271 m_pLayListCtrl->SetItem(idx, colLAYITEMS, len);
3272 m_pLayListCtrl->SetItem(idx, colLAYPERSIST, lay->m_LayerType);
3277 lic.SetAlign(wxLIST_FORMAT_LEFT);
3278 m_pLayListCtrl->SetItem(lic);
3281 lic.SetAlign(wxLIST_FORMAT_LEFT);
3282 m_pLayListCtrl->SetItem(lic);
3284 if (!lay->IsVisibleOnChart()) b_anyHidden =
true;
3287 m_pLayListCtrl->SortItems(SortLayersOnName,
3288 reinterpret_cast<wxIntPtr
>(m_pLayListCtrl));
3289 m_pLayListCtrl->SetColumnWidth(0, 4 * m_charWidth);
3294 if (selected_id != wxUIntPtr(0)) {
3295 item = m_pLayListCtrl->FindItem(-1, selected_id);
3296 m_pLayListCtrl->SetItemState(item,
3297 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
3298 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
3302 m_cbShowAllLay->SetValue(!b_anyHidden);
3305void RouteManagerDialog::OnImportClick(wxCommandEvent &event) {
3314 gFrame->RefreshAllCanvas();
3316void RouteManagerDialog::OnExportClick(wxCommandEvent &event) {
3321void RouteManagerDialog::OnBackupClick(wxCommandEvent &event) {
3322 int result = BackupDatabase(
this);
3323 if (result == wxID_YES) {
3324 OCPNMessageBox(NULL, _(
"Backup successful"), _(
"Backup result"),
3325 wxICON_INFORMATION | wxOK);
3326 }
else if (result == wxID_NO) {
3327 OCPNMessageBox(NULL, _(
"Backup Failed\nCheck the OpenCPN Logs"),
3328 _(
"Backup result"), wxICON_INFORMATION | wxOK);
3333void RouteManagerDialog::OnExportVizClick(wxCommandEvent &event) {
3334 ExportGPX(
this,
true,
true);
3337void RouteManagerDialog::OnFilterChanged(wxCommandEvent &event) {
3338 if (event.GetEventObject() == m_tFilterWpt) {
3339 UpdateWptListCtrl(NULL,
true);
3340 }
else if (event.GetEventObject() == m_tFilterRte) {
3341 UpdateRouteListCtrl();
3342 }
else if (event.GetEventObject() == m_tFilterTrk) {
3343 UpdateTrkListCtrl();
3344 }
else if (event.GetEventObject() == m_tFilterLay) {
3345 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.