42#include <wx/filename.h>
43#include <wx/stdpaths.h>
44#include <wx/progdlg.h>
45#include <wx/clipbrd.h>
46#include <wx/statline.h>
84#include "androidUTIL.h"
87#define DIALOG_MARGIN 10
89enum { rmVISIBLE = 0, rmROUTENAME, rmROUTEDESC };
90enum { colTRKVISIBLE = 0, colTRKNAME, colTRKLENGTH, colTRKDATE };
91enum { colLAYVISIBLE = 0, colLAYNAME, colLAYITEMS, colLAYPERSIST };
92enum { colWPTICON = 0, colWPTSCALE, colWPTNAME, colWPTDIST };
97void appendOSDirSlash(wxString *pString);
99static int SortRouteTrack(
const int order,
const wxString &it1,
100 const wxString &it2) {
101 if (order & 1)
return it2.CmpNoCase(it1);
103 return it1.CmpNoCase(it2);
107static int sort_route_name_dir;
108#if wxCHECK_VERSION(2, 9, 0)
109static int wxCALLBACK SortRoutesOnName(wxIntPtr item1, wxIntPtr item2,
112int wxCALLBACK SortRoutesOnName(
long item1,
long item2,
long list)
115 return SortRouteTrack(sort_route_name_dir, ((
Route *)item1)->GetName(),
116 ((
Route *)item2)->GetName());
120static int sort_route_to_dir;
121#if wxCHECK_VERSION(2, 9, 0)
122static int wxCALLBACK SortRoutesOnTo(wxIntPtr item1, wxIntPtr item2,
125int wxCALLBACK SortRoutesOnTo(
long item1,
long item2,
long list)
128 return SortRouteTrack(sort_route_to_dir, ((
Route *)item1)->GetTo(),
129 ((
Route *)item2)->GetTo());
133static int sort_track_name_dir;
134#if wxCHECK_VERSION(2, 9, 0)
135static int wxCALLBACK SortTracksOnName(wxIntPtr item1, wxIntPtr item2,
138int wxCALLBACK SortTracksOnName(
long item1,
long item2,
long list)
141 return SortRouteTrack(sort_track_name_dir, ((
Track *)item1)->GetName(),
142 ((
Track *)item2)->GetName());
145static int SortDouble(
const int order,
const double &it1,
const double &it2) {
157 if (l1 == l2)
return 0;
158 if (l2 < l1)
return 1;
163static int sort_track_len_dir;
164#if wxCHECK_VERSION(2, 9, 0)
165static int wxCALLBACK SortTracksOnDistance(wxIntPtr item1, wxIntPtr item2,
168int wxCALLBACK SortTracksOnDistance(
long item1,
long item2,
long list)
171 return SortDouble(sort_track_len_dir, ((
Track *)item1)->Length(),
172 ((
Track *)item2)->Length());
176static int sort_track_date_dir;
177#if wxCHECK_VERSION(2, 9, 0)
178static int wxCALLBACK SortTracksOnDate(wxIntPtr item1, wxIntPtr item2,
181int wxCALLBACK SortTracksOnDate(
long item1,
long item2,
long list)
185 return SortRouteTrack(sort_track_date_dir, ((
Track *)item1)->GetIsoDateTime(),
186 ((
Track *)item2)->GetIsoDateTime());
189static int sort_wp_key;
190static int sort_track_key;
193static int sort_wp_name_dir;
194#if wxCHECK_VERSION(2, 9, 0)
195static int wxCALLBACK SortWaypointsOnName(wxIntPtr item1, wxIntPtr item2,
198int wxCALLBACK SortWaypointsOnName(
long item1,
long item2,
long list)
206 if (sort_wp_name_dir & 1)
207 return pRP2->GetName().CmpNoCase(pRP1->GetName());
209 return pRP1->GetName().CmpNoCase(pRP2->GetName());
215static int sort_wp_len_dir;
216#if wxCHECK_VERSION(2, 9, 0)
217static int wxCALLBACK SortWaypointsOnDistance(wxIntPtr item1, wxIntPtr item2,
220int wxCALLBACK SortWaypointsOnDistance(
long item1,
long item2,
long list)
224 DistanceBearingMercator(((
RoutePoint *)item1)->m_lat,
227 DistanceBearingMercator(((
RoutePoint *)item2)->m_lat,
230 return SortDouble(sort_wp_len_dir, dst1, dst2);
234static int sort_layer_name_dir;
235#if wxCHECK_VERSION(2, 9, 0)
236static int wxCALLBACK SortLayersOnName(wxIntPtr item1, wxIntPtr item2,
239int wxCALLBACK SortLayersOnName(
long item1,
long item2,
long list)
242 return SortRouteTrack(sort_layer_name_dir, ((
Layer *)item1)->m_LayerName,
243 ((
Layer *)item2)->m_LayerName);
247static int sort_layer_len_dir;
248#if wxCHECK_VERSION(2, 9, 0)
249static int wxCALLBACK SortLayersOnSize(wxIntPtr item1, wxIntPtr item2,
252int wxCALLBACK SortLayersOnSize(
long item1,
long item2,
long list)
255 return SortDouble(sort_layer_len_dir, ((
Layer *)item1)->m_NoOfItems,
256 ((
Layer *)item2)->m_NoOfItems);
263EVT_NOTEBOOK_PAGE_CHANGED(
265 RouteManagerDialog::OnTabSwitch)
266EVT_CLOSE(RouteManagerDialog::OnClose)
267EVT_COMMAND(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, RouteManagerDialog::OnOK)
268EVT_CHAR_HOOK(RouteManagerDialog::OnKey)
272 if (ke.GetKeyCode() == WXK_ESCAPE)
278void RouteManagerDialog::OnTabSwitch(wxNotebookEvent &event) {
279 if (!m_pNotebook)
return;
280 int current_page = m_pNotebook->GetSelection();
281 if (current_page == 3) {
282 if (btnImport) btnImport->Enable(
false);
283 if (btnExport) btnExport->Enable(
false);
284 if (btnExportViz) btnExportViz->Enable(
false);
286 if (btnImport) btnImport->Enable(
true);
287 if (btnExport) btnExport->Enable(
true);
288 if (btnExportViz) btnExportViz->Enable(
true);
295bool RouteManagerDialog::instanceFlag =
false;
308RouteManagerDialog::RouteManagerDialog(wxWindow *parent) {
310 wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
312 wxFrame::Create(parent, -1, wxString(_(
"Route & Mark Manager")),
313 wxDefaultPosition, wxDefaultSize, style);
321 sort_wp_key = SORT_ON_NAME;
322 sort_track_key = SORT_ON_NAME;
329 routes_update_listener.
Init(GuiEvents::GetInstance().on_routes_update,
330 [&](wxCommandEvent) { UpdateRouteListCtrl(); });
333void RouteManagerDialog::Create() {
335 int char_width, char_height;
336 GetTextExtent(
"W", &char_width, &char_height);
337 m_charWidth = char_width;
339 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
340 SetSizer(itemBoxSizer1);
342 m_pNotebook =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition,
343 wxSize(-1, -1), wxNB_TOP);
344 itemBoxSizer1->Add(m_pNotebook, 1, wxALL | wxEXPAND, 5);
347 m_pPanelRte =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
348 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
350 wxBoxSizer *sbsRoutes =
new wxBoxSizer(wxHORIZONTAL);
351 m_pPanelRte->SetSizer(sbsRoutes);
352 m_pNotebook->AddPage(m_pPanelRte, _(
"Routes"));
355 sort_wp_name_dir = 0;
356 sort_track_len_dir = 1;
357 sort_route_to_dir = 0;
358 sort_track_name_dir = 0;
359 sort_route_name_dir = 0;
360 sort_layer_name_dir = 0;
361 sort_layer_len_dir = 1;
363 m_listIconSize = 2 * GetCharHeight();
366 wxBoxSizer *bSizerRteContents;
367 bSizerRteContents =
new wxBoxSizer(wxVERTICAL);
369 wxFlexGridSizer *fgSizerFilterRte;
370 fgSizerFilterRte =
new wxFlexGridSizer(0, 2, 0, 0);
371 fgSizerFilterRte->AddGrowableCol(1);
372 fgSizerFilterRte->SetFlexibleDirection(wxBOTH);
373 fgSizerFilterRte->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
375 m_stFilterRte =
new wxStaticText(m_pPanelRte, wxID_ANY, _(
"Filter"),
376 wxDefaultPosition, wxDefaultSize, 0);
377 m_stFilterRte->Wrap(-1);
378 fgSizerFilterRte->Add(m_stFilterRte, 0, wxALL, 5);
380 m_tFilterRte =
new wxTextCtrl(m_pPanelRte, wxID_ANY,
"", wxDefaultPosition,
382 fgSizerFilterRte->Add(m_tFilterRte, 1, wxALL | wxEXPAND, 5);
384 bSizerRteContents->Add(fgSizerFilterRte, 0, wxEXPAND, 5);
385 m_tFilterRte->Connect(
386 wxEVT_COMMAND_TEXT_UPDATED,
387 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
389 m_cbShowAllRte =
new wxCheckBox(m_pPanelRte, wxID_ANY, _(
"Show all routes"));
390 bSizerRteContents->Add(m_cbShowAllRte, 0, wxEXPAND | wxLEFT, 5);
391 m_cbShowAllRte->Connect(
392 wxEVT_COMMAND_CHECKBOX_CLICKED,
393 wxCommandEventHandler(RouteManagerDialog::OnShowAllRteCBClicked), NULL,
397 new wxListCtrl(m_pPanelRte, -1, wxDefaultPosition, wxSize(-1, -1),
398 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
401 m_pRouteListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
404 m_pRouteListCtrl->Connect(
405 wxEVT_COMMAND_LIST_ITEM_SELECTED,
406 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
407 m_pRouteListCtrl->Connect(
408 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
409 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
410 m_pRouteListCtrl->Connect(
411 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
412 wxListEventHandler(RouteManagerDialog::OnRteDefaultAction), NULL,
this);
413 m_pRouteListCtrl->Connect(
415 wxMouseEventHandler(RouteManagerDialog::OnRteToggleVisibility), NULL,
417 m_pRouteListCtrl->Connect(
418 wxEVT_COMMAND_LIST_COL_CLICK,
419 wxListEventHandler(RouteManagerDialog::OnRteColumnClicked), NULL,
this);
420 bSizerRteContents->Add(m_pRouteListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
421 sbsRoutes->Add(bSizerRteContents, 1, wxEXPAND, 5);
426 m_pRouteListCtrl->InsertColumn(rmVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
428 m_pRouteListCtrl->InsertColumn(rmROUTENAME, _(
"Route Name"),
429 wxLIST_FORMAT_LEFT, 15 * char_width);
430 m_pRouteListCtrl->InsertColumn(rmROUTEDESC, _(
"From <-> To"),
431 wxLIST_FORMAT_LEFT, 10 * char_width);
434 wxBoxSizer *bsRouteButtons =
new wxBoxSizer(wxVERTICAL);
435 sbsRoutes->Add(bsRouteButtons, 0, wxEXPAND);
437 wxScrolledWindow *winr =
new wxScrolledWindow(
438 m_pPanelRte, wxID_ANY, wxDefaultPosition, wxDefaultSize,
439 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
440 winr->SetScrollRate(0, 5);
442 bsRouteButtons->Add(winr, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
444 wxBoxSizer *bsRouteButtonsInner =
new wxBoxSizer(wxVERTICAL);
445 winr->SetSizer(bsRouteButtonsInner);
447 btnRteProperties =
new wxButton(winr, -1, _(
"&Properties") +
"...");
448 bsRouteButtonsInner->Add(btnRteProperties, 0, wxALL | wxEXPAND,
450 btnRteProperties->Connect(
451 wxEVT_COMMAND_BUTTON_CLICKED,
452 wxCommandEventHandler(RouteManagerDialog::OnRtePropertiesClick), NULL,
455 btnRteActivate =
new wxButton(winr, -1, _(
"&Activate"));
456 bsRouteButtonsInner->Add(btnRteActivate, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
457 btnRteActivate->Connect(
458 wxEVT_COMMAND_BUTTON_CLICKED,
459 wxCommandEventHandler(RouteManagerDialog::OnRteActivateClick), NULL,
461 btnRteActivate->Connect(
463 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
465 btnRteZoomto =
new wxButton(winr, -1, _(
"&Center View"));
466 bsRouteButtonsInner->Add(btnRteZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
467 btnRteZoomto->Connect(
468 wxEVT_COMMAND_BUTTON_CLICKED,
469 wxCommandEventHandler(RouteManagerDialog::OnRteZoomtoClick), NULL,
this);
470 btnRteZoomto->Connect(
472 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
474 btnRteReverse =
new wxButton(winr, -1, _(
"&Reverse"));
475 bsRouteButtonsInner->Add(btnRteReverse, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
476 btnRteReverse->Connect(
477 wxEVT_COMMAND_BUTTON_CLICKED,
478 wxCommandEventHandler(RouteManagerDialog::OnRteReverseClick), NULL,
this);
480 btnRteDelete =
new wxButton(winr, -1, _(
"&Delete"));
481 bsRouteButtonsInner->Add(btnRteDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
482 btnRteDelete->Connect(
483 wxEVT_COMMAND_BUTTON_CLICKED,
484 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteClick), NULL,
this);
486 wxString reseq_label(_(
"&Resequence Waypoints"));
487 wxString export_label(_(
"&Export selected..."));
488 wxString send_to_gps_label(_(
"&Send to GPS..."));
489 wxString send_to_peer_label(_(
"Send to &Peer..."));
492 reseq_label = wxString(_(
"Resequence"));
493 export_label = wxString(_(
"Export"));
494 send_to_gps_label = wxString(_(
"Send to GPS"));
495 send_to_peer_label = wxString(_(
"Send to Peer"));
498 btnRteExport =
new wxButton(winr, -1, export_label);
499 bsRouteButtonsInner->Add(btnRteExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
500 btnRteExport->Connect(
501 wxEVT_COMMAND_BUTTON_CLICKED,
502 wxCommandEventHandler(RouteManagerDialog::OnRteExportClick), NULL,
this);
504 btnRteResequence =
new wxButton(winr, -1, reseq_label);
505 bsRouteButtonsInner->Add(btnRteResequence, 0, wxALL | wxEXPAND,
507 btnRteResequence->Connect(
508 wxEVT_COMMAND_BUTTON_CLICKED,
509 wxCommandEventHandler(RouteManagerDialog::OnRteResequenceClick), NULL,
512 btnRteSendToPeer =
new wxButton(winr, -1, send_to_peer_label);
513 bsRouteButtonsInner->Add(btnRteSendToPeer, 0, wxALL | wxEXPAND,
515 btnRteSendToPeer->Connect(
516 wxEVT_COMMAND_BUTTON_CLICKED,
517 wxCommandEventHandler(RouteManagerDialog::OnRteSendToPeerClick), NULL,
520 btnRteSendToGPS =
new wxButton(winr, -1, send_to_gps_label);
521 bsRouteButtonsInner->Add(btnRteSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
522 btnRteSendToGPS->Connect(
523 wxEVT_COMMAND_BUTTON_CLICKED,
524 wxCommandEventHandler(RouteManagerDialog::OnRteSendToGPSClick), NULL,
527 bsRouteButtonsInner->AddSpacer(10);
529 btnRteDeleteAll =
new wxButton(winr, -1, _(
"&Delete All"));
530 bsRouteButtonsInner->Add(btnRteDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
531 btnRteDeleteAll->Connect(
532 wxEVT_COMMAND_BUTTON_CLICKED,
533 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteAllClick), NULL,
537 m_pPanelTrk =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
538 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
539 wxBoxSizer *sbsTracks =
new wxBoxSizer(wxHORIZONTAL);
540 m_pPanelTrk->SetSizer(sbsTracks);
541 m_pNotebook->AddPage(m_pPanelTrk, _(
"Tracks"));
543 wxBoxSizer *bSizerTrkContents;
544 bSizerTrkContents =
new wxBoxSizer(wxVERTICAL);
546 wxFlexGridSizer *fgSizerFilterTrk;
547 fgSizerFilterTrk =
new wxFlexGridSizer(0, 2, 0, 0);
548 fgSizerFilterTrk->AddGrowableCol(1);
549 fgSizerFilterTrk->SetFlexibleDirection(wxBOTH);
550 fgSizerFilterTrk->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
552 m_stFilterTrk =
new wxStaticText(m_pPanelTrk, wxID_ANY, _(
"Filter"),
553 wxDefaultPosition, wxDefaultSize, 0);
554 m_stFilterTrk->Wrap(-1);
555 fgSizerFilterTrk->Add(m_stFilterTrk, 0, wxALL, 5);
557 m_tFilterTrk =
new wxTextCtrl(m_pPanelTrk, wxID_ANY,
"", wxDefaultPosition,
559 fgSizerFilterTrk->Add(m_tFilterTrk, 1, wxALL | wxEXPAND, 5);
561 bSizerTrkContents->Add(fgSizerFilterTrk, 0, wxEXPAND, 5);
562 m_tFilterTrk->Connect(
563 wxEVT_COMMAND_TEXT_UPDATED,
564 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
566 m_cbShowAllTrk =
new wxCheckBox(m_pPanelTrk, wxID_ANY, _(
"Show all tracks"));
567 bSizerTrkContents->Add(m_cbShowAllTrk, 0, wxEXPAND | wxLEFT, 5);
568 m_cbShowAllTrk->Connect(
569 wxEVT_COMMAND_CHECKBOX_CLICKED,
570 wxCommandEventHandler(RouteManagerDialog::OnShowAllTrkCBClicked), NULL,
574 new wxListCtrl(m_pPanelTrk, -1, wxDefaultPosition, wxDefaultSize,
575 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
579 m_pTrkListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
582 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
583 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
585 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
586 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
588 m_pTrkListCtrl->Connect(
589 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
590 wxListEventHandler(RouteManagerDialog::OnTrkDefaultAction), NULL,
this);
591 m_pTrkListCtrl->Connect(
593 wxMouseEventHandler(RouteManagerDialog::OnTrkToggleVisibility), NULL,
595 m_pTrkListCtrl->Connect(
596 wxEVT_COMMAND_LIST_COL_CLICK,
597 wxListEventHandler(RouteManagerDialog::OnTrkColumnClicked), NULL,
this);
598 m_pTrkListCtrl->Connect(
599 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
600 wxListEventHandler(RouteManagerDialog::OnTrkRightClick), NULL,
this);
601 this->Connect(wxEVT_COMMAND_MENU_SELECTED,
602 wxCommandEventHandler(RouteManagerDialog::OnTrkMenuSelected),
605 bSizerTrkContents->Add(m_pTrkListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
606 sbsTracks->Add(bSizerTrkContents, 1, wxEXPAND, 5);
608 m_pTrkListCtrl->InsertColumn(colTRKVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
610 m_pTrkListCtrl->InsertColumn(colTRKNAME, _(
"Track Name"), wxLIST_FORMAT_LEFT,
612 m_pTrkListCtrl->InsertColumn(colTRKDATE, _(
"Start Date"), wxLIST_FORMAT_LEFT,
614 m_pTrkListCtrl->InsertColumn(colTRKLENGTH, _(
"Length"), wxLIST_FORMAT_LEFT,
617 wxBoxSizer *bsTrkButtons =
new wxBoxSizer(wxVERTICAL);
618 sbsTracks->Add(bsTrkButtons, 0, wxEXPAND);
620 wxScrolledWindow *wint =
new wxScrolledWindow(
621 m_pPanelTrk, wxID_ANY, wxDefaultPosition, wxDefaultSize,
622 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
623 wint->SetScrollRate(0, 5);
625 bsTrkButtons->Add(wint, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
627 wxBoxSizer *bsTrkButtonsInner =
new wxBoxSizer(wxVERTICAL);
628 wint->SetSizer(bsTrkButtonsInner);
630 btnTrkNew =
new wxButton(wint, -1, _(
"&Start Track"));
631 bsTrkButtonsInner->Add(btnTrkNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
632 btnTrkNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
633 wxCommandEventHandler(RouteManagerDialog::OnTrkNewClick),
636 btnTrkProperties =
new wxButton(wint, -1, _(
"&Properties"));
637 bsTrkButtonsInner->Add(btnTrkProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
638 btnTrkProperties->Connect(
639 wxEVT_COMMAND_BUTTON_CLICKED,
640 wxCommandEventHandler(RouteManagerDialog::OnTrkPropertiesClick), NULL,
643 btnTrkDelete =
new wxButton(wint, -1, _(
"&Delete"));
644 bsTrkButtonsInner->Add(btnTrkDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
645 btnTrkDelete->Connect(
646 wxEVT_COMMAND_BUTTON_CLICKED,
647 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteClick), NULL,
this);
649 btnTrkExport =
new wxButton(wint, -1, _(
"&Export selected..."));
650 bsTrkButtonsInner->Add(btnTrkExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
651 btnTrkExport->Connect(
652 wxEVT_COMMAND_BUTTON_CLICKED,
653 wxCommandEventHandler(RouteManagerDialog::OnTrkExportClick), NULL,
this);
655 btnTrkRouteFromTrack =
new wxButton(wint, -1, _(
"Route from Track"));
656 bsTrkButtonsInner->Add(btnTrkRouteFromTrack, 0, wxALL | wxEXPAND,
658 btnTrkRouteFromTrack->Connect(
659 wxEVT_COMMAND_BUTTON_CLICKED,
660 wxCommandEventHandler(RouteManagerDialog::OnTrkRouteFromTrackClick), NULL,
663 btnTrkSendToPeer =
new wxButton(wint, -1, _(
"Send to &Peer"));
664 bsTrkButtonsInner->Add(btnTrkSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
665 btnTrkSendToPeer->Connect(
666 wxEVT_COMMAND_BUTTON_CLICKED,
667 wxCommandEventHandler(RouteManagerDialog::OnTrkSendToPeerClick), NULL,
670 bsTrkButtonsInner->AddSpacer(10);
672 btnTrkDeleteAll =
new wxButton(wint, -1, _(
"&Delete All"));
673 bsTrkButtonsInner->Add(btnTrkDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
674 btnTrkDeleteAll->Connect(
675 wxEVT_COMMAND_BUTTON_CLICKED,
676 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteAllClick), NULL,
680 m_pPanelWpt =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
681 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
682 wxBoxSizer *sbsWpts =
new wxBoxSizer(wxHORIZONTAL);
683 m_pPanelWpt->SetSizer(sbsWpts);
684 m_pNotebook->AddPage(m_pPanelWpt, _(
"Marks"));
686 wxBoxSizer *bSizerWptContents;
687 bSizerWptContents =
new wxBoxSizer(wxVERTICAL);
689 wxFlexGridSizer *fgSizerFilterWpt;
690 fgSizerFilterWpt =
new wxFlexGridSizer(0, 2, 0, 0);
691 fgSizerFilterWpt->AddGrowableCol(1);
692 fgSizerFilterWpt->SetFlexibleDirection(wxBOTH);
693 fgSizerFilterWpt->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
695 m_stFilterWpt =
new wxStaticText(m_pPanelWpt, wxID_ANY, _(
"Filter"),
696 wxDefaultPosition, wxDefaultSize, 0);
697 m_stFilterWpt->Wrap(-1);
698 fgSizerFilterWpt->Add(m_stFilterWpt, 0, wxALL, 5);
700 m_tFilterWpt =
new wxTextCtrl(m_pPanelWpt, wxID_ANY,
"", wxDefaultPosition,
702 fgSizerFilterWpt->Add(m_tFilterWpt, 1, wxALL | wxEXPAND, 5);
704 bSizerWptContents->Add(fgSizerFilterWpt, 0, wxEXPAND, 5);
705 m_tFilterWpt->Connect(
706 wxEVT_COMMAND_TEXT_UPDATED,
707 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
709 m_cbShowAllWP =
new wxCheckBox(m_pPanelWpt, wxID_ANY, _(
"Show all marks"));
710 bSizerWptContents->Add(m_cbShowAllWP, 0, wxEXPAND | wxLEFT, 5);
711 m_cbShowAllWP->Connect(
712 wxEVT_COMMAND_CHECKBOX_CLICKED,
713 wxCommandEventHandler(RouteManagerDialog::OnShowAllWpCBClicked), NULL,
717 new wxListCtrl(m_pPanelWpt, -1, wxDefaultPosition, wxDefaultSize,
718 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
721 m_pWptListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
724 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
725 wxListEventHandler(RouteManagerDialog::OnWptSelected),
727 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
728 wxListEventHandler(RouteManagerDialog::OnWptSelected),
730 m_pWptListCtrl->Connect(
731 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
732 wxListEventHandler(RouteManagerDialog::OnWptDefaultAction), NULL,
this);
733 m_pWptListCtrl->Connect(
735 wxMouseEventHandler(RouteManagerDialog::OnWptToggleVisibility), NULL,
737 m_pWptListCtrl->Connect(
738 wxEVT_COMMAND_LIST_COL_CLICK,
739 wxListEventHandler(RouteManagerDialog::OnWptColumnClicked), NULL,
this);
740 bSizerWptContents->Add(m_pWptListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
741 sbsWpts->Add(bSizerWptContents, 1, wxEXPAND, 5);
743 m_pWptListCtrl->InsertColumn(colWPTICON, _(
"Icon"), wxLIST_FORMAT_LEFT,
745 m_pWptListCtrl->InsertColumn(colWPTSCALE, _(
"Scale"), wxLIST_FORMAT_LEFT,
747 m_pWptListCtrl->InsertColumn(colWPTNAME, _(
"Mark Name"), wxLIST_FORMAT_LEFT,
749 m_pWptListCtrl->InsertColumn(colWPTDIST, _(
"Distance from own ship"),
750 wxLIST_FORMAT_LEFT, 14 * char_width);
752 wxBoxSizer *bsWptButtons =
new wxBoxSizer(wxVERTICAL);
753 sbsWpts->Add(bsWptButtons, 0, wxEXPAND);
755 wxScrolledWindow *winw =
new wxScrolledWindow(
756 m_pPanelWpt, wxID_ANY, wxDefaultPosition, wxDefaultSize,
757 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
758 winw->SetScrollRate(0, 5);
760 bsWptButtons->Add(winw, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
762 wxBoxSizer *bsWptButtonsInner =
new wxBoxSizer(wxVERTICAL);
763 winw->SetSizer(bsWptButtonsInner);
765 btnWptNew =
new wxButton(winw, -1, _(
"&New"));
766 bsWptButtonsInner->Add(btnWptNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
767 btnWptNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
768 wxCommandEventHandler(RouteManagerDialog::OnWptNewClick),
771 btnWptProperties =
new wxButton(winw, -1, _(
"&Properties"));
772 bsWptButtonsInner->Add(btnWptProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
773 btnWptProperties->Connect(
774 wxEVT_COMMAND_BUTTON_CLICKED,
775 wxCommandEventHandler(RouteManagerDialog::OnWptPropertiesClick), NULL,
778 btnWptZoomto =
new wxButton(winw, -1, _(
"&Center View"));
779 bsWptButtonsInner->Add(btnWptZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
780 btnWptZoomto->Connect(
781 wxEVT_COMMAND_BUTTON_CLICKED,
782 wxCommandEventHandler(RouteManagerDialog::OnWptZoomtoClick), NULL,
this);
784 btnWptDelete =
new wxButton(winw, -1, _(
"&Delete"));
785 bsWptButtonsInner->Add(btnWptDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
786 btnWptDelete->Connect(
787 wxEVT_COMMAND_BUTTON_CLICKED,
788 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteClick), NULL,
this);
790 btnWptGoTo =
new wxButton(winw, -1, _(
"&Go To"));
791 bsWptButtonsInner->Add(btnWptGoTo, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
792 btnWptGoTo->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
793 wxCommandEventHandler(RouteManagerDialog::OnWptGoToClick),
796 btnWptExport =
new wxButton(winw, -1, _(
"&Export selected..."));
797 bsWptButtonsInner->Add(btnWptExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
798 btnWptExport->Connect(
799 wxEVT_COMMAND_BUTTON_CLICKED,
800 wxCommandEventHandler(RouteManagerDialog::OnWptExportClick), NULL,
this);
802 btnWptSendToGPS =
new wxButton(winw, -1, _(
"&Send to GPS"));
803 bsWptButtonsInner->Add(btnWptSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
804 btnWptSendToGPS->Connect(
805 wxEVT_COMMAND_BUTTON_CLICKED,
806 wxCommandEventHandler(RouteManagerDialog::OnWptSendToGPSClick), NULL,
809 btnWptSendToPeer =
new wxButton(winw, -1, _(
"Send to &Peer"));
810 bsWptButtonsInner->Add(btnWptSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
811 btnWptSendToPeer->Connect(
812 wxEVT_COMMAND_BUTTON_CLICKED,
813 wxCommandEventHandler(RouteManagerDialog::OnWptSendToPeerClick), NULL,
816 bsWptButtonsInner->AddSpacer(10);
818 btnWptDeleteAll =
new wxButton(winw, -1, _(
"Delete All"));
819 bsWptButtonsInner->Add(btnWptDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
820 btnWptDeleteAll->Connect(
821 wxEVT_COMMAND_BUTTON_CLICKED,
822 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteAllClick), NULL,
825 wxBoxSizer *itemBoxSizer5 =
new wxBoxSizer(wxHORIZONTAL);
826 itemBoxSizer1->Add(itemBoxSizer5, 0, wxALL | wxEXPAND);
828 wxBoxSizer *itemBoxSizer6 =
new wxBoxSizer(wxHORIZONTAL);
829 itemBoxSizer5->Add(itemBoxSizer6, 1, wxALL | wxEXPAND);
831 btnImport =
new wxButton(
this, -1, _(
"I&mport GPX..."));
832 itemBoxSizer6->Add(btnImport, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
833 btnImport->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
834 wxCommandEventHandler(RouteManagerDialog::OnImportClick),
843 btnExportViz =
new wxButton(
this, -1, _(
"Export All Visible..."));
844 itemBoxSizer6->Add(btnExportViz, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
845 btnExportViz->Connect(
846 wxEVT_COMMAND_BUTTON_CLICKED,
847 wxCommandEventHandler(RouteManagerDialog::OnExportVizClick), NULL,
this);
849 btnBackup =
new wxButton(
this, -1, _(
"Backup..."));
850 itemBoxSizer6->Add(btnBackup, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
851 btnBackup->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
852 wxCommandEventHandler(RouteManagerDialog::OnBackupClick),
855 wxSize sz = ::wxGetDisplaySize();
857 itemBoxSizer6->Add(0, 0, 1, wxEXPAND, 5);
858 itemBoxSizer6->Add(
new wxButton(
this, wxID_OK), 0, wxALL, DIALOG_MARGIN);
860 wxStaticLine *staticLine121 =
new wxStaticLine(
861 this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
862 itemBoxSizer1->Add(staticLine121, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
864 wxBoxSizer *itemBoxSizer7 =
new wxBoxSizer(wxHORIZONTAL);
865 itemBoxSizer1->Add(itemBoxSizer7, 0, wxEXPAND);
867 wxBoxSizer *itemBoxSizer7a =
new wxBoxSizer(wxHORIZONTAL);
868 itemBoxSizer7->Add(itemBoxSizer7a, 1, wxEXPAND);
870 itemBoxSizer7a->AddStretchSpacer();
871 itemBoxSizer7a->Add(
new wxButton(
this, wxID_OK), 0, wxRIGHT | wxALIGN_RIGHT,
876 m_pPanelLay =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
877 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
878 wxBoxSizer *sbsLayers =
new wxBoxSizer(wxHORIZONTAL);
879 m_pPanelLay->SetSizer(sbsLayers);
880 m_pNotebook->AddPage(m_pPanelLay, _(
"Layers"));
882 wxBoxSizer *bSizerLayContents;
883 bSizerLayContents =
new wxBoxSizer(wxVERTICAL);
885 wxFlexGridSizer *fgSizerFilterLay;
886 fgSizerFilterLay =
new wxFlexGridSizer(0, 2, 0, 0);
887 fgSizerFilterLay->AddGrowableCol(1);
888 fgSizerFilterLay->SetFlexibleDirection(wxBOTH);
889 fgSizerFilterLay->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
891 m_stFilterLay =
new wxStaticText(m_pPanelLay, wxID_ANY, _(
"Filter"),
892 wxDefaultPosition, wxDefaultSize, 0);
893 m_stFilterLay->Wrap(-1);
894 fgSizerFilterLay->Add(m_stFilterLay, 0, wxALL, 5);
896 m_tFilterLay =
new wxTextCtrl(m_pPanelLay, wxID_ANY,
"", wxDefaultPosition,
898 fgSizerFilterLay->Add(m_tFilterLay, 1, wxALL | wxEXPAND, 5);
900 bSizerLayContents->Add(fgSizerFilterLay, 0, wxEXPAND, 5);
901 m_tFilterLay->Connect(
902 wxEVT_COMMAND_TEXT_UPDATED,
903 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
905 m_cbShowAllLay =
new wxCheckBox(m_pPanelLay, wxID_ANY, _(
"Show all layers"));
906 bSizerLayContents->Add(m_cbShowAllLay, 0, wxEXPAND | wxLEFT, 5);
907 m_cbShowAllLay->Connect(
908 wxEVT_COMMAND_CHECKBOX_CLICKED,
909 wxCommandEventHandler(RouteManagerDialog::OnShowAllLayCBClicked), NULL,
913 new wxListCtrl(m_pPanelLay, -1, wxDefaultPosition, wxDefaultSize,
914 wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING |
915 wxLC_HRULES | wxBORDER_SUNKEN );
917 m_pLayListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
920 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
921 wxListEventHandler(RouteManagerDialog::OnLaySelected),
923 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
924 wxListEventHandler(RouteManagerDialog::OnLaySelected),
926 m_pLayListCtrl->Connect(
927 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
928 wxListEventHandler(RouteManagerDialog::OnLayDefaultAction), NULL,
this);
929 m_pLayListCtrl->Connect(
931 wxMouseEventHandler(RouteManagerDialog::OnLayToggleVisibility), NULL,
933 m_pLayListCtrl->Connect(
934 wxEVT_COMMAND_LIST_COL_CLICK,
935 wxListEventHandler(RouteManagerDialog::OnLayColumnClicked), NULL,
this);
936 bSizerLayContents->Add(m_pLayListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
937 sbsLayers->Add(bSizerLayContents, 1, wxEXPAND, 5);
939 m_pLayListCtrl->InsertColumn(colLAYVISIBLE,
"", wxLIST_FORMAT_LEFT,
941 m_pLayListCtrl->InsertColumn(colLAYNAME, _(
"Layer Name"), wxLIST_FORMAT_LEFT,
943 m_pLayListCtrl->InsertColumn(colLAYITEMS, _(
"No. of items"),
944 wxLIST_FORMAT_LEFT, 10 * char_width);
945 m_pLayListCtrl->InsertColumn(colLAYPERSIST, _(
"Layer type"),
946 wxLIST_FORMAT_LEFT, 10 * char_width);
948 wxBoxSizer *bsLayButtons =
new wxBoxSizer(wxVERTICAL);
949 sbsLayers->Add(bsLayButtons, 0, wxEXPAND);
951 wxScrolledWindow *winl =
new wxScrolledWindow(
952 m_pPanelLay, wxID_ANY, wxDefaultPosition, wxDefaultSize,
953 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
954 winl->SetScrollRate(0, 5);
956 bsLayButtons->Add(winl, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
958 wxBoxSizer *bsLayButtonsInner =
new wxBoxSizer(wxVERTICAL);
959 winl->SetSizer(bsLayButtonsInner);
961 btnLayNew =
new wxButton(winl, -1, _(
"Create Temporary layer"));
962 bsLayButtonsInner->Add(btnLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
963 btnLayNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
964 wxCommandEventHandler(RouteManagerDialog::OnLayNewClick),
967 btnPerLayNew =
new wxButton(winl, -1, _(
"Create Persistent layer"));
968 bsLayButtonsInner->Add(btnPerLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
969 btnPerLayNew->Connect(
970 wxEVT_COMMAND_BUTTON_CLICKED,
971 wxCommandEventHandler(RouteManagerDialog::OnPerLayNewClick), NULL,
this);
973 btnLayDelete =
new wxButton(winl, -1, _(
"&Delete"));
974 bsLayButtonsInner->Add(btnLayDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
975 btnLayDelete->Connect(
976 wxEVT_COMMAND_BUTTON_CLICKED,
977 wxCommandEventHandler(RouteManagerDialog::OnLayDeleteClick), NULL,
this);
979 cbLayToggleChart =
new wxCheckBox(winl, -1, _(
"Show on chart"));
980 bsLayButtonsInner->Add(cbLayToggleChart, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
981 cbLayToggleChart->Connect(
982 wxEVT_COMMAND_CHECKBOX_CLICKED,
983 wxCommandEventHandler(RouteManagerDialog::OnLayToggleChartClick), NULL,
987 new wxCheckBox(winl, -1, _(
"Show WPT names"), wxDefaultPosition,
988 wxDefaultSize, wxCHK_3STATE);
990 bsLayButtonsInner->Add(cbLayToggleNames, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
991 cbLayToggleNames->Connect(
992 wxEVT_COMMAND_CHECKBOX_CLICKED,
993 wxCommandEventHandler(RouteManagerDialog::OnLayToggleNamesClick), NULL,
996 cbLayToggleListing =
new wxCheckBox(winl, -1, _(
"List contents"));
997 bsLayButtonsInner->Add(cbLayToggleListing, 0, wxALL | wxEXPAND,
999 cbLayToggleListing->Connect(
1000 wxEVT_COMMAND_CHECKBOX_CLICKED,
1001 wxCommandEventHandler(RouteManagerDialog::OnLayToggleListingClick), NULL,
1006 int imageRefSize = m_charWidth * 2;
1007 wxImageList *imglist =
new wxImageList(imageRefSize, imageRefSize,
true, 1);
1010 wxString UserIconPath = g_Platform->GetSharedDataDir() +
"uidata" +
1011 wxFileName::GetPathSeparator();
1013 LoadSVG(UserIconPath +
"eye.svg", imageRefSize, imageRefSize)
1015 if (iconSVG.IsOk()) {
1016 iconSVG.Resize(wxSize(imageRefSize, imageRefSize),
1018 imglist->Add(wxBitmap(iconSVG));
1021 iconSVG =
LoadSVG(UserIconPath +
"eyex.svg", imageRefSize, imageRefSize)
1023 if (iconSVG.IsOk()) {
1024 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1025 imglist->Add(wxBitmap(iconSVG));
1028 iconSVG =
LoadSVG(UserIconPath +
"eyeGray.svg", imageRefSize, imageRefSize)
1030 if (iconSVG.IsOk()) {
1031 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1032 imglist->Add(wxBitmap(iconSVG));
1035 m_pRouteListCtrl->AssignImageList(imglist, wxIMAGE_LIST_SMALL);
1038 m_pRouteListCtrl->GetHandle()->setIconSize(QSize(imageRefSize, imageRefSize));
1042 m_pTrkListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1043 m_pWptListCtrl->SetImageList(
1044 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
1045 wxIMAGE_LIST_SMALL);
1046 m_pLayListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1056 m_bNeedConfigFlush =
false;
1059RouteManagerDialog::~RouteManagerDialog() {
1060 delete m_pRouteListCtrl;
1061 delete m_pTrkListCtrl;
1062 delete m_pWptListCtrl;
1063 delete m_pLayListCtrl;
1065 delete btnRteDelete;
1066 delete btnRteResequence;
1067 delete btnRteExport;
1068 delete btnRteZoomto;
1069 delete btnRteProperties;
1070 delete btnRteActivate;
1071 delete btnRteReverse;
1072 delete btnRteSendToGPS;
1073 delete btnRteDeleteAll;
1075 delete btnTrkProperties;
1076 delete btnTrkDelete;
1077 delete btnTrkExport;
1078 delete btnTrkRouteFromTrack;
1079 delete btnTrkDeleteAll;
1081 delete btnWptProperties;
1082 delete btnWptZoomto;
1083 delete btnWptDelete;
1085 delete btnWptExport;
1086 delete btnWptSendToGPS;
1087 delete btnWptDeleteAll;
1090 delete cbLayToggleChart;
1091 delete cbLayToggleListing;
1092 delete cbLayToggleNames;
1093 delete btnLayDelete;
1096 delete btnExportViz;
1099 btnExportViz = NULL;
1102 instanceFlag =
false;
1105void RouteManagerDialog::RecalculateSize() {
1111 int char_width, char_height;
1112 GetTextExtent(
"W", &char_width, &char_height);
1115 sz.x = 60 * char_width;
1116 sz.y = 30 * char_height;
1118 wxSize dsize = GetParent()->GetClientSize();
1119 sz.y = wxMin(sz.y, dsize.y);
1120 sz.x = wxMin(sz.x, dsize.x);
1123 wxSize fsize = GetSize();
1124 fsize.y = wxMin(fsize.y, dsize.y);
1125 fsize.x = wxMin(fsize.x, dsize.x);
1131void RouteManagerDialog::OnClose(wxCloseEvent &event) {
1133 top_frame::Get()->Raise();
1139void RouteManagerDialog::OnOK(wxCommandEvent &event) {
1141 top_frame::Get()->Raise();
1146void RouteManagerDialog::SetColorScheme() { DimeControl(
this); }
1148void RouteManagerDialog::OnShowAllRteCBClicked(wxCommandEvent &event) {
1149 bool viz = m_cbShowAllRte->GetValue();
1151 int item_count = m_pRouteListCtrl->GetItemCount();
1153 if (item_count > 50) {
1155 ::wxBeginBusyCursor();
1158 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1159 wxLIST_STATE_DONTCARE);
1160 if (item == -1)
break;
1162 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1164 pR->SetVisible(viz, viz);
1165 pR->SetSharedWPViz(viz);
1167 m_pRouteListCtrl->SetItemImage(item, !viz);
1169 NavObj_dB::GetInstance().UpdateRouteViz(pR);
1172 if (busy) ::wxEndBusyCursor();
1174 UpdateWptListCtrlViz();
1175 top_frame::Get()->RefreshAllCanvas();
1178void RouteManagerDialog::OnShowAllWpCBClicked(wxCommandEvent &event) {
1179 bool viz = m_cbShowAllWP->GetValue();
1181 int item_count = m_pWptListCtrl->GetItemCount();
1183 if (item_count > 100) {
1185 ::wxBeginBusyCursor();
1189 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1190 wxLIST_STATE_DONTCARE);
1191 if (item == -1)
break;
1195 if (!pRP->IsSharedInVisibleRoute()) {
1196 pRP->SetVisible(viz);
1198 pRP->SetVisible(
true);
1200 m_pWptListCtrl->SetItemImage(item,
RoutePointGui(*pRP).GetIconImageIndex());
1201 NavObj_dB::GetInstance().UpdateDBRoutePointViz(pRP);
1204 if (busy) ::wxEndBusyCursor();
1206 top_frame::Get()->RefreshAllCanvas();
1209void RouteManagerDialog::OnShowAllTrkCBClicked(wxCommandEvent &event) {
1210 bool viz = m_cbShowAllTrk->GetValue();
1213 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1214 wxLIST_STATE_DONTCARE);
1215 if (item == -1)
break;
1217 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1219 track->SetVisible(viz);
1220 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
1221 m_pTrkListCtrl->SetItemImage(item, track->IsVisible() ? 0 : 1);
1224 top_frame::Get()->RefreshAllCanvas();
1227void RouteManagerDialog::OnShowAllLayCBClicked(wxCommandEvent &event) {
1228 bool viz = m_cbShowAllLay->GetValue();
1231 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1232 wxLIST_STATE_DONTCARE);
1233 if (item == -1)
break;
1235 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
1237 layer->SetVisibleOnChart(viz);
1238 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
1240 ToggleLayerContentsOnChart(layer);
1243 top_frame::Get()->RefreshAllCanvas();
1246void RouteManagerDialog::UpdateRouteListCtrl() {
1249 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1250 wxLIST_STATE_SELECTED);
1251 wxUIntPtr selected_id = wxUIntPtr(0);
1252 if (item != -1) selected_id = m_pRouteListCtrl->GetItemData(item);
1255 m_pRouteListCtrl->DeleteAllItems();
1258 RouteList::iterator it;
1261 bool bpartialViz =
false;
1263 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1264 if (!(*it)->IsListed())
continue;
1266 if (!(*it)->GetName().Upper().Contains(m_tFilterRte->GetValue().Upper())) {
1271 li.SetId(list_index);
1272 li.SetImage((*it)->IsVisible() ? 0 : 1);
1275 li.SetAlign(wxLIST_FORMAT_LEFT);
1277 if ((*it)->m_bRtIsActive) {
1278 wxFont font = *wxNORMAL_FONT;
1279 font.SetWeight(wxFONTWEIGHT_BOLD);
1283 long idx = m_pRouteListCtrl->InsertItem(li);
1285 wxString name = (*it)->m_RouteNameString;
1286 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
1287 m_pRouteListCtrl->SetItem(idx, rmROUTENAME, name);
1289 wxString startend = (*it)->m_RouteStartString;
1290 if (!(*it)->m_RouteEndString.IsEmpty())
1291 startend.append(_(
" - ") + (*it)->m_RouteEndString);
1292 m_pRouteListCtrl->SetItem(idx, rmROUTEDESC, startend);
1295 lic.SetId(list_index);
1297 lic.SetAlign(wxLIST_FORMAT_LEFT);
1298 m_pRouteListCtrl->SetItem(lic);
1301 lic.SetAlign(wxLIST_FORMAT_LEFT);
1302 m_pRouteListCtrl->SetItem(lic);
1305 if (!(*it)->IsVisible()) bpartialViz =
true;
1310 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1312 m_pRouteListCtrl->SetColumnWidth(0, 4 * m_charWidth);
1317 if (selected_id != wxUIntPtr(0)) {
1318 item = m_pRouteListCtrl->FindItem(-1, selected_id);
1319 m_pRouteListCtrl->SetItemState(
1320 item, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
1321 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
1324 if ((m_lastRteItem >= 0) && (m_pRouteListCtrl->GetItemCount()))
1325 m_pRouteListCtrl->EnsureVisible(m_lastRteItem);
1329 m_cbShowAllRte->SetValue(!bpartialViz);
1332void RouteManagerDialog::UpdateRteButtons() {
1334 long selected_index_index =
1335 m_pRouteListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1336 bool enable1 = m_pRouteListCtrl->GetSelectedItemCount() == 1;
1337 bool enablemultiple = m_pRouteListCtrl->GetSelectedItemCount() >= 1;
1339 m_lastRteItem = selected_index_index;
1341 btnRteDelete->Enable(m_pRouteListCtrl->GetSelectedItemCount() > 0);
1342 btnRteZoomto->Enable(enable1);
1343 btnRteProperties->Enable(enable1);
1344 btnRteReverse->Enable(enable1);
1345 btnRteExport->Enable(enablemultiple);
1346 btnRteResequence->Enable(enable1);
1347 btnRteSendToGPS->Enable(enable1);
1348 btnRteDeleteAll->Enable(m_pRouteListCtrl->GetItemCount() > 0);
1349 btnRteSendToPeer->Enable(enablemultiple);
1352 Route *route = NULL;
1354 route = (
Route *)m_pRouteListCtrl->GetItemData(selected_index_index);
1357 btnRteActivate->Enable(enable1);
1358 if (enable1) btnRteActivate->SetLabel(_(
"Activate"));
1363 btnRteActivate->Enable(enable1);
1364 btnRteActivate->SetLabel(_(
"Deactivate"));
1366 btnRteActivate->Enable(
false);
1368 btnRteActivate->Enable(
false);
1372void RouteManagerDialog::MakeAllRoutesInvisible() {
1373 RouteList::iterator it;
1375 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1376 if ((*it)->IsVisible()) {
1377 (*it)->SetVisible(
false);
1378 m_pRouteListCtrl->SetItemImage(m_pRouteListCtrl->FindItem(-1, index),
1380 NavObj_dB::GetInstance().UpdateRoute(*it);
1385void RouteManagerDialog::ZoomtoRoute(
Route *route) {
1387 LLBBox RBBox = route->GetBBox();
1388 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
1389 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
1395 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1396 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
1398 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1399 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
1401 if (top_frame::Get()->GetFocusCanvasSize() != wxSize(0, 0)) {
1402 wxSize size = top_frame::Get()->GetFocusCanvasSize();
1403 ww = size.GetWidth();
1404 wh = size.GetHeight();
1405 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
1406 ppm = wxMin(ppm, 1.0);
1408 top_frame::Get()->JumpToPosition(clat, clon, ppm);
1411 m_bNeedConfigFlush =
true;
1415void RouteManagerDialog::OnRteDeleteClick(wxCommandEvent &event) {
1416 int count = m_pRouteListCtrl->GetSelectedItemCount();
1417 bool confirmed = RouteGui::OnDelete(
this, count);
1419 if (confirmed && count > 0) {
1420 ::wxBeginBusyCursor();
1423 top_frame::Get()->CancelAllMouseRoute();
1424 m_bNeedConfigFlush =
true;
1428 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1429 wxLIST_STATE_SELECTED);
1430 if (item == -1)
break;
1432 Route *proute_to_delete = (
Route *)m_pRouteListCtrl->GetItemData(item);
1434 if (proute_to_delete) list.push_back(proute_to_delete);
1436 for (
Route *route : list) {
1438 NavObj_dB::GetInstance().DeleteRoute(route);
1444 UpdateRouteListCtrl();
1445 UpdateTrkListCtrl();
1447 top_frame::Get()->InvalidateAllCanvasUndo();
1448 top_frame::Get()->RefreshAllCanvas();
1449 ::wxEndBusyCursor();
1453void RouteManagerDialog::OnRteDeleteAllClick(wxCommandEvent &event) {
1455 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> routes?"),
1456 wxString(_(
"OpenCPN Alert")), wxYES_NO);
1458 if (dialog_ret == wxID_YES) {
1461 top_frame::Get()->CancelAllMouseRoute();
1466 UpdateRouteListCtrl();
1470 UpdateTrkListCtrl();
1473 top_frame::Get()->InvalidateAllCanvasUndo();
1474 top_frame::Get()->RefreshAllCanvas();
1476 m_bNeedConfigFlush =
true;
1480void RouteManagerDialog::OnRtePropertiesClick(wxCommandEvent &event) {
1483 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1484 wxLIST_STATE_SELECTED);
1485 if (item == -1)
return;
1487 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1499 m_bNeedConfigFlush =
true;
1502void RouteManagerDialog::OnRteZoomtoClick(wxCommandEvent &event) {
1505 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1506 wxLIST_STATE_SELECTED);
1507 if (item == -1)
return;
1510 if (m_bCtrlDown) MakeAllRoutesInvisible();
1512 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1517 if (!route->IsVisible()) {
1518 route->SetVisible(
true);
1519 m_pRouteListCtrl->SetItemImage(item, route->IsVisible() ? 0 : 1);
1520 NavObj_dB::GetInstance().UpdateRoute(route);
1526void RouteManagerDialog::OnRteReverseClick(wxCommandEvent &event) {
1529 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1530 wxLIST_STATE_SELECTED);
1531 if (item == -1)
return;
1533 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1538 int ask_return = OCPNMessageBox(
this,
g_pRouteMan->GetRouteReverseMessage(),
1539 _(
"Rename Waypoints?"), wxYES_NO | wxCANCEL);
1540 if (ask_return != wxID_CANCEL) {
1541 bool rename = (ask_return == wxID_YES);
1543 pSelect->DeleteAllSelectableRouteSegments(route);
1544 route->Reverse(rename);
1545 pSelect->AddAllSelectableRouteSegments(route);
1551 m_pRouteListCtrl->SetItem(item, 2, startend);
1553 NavObj_dB::GetInstance().UpdateRoute(route);
1555 top_frame::Get()->RefreshAllCanvas();
1558 m_bNeedConfigFlush =
true;
1561void RouteManagerDialog::OnRteExportClick(wxCommandEvent &event) {
1564 wxString suggested_name =
"routes";
1568 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1569 wxLIST_STATE_SELECTED);
1570 if (item == -1)
break;
1572 Route *proute_to_export = (
Route *)m_pRouteListCtrl->GetItemData(item);
1574 if (proute_to_export) {
1575 list.push_back(proute_to_export);
1581 ExportGPXRoutes(
this, &list, suggested_name);
1584void RouteManagerDialog::OnRteResequenceClick(wxCommandEvent &event) {
1586 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1587 wxLIST_STATE_SELECTED);
1588 if (item == -1)
return;
1590 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1594 route->RenameRoutePoints();
1597void RouteManagerDialog::OnRteSendToPeerClick(wxCommandEvent &event) {
1598 std::vector<Route *> list;
1601 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1602 wxLIST_STATE_SELECTED);
1603 if (item == -1)
break;
1605 Route *proute = (
Route *)m_pRouteListCtrl->GetItemData(item);
1608 list.push_back(proute);
1611 if (!list.empty()) {
1613 for (
auto r : list) {
1620 MdnsCache::GetInstance().
Validate();
1621 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1624 dlg.Create(NULL, -1, _(
"Send Route(s) to OpenCPN Peer") +
"...",
"");
1629void RouteManagerDialog::OnWptSendToPeerClick(wxCommandEvent &event) {
1630 std::vector<RoutePoint *> list;
1633 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1634 wxLIST_STATE_SELECTED);
1635 if (item == -1)
break;
1640 list.push_back(proutep);
1643 if (!list.empty()) {
1645 for (
auto r : list) {
1652 MdnsCache::GetInstance().
Validate();
1653 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1656 dlg.Create(NULL, -1, _(
"Send Waypoint(s) to OpenCPN Peer") +
"...",
"");
1661void RouteManagerDialog::OnTrkSendToPeerClick(wxCommandEvent &event) {
1662 std::vector<Track *> list;
1665 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1666 wxLIST_STATE_SELECTED);
1667 if (item == -1)
break;
1669 Track *ptrk = (
Track *)m_pTrkListCtrl->GetItemData(item);
1672 list.push_back(ptrk);
1675 if (!list.empty()) {
1677 for (
auto r : list) {
1684 MdnsCache::GetInstance().
Validate();
1685 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1688 dlg.Create(NULL, -1, _(
"Send Track(s) to OpenCPN Peer") +
"...",
"");
1693void RouteManagerDialog::OnRteActivateClick(wxCommandEvent &event) {
1696 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1697 wxLIST_STATE_SELECTED);
1698 if (item == -1)
return;
1700 if (m_bCtrlDown) MakeAllRoutesInvisible();
1702 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1707 if (!route->IsVisible()) {
1708 route->SetVisible(
true);
1709 m_pRouteListCtrl->SetItemImage(item, 0, 0);
1721 UpdateRouteListCtrl();
1723 NavObj_dB::GetInstance().UpdateRoute(route);
1725 top_frame::Get()->RefreshAllCanvas();
1730 m_bNeedConfigFlush =
true;
1733void RouteManagerDialog::OnRteToggleVisibility(wxMouseEvent &event) {
1734 wxPoint pos =
event.GetPosition();
1736 long clicked_index = m_pRouteListCtrl->HitTest(pos, flags);
1739 if (clicked_index > -1 &&
1740 event.GetX() < m_pRouteListCtrl->GetColumnWidth(rmVISIBLE)) {
1742 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1744 route->SetVisible(!route->IsVisible());
1746 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1748 ::wxBeginBusyCursor();
1750 NavObj_dB::GetInstance().UpdateRoute(route);
1752 top_frame::Get()->RefreshAllCanvas();
1756 if (
g_pRouteMan->DoesRouteContainSharedPoints(route))
1757 UpdateWptListCtrlViz();
1763 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1764 wxLIST_STATE_DONTCARE);
1765 if (item == -1)
break;
1767 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1769 if (!pR->IsVisible()) {
1774 m_cbShowAllRte->SetValue(viz);
1776 ::wxEndBusyCursor();
1783void RouteManagerDialog::OnRteBtnLeftDown(wxMouseEvent &event) {
1784 m_bCtrlDown =
event.ControlDown();
1788void RouteManagerDialog::OnRteSelected(wxListEvent &event) {
1789 long clicked_index =
event.m_itemIndex;
1791 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1793 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1795 top_frame::Get()->RefreshAllCanvas();
1800void RouteManagerDialog::OnRteColumnClicked(wxListEvent &event) {
1801 if (event.m_col == 1) {
1802 sort_route_name_dir++;
1804 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1805 }
else if (event.m_col == 2) {
1806 sort_route_to_dir++;
1807 m_pRouteListCtrl->SortItems(SortRoutesOnTo, (wxIntPtr)NULL);
1811void RouteManagerDialog::OnRteSendToGPSClick(wxCommandEvent &event) {
1813 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1814 wxLIST_STATE_SELECTED);
1815 if (item == -1)
return;
1817 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1822 pdlg->SetRoute(route);
1828 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
1831 HideWithEffect(wxSHOW_EFFECT_BLEND);
1837 ShowWithEffect(wxSHOW_EFFECT_BLEND);
1843void RouteManagerDialog::OnRteDefaultAction(wxListEvent &event) {
1845 OnRtePropertiesClick(evt);
1848void RouteManagerDialog::OnTrkDefaultAction(wxListEvent &event) {
1850 OnTrkPropertiesClick(evt);
1853void RouteManagerDialog::OnTrkRightClick(wxListEvent &event) {
1855 wxMenuItem *mergeItem = menu.Append(TRACK_MERGE, _(
"&Merge Selected Tracks"));
1856 mergeItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 1);
1857 wxMenuItem *cleanItem = menu.Append(TRACK_CLEAN, _(
"Reduce Data..."));
1858 cleanItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() == 1);
1859 wxMenuItem *copyItem = menu.Append(TRACK_COPY_TEXT, _(
"&Copy as text"));
1860 copyItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 0);
1864static bool CompareTracks(
Track *track1,
Track *track2) {
1870void RouteManagerDialog::OnTrkMenuSelected(wxCommandEvent &event) {
1873 switch (event.GetId()) {
1875 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1876 wxLIST_STATE_SELECTED);
1877 if (item == -1)
break;
1878 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1879 if (track->IsRunning()) {
1884 const wxString choices[] = {
"5.0",
"10.0",
"20.0",
"50.0",
"100.0"};
1886 wxSingleChoiceDialog precisionDlg(
this,
1887 _(
"Select the maximum error allowed "
1888 "(in meters)\nafter data reduction:"),
1889 _(
"Reduce Data Precision"), 5, choices);
1891 precisionDlg.ShowWindowModal();
1892 while (precisionDlg.IsShown()) {
1896 int result = precisionDlg.GetReturnCode();
1898 int result = precisionDlg.ShowModal();
1900 if (result == wxID_CANCEL)
break;
1901 double precision = 5.0;
1902 switch (precisionDlg.GetSelection()) {
1920 int pointsBefore = track->GetnPoints();
1922 int reduction = track->Simplify(precision);
1923 top_frame::Get()->Refresh(
false);
1925 reduction = 100 * reduction / pointsBefore;
1926 wxString msg = wxString::Format(
1927 _(
"The amount of data used by the track\n was reduced by %d%%."),
1929 OCPNMessageBox(
this, msg, _(
"OpenCPN info"), wxICON_INFORMATION | wxOK);
1931 UpdateTrkListCtrl();
1932 UpdateRouteListCtrl();
1937 case TRACK_COPY_TEXT: {
1940 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1941 wxLIST_STATE_SELECTED);
1942 if (item == -1)
break;
1943 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1944 csvString << track->GetName() <<
"\t"
1945 << wxString::Format(
"%.1f", track->Length()) <<
"\t"
1949 if (wxTheClipboard->Open()) {
1950 wxTextDataObject *data =
new wxTextDataObject;
1951 data->SetText(csvString);
1952 wxTheClipboard->SetData(data);
1953 wxTheClipboard->Close();
1960 Track *targetTrack = NULL;
1964 std::vector<Track *> mergeList;
1965 std::vector<Track *> deleteList;
1966 bool runningSkipped =
false;
1968 ::wxBeginBusyCursor();
1971 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1972 wxLIST_STATE_SELECTED);
1973 if (item == -1)
break;
1974 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1975 mergeList.push_back(track);
1978 if (!mergeList.size()) {
1979 ::wxEndBusyCursor();
1983 std::sort(mergeList.begin(), mergeList.end(), CompareTracks);
1985 targetTrack = mergeList[0];
1986 lastPoint = targetTrack->GetLastPoint();
1988 for (
auto const &mergeTrack : mergeList) {
1989 if (mergeTrack == *mergeList.begin())
continue;
1991 if (mergeTrack->IsRunning()) {
1992 runningSkipped =
true;
1996 for (
int i = 0; i < mergeTrack->GetnPoints(); i++) {
1997 tPoint = mergeTrack->GetPoint(i);
1998 newPoint =
new TrackPoint(tPoint->m_lat, tPoint->m_lon,
2001 targetTrack->AddPoint(newPoint);
2002 NavObj_dB::GetInstance().AddTrackPoint(targetTrack, newPoint);
2004 pSelect->AddSelectableTrackSegment(lastPoint->m_lat, lastPoint->m_lon,
2005 newPoint->m_lat, newPoint->m_lon,
2006 lastPoint, newPoint, targetTrack);
2007 lastPoint = newPoint;
2009 deleteList.push_back(mergeTrack);
2012 for (
auto const &deleteTrack : deleteList) {
2013 g_pAIS->DeletePersistentTrack(deleteTrack);
2014 NavObj_dB::GetInstance().DeleteTrack(deleteTrack);
2015 RoutemanGui(*g_pRouteMan).DeleteTrack(deleteTrack);
2021 ::wxEndBusyCursor();
2023 UpdateTrkListCtrl();
2024 UpdateRouteListCtrl();
2025 top_frame::Get()->RefreshAllCanvas();
2027 if (runningSkipped) {
2028 wxMessageDialog skipWarning(
2030 _(
"The currently running Track was not merged.\nYou can merge it "
2031 "later when it is completed."),
2032 "Warning", wxCANCEL | wxICON_WARNING);
2033 skipWarning.ShowModal();
2041void RouteManagerDialog::UpdateTrkListCtrl() {
2045 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2047 wxUIntPtr selected_id = wxUIntPtr(0);
2048 if (item != -1) selected_id = m_pTrkListCtrl->GetItemData(item);
2051 m_pTrkListCtrl->DeleteAllItems();
2054 std::vector<Track *>::iterator it;
2057 bool bpartialViz =
false;
2060 if (!trk->IsVisible()) bpartialViz =
true;
2062 if (!trk->IsListed())
continue;
2064 if (!trk->GetName(
true).Upper().Contains(
2065 m_tFilterTrk->GetValue().Upper())) {
2070 li.SetId(list_index);
2071 li.SetImage(trk->IsVisible() ? 0 : 1);
2076 wxFont font = *wxNORMAL_FONT;
2077 font.SetWeight(wxFONTWEIGHT_BOLD);
2080 long idx = m_pTrkListCtrl->InsertItem(li);
2082 m_pTrkListCtrl->SetItem(idx, colTRKNAME, trk->GetName(
true));
2085 m_pTrkListCtrl->SetItem(idx, colTRKDATE, trk->GetDateTime());
2088 len.Printf(
"%5.2f", trk->Length());
2089 m_pTrkListCtrl->SetItem(idx, colTRKLENGTH, len);
2092 lic.SetId(list_index);
2094 lic.SetAlign(wxLIST_FORMAT_LEFT);
2095 m_pTrkListCtrl->SetItem(lic);
2098 lic.SetAlign(wxLIST_FORMAT_LEFT);
2099 m_pTrkListCtrl->SetItem(lic);
2104 switch (sort_track_key) {
2105 case SORT_ON_DISTANCE:
2106 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2109 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2113 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2117 m_pTrkListCtrl->SetColumnWidth(0, 4 * m_charWidth);
2122 if (selected_id != wxUIntPtr(0)) {
2123 item = m_pTrkListCtrl->FindItem(-1, selected_id);
2124 m_pTrkListCtrl->SetItemState(item,
2125 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2126 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2129 if ((m_lastTrkItem >= 0) && (m_pTrkListCtrl->GetItemCount()))
2130 m_pTrkListCtrl->EnsureVisible(m_lastTrkItem);
2132 m_cbShowAllTrk->SetValue(!bpartialViz);
2136void RouteManagerDialog::OnTrkSelected(wxListEvent &event) {
2140void RouteManagerDialog::OnTrkColumnClicked(wxListEvent &event) {
2141 if (event.m_col == 1) {
2142 sort_track_key = SORT_ON_NAME;
2143 sort_track_name_dir++;
2144 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2145 }
else if (event.m_col == 2) {
2146 sort_track_key = SORT_ON_DISTANCE;
2147 sort_track_len_dir++;
2148 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2149 }
else if (event.m_col == 3) {
2150 sort_track_key = SORT_ON_DATE;
2151 sort_track_date_dir++;
2152 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2156void RouteManagerDialog::UpdateTrkButtons() {
2159 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2160 int items = m_pTrkListCtrl->GetSelectedItemCount();
2162 m_lastTrkItem = item;
2164 btnTrkProperties->Enable(items == 1);
2165 btnTrkDelete->Enable(items >= 1);
2166 btnTrkExport->Enable(items >= 1);
2167 btnTrkRouteFromTrack->Enable(items == 1);
2168 btnTrkDeleteAll->Enable(m_pTrkListCtrl->GetItemCount() > 0);
2169 btnTrkSendToPeer->Enable(items >= 1);
2172void RouteManagerDialog::OnTrkToggleVisibility(wxMouseEvent &event) {
2173 wxPoint pos =
event.GetPosition();
2175 long clicked_index = m_pTrkListCtrl->HitTest(pos, flags);
2178 if (clicked_index > -1 &&
2179 event.GetX() < m_pTrkListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2181 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(clicked_index);
2183 track->SetVisible(!track->IsVisible());
2184 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
2185 m_pTrkListCtrl->SetItemImage(clicked_index, track->IsVisible() ? 0 : 1);
2192 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2193 wxLIST_STATE_DONTCARE);
2194 if (item == -1)
break;
2196 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2198 if (!track->IsVisible()) {
2203 m_cbShowAllTrk->SetValue(viz);
2205 top_frame::Get()->RefreshAllCanvas();
2212void RouteManagerDialog::OnTrkNewClick(wxCommandEvent &event) {
2213 top_frame::Get()->TrackOff();
2214 top_frame::Get()->TrackOn();
2216 UpdateTrkListCtrl();
2219void RouteManagerDialog::OnTrkPropertiesClick(wxCommandEvent &event) {
2223 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2224 if (item == -1)
return;
2226 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2234 UpdateTrkListCtrl();
2236 m_bNeedConfigFlush =
true;
2239void RouteManagerDialog::OnTrkDeleteClick(wxCommandEvent &event) {
2240 std::vector<Track *> list;
2242 int answer = OCPNMessageBox(
2243 this, _(
"Are you sure you want to delete the selected object(s)"),
2244 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2245 if (answer != wxID_YES)
return;
2248 if (m_pTrkListCtrl->GetSelectedItemCount()) {
2249 ::wxBeginBusyCursor();
2256 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2257 wxLIST_STATE_SELECTED);
2258 if (item == -1)
break;
2260 Track *ptrack_to_delete = (
Track *)m_pTrkListCtrl->GetItemData(item);
2262 if (ptrack_to_delete) list.push_back(ptrack_to_delete);
2266 for (
unsigned int i = 0; i < list.size(); i++) {
2267 Track *track = list.at(i);
2269 g_pAIS->DeletePersistentTrack(track);
2270 NavObj_dB::GetInstance().DeleteTrack(track);
2277 UpdateTrkListCtrl();
2279 top_frame::Get()->InvalidateAllCanvasUndo();
2280 top_frame::Get()->RefreshAllCanvas();
2281 ::wxEndBusyCursor();
2285void RouteManagerDialog::OnTrkExportClick(wxCommandEvent &event) {
2286 std::vector<Track *> list;
2287 wxString suggested_name =
"tracks";
2291 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2292 wxLIST_STATE_SELECTED);
2293 if (item == -1)
break;
2295 Track *ptrack_to_export = (
Track *)m_pTrkListCtrl->GetItemData(item);
2297 if (ptrack_to_export) {
2298 list.push_back(ptrack_to_export);
2299 if (ptrack_to_export->GetName() !=
"")
2300 suggested_name = ptrack_to_export->GetName();
2304 ExportGPXTracks(
this, &list, suggested_name);
2307void RouteManagerDialog::TrackToRoute(
Track *track) {
2309 if (track->m_bIsInLayer)
return;
2311 wxGenericProgressDialog pprog(_(
"OpenCPN Converting Track to Route...."),
2312 _(
"Processing Waypoints..."), 101, NULL,
2313 wxPD_AUTO_HIDE | wxPD_SMOOTH |
2314 wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2315 wxPD_REMAINING_TIME);
2317 ::wxBeginBusyCursor();
2319 Route *route = track->RouteFromTrack(&pprog);
2323 pprog.Update(101, _(
"Done."));
2325 top_frame::Get()->RefreshAllCanvas();
2327 ::wxEndBusyCursor();
2330void RouteManagerDialog::OnTrkRouteFromTrackClick(wxCommandEvent &event) {
2333 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2334 if (item == -1)
return;
2336 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2338 TrackToRoute(track);
2340 UpdateRouteListCtrl();
2343void RouteManagerDialog::OnTrkDeleteAllClick(wxCommandEvent &event) {
2345 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> tracks?"),
2346 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2348 if (dialog_ret == wxID_YES) {
2355 UpdateTrkListCtrl();
2359 UpdateRouteListCtrl();
2363 top_frame::Get()->RefreshAllCanvas();
2365 m_bNeedConfigFlush =
true;
2368void RouteManagerDialog::UpdateWptListCtrl(
RoutePoint *rp_select,
2369 bool b_retain_sort) {
2370 wxIntPtr selected_id = wxUIntPtr(0);
2373 if (NULL == rp_select) {
2375 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2376 wxLIST_STATE_SELECTED);
2378 if (item != -1) selected_id = m_pWptListCtrl->GetItemData(item);
2382 m_pWptListCtrl->SetImageList(
2383 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
2384 wxIMAGE_LIST_SMALL);
2386 m_pWptListCtrl->DeleteAllItems();
2389 bool b_anyHidden =
false;
2391 auto node = pWayPointMan->GetWaypointList()->begin();
2393 while (node != pWayPointMan->GetWaypointList()->end()) {
2395 if (rp && rp->IsListed()) {
2401 if (!rp->GetName().Upper().Contains(m_tFilterWpt->GetValue().Upper())) {
2411 long idx = m_pWptListCtrl->InsertItem(li);
2413 wxString scamin = wxString::Format(
"%i", (
int)rp->GetScaMin());
2414 if (!rp->GetUseSca()) scamin = _(
"Always");
2415 if (g_bOverruleScaMin) scamin = _(
"Overruled");
2416 m_pWptListCtrl->SetItem(idx, colWPTSCALE, scamin);
2418 wxString name = rp->GetName();
2419 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2420 m_pWptListCtrl->SetItem(idx, colWPTNAME, name);
2423 DistanceBearingMercator(rp->m_lat, rp->m_lon,
gLat,
gLon, NULL, &dst);
2425 dist.Printf(
"%5.2f " + getUsrDistanceUnit(),
toUsrDistance(dst));
2426 m_pWptListCtrl->SetItem(idx, colWPTDIST, dist);
2428 if (rp == rp_select) selected_id = (wxIntPtr)rp_select;
2433 lic.SetAlign(wxLIST_FORMAT_LEFT);
2434 m_pWptListCtrl->SetItem(lic);
2437 lic.SetAlign(wxLIST_FORMAT_LEFT);
2438 m_pWptListCtrl->SetItem(lic);
2440 if (!rp->IsVisible()) b_anyHidden =
true;
2447 if (!b_retain_sort) {
2448 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2449 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2450 sort_wp_key = SORT_ON_NAME;
2452 switch (sort_wp_key) {
2454 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2455 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2457 case SORT_ON_DISTANCE:
2458 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2459 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2464 if (selected_id != wxUIntPtr(0)) {
2465 item = m_pWptListCtrl->FindItem(-1, selected_id);
2466 m_pWptListCtrl->SetItemState(item,
2467 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2468 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2471 if ((m_lastWptItem >= 0) && (m_pWptListCtrl->GetItemCount()))
2472 m_pWptListCtrl->EnsureVisible(m_lastWptItem);
2474 if (pWayPointMan->Getpmarkicon_image_list(m_listIconSize)->GetImageCount()) {
2475 int iwidth, iheight;
2476 pWayPointMan->Getpmarkicon_image_list(m_listIconSize)
2477 ->GetSize(0, iwidth, iheight);
2479 m_pWptListCtrl->SetColumnWidth(0, wxMax(iwidth + 4, 4 * m_charWidth));
2484 m_cbShowAllWP->SetValue(!b_anyHidden);
2487void RouteManagerDialog::UpdateWptListCtrlViz() {
2490 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2491 wxLIST_STATE_DONTCARE);
2492 if (item == -1)
break;
2497 m_pWptListCtrl->SetItemImage(item, imageIndex);
2501void RouteManagerDialog::OnWptDefaultAction(wxListEvent &event) {
2503 OnWptPropertiesClick(evt);
2506void RouteManagerDialog::OnWptSelected(wxListEvent &event) {
2510void RouteManagerDialog::OnWptColumnClicked(wxListEvent &event) {
2511 if (event.m_col == NAME_COLUMN) {
2513 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2514 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2515 sort_wp_key = SORT_ON_NAME;
2517 if (event.m_col == DISTANCE_COLUMN) {
2519 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2520 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2521 sort_wp_key = SORT_ON_DISTANCE;
2524 UpdateWptListCtrl();
2527void RouteManagerDialog::UpdateWptButtons() {
2530 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2531 bool enable1 = (m_pWptListCtrl->GetSelectedItemCount() == 1);
2532 bool enablemultiple = (m_pWptListCtrl->GetSelectedItemCount() >= 1);
2535 m_lastWptItem = item;
2541 bool b_delete_enable =
true;
2544 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2545 wxLIST_STATE_SELECTED);
2546 if (item == -1)
break;
2551 b_delete_enable =
false;
2556 btnWptProperties->Enable(enablemultiple);
2557 btnWptZoomto->Enable(enable1);
2558 btnWptDeleteAll->Enable(m_pWptListCtrl->GetItemCount() > 0);
2559 btnWptDelete->Enable(b_delete_enable && enablemultiple);
2560 btnWptGoTo->Enable(enable1);
2561 btnWptExport->Enable(enablemultiple);
2562 btnWptSendToGPS->Enable(enable1);
2563 btnWptSendToPeer->Enable(enablemultiple);
2566void RouteManagerDialog::OnWptToggleVisibility(wxMouseEvent &event) {
2567 wxPoint pos =
event.GetPosition();
2569 long clicked_index = m_pWptListCtrl->HitTest(pos, flags);
2572 if (clicked_index > -1 &&
2573 event.GetX() < m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2577 if (!wp->IsSharedInVisibleRoute()) {
2578 wp->SetVisible(!wp->IsVisible());
2579 m_pWptListCtrl->SetItemImage(clicked_index,
2582 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2589 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2590 wxLIST_STATE_DONTCARE);
2591 if (item == -1)
break;
2595 if (!wp->IsVisible()) {
2600 m_cbShowAllWP->SetValue(viz);
2602 top_frame::Get()->RefreshAllCanvas();
2604 if (clicked_index > -1 &&
2605 event.GetX() > m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) &&
2606 event.GetX() < (m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) +
2607 m_pWptListCtrl->GetColumnWidth(colWPTSCALE)) &&
2608 !g_bOverruleScaMin) {
2610 wp->SetUseSca(!wp->GetUseSca());
2611 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2612 top_frame::Get()->RefreshAllCanvas();
2613 wxString scamin = wxString::Format(
"%i", (
int)wp->GetScaMin());
2614 if (!wp->GetUseSca()) scamin = _(
"Always");
2615 m_pWptListCtrl->SetItem(clicked_index, colWPTSCALE, scamin);
2622void RouteManagerDialog::OnWptNewClick(wxCommandEvent &event) {
2626 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2628 top_frame::Get()->RefreshAllCanvas();
2634 WptShowPropertiesDialog(pWP, GetParent());
2637void RouteManagerDialog::OnWptPropertiesClick(wxCommandEvent &event) {
2638 long item = wxNOT_FOUND;
2640 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2641 if (item == wxNOT_FOUND)
return;
2643 auto pWP = (
RoutePoint *)m_pWptListCtrl->GetItemData(item);
2644 WptShowPropertiesDialog(pWP, GetParent());
2646 UpdateWptListCtrl();
2647 m_bNeedConfigFlush =
true;
2650void RouteManagerDialog::WptShowPropertiesDialog(
RoutePoint *pWP,
2659 wxString base_title = _(
"Waypoint Properties");
2662 wxString caption(wxString::Format(
"%s, %s: %s", base_title, _(
"Layer"),
2673void RouteManagerDialog::OnWptZoomtoClick(wxCommandEvent &event) {
2676 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2677 if (item == -1)
return;
2683 if (top_frame::Get()->GetFocusCanvasSize() != wxSize(0, 0)) {
2684 top_frame::Get()->JumpToPosition(wp->m_lat, wp->m_lon);
2688void RouteManagerDialog::OnWptDeleteClick(wxCommandEvent &event) {
2689 RoutePointList list;
2691 int answer = OCPNMessageBox(
2692 this, _(
"Are you sure you want to delete the selected object(s)"),
2693 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2694 if (answer != wxID_YES)
return;
2697 if (m_pWptListCtrl->GetSelectedItemCount()) {
2698 ::wxBeginBusyCursor();
2699 m_bNeedConfigFlush =
true;
2704 long item_last_selected = -1;
2706 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2707 wxLIST_STATE_SELECTED);
2708 if (item == -1)
break;
2710 item_last_selected = item;
2721 OCPNMessageBox(
this,
2722 _(
"The waypoint you want to delete is used in a "
2723 "route, do you really want to delete it?"),
2724 _(
"OpenCPN Alert"), wxYES_NO)) {
2725 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2726 pWayPointMan->DestroyWaypoint(wp);
2729 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2730 pWayPointMan->DestroyWaypoint(wp);
2736 m_pWptListCtrl->GetNextItem(item_last_selected);
2739 wp_next = (
RoutePoint *)m_pWptListCtrl->GetItemData(item_next);
2741 m_lastWptItem = item_next;
2743 UpdateRouteListCtrl();
2744 UpdateTrkListCtrl();
2745 UpdateWptListCtrl(wp_next,
true);
2751 top_frame::Get()->InvalidateAllCanvasUndo();
2752 top_frame::Get()->RefreshAllCanvas();
2753 ::wxEndBusyCursor();
2757void RouteManagerDialog::OnWptGoToClick(wxCommandEvent &event) {
2760 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2761 if (item == -1)
return;
2773 temp_route->AddPoint(pWP_src);
2774 temp_route->AddPoint(wp);
2776 pSelect->AddSelectableRouteSegment(
gLat,
gLon, wp->m_lat, wp->m_lon, pWP_src,
2779 wxString name = wp->GetName();
2780 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2781 wxString rteName = _(
"Go to ");
2782 rteName.Append(name);
2793 UpdateRouteListCtrl();
2796void RouteManagerDialog::OnWptExportClick(wxCommandEvent &event) {
2797 RoutePointList list;
2799 wxString suggested_name =
"waypoints";
2803 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2804 wxLIST_STATE_SELECTED);
2805 if (item == -1)
break;
2811 if (wp->GetName() !=
"") suggested_name = wp->GetName();
2815 ExportGPXWaypoints(
this, &list, suggested_name);
2818void RouteManagerDialog::OnWptSendToGPSClick(wxCommandEvent &event) {
2821 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2822 if (item == -1)
return;
2829 pdlg->SetWaypoint(wp);
2832 pdlg->Create(NULL, -1, _(
"Send to GPS") +
"...", source);
2835 HideWithEffect(wxSHOW_EFFECT_BLEND);
2839 ShowWithEffect(wxSHOW_EFFECT_BLEND);
2845void RouteManagerDialog::OnWptDeleteAllClick(wxCommandEvent &event) {
2848 if (!pWayPointMan->SharedWptsExist()) {
2849 prompt = _(
"Are you sure you want to delete <ALL> waypoints?");
2854 _(
"There are some waypoints used in routes or anchor alarms.\n Do you "
2855 "want to delete them as well?\n This will change the routes and "
2856 "disable the anchor alarms.\n Answering No keeps the waypoints used "
2857 "in routes or alarms.");
2858 buttons = wxYES_NO | wxCANCEL;
2862 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), buttons);
2863 if (answer == wxID_YES) pWayPointMan->DeleteAllWaypoints(
true);
2864 if (answer == wxID_NO && type == 2)
2865 pWayPointMan->DeleteAllWaypoints(
false);
2872 UpdateRouteListCtrl();
2873 UpdateWptListCtrl();
2874 top_frame::Get()->InvalidateAllCanvasUndo();
2875 top_frame::Get()->RefreshAllCanvas();
2878void RouteManagerDialog::OnLaySelected(wxListEvent &event) {
2882void RouteManagerDialog::OnLayColumnClicked(wxListEvent &event) {
2883 if (event.m_col == 1) {
2884 sort_layer_name_dir++;
2885 m_pLayListCtrl->SortItems(SortLayersOnName, (wxIntPtr)NULL);
2886 }
else if (event.m_col == 2) {
2887 sort_layer_len_dir++;
2888 m_pLayListCtrl->SortItems(SortLayersOnSize, (wxIntPtr)NULL);
2892void RouteManagerDialog::UpdateLayButtons() {
2895 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2896 bool enable = (item != -1);
2899 btnLayDelete->Enable(enable);
2900 cbLayToggleChart->Enable(enable);
2901 cbLayToggleListing->Enable(enable);
2902 cbLayToggleNames->Enable(enable);
2905 cbLayToggleChart->SetValue(
2906 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnChart());
2908 cbLayToggleNames->Set3StateValue(
2909 ((
Layer *)m_pLayListCtrl->GetItemData(item))->HasVisibleNames());
2911 cbLayToggleListing->SetValue(
2912 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnListing());
2915 cbLayToggleChart->SetValue(
true);
2916 cbLayToggleNames->Set3StateValue(wxCHK_UNDETERMINED);
2917 cbLayToggleListing->SetValue(
true);
2921void RouteManagerDialog::OnLayToggleVisibility(wxMouseEvent &event) {
2922 wxPoint pos =
event.GetPosition();
2924 long clicked_index = m_pLayListCtrl->HitTest(pos, flags);
2927 if (clicked_index > -1 &&
2928 event.GetX() < m_pLayListCtrl->GetColumnWidth(colLAYVISIBLE)) {
2930 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(clicked_index);
2932 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
2933 m_pLayListCtrl->SetItemImage(clicked_index,
2934 layer->IsVisibleOnChart() ? 0 : 1);
2940 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2941 wxLIST_STATE_DONTCARE);
2942 if (item == -1)
break;
2944 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
2946 if (!layer->IsVisibleOnChart()) {
2951 m_cbShowAllLay->SetValue(viz);
2953 ToggleLayerContentsOnChart(layer);
2960void RouteManagerDialog::UpdateLists() {
2961 UpdateRouteListCtrl();
2962 UpdateTrkListCtrl();
2963 UpdateWptListCtrl();
2964 UpdateLayListCtrl();
2967void RouteManagerDialog::OnLayNewClick(wxCommandEvent &event) {
2971void RouteManagerDialog::OnPerLayNewClick(wxCommandEvent &event) {
2975void RouteManagerDialog::AddNewLayer(
bool isPersistent) {
2976 bool show_flag = g_bShowLayers;
2977 g_bShowLayers =
true;
2979 UI_ImportGPX(
this,
true,
"",
true, isPersistent);
2981 g_bShowLayers = show_flag;
2983 top_frame::Get()->RefreshAllCanvas();
2986void RouteManagerDialog::OnLayPropertiesClick(wxCommandEvent &event) {
2990 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2991 if (item == -1)
return;
2994void RouteManagerDialog::OnLayDeleteClick(wxCommandEvent &event) {
2997 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2998 if (item == -1)
return;
3000 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3006 bool ispers =
false;
3007 wxString destf, f, name, ext;
3008 f = layer->m_LayerFileName;
3009 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3011 appendOSDirSlash(&destf);
3012 destf.Append(
"layers");
3013 appendOSDirSlash(&destf);
3014 destf << name <<
"." << ext;
3016 wxString prompt = _(
3017 "Are you sure you want to delete this layer and <ALL> of its contents?");
3018 if (wxFileExists(destf)) {
3019 prompt.Append(
"\n");
3021 _(
"The file will also be deleted from OpenCPN's layer directory."));
3022 prompt.Append(
"\n (" + destf +
")");
3026 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), wxYES_NO);
3027 if (answer == wxID_NO)
return;
3032 if (wxRemoveFile(destf))
3033 remMSG.sprintf(
"Layer file: %s is deleted", destf);
3035 remMSG.sprintf(
"Error deleting Layer file: %s", destf);
3037 wxLogMessage(remMSG);
3042 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3043 pRoute->m_bIsInLayer =
false;
3044 pRoute->m_LayerID = 0;
3050 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3051 pTrack->m_bIsInLayer =
false;
3052 pTrack->m_LayerID = 0;
3053 NavObj_dB::GetInstance().DeleteTrack(pTrack);
3059 std::vector<RoutePoint *> to_be_destroyed;
3060 auto node = pWayPointMan->GetWaypointList()->begin();
3061 while (node != pWayPointMan->GetWaypointList()->end()) {
3063 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3067 to_be_destroyed.push_back(rp);
3071 for (
auto rp : to_be_destroyed) pWayPointMan->DestroyWaypoint(rp, false);
3077 auto found = std::find(pLayerList->begin(), pLayerList->end(), layer);
3078 if (found != pLayerList->end()) pLayerList->erase(found);
3082 top_frame::Get()->RefreshAllCanvas();
3084 m_bNeedConfigFlush =
false;
3087void RouteManagerDialog::OnLayToggleChartClick(wxCommandEvent &event) {
3091 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3092 if (item == -1)
return;
3094 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3098 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
3099 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
3101 ToggleLayerContentsOnChart(layer);
3104void RouteManagerDialog::ToggleLayerContentsOnChart(
Layer *layer) {
3107 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3108 pRoute->SetVisible(layer->IsVisibleOnChart());
3113 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3114 pTrack->SetVisible(layer->IsVisibleOnChart());
3115 NavObj_dB::GetInstance().UpdateDBTrackAttributes(pTrack);
3120 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3121 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3122 rp->SetVisible(layer->IsVisibleOnChart());
3129 top_frame::Get()->RefreshAllCanvas();
3132void RouteManagerDialog::OnLayToggleNamesClick(wxCommandEvent &event) {
3136 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3137 if (item == -1)
return;
3139 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3143 layer->SetVisibleNames(cbLayToggleNames->Get3StateValue());
3145 ToggleLayerContentsNames(layer);
3148void RouteManagerDialog::ToggleLayerContentsNames(
Layer *layer) {
3151 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3152 for (
RoutePoint *prp1 : *pRoute->pRoutePointList) {
3153 if (layer->HasVisibleNames() == wxCHK_UNDETERMINED) {
3154 prp1->m_bShowName = prp1->m_bShowNameData;
3156 prp1->m_bShowName = (layer->HasVisibleNames() == wxCHK_CHECKED);
3163 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3164 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3165 rp->SetNameShown(layer->HasVisibleNames() == wxCHK_CHECKED ||
3167 layer->HasVisibleNames() == wxCHK_UNDETERMINED));
3173 top_frame::Get()->RefreshAllCanvas();
3176void RouteManagerDialog::OnLayToggleListingClick(wxCommandEvent &event) {
3180 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3181 if (item == -1)
return;
3183 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3187 layer->SetVisibleOnListing(!layer->IsVisibleOnListing());
3189 ToggleLayerContentsOnListing(layer);
3192void RouteManagerDialog::ToggleLayerContentsOnListing(
Layer *layer) {
3193 ::wxBeginBusyCursor();
3197 if (pRoute->m_bIsInLayer && (pRoute->m_LayerID == layer->m_LayerID)) {
3198 pRoute->SetListed(layer->IsVisibleOnListing());
3203 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID))
3204 pTrack->SetListed(layer->IsVisibleOnListing());
3210 for (
RoutePoint *rp : *pWayPointMan->GetWaypointList()) {
3212 rp->SetListed(layer->IsVisibleOnListing());
3218 ::wxEndBusyCursor();
3220 top_frame::Get()->RefreshAllCanvas();
3223void RouteManagerDialog::OnLayDefaultAction(wxListEvent &event) {
3225 OnLayPropertiesClick(evt);
3228void RouteManagerDialog::UpdateLayListCtrl() {
3232 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3234 wxUIntPtr selected_id = wxUIntPtr(0);
3235 if (item != -1) selected_id = m_pLayListCtrl->GetItemData(item);
3238 m_pLayListCtrl->DeleteAllItems();
3241 LayerList::iterator it;
3243 bool b_anyHidden =
false;
3244 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
3247 if (!lay->m_LayerName.Upper().Contains(m_tFilterLay->GetValue().Upper())) {
3253 li.SetImage(lay->IsVisibleOnChart() ? 0 : 1);
3257 long idx = m_pLayListCtrl->InsertItem(li);
3259 wxString name = lay->m_LayerName;
3260 if (name.IsEmpty()) {
3267 name = _(
"(Unnamed Layer)");
3269 m_pLayListCtrl->SetItem(idx, colLAYNAME, name);
3272 len.Printf(
"%d", (
int)lay->m_NoOfItems);
3273 m_pLayListCtrl->SetItem(idx, colLAYITEMS, len);
3274 m_pLayListCtrl->SetItem(idx, colLAYPERSIST, lay->m_LayerType);
3279 lic.SetAlign(wxLIST_FORMAT_LEFT);
3280 m_pLayListCtrl->SetItem(lic);
3283 lic.SetAlign(wxLIST_FORMAT_LEFT);
3284 m_pLayListCtrl->SetItem(lic);
3286 if (!lay->IsVisibleOnChart()) b_anyHidden =
true;
3289 m_pLayListCtrl->SortItems(SortLayersOnName,
3290 reinterpret_cast<wxIntPtr
>(m_pLayListCtrl));
3291 m_pLayListCtrl->SetColumnWidth(0, 4 * m_charWidth);
3296 if (selected_id != wxUIntPtr(0)) {
3297 item = m_pLayListCtrl->FindItem(-1, selected_id);
3298 m_pLayListCtrl->SetItemState(item,
3299 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
3300 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
3304 m_cbShowAllLay->SetValue(!b_anyHidden);
3307void RouteManagerDialog::OnImportClick(wxCommandEvent &event) {
3316 top_frame::Get()->RefreshAllCanvas();
3318void RouteManagerDialog::OnExportClick(wxCommandEvent &event) {
3323void RouteManagerDialog::OnBackupClick(wxCommandEvent &event) {
3324 int result = BackupDatabase(
this);
3325 if (result == wxID_YES) {
3326 OCPNMessageBox(NULL, _(
"Backup successful"), _(
"Backup result"),
3327 wxICON_INFORMATION | wxOK);
3328 }
else if (result == wxID_NO) {
3329 OCPNMessageBox(NULL, _(
"Backup Failed\nCheck the OpenCPN Logs"),
3330 _(
"Backup result"), wxICON_INFORMATION | wxOK);
3335void RouteManagerDialog::OnExportVizClick(wxCommandEvent &event) {
3336 ExportGPX(
this,
true,
true);
3339void RouteManagerDialog::OnFilterChanged(wxCommandEvent &event) {
3340 if (event.GetEventObject() == m_tFilterWpt) {
3341 UpdateWptListCtrl(NULL,
true);
3342 }
else if (event.GetEventObject() == m_tFilterRte) {
3343 UpdateRouteListCtrl();
3344 }
else if (event.GetEventObject() == m_tFilterTrk) {
3345 UpdateTrkListCtrl();
3346 }
else if (event.GetEventObject() == m_tFilterLay) {
3347 UpdateLayListCtrl();
AisDecoder * g_pAIS
Global instance.
Class AisDecoder and helpers.
General chart base definitions.
Generic Chart canvas base.
Represents a layer of chart objects in OpenCPN.
Dialog for displaying and editing waypoint properties.
void Validate()
Check that all entries are accessible, remove stale ones.
void Init(const KeyProvider &kp, const std::function< void(ObservedEvt &ev)> &action)
Initiate an object yet not listening.
Represents a waypoint or mark within the navigation system.
bool m_bIsolatedMark
Flag indicating if the waypoint is a standalone mark.
bool m_bShowNameData
Flag indicating if waypoint data should be shown with the name.
bool m_bIsInRoute
Flag indicating if this waypoint is part of a route.
bool m_bIsInLayer
Flag indicating if the waypoint belongs to a layer.
int m_LayerID
Layer identifier if the waypoint belongs to a layer.
Represents a navigational route in the navigation system.
wxString m_RouteStartString
Name or description of the route's starting point.
bool m_bRtIsActive
Flag indicating whether this route is currently active for navigation.
bool m_bDeleteOnArrival
Flag indicating whether the route should be deleted once navigation reaches the end.
wxString m_RouteEndString
Name or description of the route's ending point.
wxString m_RouteNameString
User-assigned name for the route.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
bool DeleteRoute(Route *pRoute)
bool ActivateRoute(Route *pRouteToActivate, RoutePoint *pStartPoint=NULL)
Activates a route for navigation.
Dialog for sending routes/waypoints to a GPS device.
Dialog for sending navigation objects to peer devices.
Represents a single point in a track.
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Represents a track, which is a series of connected track points.
Global variables stored in configuration file.
Misc GUI event vars, a singleton.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
wxFont GetOCPNGUIScaledFont(wxString item)
Retrieves a font optimized for touch and high-resolution interfaces.
MarkInfoDlg * g_pMarkInfoDialog
global instance
Waypoint properties maintenance dialog.
MySQL based storage for routes, tracks, etc.
double toUsrDistance(double nm_distance, int unit)
Convert a distance from nautical miles (NMi) to user display units.
Navigation Utility Functions without GUI dependencies.
double gLat
Vessel's current latitude in decimal degrees.
double gCog
Course over ground in degrees (0-359.99).
double gSog
Speed over ground in knots.
double gLon
Vessel's current longitude in decimal degrees.
Position, course, speed, etc.
Purpose: Track and Trackpoint drawing stuff.
RoutePropDlgImpl * pRoutePropDialog
Global instance.
Routeman * g_pRouteMan
Global instance.
RouteList * pRouteList
Global instance.
RouteManagerDialog * pRouteManagerDialog
Global instance.
Select * pSelect
Global instance.
Selected route, segment, waypoint, etc.
Send route/waypoint to GPS dialog.
Send Route/Waypoint/Track to peer dialog.
wxBitmap LoadSVG(const wxString filename, const unsigned int width, const unsigned int height, wxBitmap *default_bitmap, bool use_cache)
Load SVG file and return it's bitmap representation of requested size In case file can't be loaded an...
Abstract gFrame/MyFrame interface.
ActiveTrack * g_pActiveTrack
global instance
std::vector< Track * > g_TrackList
Global instance.
Recorded track abstraction.
TrackPropDlg * pTrackPropDialog
Global instance.