10#include <wx/dataview.h>
11#include <wx/datectrl.h>
12#include <wx/datetime.h>
15#include <wx/menuitem.h>
16#include <wx/notebook.h>
17#include <wx/scrolwin.h>
19#include <wx/stattext.h>
21#include <wx/textctrl.h>
22#include <wx/timectrl.h>
26#include "model/nav_object_database.h"
27#include "model/ocpn_types.h"
28#include "routeman_gui.h"
29#include "model/routeman.h"
30#include "routemanagerdialog.h"
31#include "RoutePropDlg.h"
32#include "RoutePropDlgImpl.h"
35#if wxCHECK_VERSION(3, 1, 2)
36#define CELL_EDITABLE wxDATAVIEW_CELL_EDITABLE
38#define CELL_EDITABLE wxDATAVIEW_CELL_INERT
43#ifdef __OCPN__ANDROID__
44EVT_CHAR(RoutePropDlg::OnKeyChar)
54 ctx.set_route_and_update = [&](
Route* r) {
55 if (pRoutePropDialog && (pRoutePropDialog->IsShown())) {
56 pRoutePropDialog->SetRouteAndUpdate(r,
true);
60 if (pRoutePropDialog && pRoutePropDialog->IsShown()) {
61 if (pRoutePropDialog->GetRoute() == r) {
62 pRoutePropDialog->SetEnroutePoint(rt);
66 ctx.hide = [&](
Route* r) {
67 if (pRoutePropDialog && (pRoutePropDialog->IsShown()) &&
68 (r == pRoutePropDialog->GetRoute())) {
69 pRoutePropDialog->Hide();
72 auto RouteMgrDlgUpdateListCtrl = [&]() {
73 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
74 pRouteManagerDialog->UpdateRouteListCtrl();
79RoutePropDlg::RoutePropDlg(wxWindow* parent, wxWindowID
id,
80 const wxString& title,
const wxPoint& pos,
81 const wxSize& size,
long style)
82 : DIALOG_PARENT(parent, id, title, pos, size, style) {
86 this->SetSizeHints(wxSize(300, 300), wxDefaultSize);
88 wxBoxSizer* bSizerMain;
89 bSizerMain =
new wxBoxSizer(wxVERTICAL);
92 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
93 m_pnlBasic =
new wxPanel(m_ntbRteProp, wxID_ANY, wxDefaultPosition,
94 wxDefaultSize, wxTAB_TRAVERSAL);
95 wxBoxSizer* bSizerData;
96 bSizerData =
new wxBoxSizer(wxVERTICAL);
98 wxBoxSizer* bSizerName;
99 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
101 m_stName =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Name"),
102 wxDefaultPosition, wxDefaultSize, 0);
104 bSizerName->Add(m_stName, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
106 m_tcName =
new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString,
107 wxDefaultPosition, wxDefaultSize, 0);
108 bSizerName->Add(m_tcName, 1, wxALL, 5);
110 bSizerData->Add(bSizerName, 0, wxEXPAND, 5);
112 wxBoxSizer* bSizerFromTo;
113 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
115 m_stFrom =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"From"),
116 wxDefaultPosition, wxDefaultSize, 0);
118 bSizerFromTo->Add(m_stFrom, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
120 m_tcFrom =
new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString,
121 wxDefaultPosition, wxDefaultSize, 0);
122 bSizerFromTo->Add(m_tcFrom, 1, wxALL, 5);
124 m_stTo =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
127 bSizerFromTo->Add(m_stTo, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
129 m_tcTo =
new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString,
130 wxDefaultPosition, wxDefaultSize, 0);
131 bSizerFromTo->Add(m_tcTo, 1, wxALL, 5);
133 bSizerData->Add(bSizerFromTo, 0, wxEXPAND, 5);
135 wxWrapSizer* wSizerParams;
136 wSizerParams =
new wxWrapSizer(wxHORIZONTAL, wxEXTEND_LAST_ON_EACH_LINE |
137 wxREMOVE_LEADING_SPACES |
138 wxWRAPSIZER_DEFAULT_FLAGS);
140 int maxFieldSize = GetCharWidth() * 10;
142 wxBoxSizer* bSizerDistance;
143 bSizerDistance =
new wxBoxSizer(wxVERTICAL);
145 m_stDistTotal =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Distance"),
146 wxDefaultPosition, wxDefaultSize, 0);
147 m_stDistTotal->Wrap(-1);
148 bSizerDistance->Add(m_stDistTotal, 0, wxALL, 5);
151 new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
152 wxDefaultSize, wxTE_READONLY);
153 m_tcDistance->SetToolTip(
154 _(
"Total route distance calculated using rhumb line (Mercator) distances "
155 "between waypoints. Rhumb lines maintain a constant bearing but may "
156 "not represent the shortest path between points."));
157 m_tcDistance->SetMaxSize(wxSize(maxFieldSize, -1));
158 m_tcDistance->SetMinSize(wxSize(maxFieldSize, -1));
160 bSizerDistance->Add(m_tcDistance, 0, wxALL | wxEXPAND, 5);
162 wSizerParams->Add(bSizerDistance, 1, wxEXPAND, 0);
164 wxBoxSizer* bSizerSpeed;
165 bSizerSpeed =
new wxBoxSizer(wxVERTICAL);
167 m_stPlanSpeed =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Plan speed"),
168 wxDefaultPosition, wxDefaultSize, 0);
169 m_stPlanSpeed->Wrap(-1);
170 bSizerSpeed->Add(m_stPlanSpeed, 0, wxALL, 5);
173 new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
174 wxDefaultSize, wxTE_PROCESS_ENTER);
175 m_tcPlanSpeed->SetToolTip(
176 _(
"Default speed in knots used for route time calculations. This speed "
177 "is used for all legs unless individual waypoints have their own "
178 "planned speed values. Time calculations use both the planned speed "
179 "and the rhumb line distances between waypoints."));
180 m_tcPlanSpeed->SetMaxSize(wxSize(maxFieldSize, -1));
181 m_tcPlanSpeed->SetMinSize(wxSize(maxFieldSize, -1));
183 bSizerSpeed->Add(m_tcPlanSpeed, 0, wxALL, 5);
185 wSizerParams->Add(bSizerSpeed, 1, wxEXPAND, 0);
188 wxBoxSizer* bSizerEnroute;
189 bSizerEnroute =
new wxBoxSizer(wxVERTICAL);
191 m_stEnroute =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Enroute"),
192 wxDefaultPosition, wxDefaultSize, 0);
193 m_stEnroute->Wrap(-1);
194 bSizerEnroute->Add(m_stEnroute, 0, wxALL, 5);
196 m_tcEnroute =
new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString,
197 wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
198 m_tcEnroute->SetToolTip(
199 _(
"Estimated total time to complete the route based on planned speeds "
200 "and rhumb line distances. For each leg, the calculation uses the "
201 "waypoint's planned speed if available, or the route's default speed "
202 "if not specified. The time is calculated as: distance รท speed for "
203 "each leg, then summed for the entire route."));
204 m_tcEnroute->SetMaxSize(wxSize(maxFieldSize, -1));
205 m_tcEnroute->SetMinSize(wxSize(maxFieldSize, -1));
207 bSizerEnroute->Add(m_tcEnroute, 0, wxALL, 5);
209 wSizerParams->Add(bSizerEnroute, 1, wxEXPAND, 0);
212 wxBoxSizer* bSizerDeparture;
213 bSizerDeparture =
new wxBoxSizer(wxVERTICAL);
215 m_stDeparture =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Departure"),
216 wxDefaultPosition, wxDefaultSize, 0);
217 m_stDeparture->Wrap(-1);
218 bSizerDeparture->Add(m_stDeparture, 0, wxALL, 5);
220 wxBoxSizer* bSizerDepartureTS;
221 bSizerDepartureTS =
new wxBoxSizer(wxHORIZONTAL);
222 bSizerDeparture->Add(bSizerDepartureTS, 0, 0, 5);
225 new wxDatePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
226 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
227 bSizerDepartureTS->Add(m_dpDepartureDate, 0, wxALIGN_CENTER_VERTICAL | wxALL,
230 int ys = GetCharHeight();
231 m_dpDepartureDate->SetMinSize(wxSize(-1, ys * 15 / 10));
235 m_tpDepartureTime =
new TimeCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
236 wxDefaultPosition, wxDefaultSize);
239 new wxTimePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
240 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
242 bSizerDepartureTS->Add(m_tpDepartureTime, 0, wxALIGN_CENTER_VERTICAL | wxALL,
245 wSizerParams->Add(bSizerDeparture, 1, wxEXPAND, 0);
247 wxBoxSizer* bSizerTime;
248 bSizerTime =
new wxBoxSizer(wxVERTICAL);
250 m_stTimeZone =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Time"),
251 wxDefaultPosition, wxDefaultSize, 0);
252 m_stTimeZone->Wrap(-1);
253 bSizerTime->Add(m_stTimeZone, 0, wxALL, 5);
256 wxString m_choiceTimezoneChoices[] = {
257 _(
"UTC"), _(
"Local Time"), _(
"LMT@Location"), _(
"Honor Global Settings")};
258 int m_choiceTimezoneNChoices =
259 sizeof(m_choiceTimezoneChoices) /
sizeof(wxString);
261 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
262 m_choiceTimezoneNChoices, m_choiceTimezoneChoices, 0);
263 m_choiceTimezone->SetSelection(3 );
264 m_choiceTimezone->SetMaxSize(wxSize(GetCharWidth() * 12, -1));
266 bSizerTime->Add(m_choiceTimezone, 0, wxALL, 5);
268 wSizerParams->Add(bSizerTime, 1, wxEXPAND, 0);
270 wxBoxSizer* bSizerColor;
271 bSizerColor =
new wxBoxSizer(wxVERTICAL);
273 m_staticTextColor =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Color"),
274 wxDefaultPosition, wxDefaultSize, 0);
275 m_staticTextColor->Wrap(-1);
276 bSizerColor->Add(m_staticTextColor, 0, wxALL, 5);
278 wxString m_choiceColorChoices[] = {
279 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
280 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
281 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
282 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
284 int m_choiceColorNChoices =
sizeof(m_choiceColorChoices) /
sizeof(wxString);
286 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
287 m_choiceColorNChoices, m_choiceColorChoices, 0);
288 m_choiceColor->SetSelection(0);
289 bSizerColor->Add(m_choiceColor, 0, wxALL, 5);
291 wSizerParams->Add(bSizerColor, 1, wxEXPAND, 5);
293 wxBoxSizer* bSizerStyle;
294 bSizerStyle =
new wxBoxSizer(wxVERTICAL);
296 m_stStyle =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Style"),
297 wxDefaultPosition, wxDefaultSize, 0);
299 bSizerStyle->Add(m_stStyle, 0, wxALL, 5);
301 wxString m_choiceStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
302 _(
"Long dash"), _(
"Short dash")};
303 int m_choiceStyleNChoices =
sizeof(m_choiceStyleChoices) /
sizeof(wxString);
305 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
306 m_choiceStyleNChoices, m_choiceStyleChoices, 0);
307 m_choiceStyle->SetSelection(0);
308 bSizerStyle->Add(m_choiceStyle, 0, wxALL, 5);
310 wSizerParams->Add(bSizerStyle, 1, wxEXPAND, 5);
312 wxBoxSizer* bSizerWidth;
313 bSizerWidth =
new wxBoxSizer(wxVERTICAL);
315 m_stWidth =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Width"),
316 wxDefaultPosition, wxDefaultSize, 0);
318 bSizerWidth->Add(m_stWidth, 0, wxALL, 5);
320 wxString m_choiceWidthChoices[] = {
321 _(
"Default"), _(
"1 px"), _(
"2px"), _(
"3 px"), _(
"4 px"), _(
"5 px"),
322 _(
"6 px"), _(
"7 px"), _(
"8 px"), _(
"9 px"), _(
"10 px")};
323 int m_choiceWidthNChoices =
sizeof(m_choiceWidthChoices) /
sizeof(wxString);
325 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
326 m_choiceWidthNChoices, m_choiceWidthChoices, 0);
327 m_choiceWidth->SetSelection(0);
328 bSizerWidth->Add(m_choiceWidth, 0, wxALL, 5);
330 wSizerParams->Add(bSizerWidth, 1, wxEXPAND, 5);
335 wxString toLabel = _(
"To waypoint");
338 int columWidths[] = {
339 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
340 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
341 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
342 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
343 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE};
345 toLabel = _(
"To WP");
348 int columWidths[] = {
364 int colFlags = wxDATAVIEW_COL_RESIZABLE;
368 bSizerData->Add(wSizerParams, 0, wxEXPAND, 0);
371 new wxDataViewListCtrl(m_pnlBasic, wxID_ANY, wxDefaultPosition,
372 wxDefaultSize, wxDV_VERT_RULES | wxDV_HORIZ_RULES);
373 m_dataViewListColumnLeg = m_dvlcWaypoints->AppendTextColumn(
374 _(
"Leg"), wxDATAVIEW_CELL_INERT, columWidths[0],
375 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
376 m_dataViewListColumnLeg->GetRenderer()->EnableEllipsize(wxELLIPSIZE_NONE);
377 m_dataViewListColumnToWpt = m_dvlcWaypoints->AppendTextColumn(
378 toLabel, wxDATAVIEW_CELL_INERT, columWidths[1],
379 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
380 m_dataViewListColumnToWpt->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
381 m_dataViewListColumnDistance = m_dvlcWaypoints->AppendTextColumn(
382 _(
"Distance"), wxDATAVIEW_CELL_INERT, columWidths[2],
383 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
384 m_dataViewListColumnDistance->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
385 m_dataViewListColumnBearing = m_dvlcWaypoints->AppendTextColumn(
386 _(
"Bearing"), wxDATAVIEW_CELL_INERT, columWidths[3],
387 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
388 m_dataViewListColumnBearing->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
389 m_dataViewListColumnTotalDistance = m_dvlcWaypoints->AppendTextColumn(
390 _(
"Total Distance"), wxDATAVIEW_CELL_INERT, columWidths[4],
391 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
392 m_dataViewListColumnTotalDistance->GetRenderer()->EnableEllipsize(
394 m_dataViewListColumnLat = m_dvlcWaypoints->AppendTextColumn(
395 _(
"Latitude"), wxDATAVIEW_CELL_INERT, columWidths[5],
396 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
397 m_dataViewListColumnLat->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
398 m_dataViewListColumnLon = m_dvlcWaypoints->AppendTextColumn(
399 _(
"Longitude"), wxDATAVIEW_CELL_INERT, columWidths[6],
400 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
401 m_dataViewListColumnLon->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
402 m_dataViewListColumnETE = m_dvlcWaypoints->AppendTextColumn(
403 _(
"ETE"), wxDATAVIEW_CELL_INERT, columWidths[7],
404 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
405 m_dataViewListColumnETE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
406 m_dataViewListColumnETA = m_dvlcWaypoints->AppendTextColumn(
407 _(
"ETA"), wxDATAVIEW_CELL_INERT, columWidths[8],
408 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
409 m_dataViewListColumnETA->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
410 m_dataViewListColumnSpeed = m_dvlcWaypoints->AppendTextColumn(
411 _(
"Speed"), CELL_EDITABLE, columWidths[9],
412 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
413 m_dataViewListColumnSpeed->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
414 m_dataViewListColumnNTE = m_dvlcWaypoints->AppendTextColumn(
415 _(
"Next tide event"), wxDATAVIEW_CELL_INERT, columWidths[10],
416 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
417 m_dataViewListColumnNTE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
418 m_dataViewListColumnDesc = m_dvlcWaypoints->AppendTextColumn(
419 _(
"Description"), wxDATAVIEW_CELL_INERT, columWidths[11],
420 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
421 m_dataViewListColumnDesc->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
422 m_dataViewListColumnCourse = m_dvlcWaypoints->AppendTextColumn(
423 _(
"Course"), wxDATAVIEW_CELL_INERT, columWidths[12],
424 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
425 m_dataViewListColumnCourse->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
426 m_dataViewListColumnETD = m_dvlcWaypoints->AppendTextColumn(
427 _(
"ETD"), CELL_EDITABLE, columWidths[13],
428 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
429 m_dataViewListColumnETD->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
430 m_dataViewListColumnEmpty = m_dvlcWaypoints->AppendTextColumn(
431 wxEmptyString, wxDATAVIEW_CELL_INERT, columWidths[14],
432 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
433 bSizerData->Add(m_dvlcWaypoints, 1, wxALL | wxEXPAND, 5);
435 m_pnlBasic->SetSizer(bSizerData);
436 m_pnlBasic->Layout();
437 bSizerData->Fit(m_pnlBasic);
438 m_ntbRteProp->AddPage(m_pnlBasic, _(
"Basic"),
false);
439 m_pnlAdvanced =
new wxPanel(m_ntbRteProp, wxID_ANY, wxDefaultPosition,
440 wxDefaultSize, wxTAB_TRAVERSAL);
441 wxBoxSizer* bSizerAdvanced;
442 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
444 m_stDescription =
new wxStaticText(m_pnlAdvanced, wxID_ANY, _(
"Description"),
445 wxDefaultPosition, wxDefaultSize, 0);
446 m_stDescription->Wrap(-1);
447 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
450 new wxTextCtrl(m_pnlAdvanced, wxID_ANY, wxEmptyString, wxDefaultPosition,
451 wxDefaultSize, wxTE_MULTILINE);
452 bSizerAdvanced->Add(m_tcDescription, 0, wxALL | wxEXPAND, 5);
454 wxStaticBoxSizer* sbSizerLinks;
455 sbSizerLinks =
new wxStaticBoxSizer(
456 new wxStaticBox(m_pnlAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
458 m_scrolledWindowLinks =
new wxScrolledWindow(
459 sbSizerLinks->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize,
460 wxHSCROLL | wxVSCROLL);
461 m_scrolledWindowLinks->SetScrollRate(5, 5);
462 wxBoxSizer* bSizerLinksWnd;
463 bSizerLinksWnd =
new wxBoxSizer(wxVERTICAL);
465 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
468 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
469 wxT(
"http://www.wxformbuilder.org"),
470 wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
471 m_hyperlink1->Enable(
false);
472 m_hyperlink1->Hide();
474 m_menuLink =
new wxMenu();
475 wxMenuItem* m_menuItemEdit;
476 m_menuItemEdit =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Edit")),
477 wxEmptyString, wxITEM_NORMAL);
478 m_menuLink->Append(m_menuItemEdit);
480 wxMenuItem* m_menuItemAdd;
481 m_menuItemAdd =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Add new")),
482 wxEmptyString, wxITEM_NORMAL);
483 m_menuLink->Append(m_menuItemAdd);
485 wxMenuItem* m_menuItemDelete;
486 m_menuItemDelete =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Delete")),
487 wxEmptyString, wxITEM_NORMAL);
488 m_menuLink->Append(m_menuItemDelete);
490 m_hyperlink1->Connect(
492 wxMouseEventHandler(RoutePropDlg::m_hyperlink1OnContextMenu), NULL,
this);
494 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
496 bSizerLinksWnd->Add(bSizerLinks, 1, wxEXPAND, 5);
498 wxBoxSizer* bSizerLinkBtns;
499 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
501 m_btnAddLink =
new wxButton(m_scrolledWindowLinks, wxID_ANY, _(
"Add"),
502 wxDefaultPosition, wxDefaultSize, 0);
503 bSizerLinkBtns->Add(m_btnAddLink, 0, wxALL, 5);
506 new wxToggleButton(m_scrolledWindowLinks, wxID_ANY, _(
"Edit"),
507 wxDefaultPosition, wxDefaultSize, 0);
508 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
511 new wxStaticText(m_scrolledWindowLinks, wxID_ANY,
512 _(
"Links are opened in the default browser."),
513 wxDefaultPosition, wxDefaultSize, 0);
514 m_stEditEnabled->Wrap(-1);
515 bSizerLinkBtns->Add(m_stEditEnabled, 0, wxALL, 5);
517 bSizerLinksWnd->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
519 m_scrolledWindowLinks->SetSizer(bSizerLinksWnd);
520 m_scrolledWindowLinks->Layout();
521 bSizerLinksWnd->Fit(m_scrolledWindowLinks);
522 m_menuLinks =
new wxMenu();
523 wxMenuItem* m_menuItemAddLink;
525 new wxMenuItem(m_menuLinks, wxID_ANY, wxString(_(
"Add new")),
526 wxEmptyString, wxITEM_NORMAL);
527 m_menuLinks->Append(m_menuItemAddLink);
529 m_scrolledWindowLinks->Connect(
531 wxMouseEventHandler(RoutePropDlg::m_scrolledWindowLinksOnContextMenu),
534 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
536 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
538 m_pnlAdvanced->SetSizer(bSizerAdvanced);
539 m_pnlAdvanced->Layout();
540 bSizerAdvanced->Fit(m_pnlAdvanced);
541 m_ntbRteProp->AddPage(m_pnlAdvanced, _(
"Advanced"),
false);
543 bSizerMain->Add(m_ntbRteProp, 1, wxEXPAND | wxALL, 5);
545 wxWrapSizer* wSizerCustomBtns;
546 wSizerCustomBtns =
new wxWrapSizer(wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS);
548 m_btnPrint =
new wxButton(
this, wxID_ANY, _(
"Print"), wxDefaultPosition,
550 wSizerCustomBtns->Add(m_btnPrint, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
552#ifdef __OCPN__ANDROID__
556 m_btnExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"), wxDefaultPosition,
558 m_btnExtend->SetToolTip(_(
559 "Extend this route by connecting it to another route. The button is "
560 "disabled when: the route is active, is part of a layer, or there is no "
561 "suitable route to connect to. A suitable route must be visible, "
562 "different from this route, and share a common waypoint with this route "
563 "(or have a waypoint very close to the last point of this route)."));
564 wSizerCustomBtns->Add(m_btnExtend, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
566 m_btnSplit =
new wxButton(
this, wxID_ANY, _(
"Split"), wxDefaultPosition,
568 wSizerCustomBtns->Add(m_btnSplit, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
570 wSizerCustomBtns->Add(0, 0, 1, wxEXPAND, 5);
572 m_sdbSizerBtns =
new wxStdDialogButtonSizer();
573 m_sdbSizerBtnsOK =
new wxButton(
this, wxID_OK);
574 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsOK);
575 m_sdbSizerBtnsCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"));
576 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsCancel);
577 m_sdbSizerBtns->Realize();
579 wSizerCustomBtns->Add(m_sdbSizerBtns, 1, wxEXPAND, 5);
581 bSizerMain->Add(wSizerCustomBtns, 0, wxEXPAND, 0);
583 this->SetSizer(bSizerMain);
586 this->Centre(wxBOTH);
589 this->Connect(wxEVT_CLOSE_WINDOW,
590 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
591 this->Connect(wxEVT_SIZE,
592 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
593 m_ntbRteProp->Connect(
594 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
595 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
597 m_tcPlanSpeed->Connect(
598 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
600 m_tcPlanSpeed->Connect(
601 wxEVT_COMMAND_TEXT_ENTER,
602 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
603 m_tcPlanSpeed->Connect(
604 wxEVT_COMMAND_TEXT_UPDATED,
605 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
606 m_dpDepartureDate->Connect(
608 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
609 m_tpDepartureTime->Connect(
611 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
612 m_choiceTimezone->Connect(
613 wxEVT_COMMAND_CHOICE_SELECTED,
614 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
615 m_dvlcWaypoints->Connect(
616 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
617 wxDataViewEventHandler(
618 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
620 m_dvlcWaypoints->Connect(
621 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
622 wxDataViewEventHandler(
623 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
625 m_dvlcWaypoints->Connect(
626 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
627 wxDataViewEventHandler(
628 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
630 m_dvlcWaypoints->Connect(
631 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
632 wxDataViewEventHandler(
633 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
635 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
636 wxCommandEventHandler(RoutePropDlg::ItemEditOnMenuSelection),
637 this, m_menuItemEdit->GetId());
638 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
639 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
640 this, m_menuItemAdd->GetId());
642 wxEVT_COMMAND_MENU_SELECTED,
643 wxCommandEventHandler(RoutePropDlg::ItemDeleteOnMenuSelection),
this,
644 m_menuItemDelete->GetId());
645 m_btnAddLink->Connect(
646 wxEVT_COMMAND_BUTTON_CLICKED,
647 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
648 m_toggleBtnEdit->Connect(
649 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
650 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
651 m_menuLinks->Bind(wxEVT_COMMAND_MENU_SELECTED,
652 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
653 this, m_menuItemAddLink->GetId());
654 m_btnPrint->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
655 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick),
657 m_btnExtend->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
658 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick),
660 m_btnSplit->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
661 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick),
663 m_sdbSizerBtnsCancel->Connect(
664 wxEVT_COMMAND_BUTTON_CLICKED,
665 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
666 m_sdbSizerBtnsOK->Connect(
667 wxEVT_COMMAND_BUTTON_CLICKED,
668 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
670 auto navobj = NavObjectChanges::getInstance();
672 navobj_del_track_listener.Listen(navobj->evt_delete_track,
this,
673 EVT_ROUTEMAN_DEL_TRK);
675 auto t = std::const_pointer_cast<Track>(UnpackEvtPointer<Track>(ev));
679 wxDEFINE_EVENT(EVT_ROUTEMAN_DEL_ROUTE,
ObservedEvt);
680 navobj_del_route_listener.Listen(navobj->evt_delete_route,
this,
681 EVT_ROUTEMAN_DEL_ROUTE);
682 Bind(EVT_ROUTEMAN_DEL_ROUTE, [&](
ObservedEvt& ev) {
683 auto r = std::const_pointer_cast<Route>(UnpackEvtPointer<Route>(ev));
688RoutePropDlg::~RoutePropDlg() {
690 this->Disconnect(wxEVT_CLOSE_WINDOW,
691 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
692 this->Disconnect(wxEVT_SIZE,
693 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
694 m_ntbRteProp->Disconnect(
695 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
696 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
698 m_tcPlanSpeed->Disconnect(
699 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
701 m_tcPlanSpeed->Disconnect(
702 wxEVT_COMMAND_TEXT_ENTER,
703 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
704 m_tcPlanSpeed->Disconnect(
705 wxEVT_COMMAND_TEXT_UPDATED,
706 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
709 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
712 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
713 m_choiceTimezone->Disconnect(
714 wxEVT_COMMAND_CHOICE_SELECTED,
715 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
716 m_dvlcWaypoints->Disconnect(
717 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
718 wxDataViewEventHandler(
719 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
721 m_dvlcWaypoints->Disconnect(
722 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
723 wxDataViewEventHandler(
724 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
726 m_dvlcWaypoints->Disconnect(
727 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
728 wxDataViewEventHandler(
729 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
731 m_dvlcWaypoints->Disconnect(
732 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
733 wxDataViewEventHandler(
734 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
736 m_btnAddLink->Disconnect(
737 wxEVT_COMMAND_BUTTON_CLICKED,
738 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
739 m_toggleBtnEdit->Disconnect(
740 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
741 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
742 m_btnPrint->Disconnect(
743 wxEVT_COMMAND_BUTTON_CLICKED,
744 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick), NULL,
this);
745 m_btnExtend->Disconnect(
746 wxEVT_COMMAND_BUTTON_CLICKED,
747 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick), NULL,
this);
748 m_btnSplit->Disconnect(
749 wxEVT_COMMAND_BUTTON_CLICKED,
750 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick), NULL,
this);
751 m_sdbSizerBtnsCancel->Disconnect(
752 wxEVT_COMMAND_BUTTON_CLICKED,
753 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
754 m_sdbSizerBtnsOK->Disconnect(
755 wxEVT_COMMAND_BUTTON_CLICKED,
756 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
762void RoutePropDlg::OnKeyChar(wxKeyEvent& event) {
763 int key_char =
event.GetKeyCode();
Custom event class for OpenCPN's notification system.
Represents a waypoint or mark within the navigation system.
wxTimePickerCtrl * m_tpDepartureTime
The time picker for the departure time of the route.
wxDatePickerCtrl * m_dpDepartureDate
The date picker for the departure date of the route.
Represents a navigational route in the navigation system.
bool DeleteRoute(Route *pRoute, NavObjectChanges *nav_obj_changes)
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
Callbacks for RoutePropDlg.