24#include "routemanagerdialog.h"
34#include <wx/filename.h>
35#include <wx/stdpaths.h>
36#include <wx/progdlg.h>
37#include <wx/clipbrd.h>
38#include <wx/statline.h>
45#include "model/config_vars.h"
46#include "model/georef.h"
50#include "model/navutil_base.h"
51#include "model/own_ship.h"
52#include "model/route.h"
53#include "model/routeman.h"
54#include "model/select.h"
55#include "model/track.h"
63#include "ocpn_frame.h"
64#include "OCPNPlatform.h"
65#include "routeman_gui.h"
66#include "route_point_gui.h"
67#include "RoutePropDlgImpl.h"
68#include "SendToGpsDlg.h"
69#include "SendToPeerDlg.h"
72#include "TrackPropDlg.h"
75#include "androidUTIL.h"
78#define DIALOG_MARGIN 10
80enum { rmVISIBLE = 0, rmROUTENAME, rmROUTEDESC };
81enum { colTRKVISIBLE = 0, colTRKNAME, colTRKLENGTH, colTRKDATE };
82enum { colLAYVISIBLE = 0, colLAYNAME, colLAYITEMS, colLAYPERSIST };
83enum { colWPTICON = 0, colWPTSCALE, colWPTNAME, colWPTDIST };
86extern RouteList *pRouteList;
87extern std::vector<Track *> g_TrackList;
88extern LayerList *pLayerList;
89extern wxString GetLayerName(
int id);
97extern bool g_bShowLayers;
98extern wxString g_default_wp_icon;
102void appendOSDirSlash(wxString *pString);
104static int SortRouteTrack(
const int order,
const wxString &it1,
105 const wxString &it2) {
106 if (order & 1)
return it2.CmpNoCase(it1);
108 return it1.CmpNoCase(it2);
112static int sort_route_name_dir;
113#if wxCHECK_VERSION(2, 9, 0)
114static int wxCALLBACK SortRoutesOnName(wxIntPtr item1, wxIntPtr item2,
117int wxCALLBACK SortRoutesOnName(
long item1,
long item2,
long list)
120 return SortRouteTrack(sort_route_name_dir, ((
Route *)item1)->GetName(),
121 ((
Route *)item2)->GetName());
125static int sort_route_to_dir;
126#if wxCHECK_VERSION(2, 9, 0)
127static int wxCALLBACK SortRoutesOnTo(wxIntPtr item1, wxIntPtr item2,
130int wxCALLBACK SortRoutesOnTo(
long item1,
long item2,
long list)
133 return SortRouteTrack(sort_route_to_dir, ((
Route *)item1)->GetTo(),
134 ((
Route *)item2)->GetTo());
138static int sort_track_name_dir;
139#if wxCHECK_VERSION(2, 9, 0)
140static int wxCALLBACK SortTracksOnName(wxIntPtr item1, wxIntPtr item2,
143int wxCALLBACK SortTracksOnName(
long item1,
long item2,
long list)
146 return SortRouteTrack(sort_track_name_dir, ((
Track *)item1)->GetName(),
147 ((
Track *)item2)->GetName());
150static int SortDouble(
const int order,
const double &it1,
const double &it2) {
162 if (l1 == l2)
return 0;
163 if (l2 < l1)
return 1;
168static int sort_track_len_dir;
169#if wxCHECK_VERSION(2, 9, 0)
170static int wxCALLBACK SortTracksOnDistance(wxIntPtr item1, wxIntPtr item2,
173int wxCALLBACK SortTracksOnDistance(
long item1,
long item2,
long list)
176 return SortDouble(sort_track_len_dir, ((
Track *)item1)->Length(),
177 ((
Track *)item2)->Length());
181static int sort_track_date_dir;
182#if wxCHECK_VERSION(2, 9, 0)
183static int wxCALLBACK SortTracksOnDate(wxIntPtr item1, wxIntPtr item2,
186int wxCALLBACK SortTracksOnDate(
long item1,
long item2,
long list)
190 return SortRouteTrack(sort_track_date_dir, ((
Track *)item1)->GetIsoDateTime(),
191 ((
Track *)item2)->GetIsoDateTime());
194static int sort_wp_key;
195static int sort_track_key;
198static int sort_wp_name_dir;
199#if wxCHECK_VERSION(2, 9, 0)
200static int wxCALLBACK SortWaypointsOnName(wxIntPtr item1, wxIntPtr item2,
203int wxCALLBACK SortWaypointsOnName(
long item1,
long item2,
long list)
211 if (sort_wp_name_dir & 1)
212 return pRP2->GetName().CmpNoCase(pRP1->GetName());
214 return pRP1->GetName().CmpNoCase(pRP2->GetName());
220static int sort_wp_len_dir;
221#if wxCHECK_VERSION(2, 9, 0)
222static int wxCALLBACK SortWaypointsOnDistance(wxIntPtr item1, wxIntPtr item2,
225int wxCALLBACK SortWaypointsOnDistance(
long item1,
long item2,
long list)
229 DistanceBearingMercator(((
RoutePoint *)item1)->m_lat,
230 ((
RoutePoint *)item1)->m_lon, gLat, gLon, NULL,
232 DistanceBearingMercator(((
RoutePoint *)item2)->m_lat,
233 ((
RoutePoint *)item2)->m_lon, gLat, gLon, NULL,
235 return SortDouble(sort_wp_len_dir, dst1, dst2);
239static int sort_layer_name_dir;
240#if wxCHECK_VERSION(2, 9, 0)
241static int wxCALLBACK SortLayersOnName(wxIntPtr item1, wxIntPtr item2,
244int wxCALLBACK SortLayersOnName(
long item1,
long item2,
long list)
247 return SortRouteTrack(sort_layer_name_dir, ((
Layer *)item1)->m_LayerName,
248 ((
Layer *)item2)->m_LayerName);
252static int sort_layer_len_dir;
253#if wxCHECK_VERSION(2, 9, 0)
254static int wxCALLBACK SortLayersOnSize(wxIntPtr item1, wxIntPtr item2,
257int wxCALLBACK SortLayersOnSize(
long item1,
long item2,
long list)
260 return SortDouble(sort_layer_len_dir, ((
Layer *)item1)->m_NoOfItems,
261 ((
Layer *)item2)->m_NoOfItems);
268EVT_NOTEBOOK_PAGE_CHANGED(
270 RouteManagerDialog::OnTabSwitch)
271EVT_CLOSE(RouteManagerDialog::OnClose)
272EVT_COMMAND(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, RouteManagerDialog::OnOK)
273EVT_CHAR_HOOK(RouteManagerDialog::OnKey)
277 if (ke.GetKeyCode() == WXK_ESCAPE)
283void RouteManagerDialog::OnTabSwitch(wxNotebookEvent &event) {
284 if (!m_pNotebook)
return;
285 int current_page = m_pNotebook->GetSelection();
286 if (current_page == 3) {
287 if (btnImport) btnImport->Enable(
false);
288 if (btnExport) btnExport->Enable(
false);
289 if (btnExportViz) btnExportViz->Enable(
false);
291 if (btnImport) btnImport->Enable(
true);
292 if (btnExport) btnExport->Enable(
true);
293 if (btnExportViz) btnExportViz->Enable(
true);
300bool RouteManagerDialog::instanceFlag =
false;
313RouteManagerDialog::RouteManagerDialog(wxWindow *parent) {
315 wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFRAME_FLOAT_ON_PARENT;
317 wxFrame::Create(parent, -1, wxString(_(
"Route & Mark Manager")),
318 wxDefaultPosition, wxDefaultSize, style);
326 sort_wp_key = SORT_ON_NAME;
327 sort_track_key = SORT_ON_NAME;
335 [&](wxCommandEvent) { UpdateRouteListCtrl(); });
338void RouteManagerDialog::Create() {
340 int char_width, char_height;
341 GetTextExtent(_T(
"W"), &char_width, &char_height);
342 m_charWidth = char_width;
344 wxBoxSizer *itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
345 SetSizer(itemBoxSizer1);
347 m_pNotebook =
new wxNotebook(
this, wxID_ANY, wxDefaultPosition,
348 wxSize(-1, -1), wxNB_TOP);
349 itemBoxSizer1->Add(m_pNotebook, 1, wxALL | wxEXPAND, 5);
352 m_pPanelRte =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
353 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
355 wxBoxSizer *sbsRoutes =
new wxBoxSizer(wxHORIZONTAL);
356 m_pPanelRte->SetSizer(sbsRoutes);
357 m_pNotebook->AddPage(m_pPanelRte, _(
"Routes"));
360 sort_wp_name_dir = 0;
361 sort_track_len_dir = 1;
362 sort_route_to_dir = 0;
363 sort_track_name_dir = 0;
364 sort_route_name_dir = 0;
365 sort_layer_name_dir = 0;
366 sort_layer_len_dir = 1;
368 m_listIconSize = 2 * GetCharHeight();
371 wxBoxSizer *bSizerRteContents;
372 bSizerRteContents =
new wxBoxSizer(wxVERTICAL);
374 wxFlexGridSizer *fgSizerFilterRte;
375 fgSizerFilterRte =
new wxFlexGridSizer(0, 2, 0, 0);
376 fgSizerFilterRte->AddGrowableCol(1);
377 fgSizerFilterRte->SetFlexibleDirection(wxBOTH);
378 fgSizerFilterRte->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
380 m_stFilterRte =
new wxStaticText(m_pPanelRte, wxID_ANY, _(
"Filter"),
381 wxDefaultPosition, wxDefaultSize, 0);
382 m_stFilterRte->Wrap(-1);
383 fgSizerFilterRte->Add(m_stFilterRte, 0, wxALL, 5);
385 m_tFilterRte =
new wxTextCtrl(m_pPanelRte, wxID_ANY, wxEmptyString,
386 wxDefaultPosition, wxDefaultSize, 0);
387 fgSizerFilterRte->Add(m_tFilterRte, 1, wxALL | wxEXPAND, 5);
389 bSizerRteContents->Add(fgSizerFilterRte, 0, wxEXPAND, 5);
390 m_tFilterRte->Connect(
391 wxEVT_COMMAND_TEXT_UPDATED,
392 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
394 m_cbShowAllRte =
new wxCheckBox(m_pPanelRte, wxID_ANY, _(
"Show all routes"));
395 bSizerRteContents->Add(m_cbShowAllRte, 0, wxEXPAND | wxLEFT, 5);
396 m_cbShowAllRte->Connect(
397 wxEVT_COMMAND_CHECKBOX_CLICKED,
398 wxCommandEventHandler(RouteManagerDialog::OnShowAllRteCBClicked), NULL,
402 new wxListCtrl(m_pPanelRte, -1, wxDefaultPosition, wxSize(-1, -1),
403 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
406 m_pRouteListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
409 m_pRouteListCtrl->Connect(
410 wxEVT_COMMAND_LIST_ITEM_SELECTED,
411 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
412 m_pRouteListCtrl->Connect(
413 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
414 wxListEventHandler(RouteManagerDialog::OnRteSelected), NULL,
this);
415 m_pRouteListCtrl->Connect(
416 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
417 wxListEventHandler(RouteManagerDialog::OnRteDefaultAction), NULL,
this);
418 m_pRouteListCtrl->Connect(
420 wxMouseEventHandler(RouteManagerDialog::OnRteToggleVisibility), NULL,
422 m_pRouteListCtrl->Connect(
423 wxEVT_COMMAND_LIST_COL_CLICK,
424 wxListEventHandler(RouteManagerDialog::OnRteColumnClicked), NULL,
this);
425 bSizerRteContents->Add(m_pRouteListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
426 sbsRoutes->Add(bSizerRteContents, 1, wxEXPAND, 5);
431 m_pRouteListCtrl->InsertColumn(rmVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
433 m_pRouteListCtrl->InsertColumn(rmROUTENAME, _(
"Route Name"),
434 wxLIST_FORMAT_LEFT, 15 * char_width);
435 m_pRouteListCtrl->InsertColumn(rmROUTEDESC, _(
"From <-> To"),
436 wxLIST_FORMAT_LEFT, 10 * char_width);
439 wxBoxSizer *bsRouteButtons =
new wxBoxSizer(wxVERTICAL);
440 sbsRoutes->Add(bsRouteButtons, 0, wxEXPAND);
442 wxScrolledWindow *winr =
new wxScrolledWindow(
443 m_pPanelRte, wxID_ANY, wxDefaultPosition, wxDefaultSize,
444 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
445 winr->SetScrollRate(0, 5);
447 bsRouteButtons->Add(winr, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
449 wxBoxSizer *bsRouteButtonsInner =
new wxBoxSizer(wxVERTICAL);
450 winr->SetSizer(bsRouteButtonsInner);
452 btnRteProperties =
new wxButton(winr, -1, _(
"&Properties") + _T(
"..."));
453 bsRouteButtonsInner->Add(btnRteProperties, 0, wxALL | wxEXPAND,
455 btnRteProperties->Connect(
456 wxEVT_COMMAND_BUTTON_CLICKED,
457 wxCommandEventHandler(RouteManagerDialog::OnRtePropertiesClick), NULL,
460 btnRteActivate =
new wxButton(winr, -1, _(
"&Activate"));
461 bsRouteButtonsInner->Add(btnRteActivate, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
462 btnRteActivate->Connect(
463 wxEVT_COMMAND_BUTTON_CLICKED,
464 wxCommandEventHandler(RouteManagerDialog::OnRteActivateClick), NULL,
466 btnRteActivate->Connect(
468 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
470 btnRteZoomto =
new wxButton(winr, -1, _(
"&Center View"));
471 bsRouteButtonsInner->Add(btnRteZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
472 btnRteZoomto->Connect(
473 wxEVT_COMMAND_BUTTON_CLICKED,
474 wxCommandEventHandler(RouteManagerDialog::OnRteZoomtoClick), NULL,
this);
475 btnRteZoomto->Connect(
477 wxMouseEventHandler(RouteManagerDialog::OnRteBtnLeftDown), NULL,
this);
479 btnRteReverse =
new wxButton(winr, -1, _(
"&Reverse"));
480 bsRouteButtonsInner->Add(btnRteReverse, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
481 btnRteReverse->Connect(
482 wxEVT_COMMAND_BUTTON_CLICKED,
483 wxCommandEventHandler(RouteManagerDialog::OnRteReverseClick), NULL,
this);
485 btnRteDelete =
new wxButton(winr, -1, _(
"&Delete"));
486 bsRouteButtonsInner->Add(btnRteDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
487 btnRteDelete->Connect(
488 wxEVT_COMMAND_BUTTON_CLICKED,
489 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteClick), NULL,
this);
491 wxString reseq_label(_(
"&Resequence Waypoints"));
492 wxString export_label(_(
"&Export selected..."));
493 wxString send_to_gps_label(_(
"&Send to GPS..."));
494 wxString send_to_peer_label(_(
"Send to &Peer..."));
497 reseq_label = wxString(_(
"Resequence"));
498 export_label = wxString(_(
"Export"));
499 send_to_gps_label = wxString(_(
"Send to GPS"));
500 send_to_peer_label = wxString(_(
"Send to Peer"));
503 btnRteExport =
new wxButton(winr, -1, export_label);
504 bsRouteButtonsInner->Add(btnRteExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
505 btnRteExport->Connect(
506 wxEVT_COMMAND_BUTTON_CLICKED,
507 wxCommandEventHandler(RouteManagerDialog::OnRteExportClick), NULL,
this);
509 btnRteResequence =
new wxButton(winr, -1, reseq_label);
510 bsRouteButtonsInner->Add(btnRteResequence, 0, wxALL | wxEXPAND,
512 btnRteResequence->Connect(
513 wxEVT_COMMAND_BUTTON_CLICKED,
514 wxCommandEventHandler(RouteManagerDialog::OnRteResequenceClick), NULL,
517 btnRteSendToPeer =
new wxButton(winr, -1, send_to_peer_label);
518 bsRouteButtonsInner->Add(btnRteSendToPeer, 0, wxALL | wxEXPAND,
520 btnRteSendToPeer->Connect(
521 wxEVT_COMMAND_BUTTON_CLICKED,
522 wxCommandEventHandler(RouteManagerDialog::OnRteSendToPeerClick), NULL,
525 btnRteSendToGPS =
new wxButton(winr, -1, send_to_gps_label);
526 bsRouteButtonsInner->Add(btnRteSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
527 btnRteSendToGPS->Connect(
528 wxEVT_COMMAND_BUTTON_CLICKED,
529 wxCommandEventHandler(RouteManagerDialog::OnRteSendToGPSClick), NULL,
532 bsRouteButtonsInner->AddSpacer(10);
534 btnRteDeleteAll =
new wxButton(winr, -1, _(
"&Delete All"));
535 bsRouteButtonsInner->Add(btnRteDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
536 btnRteDeleteAll->Connect(
537 wxEVT_COMMAND_BUTTON_CLICKED,
538 wxCommandEventHandler(RouteManagerDialog::OnRteDeleteAllClick), NULL,
542 m_pPanelTrk =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
543 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
544 wxBoxSizer *sbsTracks =
new wxBoxSizer(wxHORIZONTAL);
545 m_pPanelTrk->SetSizer(sbsTracks);
546 m_pNotebook->AddPage(m_pPanelTrk, _(
"Tracks"));
548 wxBoxSizer *bSizerTrkContents;
549 bSizerTrkContents =
new wxBoxSizer(wxVERTICAL);
551 wxFlexGridSizer *fgSizerFilterTrk;
552 fgSizerFilterTrk =
new wxFlexGridSizer(0, 2, 0, 0);
553 fgSizerFilterTrk->AddGrowableCol(1);
554 fgSizerFilterTrk->SetFlexibleDirection(wxBOTH);
555 fgSizerFilterTrk->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
557 m_stFilterTrk =
new wxStaticText(m_pPanelTrk, wxID_ANY, _(
"Filter"),
558 wxDefaultPosition, wxDefaultSize, 0);
559 m_stFilterTrk->Wrap(-1);
560 fgSizerFilterTrk->Add(m_stFilterTrk, 0, wxALL, 5);
562 m_tFilterTrk =
new wxTextCtrl(m_pPanelTrk, wxID_ANY, wxEmptyString,
563 wxDefaultPosition, wxDefaultSize, 0);
564 fgSizerFilterTrk->Add(m_tFilterTrk, 1, wxALL | wxEXPAND, 5);
566 bSizerTrkContents->Add(fgSizerFilterTrk, 0, wxEXPAND, 5);
567 m_tFilterTrk->Connect(
568 wxEVT_COMMAND_TEXT_UPDATED,
569 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
571 m_cbShowAllTrk =
new wxCheckBox(m_pPanelTrk, wxID_ANY, _(
"Show all tracks"));
572 bSizerTrkContents->Add(m_cbShowAllTrk, 0, wxEXPAND | wxLEFT, 5);
573 m_cbShowAllTrk->Connect(
574 wxEVT_COMMAND_CHECKBOX_CLICKED,
575 wxCommandEventHandler(RouteManagerDialog::OnShowAllTrkCBClicked), NULL,
579 new wxListCtrl(m_pPanelTrk, -1, wxDefaultPosition, wxDefaultSize,
580 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
584 m_pTrkListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
587 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
588 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
590 m_pTrkListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
591 wxListEventHandler(RouteManagerDialog::OnTrkSelected),
593 m_pTrkListCtrl->Connect(
594 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
595 wxListEventHandler(RouteManagerDialog::OnTrkDefaultAction), NULL,
this);
596 m_pTrkListCtrl->Connect(
598 wxMouseEventHandler(RouteManagerDialog::OnTrkToggleVisibility), NULL,
600 m_pTrkListCtrl->Connect(
601 wxEVT_COMMAND_LIST_COL_CLICK,
602 wxListEventHandler(RouteManagerDialog::OnTrkColumnClicked), NULL,
this);
603 m_pTrkListCtrl->Connect(
604 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
605 wxListEventHandler(RouteManagerDialog::OnTrkRightClick), NULL,
this);
606 this->Connect(wxEVT_COMMAND_MENU_SELECTED,
607 wxCommandEventHandler(RouteManagerDialog::OnTrkMenuSelected),
610 bSizerTrkContents->Add(m_pTrkListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
611 sbsTracks->Add(bSizerTrkContents, 1, wxEXPAND, 5);
613 m_pTrkListCtrl->InsertColumn(colTRKVISIBLE, _(
"Show"), wxLIST_FORMAT_LEFT,
615 m_pTrkListCtrl->InsertColumn(colTRKNAME, _(
"Track Name"), wxLIST_FORMAT_LEFT,
617 m_pTrkListCtrl->InsertColumn(colTRKDATE, _(
"Start Date"), wxLIST_FORMAT_LEFT,
619 m_pTrkListCtrl->InsertColumn(colTRKLENGTH, _(
"Length"), wxLIST_FORMAT_LEFT,
622 wxBoxSizer *bsTrkButtons =
new wxBoxSizer(wxVERTICAL);
623 sbsTracks->Add(bsTrkButtons, 0, wxEXPAND);
625 wxScrolledWindow *wint =
new wxScrolledWindow(
626 m_pPanelTrk, wxID_ANY, wxDefaultPosition, wxDefaultSize,
627 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
628 wint->SetScrollRate(0, 5);
630 bsTrkButtons->Add(wint, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
632 wxBoxSizer *bsTrkButtonsInner =
new wxBoxSizer(wxVERTICAL);
633 wint->SetSizer(bsTrkButtonsInner);
635 btnTrkNew =
new wxButton(wint, -1, _(
"&Start Track"));
636 bsTrkButtonsInner->Add(btnTrkNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
637 btnTrkNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
638 wxCommandEventHandler(RouteManagerDialog::OnTrkNewClick),
641 btnTrkProperties =
new wxButton(wint, -1, _(
"&Properties"));
642 bsTrkButtonsInner->Add(btnTrkProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
643 btnTrkProperties->Connect(
644 wxEVT_COMMAND_BUTTON_CLICKED,
645 wxCommandEventHandler(RouteManagerDialog::OnTrkPropertiesClick), NULL,
648 btnTrkDelete =
new wxButton(wint, -1, _(
"&Delete"));
649 bsTrkButtonsInner->Add(btnTrkDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
650 btnTrkDelete->Connect(
651 wxEVT_COMMAND_BUTTON_CLICKED,
652 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteClick), NULL,
this);
654 btnTrkExport =
new wxButton(wint, -1, _(
"&Export selected..."));
655 bsTrkButtonsInner->Add(btnTrkExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
656 btnTrkExport->Connect(
657 wxEVT_COMMAND_BUTTON_CLICKED,
658 wxCommandEventHandler(RouteManagerDialog::OnTrkExportClick), NULL,
this);
660 btnTrkRouteFromTrack =
new wxButton(wint, -1, _(
"Route from Track"));
661 bsTrkButtonsInner->Add(btnTrkRouteFromTrack, 0, wxALL | wxEXPAND,
663 btnTrkRouteFromTrack->Connect(
664 wxEVT_COMMAND_BUTTON_CLICKED,
665 wxCommandEventHandler(RouteManagerDialog::OnTrkRouteFromTrackClick), NULL,
668 btnTrkSendToPeer =
new wxButton(wint, -1, _(
"Send to &Peer"));
669 bsTrkButtonsInner->Add(btnTrkSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
670 btnTrkSendToPeer->Connect(
671 wxEVT_COMMAND_BUTTON_CLICKED,
672 wxCommandEventHandler(RouteManagerDialog::OnTrkSendToPeerClick), NULL,
675 bsTrkButtonsInner->AddSpacer(10);
677 btnTrkDeleteAll =
new wxButton(wint, -1, _(
"&Delete All"));
678 bsTrkButtonsInner->Add(btnTrkDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
679 btnTrkDeleteAll->Connect(
680 wxEVT_COMMAND_BUTTON_CLICKED,
681 wxCommandEventHandler(RouteManagerDialog::OnTrkDeleteAllClick), NULL,
685 m_pPanelWpt =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
686 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
687 wxBoxSizer *sbsWpts =
new wxBoxSizer(wxHORIZONTAL);
688 m_pPanelWpt->SetSizer(sbsWpts);
689 m_pNotebook->AddPage(m_pPanelWpt, _(
"Marks"));
691 wxBoxSizer *bSizerWptContents;
692 bSizerWptContents =
new wxBoxSizer(wxVERTICAL);
694 wxFlexGridSizer *fgSizerFilterWpt;
695 fgSizerFilterWpt =
new wxFlexGridSizer(0, 2, 0, 0);
696 fgSizerFilterWpt->AddGrowableCol(1);
697 fgSizerFilterWpt->SetFlexibleDirection(wxBOTH);
698 fgSizerFilterWpt->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
700 m_stFilterWpt =
new wxStaticText(m_pPanelWpt, wxID_ANY, _(
"Filter"),
701 wxDefaultPosition, wxDefaultSize, 0);
702 m_stFilterWpt->Wrap(-1);
703 fgSizerFilterWpt->Add(m_stFilterWpt, 0, wxALL, 5);
705 m_tFilterWpt =
new wxTextCtrl(m_pPanelWpt, wxID_ANY, wxEmptyString,
706 wxDefaultPosition, wxDefaultSize, 0);
707 fgSizerFilterWpt->Add(m_tFilterWpt, 1, wxALL | wxEXPAND, 5);
709 bSizerWptContents->Add(fgSizerFilterWpt, 0, wxEXPAND, 5);
710 m_tFilterWpt->Connect(
711 wxEVT_COMMAND_TEXT_UPDATED,
712 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
714 m_cbShowAllWP =
new wxCheckBox(m_pPanelWpt, wxID_ANY, _(
"Show all marks"));
715 bSizerWptContents->Add(m_cbShowAllWP, 0, wxEXPAND | wxLEFT, 5);
716 m_cbShowAllWP->Connect(
717 wxEVT_COMMAND_CHECKBOX_CLICKED,
718 wxCommandEventHandler(RouteManagerDialog::OnShowAllWpCBClicked), NULL,
722 new wxListCtrl(m_pPanelWpt, -1, wxDefaultPosition, wxDefaultSize,
723 wxLC_REPORT | wxLC_SORT_ASCENDING | wxLC_HRULES |
726 m_pWptListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
729 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
730 wxListEventHandler(RouteManagerDialog::OnWptSelected),
732 m_pWptListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
733 wxListEventHandler(RouteManagerDialog::OnWptSelected),
735 m_pWptListCtrl->Connect(
736 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
737 wxListEventHandler(RouteManagerDialog::OnWptDefaultAction), NULL,
this);
738 m_pWptListCtrl->Connect(
740 wxMouseEventHandler(RouteManagerDialog::OnWptToggleVisibility), NULL,
742 m_pWptListCtrl->Connect(
743 wxEVT_COMMAND_LIST_COL_CLICK,
744 wxListEventHandler(RouteManagerDialog::OnWptColumnClicked), NULL,
this);
745 bSizerWptContents->Add(m_pWptListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
746 sbsWpts->Add(bSizerWptContents, 1, wxEXPAND, 5);
748 m_pWptListCtrl->InsertColumn(colWPTICON, _(
"Icon"), wxLIST_FORMAT_LEFT,
750 m_pWptListCtrl->InsertColumn(colWPTSCALE, _(
"Scale"), wxLIST_FORMAT_LEFT,
752 m_pWptListCtrl->InsertColumn(colWPTNAME, _(
"Mark Name"), wxLIST_FORMAT_LEFT,
754 m_pWptListCtrl->InsertColumn(colWPTDIST, _(
"Distance from own ship"),
755 wxLIST_FORMAT_LEFT, 14 * char_width);
757 wxBoxSizer *bsWptButtons =
new wxBoxSizer(wxVERTICAL);
758 sbsWpts->Add(bsWptButtons, 0, wxEXPAND);
760 wxScrolledWindow *winw =
new wxScrolledWindow(
761 m_pPanelWpt, wxID_ANY, wxDefaultPosition, wxDefaultSize,
762 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
763 winw->SetScrollRate(0, 5);
765 bsWptButtons->Add(winw, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
767 wxBoxSizer *bsWptButtonsInner =
new wxBoxSizer(wxVERTICAL);
768 winw->SetSizer(bsWptButtonsInner);
770 btnWptNew =
new wxButton(winw, -1, _(
"&New"));
771 bsWptButtonsInner->Add(btnWptNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
772 btnWptNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
773 wxCommandEventHandler(RouteManagerDialog::OnWptNewClick),
776 btnWptProperties =
new wxButton(winw, -1, _(
"&Properties"));
777 bsWptButtonsInner->Add(btnWptProperties, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
778 btnWptProperties->Connect(
779 wxEVT_COMMAND_BUTTON_CLICKED,
780 wxCommandEventHandler(RouteManagerDialog::OnWptPropertiesClick), NULL,
783 btnWptZoomto =
new wxButton(winw, -1, _(
"&Center View"));
784 bsWptButtonsInner->Add(btnWptZoomto, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
785 btnWptZoomto->Connect(
786 wxEVT_COMMAND_BUTTON_CLICKED,
787 wxCommandEventHandler(RouteManagerDialog::OnWptZoomtoClick), NULL,
this);
789 btnWptDelete =
new wxButton(winw, -1, _(
"&Delete"));
790 bsWptButtonsInner->Add(btnWptDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
791 btnWptDelete->Connect(
792 wxEVT_COMMAND_BUTTON_CLICKED,
793 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteClick), NULL,
this);
795 btnWptGoTo =
new wxButton(winw, -1, _(
"&Go To"));
796 bsWptButtonsInner->Add(btnWptGoTo, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
797 btnWptGoTo->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
798 wxCommandEventHandler(RouteManagerDialog::OnWptGoToClick),
801 btnWptExport =
new wxButton(winw, -1, _(
"&Export selected..."));
802 bsWptButtonsInner->Add(btnWptExport, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
803 btnWptExport->Connect(
804 wxEVT_COMMAND_BUTTON_CLICKED,
805 wxCommandEventHandler(RouteManagerDialog::OnWptExportClick), NULL,
this);
807 btnWptSendToGPS =
new wxButton(winw, -1, _(
"&Send to GPS"));
808 bsWptButtonsInner->Add(btnWptSendToGPS, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
809 btnWptSendToGPS->Connect(
810 wxEVT_COMMAND_BUTTON_CLICKED,
811 wxCommandEventHandler(RouteManagerDialog::OnWptSendToGPSClick), NULL,
814 btnWptSendToPeer =
new wxButton(winw, -1, _(
"Send to &Peer"));
815 bsWptButtonsInner->Add(btnWptSendToPeer, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
816 btnWptSendToPeer->Connect(
817 wxEVT_COMMAND_BUTTON_CLICKED,
818 wxCommandEventHandler(RouteManagerDialog::OnWptSendToPeerClick), NULL,
821 bsWptButtonsInner->AddSpacer(10);
823 btnWptDeleteAll =
new wxButton(winw, -1, _(
"Delete All"));
824 bsWptButtonsInner->Add(btnWptDeleteAll, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
825 btnWptDeleteAll->Connect(
826 wxEVT_COMMAND_BUTTON_CLICKED,
827 wxCommandEventHandler(RouteManagerDialog::OnWptDeleteAllClick), NULL,
830 wxBoxSizer *itemBoxSizer5 =
new wxBoxSizer(wxHORIZONTAL);
831 itemBoxSizer1->Add(itemBoxSizer5, 0, wxALL | wxEXPAND);
833 wxBoxSizer *itemBoxSizer6 =
new wxBoxSizer(wxHORIZONTAL);
834 itemBoxSizer5->Add(itemBoxSizer6, 1, wxALL | wxEXPAND);
836 btnImport =
new wxButton(
this, -1, _(
"I&mport GPX..."));
837 itemBoxSizer6->Add(btnImport, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
838 btnImport->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
839 wxCommandEventHandler(RouteManagerDialog::OnImportClick),
848 btnExportViz =
new wxButton(
this, -1, _(
"Export All Visible..."));
849 itemBoxSizer6->Add(btnExportViz, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
850 btnExportViz->Connect(
851 wxEVT_COMMAND_BUTTON_CLICKED,
852 wxCommandEventHandler(RouteManagerDialog::OnExportVizClick), NULL,
this);
854 btnBackup =
new wxButton(
this, -1, _(
"Backup..."));
855 itemBoxSizer6->Add(btnBackup, 0, wxALL | wxALIGN_LEFT, DIALOG_MARGIN);
856 btnBackup->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
857 wxCommandEventHandler(RouteManagerDialog::OnBackupClick),
860 wxSize sz = ::wxGetDisplaySize();
862 itemBoxSizer6->Add(0, 0, 1, wxEXPAND, 5);
863 itemBoxSizer6->Add(
new wxButton(
this, wxID_OK), 0, wxALL, DIALOG_MARGIN);
865 wxStaticLine *staticLine121 =
new wxStaticLine(
866 this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
867 itemBoxSizer1->Add(staticLine121, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
869 wxBoxSizer *itemBoxSizer7 =
new wxBoxSizer(wxHORIZONTAL);
870 itemBoxSizer1->Add(itemBoxSizer7, 0, wxEXPAND);
872 wxBoxSizer *itemBoxSizer7a =
new wxBoxSizer(wxHORIZONTAL);
873 itemBoxSizer7->Add(itemBoxSizer7a, 1, wxEXPAND);
875 itemBoxSizer7a->AddStretchSpacer();
876 itemBoxSizer7a->Add(
new wxButton(
this, wxID_OK), 0, wxRIGHT | wxALIGN_RIGHT,
881 m_pPanelLay =
new wxPanel(m_pNotebook, wxID_ANY, wxDefaultPosition,
882 wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL);
883 wxBoxSizer *sbsLayers =
new wxBoxSizer(wxHORIZONTAL);
884 m_pPanelLay->SetSizer(sbsLayers);
885 m_pNotebook->AddPage(m_pPanelLay, _(
"Layers"));
887 wxBoxSizer *bSizerLayContents;
888 bSizerLayContents =
new wxBoxSizer(wxVERTICAL);
890 wxFlexGridSizer *fgSizerFilterLay;
891 fgSizerFilterLay =
new wxFlexGridSizer(0, 2, 0, 0);
892 fgSizerFilterLay->AddGrowableCol(1);
893 fgSizerFilterLay->SetFlexibleDirection(wxBOTH);
894 fgSizerFilterLay->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
896 m_stFilterLay =
new wxStaticText(m_pPanelLay, wxID_ANY, _(
"Filter"),
897 wxDefaultPosition, wxDefaultSize, 0);
898 m_stFilterLay->Wrap(-1);
899 fgSizerFilterLay->Add(m_stFilterLay, 0, wxALL, 5);
901 m_tFilterLay =
new wxTextCtrl(m_pPanelLay, wxID_ANY, wxEmptyString,
902 wxDefaultPosition, wxDefaultSize, 0);
903 fgSizerFilterLay->Add(m_tFilterLay, 1, wxALL | wxEXPAND, 5);
905 bSizerLayContents->Add(fgSizerFilterLay, 0, wxEXPAND, 5);
906 m_tFilterLay->Connect(
907 wxEVT_COMMAND_TEXT_UPDATED,
908 wxCommandEventHandler(RouteManagerDialog::OnFilterChanged), NULL,
this);
910 m_cbShowAllLay =
new wxCheckBox(m_pPanelLay, wxID_ANY, _(
"Show all layers"));
911 bSizerLayContents->Add(m_cbShowAllLay, 0, wxEXPAND | wxLEFT, 5);
912 m_cbShowAllLay->Connect(
913 wxEVT_COMMAND_CHECKBOX_CLICKED,
914 wxCommandEventHandler(RouteManagerDialog::OnShowAllLayCBClicked), NULL,
918 new wxListCtrl(m_pPanelLay, -1, wxDefaultPosition, wxDefaultSize,
919 wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING |
920 wxLC_HRULES | wxBORDER_SUNKEN );
922 m_pLayListCtrl->GetHandle()->setStyleSheet(getAdjustedDialogStyleSheet());
925 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
926 wxListEventHandler(RouteManagerDialog::OnLaySelected),
928 m_pLayListCtrl->Connect(wxEVT_COMMAND_LIST_ITEM_DESELECTED,
929 wxListEventHandler(RouteManagerDialog::OnLaySelected),
931 m_pLayListCtrl->Connect(
932 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
933 wxListEventHandler(RouteManagerDialog::OnLayDefaultAction), NULL,
this);
934 m_pLayListCtrl->Connect(
936 wxMouseEventHandler(RouteManagerDialog::OnLayToggleVisibility), NULL,
938 m_pLayListCtrl->Connect(
939 wxEVT_COMMAND_LIST_COL_CLICK,
940 wxListEventHandler(RouteManagerDialog::OnLayColumnClicked), NULL,
this);
941 bSizerLayContents->Add(m_pLayListCtrl, 1, wxEXPAND | wxALL, DIALOG_MARGIN);
942 sbsLayers->Add(bSizerLayContents, 1, wxEXPAND, 5);
944 m_pLayListCtrl->InsertColumn(colLAYVISIBLE, _T(
""), wxLIST_FORMAT_LEFT,
946 m_pLayListCtrl->InsertColumn(colLAYNAME, _(
"Layer Name"), wxLIST_FORMAT_LEFT,
948 m_pLayListCtrl->InsertColumn(colLAYITEMS, _(
"No. of items"),
949 wxLIST_FORMAT_LEFT, 10 * char_width);
950 m_pLayListCtrl->InsertColumn(colLAYPERSIST, _(
"Layer type"),
951 wxLIST_FORMAT_LEFT, 10 * char_width);
953 wxBoxSizer *bsLayButtons =
new wxBoxSizer(wxVERTICAL);
954 sbsLayers->Add(bsLayButtons, 0, wxEXPAND);
956 wxScrolledWindow *winl =
new wxScrolledWindow(
957 m_pPanelLay, wxID_ANY, wxDefaultPosition, wxDefaultSize,
958 wxNO_BORDER | wxTAB_TRAVERSAL | wxVSCROLL);
959 winl->SetScrollRate(0, 5);
961 bsLayButtons->Add(winl, 1, wxALL | wxEXPAND, DIALOG_MARGIN);
963 wxBoxSizer *bsLayButtonsInner =
new wxBoxSizer(wxVERTICAL);
964 winl->SetSizer(bsLayButtonsInner);
966 btnLayNew =
new wxButton(winl, -1, _(
"Create Temporary layer"));
967 bsLayButtonsInner->Add(btnLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
968 btnLayNew->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
969 wxCommandEventHandler(RouteManagerDialog::OnLayNewClick),
972 btnPerLayNew =
new wxButton(winl, -1, _(
"Create Persistent layer"));
973 bsLayButtonsInner->Add(btnPerLayNew, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
974 btnPerLayNew->Connect(
975 wxEVT_COMMAND_BUTTON_CLICKED,
976 wxCommandEventHandler(RouteManagerDialog::OnPerLayNewClick), NULL,
this);
978 btnLayDelete =
new wxButton(winl, -1, _(
"&Delete"));
979 bsLayButtonsInner->Add(btnLayDelete, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
980 btnLayDelete->Connect(
981 wxEVT_COMMAND_BUTTON_CLICKED,
982 wxCommandEventHandler(RouteManagerDialog::OnLayDeleteClick), NULL,
this);
984 cbLayToggleChart =
new wxCheckBox(winl, -1, _(
"Show on chart"));
985 bsLayButtonsInner->Add(cbLayToggleChart, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
986 cbLayToggleChart->Connect(
987 wxEVT_COMMAND_CHECKBOX_CLICKED,
988 wxCommandEventHandler(RouteManagerDialog::OnLayToggleChartClick), NULL,
992 new wxCheckBox(winl, -1, _(
"Show WPT names"), wxDefaultPosition,
993 wxDefaultSize, wxCHK_3STATE);
995 bsLayButtonsInner->Add(cbLayToggleNames, 0, wxALL | wxEXPAND, DIALOG_MARGIN);
996 cbLayToggleNames->Connect(
997 wxEVT_COMMAND_CHECKBOX_CLICKED,
998 wxCommandEventHandler(RouteManagerDialog::OnLayToggleNamesClick), NULL,
1001 cbLayToggleListing =
new wxCheckBox(winl, -1, _(
"List contents"));
1002 bsLayButtonsInner->Add(cbLayToggleListing, 0, wxALL | wxEXPAND,
1004 cbLayToggleListing->Connect(
1005 wxEVT_COMMAND_CHECKBOX_CLICKED,
1006 wxCommandEventHandler(RouteManagerDialog::OnLayToggleListingClick), NULL,
1011 int imageRefSize = m_charWidth * 2;
1012 wxImageList *imglist =
new wxImageList(imageRefSize, imageRefSize,
true, 1);
1015 wxString UserIconPath = g_Platform->GetSharedDataDir() + _T(
"uidata") +
1016 wxFileName::GetPathSeparator();
1018 LoadSVG(UserIconPath + _T(
"eye.svg"), imageRefSize, imageRefSize)
1020 if (iconSVG.IsOk()) {
1021 iconSVG.Resize(wxSize(imageRefSize, imageRefSize),
1023 imglist->Add(wxBitmap(iconSVG));
1026 iconSVG = LoadSVG(UserIconPath + _T(
"eyex.svg"), imageRefSize, imageRefSize)
1028 if (iconSVG.IsOk()) {
1029 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1030 imglist->Add(wxBitmap(iconSVG));
1034 LoadSVG(UserIconPath + _T(
"eyeGray.svg"), imageRefSize, imageRefSize)
1036 if (iconSVG.IsOk()) {
1037 iconSVG.Resize(wxSize(imageRefSize, imageRefSize), wxPoint(0, 0));
1038 imglist->Add(wxBitmap(iconSVG));
1041 m_pRouteListCtrl->AssignImageList(imglist, wxIMAGE_LIST_SMALL);
1044 m_pRouteListCtrl->GetHandle()->setIconSize(QSize(imageRefSize, imageRefSize));
1048 m_pTrkListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1049 m_pWptListCtrl->SetImageList(
1050 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
1051 wxIMAGE_LIST_SMALL);
1052 m_pLayListCtrl->SetImageList(imglist, wxIMAGE_LIST_SMALL);
1062 m_bNeedConfigFlush =
false;
1065RouteManagerDialog::~RouteManagerDialog() {
1066 delete m_pRouteListCtrl;
1067 delete m_pTrkListCtrl;
1068 delete m_pWptListCtrl;
1069 delete m_pLayListCtrl;
1071 delete btnRteDelete;
1072 delete btnRteResequence;
1073 delete btnRteExport;
1074 delete btnRteZoomto;
1075 delete btnRteProperties;
1076 delete btnRteActivate;
1077 delete btnRteReverse;
1078 delete btnRteSendToGPS;
1079 delete btnRteDeleteAll;
1081 delete btnTrkProperties;
1082 delete btnTrkDelete;
1083 delete btnTrkExport;
1084 delete btnTrkRouteFromTrack;
1085 delete btnTrkDeleteAll;
1087 delete btnWptProperties;
1088 delete btnWptZoomto;
1089 delete btnWptDelete;
1091 delete btnWptExport;
1092 delete btnWptSendToGPS;
1093 delete btnWptDeleteAll;
1096 delete cbLayToggleChart;
1097 delete cbLayToggleListing;
1098 delete cbLayToggleNames;
1099 delete btnLayDelete;
1102 delete btnExportViz;
1105 btnExportViz = NULL;
1108 instanceFlag =
false;
1111void RouteManagerDialog::RecalculateSize() {
1117 int char_width, char_height;
1118 GetTextExtent(_T(
"W"), &char_width, &char_height);
1121 sz.x = 60 * char_width;
1122 sz.y = 30 * char_height;
1124 wxSize dsize = GetParent()->GetClientSize();
1125 sz.y = wxMin(sz.y, dsize.y);
1126 sz.x = wxMin(sz.x, dsize.x);
1129 wxSize fsize = GetSize();
1130 fsize.y = wxMin(fsize.y, dsize.y);
1131 fsize.x = wxMin(fsize.x, dsize.x);
1137void RouteManagerDialog::OnClose(wxCloseEvent &event) {
1145void RouteManagerDialog::OnOK(wxCommandEvent &event) {
1152void RouteManagerDialog::SetColorScheme() { DimeControl(
this); }
1154void RouteManagerDialog::OnShowAllRteCBClicked(wxCommandEvent &event) {
1155 bool viz = m_cbShowAllRte->GetValue();
1157 int item_count = m_pRouteListCtrl->GetItemCount();
1159 if (item_count > 50) {
1161 ::wxBeginBusyCursor();
1164 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1165 wxLIST_STATE_DONTCARE);
1166 if (item == -1)
break;
1168 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1170 pR->SetVisible(viz, viz);
1171 pR->SetSharedWPViz(viz);
1173 m_pRouteListCtrl->SetItemImage(item, !viz);
1175 NavObj_dB::GetInstance().UpdateRouteViz(pR);
1178 if (busy) ::wxEndBusyCursor();
1180 UpdateWptListCtrlViz();
1181 gFrame->RefreshAllCanvas();
1184void RouteManagerDialog::OnShowAllWpCBClicked(wxCommandEvent &event) {
1185 bool viz = m_cbShowAllWP->GetValue();
1187 int item_count = m_pWptListCtrl->GetItemCount();
1189 if (item_count > 100) {
1191 ::wxBeginBusyCursor();
1195 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1196 wxLIST_STATE_DONTCARE);
1197 if (item == -1)
break;
1201 if (!pRP->IsSharedInVisibleRoute()) {
1202 pRP->SetVisible(viz);
1204 pRP->SetVisible(
true);
1206 m_pWptListCtrl->SetItemImage(item,
RoutePointGui(*pRP).GetIconImageIndex());
1207 NavObj_dB::GetInstance().UpdateDBRoutePointViz(pRP);
1210 if (busy) ::wxEndBusyCursor();
1212 gFrame->RefreshAllCanvas();
1215void RouteManagerDialog::OnShowAllTrkCBClicked(wxCommandEvent &event) {
1216 bool viz = m_cbShowAllTrk->GetValue();
1219 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1220 wxLIST_STATE_DONTCARE);
1221 if (item == -1)
break;
1223 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1225 track->SetVisible(viz);
1226 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
1227 m_pTrkListCtrl->SetItemImage(item, track->IsVisible() ? 0 : 1);
1230 gFrame->RefreshAllCanvas();
1233void RouteManagerDialog::OnShowAllLayCBClicked(wxCommandEvent &event) {
1234 bool viz = m_cbShowAllLay->GetValue();
1237 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1238 wxLIST_STATE_DONTCARE);
1239 if (item == -1)
break;
1241 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
1243 layer->SetVisibleOnChart(viz);
1244 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
1246 ToggleLayerContentsOnChart(layer);
1249 gFrame->RefreshAllCanvas();
1252void RouteManagerDialog::UpdateRouteListCtrl() {
1255 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1256 wxLIST_STATE_SELECTED);
1257 wxUIntPtr selected_id = wxUIntPtr(0);
1258 if (item != -1) selected_id = m_pRouteListCtrl->GetItemData(item);
1261 m_pRouteListCtrl->DeleteAllItems();
1264 RouteList::iterator it;
1267 bool bpartialViz =
false;
1269 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1270 if (!(*it)->IsListed())
continue;
1272 if (!(*it)->GetName().Upper().Contains(m_tFilterRte->GetValue().Upper())) {
1277 li.SetId(list_index);
1278 li.SetImage((*it)->IsVisible() ? 0 : 1);
1281 li.SetAlign(wxLIST_FORMAT_LEFT);
1283 if ((*it)->m_bRtIsActive) {
1284 wxFont font = *wxNORMAL_FONT;
1285 font.SetWeight(wxFONTWEIGHT_BOLD);
1289 long idx = m_pRouteListCtrl->InsertItem(li);
1291 wxString name = (*it)->m_RouteNameString;
1292 if (name.IsEmpty()) name = _(
"(Unnamed Route)");
1293 m_pRouteListCtrl->SetItem(idx, rmROUTENAME, name);
1295 wxString startend = (*it)->m_RouteStartString;
1296 if (!(*it)->m_RouteEndString.IsEmpty())
1297 startend.append(_(
" - ") + (*it)->m_RouteEndString);
1298 m_pRouteListCtrl->SetItem(idx, rmROUTEDESC, startend);
1301 lic.SetId(list_index);
1303 lic.SetAlign(wxLIST_FORMAT_LEFT);
1304 m_pRouteListCtrl->SetItem(lic);
1307 lic.SetAlign(wxLIST_FORMAT_LEFT);
1308 m_pRouteListCtrl->SetItem(lic);
1311 if (!(*it)->IsVisible()) bpartialViz =
true;
1316 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1318 m_pRouteListCtrl->SetColumnWidth(0, 4 * m_charWidth);
1323 if (selected_id != wxUIntPtr(0)) {
1324 item = m_pRouteListCtrl->FindItem(-1, selected_id);
1325 m_pRouteListCtrl->SetItemState(
1326 item, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
1327 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
1330 if ((m_lastRteItem >= 0) && (m_pRouteListCtrl->GetItemCount()))
1331 m_pRouteListCtrl->EnsureVisible(m_lastRteItem);
1335 m_cbShowAllRte->SetValue(!bpartialViz);
1338void RouteManagerDialog::UpdateRteButtons() {
1340 long selected_index_index =
1341 m_pRouteListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1342 bool enable1 = m_pRouteListCtrl->GetSelectedItemCount() == 1;
1343 bool enablemultiple = m_pRouteListCtrl->GetSelectedItemCount() >= 1;
1345 m_lastRteItem = selected_index_index;
1347 btnRteDelete->Enable(m_pRouteListCtrl->GetSelectedItemCount() > 0);
1348 btnRteZoomto->Enable(enable1);
1349 btnRteProperties->Enable(enable1);
1350 btnRteReverse->Enable(enable1);
1351 btnRteExport->Enable(enablemultiple);
1352 btnRteResequence->Enable(enable1);
1353 btnRteSendToGPS->Enable(enable1);
1354 btnRteDeleteAll->Enable(m_pRouteListCtrl->GetItemCount() > 0);
1355 btnRteSendToPeer->Enable(enablemultiple);
1358 Route *route = NULL;
1360 route = (
Route *)m_pRouteListCtrl->GetItemData(selected_index_index);
1362 if (!g_pRouteMan->IsAnyRouteActive()) {
1363 btnRteActivate->Enable(enable1);
1364 if (enable1) btnRteActivate->SetLabel(_(
"Activate"));
1369 btnRteActivate->Enable(enable1);
1370 btnRteActivate->SetLabel(_(
"Deactivate"));
1372 btnRteActivate->Enable(
false);
1374 btnRteActivate->Enable(
false);
1378void RouteManagerDialog::MakeAllRoutesInvisible() {
1379 RouteList::iterator it;
1381 for (it = (*pRouteList).begin(); it != (*pRouteList).end(); ++it, ++index) {
1382 if ((*it)->IsVisible()) {
1383 (*it)->SetVisible(
false);
1384 m_pRouteListCtrl->SetItemImage(m_pRouteListCtrl->FindItem(-1, index),
1386 NavObj_dB::GetInstance().UpdateRoute(*it);
1391void RouteManagerDialog::ZoomtoRoute(
Route *route) {
1393 LLBBox RBBox = route->GetBBox();
1394 double clat = (RBBox.GetMinLat() + RBBox.GetMaxLat()) / 2;
1395 double clon = (RBBox.GetMinLon() + RBBox.GetMaxLon()) / 2;
1401 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1402 RBBox.GetMinLat(), RBBox.GetMaxLon(), NULL, &rw);
1404 DistanceBearingMercator(RBBox.GetMinLat(), RBBox.GetMinLon(),
1405 RBBox.GetMaxLat(), RBBox.GetMinLon(), NULL, &rh);
1407 if (gFrame->GetFocusCanvas()) {
1408 gFrame->GetFocusCanvas()->GetSize(&ww, &wh);
1409 ppm = wxMin(ww / (rw * 1852), wh / (rh * 1852)) * (100 - fabs(clat)) / 90;
1410 ppm = wxMin(ppm, 1.0);
1412 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), clat, clon, ppm);
1415 m_bNeedConfigFlush =
true;
1419void RouteManagerDialog::OnRteDeleteClick(wxCommandEvent &event) {
1420 int count = m_pRouteListCtrl->GetSelectedItemCount();
1421 bool confirmed = RouteGui::OnDelete(
this, count);
1423 if (confirmed && count > 0) {
1424 ::wxBeginBusyCursor();
1427 gFrame->CancelAllMouseRoute();
1428 m_bNeedConfigFlush =
true;
1432 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1433 wxLIST_STATE_SELECTED);
1434 if (item == -1)
break;
1436 Route *proute_to_delete = (
Route *)m_pRouteListCtrl->GetItemData(item);
1438 if (proute_to_delete) list.Append(proute_to_delete);
1441 for (
unsigned int i = 0; i < list.GetCount(); i++) {
1442 Route *route = list.Item(i)->GetData();
1444 NavObj_dB::GetInstance().DeleteRoute(route);
1450 UpdateRouteListCtrl();
1451 UpdateTrkListCtrl();
1453 gFrame->InvalidateAllCanvasUndo();
1454 gFrame->RefreshAllCanvas();
1455 ::wxEndBusyCursor();
1459void RouteManagerDialog::OnRteDeleteAllClick(wxCommandEvent &event) {
1461 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> routes?"),
1462 wxString(_(
"OpenCPN Alert")), wxYES_NO);
1464 if (dialog_ret == wxID_YES) {
1465 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
1467 gFrame->CancelAllMouseRoute();
1469 g_pRouteMan->DeleteAllRoutes();
1472 UpdateRouteListCtrl();
1476 UpdateTrkListCtrl();
1478 if (pRoutePropDialog) pRoutePropDialog->Hide();
1479 gFrame->InvalidateAllCanvasUndo();
1480 gFrame->RefreshAllCanvas();
1482 m_bNeedConfigFlush =
true;
1486void RouteManagerDialog::OnRtePropertiesClick(wxCommandEvent &event) {
1489 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1490 wxLIST_STATE_SELECTED);
1491 if (item == -1)
return;
1493 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1497 pRoutePropDialog = RoutePropDlgImpl::getInstance(GetParent());
1499 pRoutePropDialog->SetRouteAndUpdate(route);
1501 if (!pRoutePropDialog->IsShown()) pRoutePropDialog->Show();
1503 pRoutePropDialog->Raise();
1505 m_bNeedConfigFlush =
true;
1508void RouteManagerDialog::OnRteZoomtoClick(wxCommandEvent &event) {
1511 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1512 wxLIST_STATE_SELECTED);
1513 if (item == -1)
return;
1516 if (m_bCtrlDown) MakeAllRoutesInvisible();
1518 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1523 if (!route->IsVisible()) {
1524 route->SetVisible(
true);
1525 m_pRouteListCtrl->SetItemImage(item, route->IsVisible() ? 0 : 1);
1526 NavObj_dB::GetInstance().UpdateRoute(route);
1532void RouteManagerDialog::OnRteReverseClick(wxCommandEvent &event) {
1535 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1536 wxLIST_STATE_SELECTED);
1537 if (item == -1)
return;
1539 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1544 int ask_return = OCPNMessageBox(
this, g_pRouteMan->GetRouteReverseMessage(),
1545 _(
"Rename Waypoints?"), wxYES_NO | wxCANCEL);
1546 if (ask_return != wxID_CANCEL) {
1547 bool rename = (ask_return == wxID_YES);
1549 pSelect->DeleteAllSelectableRouteSegments(route);
1550 route->Reverse(rename);
1551 pSelect->AddAllSelectableRouteSegments(route);
1557 m_pRouteListCtrl->SetItem(item, 2, startend);
1559 NavObj_dB::GetInstance().UpdateRoute(route);
1561 gFrame->RefreshAllCanvas();
1564 m_bNeedConfigFlush =
true;
1567void RouteManagerDialog::OnRteExportClick(wxCommandEvent &event) {
1570 wxString suggested_name = _T(
"routes");
1574 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1575 wxLIST_STATE_SELECTED);
1576 if (item == -1)
break;
1578 Route *proute_to_export = (
Route *)m_pRouteListCtrl->GetItemData(item);
1580 if (proute_to_export) {
1581 list.Append(proute_to_export);
1587 ExportGPXRoutes(
this, &list, suggested_name);
1590void RouteManagerDialog::OnRteResequenceClick(wxCommandEvent &event) {
1592 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1593 wxLIST_STATE_SELECTED);
1594 if (item == -1)
return;
1596 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1600 route->RenameRoutePoints();
1603void RouteManagerDialog::OnRteSendToPeerClick(wxCommandEvent &event) {
1604 std::vector<Route *> list;
1607 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1608 wxLIST_STATE_SELECTED);
1609 if (item == -1)
break;
1611 Route *proute = (
Route *)m_pRouteListCtrl->GetItemData(item);
1614 list.push_back(proute);
1617 if (!list.empty()) {
1619 for (
auto r : list) {
1626 MdnsCache::GetInstance().
Validate();
1627 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1630 dlg.Create(NULL, -1, _(
"Send Route(s) to OpenCPN Peer") + _T(
"..." ),
1636void RouteManagerDialog::OnWptSendToPeerClick(wxCommandEvent &event) {
1637 std::vector<RoutePoint *> list;
1640 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1641 wxLIST_STATE_SELECTED);
1642 if (item == -1)
break;
1647 list.push_back(proutep);
1650 if (!list.empty()) {
1652 for (
auto r : list) {
1659 MdnsCache::GetInstance().
Validate();
1660 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1663 dlg.Create(NULL, -1, _(
"Send Waypoint(s) to OpenCPN Peer") + _T(
"..." ),
1669void RouteManagerDialog::OnTrkSendToPeerClick(wxCommandEvent &event) {
1670 std::vector<Track *> list;
1673 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1674 wxLIST_STATE_SELECTED);
1675 if (item == -1)
break;
1677 Track *ptrk = (
Track *)m_pTrkListCtrl->GetItemData(item);
1680 list.push_back(ptrk);
1683 if (!list.empty()) {
1685 for (
auto r : list) {
1692 MdnsCache::GetInstance().
Validate();
1693 if (MdnsCache::GetInstance().GetCache().empty()) dlg.SetScanOnCreate(
true);
1696 dlg.Create(NULL, -1, _(
"Send Track(s) to OpenCPN Peer") + _T(
"..." ),
1702void RouteManagerDialog::OnRteActivateClick(wxCommandEvent &event) {
1705 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1706 wxLIST_STATE_SELECTED);
1707 if (item == -1)
return;
1709 if (m_bCtrlDown) MakeAllRoutesInvisible();
1711 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1716 if (!route->IsVisible()) {
1717 route->SetVisible(
true);
1718 m_pRouteListCtrl->SetItemImage(item, 0, 0);
1724 g_pRouteMan->FindBestActivatePoint(route, gLat, gLon, gCog, gSog);
1728 g_pRouteMan->DeactivateRoute();
1730 UpdateRouteListCtrl();
1732 NavObj_dB::GetInstance().UpdateRoute(route);
1734 gFrame->RefreshAllCanvas();
1739 m_bNeedConfigFlush =
true;
1742void RouteManagerDialog::OnRteToggleVisibility(wxMouseEvent &event) {
1743 wxPoint pos =
event.GetPosition();
1745 long clicked_index = m_pRouteListCtrl->HitTest(pos, flags);
1748 if (clicked_index > -1 &&
1749 event.GetX() < m_pRouteListCtrl->GetColumnWidth(rmVISIBLE)) {
1751 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1753 route->SetVisible(!route->IsVisible());
1755 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1757 ::wxBeginBusyCursor();
1759 NavObj_dB::GetInstance().UpdateRoute(route);
1761 gFrame->RefreshAllCanvas();
1765 if (g_pRouteMan->DoesRouteContainSharedPoints(route))
1766 UpdateWptListCtrlViz();
1772 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1773 wxLIST_STATE_DONTCARE);
1774 if (item == -1)
break;
1776 Route *pR = (
Route *)m_pRouteListCtrl->GetItemData(item);
1778 if (!pR->IsVisible()) {
1783 m_cbShowAllRte->SetValue(viz);
1785 ::wxEndBusyCursor();
1792void RouteManagerDialog::OnRteBtnLeftDown(wxMouseEvent &event) {
1793 m_bCtrlDown =
event.ControlDown();
1797void RouteManagerDialog::OnRteSelected(wxListEvent &event) {
1798 long clicked_index =
event.m_itemIndex;
1800 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(clicked_index);
1802 m_pRouteListCtrl->SetItemImage(clicked_index, route->IsVisible() ? 0 : 1);
1804 gFrame->RefreshAllCanvas();
1809void RouteManagerDialog::OnRteColumnClicked(wxListEvent &event) {
1810 if (event.m_col == 1) {
1811 sort_route_name_dir++;
1813 m_pRouteListCtrl->SortItems(SortRoutesOnName, (wxIntPtr)NULL);
1814 }
else if (event.m_col == 2) {
1815 sort_route_to_dir++;
1816 m_pRouteListCtrl->SortItems(SortRoutesOnTo, (wxIntPtr)NULL);
1820void RouteManagerDialog::OnRteSendToGPSClick(wxCommandEvent &event) {
1822 item = m_pRouteListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1823 wxLIST_STATE_SELECTED);
1824 if (item == -1)
return;
1826 Route *route = (
Route *)m_pRouteListCtrl->GetItemData(item);
1831 pdlg->SetRoute(route);
1837 pdlg->Create(NULL, -1, _(
"Send to GPS") + _T(
"..." ), source);
1840 HideWithEffect(wxSHOW_EFFECT_BLEND);
1846 ShowWithEffect(wxSHOW_EFFECT_BLEND);
1852void RouteManagerDialog::OnRteDefaultAction(wxListEvent &event) {
1854 OnRtePropertiesClick(evt);
1857void RouteManagerDialog::OnTrkDefaultAction(wxListEvent &event) {
1859 OnTrkPropertiesClick(evt);
1862void RouteManagerDialog::OnTrkRightClick(wxListEvent &event) {
1864 wxMenuItem *mergeItem = menu.Append(TRACK_MERGE, _(
"&Merge Selected Tracks"));
1865 mergeItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 1);
1866 wxMenuItem *cleanItem = menu.Append(TRACK_CLEAN, _(
"Reduce Data..."));
1867 cleanItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() == 1);
1868 wxMenuItem *copyItem = menu.Append(TRACK_COPY_TEXT, _(
"&Copy as text"));
1869 copyItem->Enable(m_pTrkListCtrl->GetSelectedItemCount() > 0);
1873static bool CompareTracks(
Track *track1,
Track *track2) {
1879void RouteManagerDialog::OnTrkMenuSelected(wxCommandEvent &event) {
1882 switch (event.GetId()) {
1884 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1885 wxLIST_STATE_SELECTED);
1886 if (item == -1)
break;
1887 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1888 if (track->IsRunning()) {
1893 const wxString choices[] = {_T(
"5.0"), _T(
"10.0"), _T(
"20.0"), _T(
"50.0"),
1896 wxSingleChoiceDialog precisionDlg(
this,
1897 _(
"Select the maximum error allowed "
1898 "(in meters)\nafter data reduction:"),
1899 _(
"Reduce Data Precision"), 5, choices);
1901 precisionDlg.ShowWindowModal();
1902 while (precisionDlg.IsShown()) {
1906 int result = precisionDlg.GetReturnCode();
1908 int result = precisionDlg.ShowModal();
1910 if (result == wxID_CANCEL)
break;
1911 double precision = 5.0;
1912 switch (precisionDlg.GetSelection()) {
1930 int pointsBefore = track->GetnPoints();
1932 int reduction = track->Simplify(precision);
1933 gFrame->Refresh(
false);
1935 reduction = 100 * reduction / pointsBefore;
1936 wxString msg = wxString::Format(
1937 _(
"The amount of data used by the track\n was reduced by %d%%."),
1939 OCPNMessageBox(
this, msg, _(
"OpenCPN info"), wxICON_INFORMATION | wxOK);
1941 UpdateTrkListCtrl();
1942 UpdateRouteListCtrl();
1947 case TRACK_COPY_TEXT: {
1950 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1951 wxLIST_STATE_SELECTED);
1952 if (item == -1)
break;
1953 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1954 csvString << track->GetName() << _T(
"\t")
1955 << wxString::Format(_T(
"%.1f"), track->Length()) << _T(
"\t")
1959 if (wxTheClipboard->Open()) {
1960 wxTextDataObject *data =
new wxTextDataObject;
1961 data->SetText(csvString);
1962 wxTheClipboard->SetData(data);
1963 wxTheClipboard->Close();
1970 Track *targetTrack = NULL;
1974 std::vector<Track *> mergeList;
1975 std::vector<Track *> deleteList;
1976 bool runningSkipped =
false;
1978 ::wxBeginBusyCursor();
1981 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
1982 wxLIST_STATE_SELECTED);
1983 if (item == -1)
break;
1984 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
1985 mergeList.push_back(track);
1988 if (!mergeList.size()) {
1989 ::wxEndBusyCursor();
1993 std::sort(mergeList.begin(), mergeList.end(), CompareTracks);
1995 targetTrack = mergeList[0];
1996 lastPoint = targetTrack->GetLastPoint();
1998 for (
auto const &mergeTrack : mergeList) {
1999 if (mergeTrack == *mergeList.begin())
continue;
2001 if (mergeTrack->IsRunning()) {
2002 runningSkipped =
true;
2006 for (
int i = 0; i < mergeTrack->GetnPoints(); i++) {
2007 tPoint = mergeTrack->GetPoint(i);
2008 newPoint =
new TrackPoint(tPoint->m_lat, tPoint->m_lon,
2011 targetTrack->AddPoint(newPoint);
2012 NavObj_dB::GetInstance().AddTrackPoint(targetTrack, newPoint);
2014 pSelect->AddSelectableTrackSegment(lastPoint->m_lat, lastPoint->m_lon,
2015 newPoint->m_lat, newPoint->m_lon,
2016 lastPoint, newPoint, targetTrack);
2017 lastPoint = newPoint;
2019 deleteList.push_back(mergeTrack);
2022 for (
auto const &deleteTrack : deleteList) {
2023 g_pAIS->DeletePersistentTrack(deleteTrack);
2024 NavObj_dB::GetInstance().DeleteTrack(deleteTrack);
2025 RoutemanGui(*g_pRouteMan).DeleteTrack(deleteTrack);
2031 ::wxEndBusyCursor();
2033 UpdateTrkListCtrl();
2034 UpdateRouteListCtrl();
2035 gFrame->RefreshAllCanvas();
2037 if (runningSkipped) {
2038 wxMessageDialog skipWarning(
2040 _(
"The currently running Track was not merged.\nYou can merge it "
2041 "later when it is completed."),
2042 _T(
"Warning"), wxCANCEL | wxICON_WARNING);
2043 skipWarning.ShowModal();
2051void RouteManagerDialog::UpdateTrkListCtrl() {
2055 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2057 wxUIntPtr selected_id = wxUIntPtr(0);
2058 if (item != -1) selected_id = m_pTrkListCtrl->GetItemData(item);
2061 m_pTrkListCtrl->DeleteAllItems();
2064 std::vector<Track *>::iterator it;
2067 bool bpartialViz =
false;
2069 for (
Track *trk : g_TrackList) {
2070 if (!trk->IsVisible()) bpartialViz =
true;
2072 if (!trk->IsListed())
continue;
2074 if (!trk->GetName(
true).Upper().Contains(
2075 m_tFilterTrk->GetValue().Upper())) {
2080 li.SetId(list_index);
2081 li.SetImage(trk->IsVisible() ? 0 : 1);
2085 if (g_pActiveTrack == trk) {
2086 wxFont font = *wxNORMAL_FONT;
2087 font.SetWeight(wxFONTWEIGHT_BOLD);
2090 long idx = m_pTrkListCtrl->InsertItem(li);
2092 m_pTrkListCtrl->SetItem(idx, colTRKNAME, trk->GetName(
true));
2095 m_pTrkListCtrl->SetItem(idx, colTRKDATE, trk->GetDateTime());
2098 len.Printf(wxT(
"%5.2f"), trk->Length());
2099 m_pTrkListCtrl->SetItem(idx, colTRKLENGTH, len);
2102 lic.SetId(list_index);
2104 lic.SetAlign(wxLIST_FORMAT_LEFT);
2105 m_pTrkListCtrl->SetItem(lic);
2108 lic.SetAlign(wxLIST_FORMAT_LEFT);
2109 m_pTrkListCtrl->SetItem(lic);
2114 switch (sort_track_key) {
2115 case SORT_ON_DISTANCE:
2116 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2119 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2123 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2127 m_pTrkListCtrl->SetColumnWidth(0, 4 * m_charWidth);
2132 if (selected_id != wxUIntPtr(0)) {
2133 item = m_pTrkListCtrl->FindItem(-1, selected_id);
2134 m_pTrkListCtrl->SetItemState(item,
2135 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2136 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2139 if ((m_lastTrkItem >= 0) && (m_pTrkListCtrl->GetItemCount()))
2140 m_pTrkListCtrl->EnsureVisible(m_lastTrkItem);
2142 m_cbShowAllTrk->SetValue(!bpartialViz);
2146void RouteManagerDialog::OnTrkSelected(wxListEvent &event) {
2150void RouteManagerDialog::OnTrkColumnClicked(wxListEvent &event) {
2151 if (event.m_col == 1) {
2152 sort_track_key = SORT_ON_NAME;
2153 sort_track_name_dir++;
2154 m_pTrkListCtrl->SortItems(SortTracksOnName, (wxIntPtr)NULL);
2155 }
else if (event.m_col == 2) {
2156 sort_track_key = SORT_ON_DISTANCE;
2157 sort_track_len_dir++;
2158 m_pTrkListCtrl->SortItems(SortTracksOnDistance, (wxIntPtr)NULL);
2159 }
else if (event.m_col == 3) {
2160 sort_track_key = SORT_ON_DATE;
2161 sort_track_date_dir++;
2162 m_pTrkListCtrl->SortItems(SortTracksOnDate, (wxIntPtr)NULL);
2166void RouteManagerDialog::UpdateTrkButtons() {
2169 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2170 int items = m_pTrkListCtrl->GetSelectedItemCount();
2172 m_lastTrkItem = item;
2174 btnTrkProperties->Enable(items == 1);
2175 btnTrkDelete->Enable(items >= 1);
2176 btnTrkExport->Enable(items >= 1);
2177 btnTrkRouteFromTrack->Enable(items == 1);
2178 btnTrkDeleteAll->Enable(m_pTrkListCtrl->GetItemCount() > 0);
2179 btnTrkSendToPeer->Enable(items >= 1);
2182void RouteManagerDialog::OnTrkToggleVisibility(wxMouseEvent &event) {
2183 wxPoint pos =
event.GetPosition();
2185 long clicked_index = m_pTrkListCtrl->HitTest(pos, flags);
2188 if (clicked_index > -1 &&
2189 event.GetX() < m_pTrkListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2191 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(clicked_index);
2193 track->SetVisible(!track->IsVisible());
2194 NavObj_dB::GetInstance().UpdateDBTrackAttributes(track);
2195 m_pTrkListCtrl->SetItemImage(clicked_index, track->IsVisible() ? 0 : 1);
2202 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2203 wxLIST_STATE_DONTCARE);
2204 if (item == -1)
break;
2206 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2208 if (!track->IsVisible()) {
2213 m_cbShowAllTrk->SetValue(viz);
2215 gFrame->RefreshAllCanvas();
2222void RouteManagerDialog::OnTrkNewClick(wxCommandEvent &event) {
2226 UpdateTrkListCtrl();
2229void RouteManagerDialog::OnTrkPropertiesClick(wxCommandEvent &event) {
2233 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2234 if (item == -1)
return;
2236 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2240 pTrackPropDialog = TrackPropDlg::getInstance(GetParent());
2241 pTrackPropDialog->SetTrackAndUpdate(track);
2243 if (!pTrackPropDialog->IsShown()) pTrackPropDialog->Show();
2244 UpdateTrkListCtrl();
2246 m_bNeedConfigFlush =
true;
2249void RouteManagerDialog::OnTrkDeleteClick(wxCommandEvent &event) {
2250 std::vector<Track *> list;
2252 int answer = OCPNMessageBox(
2253 this, _(
"Are you sure you want to delete the selected object(s)"),
2254 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2255 if (answer != wxID_YES)
return;
2258 if (m_pTrkListCtrl->GetSelectedItemCount()) {
2259 ::wxBeginBusyCursor();
2266 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2267 wxLIST_STATE_SELECTED);
2268 if (item == -1)
break;
2270 Track *ptrack_to_delete = (
Track *)m_pTrkListCtrl->GetItemData(item);
2272 if (ptrack_to_delete) list.push_back(ptrack_to_delete);
2276 for (
unsigned int i = 0; i < list.size(); i++) {
2277 Track *track = list.at(i);
2279 g_pAIS->DeletePersistentTrack(track);
2280 NavObj_dB::GetInstance().DeleteTrack(track);
2287 UpdateTrkListCtrl();
2289 gFrame->InvalidateAllCanvasUndo();
2290 gFrame->RefreshAllCanvas();
2291 ::wxEndBusyCursor();
2295void RouteManagerDialog::OnTrkExportClick(wxCommandEvent &event) {
2296 std::vector<Track *> list;
2297 wxString suggested_name = _T(
"tracks");
2301 item = m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2302 wxLIST_STATE_SELECTED);
2303 if (item == -1)
break;
2305 Track *ptrack_to_export = (
Track *)m_pTrkListCtrl->GetItemData(item);
2307 if (ptrack_to_export) {
2308 list.push_back(ptrack_to_export);
2309 if (ptrack_to_export->GetName() != wxEmptyString)
2310 suggested_name = ptrack_to_export->GetName();
2314 ExportGPXTracks(
this, &list, suggested_name);
2317void RouteManagerDialog::TrackToRoute(
Track *track) {
2319 if (track->m_bIsInLayer)
return;
2321 wxGenericProgressDialog pprog(_(
"OpenCPN Converting Track to Route...."),
2322 _(
"Processing Waypoints..."), 101, NULL,
2323 wxPD_AUTO_HIDE | wxPD_SMOOTH |
2324 wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME |
2325 wxPD_REMAINING_TIME);
2327 ::wxBeginBusyCursor();
2329 Route *route = track->RouteFromTrack(&pprog);
2331 pRouteList->Append(route);
2333 pprog.Update(101, _(
"Done."));
2335 gFrame->RefreshAllCanvas();
2337 ::wxEndBusyCursor();
2340void RouteManagerDialog::OnTrkRouteFromTrackClick(wxCommandEvent &event) {
2343 m_pTrkListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2344 if (item == -1)
return;
2346 Track *track = (
Track *)m_pTrkListCtrl->GetItemData(item);
2348 TrackToRoute(track);
2350 UpdateRouteListCtrl();
2353void RouteManagerDialog::OnTrkDeleteAllClick(wxCommandEvent &event) {
2355 OCPNMessageBox(
this, _(
"Are you sure you want to delete <ALL> tracks?"),
2356 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2358 if (dialog_ret == wxID_YES) {
2365 UpdateTrkListCtrl();
2369 UpdateRouteListCtrl();
2371 if (pRoutePropDialog) pRoutePropDialog->Hide();
2373 gFrame->RefreshAllCanvas();
2375 m_bNeedConfigFlush =
true;
2378void RouteManagerDialog::UpdateWptListCtrl(
RoutePoint *rp_select,
2379 bool b_retain_sort) {
2380 wxIntPtr selected_id = wxUIntPtr(0);
2383 if (NULL == rp_select) {
2385 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2386 wxLIST_STATE_SELECTED);
2388 if (item != -1) selected_id = m_pWptListCtrl->GetItemData(item);
2392 m_pWptListCtrl->SetImageList(
2393 pWayPointMan->Getpmarkicon_image_list(m_listIconSize),
2394 wxIMAGE_LIST_SMALL);
2396 m_pWptListCtrl->DeleteAllItems();
2398 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
2401 bool b_anyHidden =
false;
2404 if (rp && rp->IsListed()) {
2406 node = node->GetNext();
2410 if (!rp->GetName().Upper().Contains(m_tFilterWpt->GetValue().Upper())) {
2411 node = node->GetNext();
2420 long idx = m_pWptListCtrl->InsertItem(li);
2422 wxString scamin = wxString::Format(_T(
"%i"), (
int)rp->GetScaMin());
2423 if (!rp->GetUseSca()) scamin = _(
"Always");
2424 if (g_bOverruleScaMin) scamin = _(
"Overruled");
2425 m_pWptListCtrl->SetItem(idx, colWPTSCALE, scamin);
2427 wxString name = rp->GetName();
2428 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2429 m_pWptListCtrl->SetItem(idx, colWPTNAME, name);
2432 DistanceBearingMercator(rp->m_lat, rp->m_lon, gLat, gLon, NULL, &dst);
2434 dist.Printf(_T(
"%5.2f ") + getUsrDistanceUnit(), toUsrDistance(dst));
2435 m_pWptListCtrl->SetItem(idx, colWPTDIST, dist);
2437 if (rp == rp_select) selected_id = (wxIntPtr)rp_select;
2442 lic.SetAlign(wxLIST_FORMAT_LEFT);
2443 m_pWptListCtrl->SetItem(lic);
2446 lic.SetAlign(wxLIST_FORMAT_LEFT);
2447 m_pWptListCtrl->SetItem(lic);
2449 if (!rp->IsVisible()) b_anyHidden =
true;
2454 node = node->GetNext();
2457 if (!b_retain_sort) {
2458 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2459 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2460 sort_wp_key = SORT_ON_NAME;
2462 switch (sort_wp_key) {
2464 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2465 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2467 case SORT_ON_DISTANCE:
2468 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2469 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2474 if (selected_id != wxUIntPtr(0)) {
2475 item = m_pWptListCtrl->FindItem(-1, selected_id);
2476 m_pWptListCtrl->SetItemState(item,
2477 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
2478 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
2481 if ((m_lastWptItem >= 0) && (m_pWptListCtrl->GetItemCount()))
2482 m_pWptListCtrl->EnsureVisible(m_lastWptItem);
2484 if (pWayPointMan->Getpmarkicon_image_list(m_listIconSize)->GetImageCount()) {
2485 int iwidth, iheight;
2486 pWayPointMan->Getpmarkicon_image_list(m_listIconSize)
2487 ->GetSize(0, iwidth, iheight);
2489 m_pWptListCtrl->SetColumnWidth(0, wxMax(iwidth + 4, 4 * m_charWidth));
2494 m_cbShowAllWP->SetValue(!b_anyHidden);
2497void RouteManagerDialog::UpdateWptListCtrlViz() {
2500 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2501 wxLIST_STATE_DONTCARE);
2502 if (item == -1)
break;
2507 m_pWptListCtrl->SetItemImage(item, imageIndex);
2511void RouteManagerDialog::OnWptDefaultAction(wxListEvent &event) {
2513 OnWptPropertiesClick(evt);
2516void RouteManagerDialog::OnWptSelected(wxListEvent &event) {
2520void RouteManagerDialog::OnWptColumnClicked(wxListEvent &event) {
2521 if (event.m_col == NAME_COLUMN) {
2523 m_pWptListCtrl->SortItems(SortWaypointsOnName,
2524 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2525 sort_wp_key = SORT_ON_NAME;
2527 if (event.m_col == DISTANCE_COLUMN) {
2529 m_pWptListCtrl->SortItems(SortWaypointsOnDistance,
2530 reinterpret_cast<wxIntPtr
>(m_pWptListCtrl));
2531 sort_wp_key = SORT_ON_DISTANCE;
2534 UpdateWptListCtrl();
2537void RouteManagerDialog::UpdateWptButtons() {
2540 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2541 bool enable1 = (m_pWptListCtrl->GetSelectedItemCount() == 1);
2542 bool enablemultiple = (m_pWptListCtrl->GetSelectedItemCount() >= 1);
2545 m_lastWptItem = item;
2551 bool b_delete_enable =
true;
2554 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2555 wxLIST_STATE_SELECTED);
2556 if (item == -1)
break;
2561 b_delete_enable =
false;
2566 btnWptProperties->Enable(enablemultiple);
2567 btnWptZoomto->Enable(enable1);
2568 btnWptDeleteAll->Enable(m_pWptListCtrl->GetItemCount() > 0);
2569 btnWptDelete->Enable(b_delete_enable && enablemultiple);
2570 btnWptGoTo->Enable(enable1);
2571 btnWptExport->Enable(enablemultiple);
2572 btnWptSendToGPS->Enable(enable1);
2573 btnWptSendToPeer->Enable(enablemultiple);
2576void RouteManagerDialog::OnWptToggleVisibility(wxMouseEvent &event) {
2577 wxPoint pos =
event.GetPosition();
2579 long clicked_index = m_pWptListCtrl->HitTest(pos, flags);
2582 if (clicked_index > -1 &&
2583 event.GetX() < m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE)) {
2587 if (!wp->IsSharedInVisibleRoute()) {
2588 wp->SetVisible(!wp->IsVisible());
2589 m_pWptListCtrl->SetItemImage(clicked_index,
2592 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2599 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2600 wxLIST_STATE_DONTCARE);
2601 if (item == -1)
break;
2605 if (!wp->IsVisible()) {
2610 m_cbShowAllWP->SetValue(viz);
2612 gFrame->RefreshAllCanvas();
2614 if (clicked_index > -1 &&
2615 event.GetX() > m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) &&
2616 event.GetX() < (m_pWptListCtrl->GetColumnWidth(colTRKVISIBLE) +
2617 m_pWptListCtrl->GetColumnWidth(colWPTSCALE)) &&
2618 !g_bOverruleScaMin) {
2620 wp->SetUseSca(!wp->GetUseSca());
2621 NavObj_dB::GetInstance().UpdateRoutePoint(wp);
2622 gFrame->RefreshAllCanvas();
2623 wxString scamin = wxString::Format(_T(
"%i"), (
int)wp->GetScaMin());
2624 if (!wp->GetUseSca()) scamin = _(
"Always");
2625 m_pWptListCtrl->SetItem(clicked_index, colWPTSCALE, scamin);
2632void RouteManagerDialog::OnWptNewClick(wxCommandEvent &event) {
2636 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP);
2637 NavObj_dB::GetInstance().InsertRoutePoint(pWP);
2639 gFrame->RefreshAllCanvas();
2643 if (!g_pMarkInfoDialog) g_pMarkInfoDialog =
new MarkInfoDlg(GetParent());
2645 WptShowPropertiesDialog(pWP, GetParent());
2648void RouteManagerDialog::OnWptPropertiesClick(wxCommandEvent &event) {
2649 long item = wxNOT_FOUND;
2651 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2652 if (item == wxNOT_FOUND)
return;
2654 auto pWP = (
RoutePoint *)m_pWptListCtrl->GetItemData(item);
2655 WptShowPropertiesDialog(pWP, GetParent());
2657 UpdateWptListCtrl();
2658 m_bNeedConfigFlush =
true;
2661void RouteManagerDialog::WptShowPropertiesDialog(
RoutePoint *pWP,
2663 if (!g_pMarkInfoDialog)
2667 g_pMarkInfoDialog->SetRoutePoint(pWP);
2668 g_pMarkInfoDialog->UpdateProperties();
2670 wxString base_title = _(
"Waypoint Properties");
2673 wxString caption(wxString::Format(_T(
"%s, %s: %s"), base_title, _(
"Layer"),
2675 g_pMarkInfoDialog->SetDialogTitle(caption);
2677 g_pMarkInfoDialog->SetDialogTitle(base_title);
2680 if (!g_pMarkInfoDialog->IsShown()) g_pMarkInfoDialog->Show();
2681 g_pMarkInfoDialog->Raise();
2684void RouteManagerDialog::OnWptZoomtoClick(wxCommandEvent &event) {
2687 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2688 if (item == -1)
return;
2694 if (gFrame->GetFocusCanvas()) {
2695 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), wp->m_lat, wp->m_lon,
2696 gFrame->GetFocusCanvas()->GetVPScale());
2700void RouteManagerDialog::OnWptDeleteClick(wxCommandEvent &event) {
2701 RoutePointList list;
2703 int answer = OCPNMessageBox(
2704 this, _(
"Are you sure you want to delete the selected object(s)"),
2705 wxString(_(
"OpenCPN Alert")), wxYES_NO);
2706 if (answer != wxID_YES)
return;
2709 if (m_pWptListCtrl->GetSelectedItemCount()) {
2710 ::wxBeginBusyCursor();
2711 m_bNeedConfigFlush =
true;
2716 long item_last_selected = -1;
2718 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2719 wxLIST_STATE_SELECTED);
2720 if (item == -1)
break;
2722 item_last_selected = item;
2729 for (
unsigned int i = 0; i < list.GetCount(); i++) {
2734 OCPNMessageBox(
this,
2735 _(
"The waypoint you want to delete is used in a "
2736 "route, do you really want to delete it?"),
2737 _(
"OpenCPN Alert"), wxYES_NO)) {
2738 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2739 pWayPointMan->DestroyWaypoint(wp);
2742 NavObj_dB::GetInstance().DeleteRoutePoint(wp);
2743 pWayPointMan->DestroyWaypoint(wp);
2749 m_pWptListCtrl->GetNextItem(item_last_selected);
2752 wp_next = (
RoutePoint *)m_pWptListCtrl->GetItemData(item_next);
2754 m_lastWptItem = item_next;
2756 UpdateRouteListCtrl();
2757 UpdateTrkListCtrl();
2758 UpdateWptListCtrl(wp_next,
true);
2760 if (g_pMarkInfoDialog) {
2761 g_pMarkInfoDialog->ClearData();
2764 gFrame->InvalidateAllCanvasUndo();
2765 gFrame->RefreshAllCanvas();
2766 ::wxEndBusyCursor();
2770void RouteManagerDialog::OnWptGoToClick(wxCommandEvent &event) {
2773 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2774 if (item == -1)
return;
2781 wxEmptyString, wxEmptyString);
2782 pSelect->AddSelectableRoutePoint(gLat, gLon, pWP_src);
2785 pRouteList->Append(temp_route);
2787 temp_route->AddPoint(pWP_src);
2788 temp_route->AddPoint(wp);
2790 pSelect->AddSelectableRouteSegment(gLat, gLon, wp->m_lat, wp->m_lon, pWP_src,
2793 wxString name = wp->GetName();
2794 if (name.IsEmpty()) name = _(
"(Unnamed Waypoint)");
2795 wxString rteName = _(
"Go to ");
2796 rteName.Append(name);
2803 if (g_pRouteMan->GetpActiveRoute()) g_pRouteMan->DeactivateRoute();
2807 UpdateRouteListCtrl();
2810void RouteManagerDialog::OnWptExportClick(wxCommandEvent &event) {
2811 RoutePointList list;
2813 wxString suggested_name = _T(
"waypoints");
2817 item = m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2818 wxLIST_STATE_SELECTED);
2819 if (item == -1)
break;
2825 if (wp->GetName() != wxEmptyString) suggested_name = wp->GetName();
2829 ExportGPXWaypoints(
this, &list, suggested_name);
2832void RouteManagerDialog::OnWptSendToGPSClick(wxCommandEvent &event) {
2835 m_pWptListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2836 if (item == -1)
return;
2843 pdlg->SetWaypoint(wp);
2846 pdlg->Create(NULL, -1, _(
"Send to GPS") + _T(
"..." ), source);
2849 HideWithEffect(wxSHOW_EFFECT_BLEND);
2853 ShowWithEffect(wxSHOW_EFFECT_BLEND);
2859void RouteManagerDialog::OnWptDeleteAllClick(wxCommandEvent &event) {
2862 if (!pWayPointMan->SharedWptsExist()) {
2863 prompt = _(
"Are you sure you want to delete <ALL> waypoints?");
2868 _(
"There are some waypoints used in routes or anchor alarms.\n Do you "
2869 "want to delete them as well?\n This will change the routes and "
2870 "disable the anchor alarms.\n Answering No keeps the waypoints used "
2871 "in routes or alarms.");
2872 buttons = wxYES_NO | wxCANCEL;
2876 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), buttons);
2877 if (answer == wxID_YES) pWayPointMan->DeleteAllWaypoints(
true);
2878 if (answer == wxID_NO && type == 2)
2879 pWayPointMan->DeleteAllWaypoints(
false);
2881 if (g_pMarkInfoDialog) {
2882 g_pMarkInfoDialog->ClearData();
2886 UpdateRouteListCtrl();
2887 UpdateWptListCtrl();
2888 gFrame->InvalidateAllCanvasUndo();
2889 gFrame->RefreshAllCanvas();
2892void RouteManagerDialog::OnLaySelected(wxListEvent &event) {
2896void RouteManagerDialog::OnLayColumnClicked(wxListEvent &event) {
2897 if (event.m_col == 1) {
2898 sort_layer_name_dir++;
2899 m_pLayListCtrl->SortItems(SortLayersOnName, (wxIntPtr)NULL);
2900 }
else if (event.m_col == 2) {
2901 sort_layer_len_dir++;
2902 m_pLayListCtrl->SortItems(SortLayersOnSize, (wxIntPtr)NULL);
2906void RouteManagerDialog::UpdateLayButtons() {
2909 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
2910 bool enable = (item != -1);
2913 btnLayDelete->Enable(enable);
2914 cbLayToggleChart->Enable(enable);
2915 cbLayToggleListing->Enable(enable);
2916 cbLayToggleNames->Enable(enable);
2919 cbLayToggleChart->SetValue(
2920 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnChart());
2922 cbLayToggleNames->Set3StateValue(
2923 ((
Layer *)m_pLayListCtrl->GetItemData(item))->HasVisibleNames());
2925 cbLayToggleListing->SetValue(
2926 ((
Layer *)m_pLayListCtrl->GetItemData(item))->IsVisibleOnListing());
2929 cbLayToggleChart->SetValue(
true);
2930 cbLayToggleNames->Set3StateValue(wxCHK_UNDETERMINED);
2931 cbLayToggleListing->SetValue(
true);
2935void RouteManagerDialog::OnLayToggleVisibility(wxMouseEvent &event) {
2936 wxPoint pos =
event.GetPosition();
2938 long clicked_index = m_pLayListCtrl->HitTest(pos, flags);
2941 if (clicked_index > -1 &&
2942 event.GetX() < m_pLayListCtrl->GetColumnWidth(colLAYVISIBLE)) {
2944 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(clicked_index);
2946 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
2947 m_pLayListCtrl->SetItemImage(clicked_index,
2948 layer->IsVisibleOnChart() ? 0 : 1);
2954 item = m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL,
2955 wxLIST_STATE_DONTCARE);
2956 if (item == -1)
break;
2958 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
2960 if (!layer->IsVisibleOnChart()) {
2965 m_cbShowAllLay->SetValue(viz);
2967 ToggleLayerContentsOnChart(layer);
2974void RouteManagerDialog::UpdateLists() {
2975 UpdateRouteListCtrl();
2976 UpdateTrkListCtrl();
2977 UpdateWptListCtrl();
2978 UpdateLayListCtrl();
2981void RouteManagerDialog::OnLayNewClick(wxCommandEvent &event) {
2985void RouteManagerDialog::OnPerLayNewClick(wxCommandEvent &event) {
2989void RouteManagerDialog::AddNewLayer(
bool isPersistent) {
2990 bool show_flag = g_bShowLayers;
2991 g_bShowLayers =
true;
2993 UI_ImportGPX(
this,
true, _T(
""),
true, isPersistent);
2995 g_bShowLayers = show_flag;
2997 gFrame->RefreshAllCanvas();
3000void RouteManagerDialog::OnLayPropertiesClick(wxCommandEvent &event) {
3004 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3005 if (item == -1)
return;
3008void RouteManagerDialog::OnLayDeleteClick(wxCommandEvent &event) {
3011 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3012 if (item == -1)
return;
3014 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3020 bool ispers =
false;
3021 wxString destf, f, name, ext;
3022 f = layer->m_LayerFileName;
3023 wxFileName::SplitPath(f, NULL, NULL, &name, &ext);
3025 appendOSDirSlash(&destf);
3026 destf.Append(_T(
"layers"));
3027 appendOSDirSlash(&destf);
3028 destf << name << _T(
".") << ext;
3030 wxString prompt = _(
3031 "Are you sure you want to delete this layer and <ALL> of its contents?");
3032 if (wxFileExists(destf)) {
3033 prompt.Append(_T(
"\n"));
3035 _(
"The file will also be deleted from OpenCPN's layer directory."));
3036 prompt.Append(_T(
"\n (") + destf + _T(
")" ));
3040 OCPNMessageBox(
this, prompt, wxString(_(
"OpenCPN Alert")), wxYES_NO);
3041 if (answer == wxID_NO)
return;
3046 if (wxRemoveFile(destf))
3047 remMSG.sprintf(_T(
"Layer file: %s is deleted"), destf);
3049 remMSG.sprintf(_T(
"Error deleting Layer file: %s"), destf);
3051 wxLogMessage(remMSG);
3055 wxRouteListNode *node1 = pRouteList->GetFirst();
3057 Route *pRoute = node1->GetData();
3058 wxRouteListNode *next_node = node1->GetNext();
3067 for (
Track *pTrack : g_TrackList) {
3068 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3069 pTrack->m_bIsInLayer =
false;
3070 pTrack->m_LayerID = 0;
3071 NavObj_dB::GetInstance().DeleteTrack(pTrack);
3077 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3078 wxRoutePointListNode *node3;
3081 node3 = node->GetNext();
3083 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3086 pWayPointMan->DestroyWaypoint(
3094 if (g_pMarkInfoDialog) {
3095 g_pMarkInfoDialog->ClearData();
3098 pLayerList->DeleteObject(layer);
3102 gFrame->RefreshAllCanvas();
3104 m_bNeedConfigFlush =
false;
3107void RouteManagerDialog::OnLayToggleChartClick(wxCommandEvent &event) {
3111 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3112 if (item == -1)
return;
3114 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3118 layer->SetVisibleOnChart(!layer->IsVisibleOnChart());
3119 m_pLayListCtrl->SetItemImage(item, layer->IsVisibleOnChart() ? 0 : 1);
3121 ToggleLayerContentsOnChart(layer);
3124void RouteManagerDialog::ToggleLayerContentsOnChart(
Layer *layer) {
3126 wxRouteListNode *node1 = pRouteList->GetFirst();
3128 Route *pRoute = node1->GetData();
3130 pRoute->SetVisible(layer->IsVisibleOnChart());
3132 node1 = node1->GetNext();
3135 for (
Track *pTrack : g_TrackList) {
3136 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID)) {
3137 pTrack->SetVisible(layer->IsVisibleOnChart());
3138 NavObj_dB::GetInstance().UpdateDBTrackAttributes(pTrack);
3143 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3147 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3148 rp->SetVisible(layer->IsVisibleOnChart());
3151 node = node->GetNext();
3157 gFrame->RefreshAllCanvas();
3160void RouteManagerDialog::OnLayToggleNamesClick(wxCommandEvent &event) {
3164 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3165 if (item == -1)
return;
3167 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3171 layer->SetVisibleNames(cbLayToggleNames->Get3StateValue());
3173 ToggleLayerContentsNames(layer);
3176void RouteManagerDialog::ToggleLayerContentsNames(
Layer *layer) {
3178 wxRouteListNode *node1 = pRouteList->GetFirst();
3180 Route *pRoute = node1->GetData();
3185 if (layer->HasVisibleNames() == wxCHK_UNDETERMINED) {
3188 prp1->
m_bShowName = (layer->HasVisibleNames() == wxCHK_CHECKED);
3190 node = node->GetNext();
3193 node1 = node1->GetNext();
3197 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3201 if (rp && (rp->
m_LayerID == layer->m_LayerID)) {
3202 rp->SetNameShown(layer->HasVisibleNames() == wxCHK_CHECKED ||
3204 layer->HasVisibleNames() == wxCHK_UNDETERMINED));
3207 node = node->GetNext();
3212 gFrame->RefreshAllCanvas();
3215void RouteManagerDialog::OnLayToggleListingClick(wxCommandEvent &event) {
3219 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3220 if (item == -1)
return;
3222 Layer *layer = (
Layer *)m_pLayListCtrl->GetItemData(item);
3226 layer->SetVisibleOnListing(!layer->IsVisibleOnListing());
3228 ToggleLayerContentsOnListing(layer);
3231void RouteManagerDialog::ToggleLayerContentsOnListing(
Layer *layer) {
3232 ::wxBeginBusyCursor();
3235 wxRouteListNode *node1 = pRouteList->GetFirst();
3237 Route *pRoute = node1->GetData();
3239 pRoute->SetListed(layer->IsVisibleOnListing());
3241 node1 = node1->GetNext();
3244 for (
Track *pTrack : g_TrackList) {
3245 if (pTrack->m_bIsInLayer && (pTrack->m_LayerID == layer->m_LayerID))
3246 pTrack->SetListed(layer->IsVisibleOnListing());
3253 wxRoutePointListNode *node = pWayPointMan->GetWaypointList()->GetFirst();
3258 rp->SetListed(layer->IsVisibleOnListing());
3261 node = node->GetNext();
3266 ::wxEndBusyCursor();
3268 gFrame->RefreshAllCanvas();
3271void RouteManagerDialog::OnLayDefaultAction(wxListEvent &event) {
3273 OnLayPropertiesClick(evt);
3276void RouteManagerDialog::UpdateLayListCtrl() {
3280 m_pLayListCtrl->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
3282 wxUIntPtr selected_id = wxUIntPtr(0);
3283 if (item != -1) selected_id = m_pLayListCtrl->GetItemData(item);
3286 m_pLayListCtrl->DeleteAllItems();
3289 LayerList::iterator it;
3291 bool b_anyHidden =
false;
3292 for (it = (*pLayerList).begin(); it != (*pLayerList).end(); ++it, ++index) {
3295 if (!lay->m_LayerName.Upper().Contains(m_tFilterLay->GetValue().Upper())) {
3301 li.SetImage(lay->IsVisibleOnChart() ? 0 : 1);
3305 long idx = m_pLayListCtrl->InsertItem(li);
3307 wxString name = lay->m_LayerName;
3308 if (name.IsEmpty()) {
3315 name = _(
"(Unnamed Layer)");
3317 m_pLayListCtrl->SetItem(idx, colLAYNAME, name);
3320 len.Printf(wxT(
"%d"), (
int)lay->m_NoOfItems);
3321 m_pLayListCtrl->SetItem(idx, colLAYITEMS, len);
3322 m_pLayListCtrl->SetItem(idx, colLAYPERSIST, lay->m_LayerType);
3327 lic.SetAlign(wxLIST_FORMAT_LEFT);
3328 m_pLayListCtrl->SetItem(lic);
3331 lic.SetAlign(wxLIST_FORMAT_LEFT);
3332 m_pLayListCtrl->SetItem(lic);
3334 if (!lay->IsVisibleOnChart()) b_anyHidden =
true;
3337 m_pLayListCtrl->SortItems(SortLayersOnName,
3338 reinterpret_cast<wxIntPtr
>(m_pLayListCtrl));
3339 m_pLayListCtrl->SetColumnWidth(0, 4 * m_charWidth);
3344 if (selected_id != wxUIntPtr(0)) {
3345 item = m_pLayListCtrl->FindItem(-1, selected_id);
3346 m_pLayListCtrl->SetItemState(item,
3347 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED,
3348 wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED);
3352 m_cbShowAllLay->SetValue(!b_anyHidden);
3355void RouteManagerDialog::OnImportClick(wxCommandEvent &event) {
3364 gFrame->RefreshAllCanvas();
3366void RouteManagerDialog::OnExportClick(wxCommandEvent &event) {
3370void RouteManagerDialog::OnBackupClick(wxCommandEvent &event) {
3371 int result = BackupDatabase(
this);
3372 if (result == wxID_YES) {
3373 OCPNMessageBox(NULL, _(
"Backup successful"), _(
"Backup result"),
3374 wxICON_INFORMATION | wxOK);
3375 }
else if (result == wxID_NO) {
3376 OCPNMessageBox(NULL, _(
"Backup Failed\nCheck the OpenCPN Logs"),
3377 _(
"Backup result"), wxICON_INFORMATION | wxOK);
3382void RouteManagerDialog::OnExportVizClick(wxCommandEvent &event) {
3383 ExportGPX(
this,
true,
true);
3386void RouteManagerDialog::OnFilterChanged(wxCommandEvent &event) {
3387 if (event.GetEventObject() == m_tFilterWpt) {
3388 UpdateWptListCtrl(NULL,
true);
3389 }
else if (event.GetEventObject() == m_tFilterRte) {
3390 UpdateRouteListCtrl();
3391 }
else if (event.GetEventObject() == m_tFilterTrk) {
3392 UpdateTrkListCtrl();
3393 }
else if (event.GetEventObject() == m_tFilterLay) {
3394 UpdateLayListCtrl();
Class AisDecoder and helpers.
Represents an active track that is currently being recorded.
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_bShowName
Flag indicating if the waypoint name should be shown.
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.
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
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.
int m_LayerID
Identifier of the layer containing this route.
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.
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.
MdnsCache mDNS host lookups cache.