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>
25#include "model/nav_object_database.h"
32#include "route_prop_dlg.h"
36#if wxCHECK_VERSION(3, 1, 2)
37#define CELL_EDITABLE wxDATAVIEW_CELL_EDITABLE
39#define CELL_EDITABLE wxDATAVIEW_CELL_INERT
45EVT_CHAR(RoutePropDlg::OnKeyChar)
51 ctx.set_route_and_update = [&](
Route* r) {
63 ctx.hide = [&](
Route* r) {
69 auto RouteMgrDlgUpdateListCtrl = [&]() {
70 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
71 pRouteManagerDialog->UpdateRouteListCtrl();
76RoutePropDlg::RoutePropDlg(wxWindow* parent, wxWindowID
id,
77 const wxString& title,
const wxPoint& pos,
78 const wxSize& size,
long style)
79 : DIALOG_PARENT(parent, id, title, pos, size, style) {
83 this->SetSizeHints(wxSize(300, 300), wxDefaultSize);
85 wxBoxSizer* bSizerMain;
86 bSizerMain =
new wxBoxSizer(wxVERTICAL);
89 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
90 m_pnlBasic =
new wxPanel(m_ntbRteProp, wxID_ANY, wxDefaultPosition,
91 wxDefaultSize, wxTAB_TRAVERSAL);
92 wxBoxSizer* bSizerData;
93 bSizerData =
new wxBoxSizer(wxVERTICAL);
95 wxBoxSizer* bSizerName;
96 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
98 m_stName =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Name"),
99 wxDefaultPosition, wxDefaultSize, 0);
101 bSizerName->Add(m_stName, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
103 m_tcName =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
105 bSizerName->Add(m_tcName, 1, wxALL, 5);
107 bSizerData->Add(bSizerName, 0, wxEXPAND, 5);
109 wxBoxSizer* bSizerFromTo;
110 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
112 m_stFrom =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"From"),
113 wxDefaultPosition, wxDefaultSize, 0);
115 bSizerFromTo->Add(m_stFrom, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
117 m_tcFrom =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
119 bSizerFromTo->Add(m_tcFrom, 1, wxALL, 5);
121 m_stTo =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
124 bSizerFromTo->Add(m_stTo, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
126 m_tcTo =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
128 bSizerFromTo->Add(m_tcTo, 1, wxALL, 5);
130 bSizerData->Add(bSizerFromTo, 0, wxEXPAND, 5);
132 wxWrapSizer* wSizerParams;
133 wSizerParams =
new wxWrapSizer(wxHORIZONTAL, wxEXTEND_LAST_ON_EACH_LINE |
134 wxREMOVE_LEADING_SPACES |
135 wxWRAPSIZER_DEFAULT_FLAGS);
137 int maxFieldSize = GetCharWidth() * 10;
139 wxBoxSizer* bSizerDistance;
140 bSizerDistance =
new wxBoxSizer(wxVERTICAL);
142 m_stDistTotal =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Distance"),
143 wxDefaultPosition, wxDefaultSize, 0);
144 m_stDistTotal->Wrap(-1);
145 bSizerDistance->Add(m_stDistTotal, 0, wxALL, 5);
147 m_tcDistance =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
148 wxDefaultSize, wxTE_READONLY);
149 m_tcDistance->SetToolTip(
150 _(
"Total route distance calculated using rhumb line (Mercator) distances "
151 "between waypoints. Rhumb lines maintain a constant bearing but may "
152 "not represent the shortest path between points."));
153 m_tcDistance->SetMaxSize(wxSize(maxFieldSize, -1));
154 m_tcDistance->SetMinSize(wxSize(maxFieldSize, -1));
156 bSizerDistance->Add(m_tcDistance, 0, wxALL | wxEXPAND, 5);
158 wSizerParams->Add(bSizerDistance, 1, wxEXPAND, 0);
160 wxBoxSizer* bSizerSpeed;
161 bSizerSpeed =
new wxBoxSizer(wxVERTICAL);
163 m_stPlanSpeed =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Plan speed"),
164 wxDefaultPosition, wxDefaultSize, 0);
165 m_stPlanSpeed->Wrap(-1);
166 bSizerSpeed->Add(m_stPlanSpeed, 0, wxALL, 5);
168 m_tcPlanSpeed =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
169 wxDefaultSize, wxTE_PROCESS_ENTER);
170 m_tcPlanSpeed->SetToolTip(
171 _(
"Default speed in knots used for route time calculations. This speed "
172 "is used for all legs unless individual waypoints have their own "
173 "planned speed values. Time calculations use both the planned speed "
174 "and the rhumb line distances between waypoints."));
175 m_tcPlanSpeed->SetMaxSize(wxSize(maxFieldSize, -1));
176 m_tcPlanSpeed->SetMinSize(wxSize(maxFieldSize, -1));
178 bSizerSpeed->Add(m_tcPlanSpeed, 0, wxALL, 5);
180 wSizerParams->Add(bSizerSpeed, 1, wxEXPAND, 0);
183 wxBoxSizer* bSizerEnroute;
184 bSizerEnroute =
new wxBoxSizer(wxVERTICAL);
186 m_stEnroute =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Enroute"),
187 wxDefaultPosition, wxDefaultSize, 0);
188 m_stEnroute->Wrap(-1);
189 bSizerEnroute->Add(m_stEnroute, 0, wxALL, 5);
191 m_tcEnroute =
new wxTextCtrl(m_pnlBasic, wxID_ANY,
"", wxDefaultPosition,
192 wxDefaultSize, wxTE_READONLY);
193 m_tcEnroute->SetToolTip(
194 _(
"Estimated total time to complete the route based on planned speeds "
195 "and rhumb line distances. For each leg, the calculation uses the "
196 "waypoint's planned speed if available, or the route's default speed "
197 "if not specified. The time is calculated as: distance รท speed for "
198 "each leg, then summed for the entire route."));
199 m_tcEnroute->SetMaxSize(wxSize(maxFieldSize, -1));
200 m_tcEnroute->SetMinSize(wxSize(maxFieldSize, -1));
202 bSizerEnroute->Add(m_tcEnroute, 0, wxALL, 5);
204 wSizerParams->Add(bSizerEnroute, 1, wxEXPAND, 0);
207 wxBoxSizer* bSizerDeparture;
208 bSizerDeparture =
new wxBoxSizer(wxVERTICAL);
210 m_stDeparture =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Departure"),
211 wxDefaultPosition, wxDefaultSize, 0);
212 m_stDeparture->Wrap(-1);
213 bSizerDeparture->Add(m_stDeparture, 0, wxALL, 5);
215 wxBoxSizer* bSizerDepartureTS;
216 bSizerDepartureTS =
new wxBoxSizer(wxHORIZONTAL);
217 bSizerDeparture->Add(bSizerDepartureTS, 0, 0, 5);
220 new wxDatePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
221 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
222 bSizerDepartureTS->Add(m_dpDepartureDate, 0, wxALIGN_CENTER_VERTICAL | wxALL,
225 int ys = GetCharHeight();
226 m_dpDepartureDate->SetMinSize(wxSize(-1, ys * 15 / 10));
230 m_tpDepartureTime =
new TimeCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
231 wxDefaultPosition, wxDefaultSize);
234 new wxTimePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
235 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
237 bSizerDepartureTS->Add(m_tpDepartureTime, 0, wxALIGN_CENTER_VERTICAL | wxALL,
240 wSizerParams->Add(bSizerDeparture, 1, wxEXPAND, 0);
242 wxBoxSizer* bSizerTime;
243 bSizerTime =
new wxBoxSizer(wxVERTICAL);
245 m_stTimeZone =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Time"),
246 wxDefaultPosition, wxDefaultSize, 0);
247 m_stTimeZone->Wrap(-1);
248 bSizerTime->Add(m_stTimeZone, 0, wxALL, 5);
251 wxString m_choiceTimezoneChoices[] = {
252 _(
"UTC"), _(
"Local Time"), _(
"LMT@Location"), _(
"Honor Global Settings")};
253 int m_choiceTimezoneNChoices =
254 sizeof(m_choiceTimezoneChoices) /
sizeof(wxString);
256 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
257 m_choiceTimezoneNChoices, m_choiceTimezoneChoices, 0);
258 m_choiceTimezone->SetSelection(3 );
259 m_choiceTimezone->SetMaxSize(wxSize(GetCharWidth() * 12, -1));
261 bSizerTime->Add(m_choiceTimezone, 0, wxALL, 5);
263 wSizerParams->Add(bSizerTime, 1, wxEXPAND, 0);
265 wxBoxSizer* bSizerColor;
266 bSizerColor =
new wxBoxSizer(wxVERTICAL);
268 m_staticTextColor =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Color"),
269 wxDefaultPosition, wxDefaultSize, 0);
270 m_staticTextColor->Wrap(-1);
271 bSizerColor->Add(m_staticTextColor, 0, wxALL, 5);
273 wxString m_choiceColorChoices[] = {
274 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
275 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
276 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
277 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
279 int m_choiceColorNChoices =
sizeof(m_choiceColorChoices) /
sizeof(wxString);
281 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
282 m_choiceColorNChoices, m_choiceColorChoices, 0);
283 m_choiceColor->SetSelection(0);
284 bSizerColor->Add(m_choiceColor, 0, wxALL, 5);
286 wSizerParams->Add(bSizerColor, 1, wxEXPAND, 5);
288 wxBoxSizer* bSizerStyle;
289 bSizerStyle =
new wxBoxSizer(wxVERTICAL);
291 m_stStyle =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Style"),
292 wxDefaultPosition, wxDefaultSize, 0);
294 bSizerStyle->Add(m_stStyle, 0, wxALL, 5);
296 wxString m_choiceStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
297 _(
"Long dash"), _(
"Short dash")};
298 int m_choiceStyleNChoices =
sizeof(m_choiceStyleChoices) /
sizeof(wxString);
300 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
301 m_choiceStyleNChoices, m_choiceStyleChoices, 0);
302 m_choiceStyle->SetSelection(0);
303 bSizerStyle->Add(m_choiceStyle, 0, wxALL, 5);
305 wSizerParams->Add(bSizerStyle, 1, wxEXPAND, 5);
307 wxBoxSizer* bSizerWidth;
308 bSizerWidth =
new wxBoxSizer(wxVERTICAL);
310 m_stWidth =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Width"),
311 wxDefaultPosition, wxDefaultSize, 0);
313 bSizerWidth->Add(m_stWidth, 0, wxALL, 5);
315 wxString m_choiceWidthChoices[] = {
316 _(
"Default"), _(
"1 px"), _(
"2px"), _(
"3 px"), _(
"4 px"), _(
"5 px"),
317 _(
"6 px"), _(
"7 px"), _(
"8 px"), _(
"9 px"), _(
"10 px")};
318 int m_choiceWidthNChoices =
sizeof(m_choiceWidthChoices) /
sizeof(wxString);
320 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
321 m_choiceWidthNChoices, m_choiceWidthChoices, 0);
322 m_choiceWidth->SetSelection(0);
323 bSizerWidth->Add(m_choiceWidth, 0, wxALL, 5);
325 wSizerParams->Add(bSizerWidth, 1, wxEXPAND, 5);
330 wxString toLabel = _(
"To waypoint");
333 int columWidths[] = {
334 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
335 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
336 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
337 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
338 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE};
340 toLabel = _(
"To WP");
343 int columWidths[] = {
359 int colFlags = wxDATAVIEW_COL_RESIZABLE;
363 bSizerData->Add(wSizerParams, 0, wxEXPAND, 0);
366 new wxDataViewListCtrl(m_pnlBasic, wxID_ANY, wxDefaultPosition,
367 wxDefaultSize, wxDV_VERT_RULES | wxDV_HORIZ_RULES);
368 m_dataViewListColumnLeg = m_dvlcWaypoints->AppendTextColumn(
369 _(
"Leg"), wxDATAVIEW_CELL_INERT, columWidths[0],
370 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
371 m_dataViewListColumnLeg->GetRenderer()->EnableEllipsize(wxELLIPSIZE_NONE);
372 m_dataViewListColumnToWpt = m_dvlcWaypoints->AppendTextColumn(
373 toLabel, wxDATAVIEW_CELL_INERT, columWidths[1],
374 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
375 m_dataViewListColumnToWpt->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
376 m_dataViewListColumnDistance = m_dvlcWaypoints->AppendTextColumn(
377 _(
"Distance"), wxDATAVIEW_CELL_INERT, columWidths[2],
378 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
379 m_dataViewListColumnDistance->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
380 m_dataViewListColumnBearing = m_dvlcWaypoints->AppendTextColumn(
381 _(
"Bearing"), wxDATAVIEW_CELL_INERT, columWidths[3],
382 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
383 m_dataViewListColumnBearing->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
384 m_dataViewListColumnTotalDistance = m_dvlcWaypoints->AppendTextColumn(
385 _(
"Total Distance"), wxDATAVIEW_CELL_INERT, columWidths[4],
386 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
387 m_dataViewListColumnTotalDistance->GetRenderer()->EnableEllipsize(
389 m_dataViewListColumnLat = m_dvlcWaypoints->AppendTextColumn(
390 _(
"Latitude"), wxDATAVIEW_CELL_INERT, columWidths[5],
391 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
392 m_dataViewListColumnLat->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
393 m_dataViewListColumnLon = m_dvlcWaypoints->AppendTextColumn(
394 _(
"Longitude"), wxDATAVIEW_CELL_INERT, columWidths[6],
395 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
396 m_dataViewListColumnLon->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
397 m_dataViewListColumnETE = m_dvlcWaypoints->AppendTextColumn(
398 _(
"ETE"), wxDATAVIEW_CELL_INERT, columWidths[7],
399 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
400 m_dataViewListColumnETE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
401 m_dataViewListColumnETA = m_dvlcWaypoints->AppendTextColumn(
402 _(
"ETA"), wxDATAVIEW_CELL_INERT, columWidths[8],
403 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
404 m_dataViewListColumnETA->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
405 m_dataViewListColumnSpeed = m_dvlcWaypoints->AppendTextColumn(
406 _(
"Speed"), CELL_EDITABLE, columWidths[9],
407 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
408 m_dataViewListColumnSpeed->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
409 m_dataViewListColumnNTE = m_dvlcWaypoints->AppendTextColumn(
410 _(
"Next tide event"), wxDATAVIEW_CELL_INERT, columWidths[10],
411 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
412 m_dataViewListColumnNTE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
413 m_dataViewListColumnDesc = m_dvlcWaypoints->AppendTextColumn(
414 _(
"Description"), wxDATAVIEW_CELL_INERT, columWidths[11],
415 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
416 m_dataViewListColumnDesc->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
417 m_dataViewListColumnCourse = m_dvlcWaypoints->AppendTextColumn(
418 _(
"Course"), wxDATAVIEW_CELL_INERT, columWidths[12],
419 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
420 m_dataViewListColumnCourse->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
421 m_dataViewListColumnETD = m_dvlcWaypoints->AppendTextColumn(
422 _(
"ETD"), CELL_EDITABLE, columWidths[13],
423 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
424 m_dataViewListColumnETD->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
425 m_dataViewListColumnEmpty = m_dvlcWaypoints->AppendTextColumn(
426 "", wxDATAVIEW_CELL_INERT, columWidths[14],
427 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
428 bSizerData->Add(m_dvlcWaypoints, 1, wxALL | wxEXPAND, 5);
430 m_pnlBasic->SetSizer(bSizerData);
431 m_pnlBasic->Layout();
432 bSizerData->Fit(m_pnlBasic);
433 m_ntbRteProp->AddPage(m_pnlBasic, _(
"Basic"),
false);
434 m_pnlAdvanced =
new wxPanel(m_ntbRteProp, wxID_ANY, wxDefaultPosition,
435 wxDefaultSize, wxTAB_TRAVERSAL);
436 wxBoxSizer* bSizerAdvanced;
437 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
439 m_stDescription =
new wxStaticText(m_pnlAdvanced, wxID_ANY, _(
"Description"),
440 wxDefaultPosition, wxDefaultSize, 0);
441 m_stDescription->Wrap(-1);
442 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
445 new wxTextCtrl(m_pnlAdvanced, wxID_ANY,
"", wxDefaultPosition,
446 wxDefaultSize, wxTE_MULTILINE);
447 bSizerAdvanced->Add(m_tcDescription, 0, wxALL | wxEXPAND, 5);
449 wxStaticBoxSizer* sbSizerLinks;
450 sbSizerLinks =
new wxStaticBoxSizer(
451 new wxStaticBox(m_pnlAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
453 m_scrolledWindowLinks =
new wxScrolledWindow(
454 sbSizerLinks->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize,
455 wxHSCROLL | wxVSCROLL);
456 m_scrolledWindowLinks->SetScrollRate(5, 5);
457 wxBoxSizer* bSizerLinksWnd;
458 bSizerLinksWnd =
new wxBoxSizer(wxVERTICAL);
460 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
463 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
464 "http://www.wxformbuilder.org", wxDefaultPosition,
465 wxDefaultSize, wxHL_DEFAULT_STYLE);
466 m_hyperlink1->Enable(
false);
467 m_hyperlink1->Hide();
469 m_menuLink =
new wxMenu();
470 wxMenuItem* m_menuItemEdit;
471 m_menuItemEdit =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Edit")),
"",
473 m_menuLink->Append(m_menuItemEdit);
475 wxMenuItem* m_menuItemAdd;
476 m_menuItemAdd =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Add new")),
478 m_menuLink->Append(m_menuItemAdd);
480 wxMenuItem* m_menuItemDelete;
481 m_menuItemDelete =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Delete")),
483 m_menuLink->Append(m_menuItemDelete);
485 m_hyperlink1->Connect(
487 wxMouseEventHandler(RoutePropDlg::m_hyperlink1OnContextMenu), NULL,
this);
489 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
491 bSizerLinksWnd->Add(bSizerLinks, 1, wxEXPAND, 5);
493 wxBoxSizer* bSizerLinkBtns;
494 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
496 m_btnAddLink =
new wxButton(m_scrolledWindowLinks, wxID_ANY, _(
"Add"),
497 wxDefaultPosition, wxDefaultSize, 0);
498 bSizerLinkBtns->Add(m_btnAddLink, 0, wxALL, 5);
501 new wxToggleButton(m_scrolledWindowLinks, wxID_ANY, _(
"Edit"),
502 wxDefaultPosition, wxDefaultSize, 0);
503 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
506 new wxStaticText(m_scrolledWindowLinks, wxID_ANY,
507 _(
"Links are opened in the default browser."),
508 wxDefaultPosition, wxDefaultSize, 0);
509 m_stEditEnabled->Wrap(-1);
510 bSizerLinkBtns->Add(m_stEditEnabled, 0, wxALL, 5);
512 bSizerLinksWnd->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
514 m_scrolledWindowLinks->SetSizer(bSizerLinksWnd);
515 m_scrolledWindowLinks->Layout();
516 bSizerLinksWnd->Fit(m_scrolledWindowLinks);
517 m_menuLinks =
new wxMenu();
518 wxMenuItem* m_menuItemAddLink;
519 m_menuItemAddLink =
new wxMenuItem(m_menuLinks, wxID_ANY,
520 wxString(_(
"Add new")),
"", wxITEM_NORMAL);
521 m_menuLinks->Append(m_menuItemAddLink);
523 m_scrolledWindowLinks->Connect(
525 wxMouseEventHandler(RoutePropDlg::m_scrolledWindowLinksOnContextMenu),
528 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
530 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
532 m_pnlAdvanced->SetSizer(bSizerAdvanced);
533 m_pnlAdvanced->Layout();
534 bSizerAdvanced->Fit(m_pnlAdvanced);
535 m_ntbRteProp->AddPage(m_pnlAdvanced, _(
"Advanced"),
false);
537 bSizerMain->Add(m_ntbRteProp, 1, wxEXPAND | wxALL, 5);
539 wxWrapSizer* wSizerCustomBtns;
540 wSizerCustomBtns =
new wxWrapSizer(wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS);
542 m_btnPrint =
new wxButton(
this, wxID_ANY, _(
"Print"), wxDefaultPosition,
544 wSizerCustomBtns->Add(m_btnPrint, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
550 m_btnExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"), wxDefaultPosition,
552 m_btnExtend->SetToolTip(_(
553 "Extend this route by connecting it to another route. The button is "
554 "disabled when: the route is active, is part of a layer, or there is no "
555 "suitable route to connect to. A suitable route must be visible, "
556 "different from this route, and share a common waypoint with this route "
557 "(or have a waypoint very close to the last point of this route)."));
558 wSizerCustomBtns->Add(m_btnExtend, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
560 m_btnSplit =
new wxButton(
this, wxID_ANY, _(
"Split"), wxDefaultPosition,
562 wSizerCustomBtns->Add(m_btnSplit, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
564 wSizerCustomBtns->Add(0, 0, 1, wxEXPAND, 5);
566 m_sdbSizerBtns =
new wxStdDialogButtonSizer();
567 m_sdbSizerBtnsOK =
new wxButton(
this, wxID_OK);
568 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsOK);
569 m_sdbSizerBtnsCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"));
570 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsCancel);
571 m_sdbSizerBtns->Realize();
573 wSizerCustomBtns->Add(m_sdbSizerBtns, 1, wxEXPAND, 5);
575 bSizerMain->Add(wSizerCustomBtns, 0, wxEXPAND, 0);
577 this->SetSizer(bSizerMain);
580 this->Centre(wxBOTH);
583 this->Connect(wxEVT_CLOSE_WINDOW,
584 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
585 this->Connect(wxEVT_SIZE,
586 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
587 m_ntbRteProp->Connect(
588 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
589 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
591 m_tcPlanSpeed->Connect(
592 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
594 m_tcPlanSpeed->Connect(
595 wxEVT_COMMAND_TEXT_ENTER,
596 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
597 m_tcPlanSpeed->Connect(
598 wxEVT_COMMAND_TEXT_UPDATED,
599 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
600 m_dpDepartureDate->Connect(
602 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
603 m_tpDepartureTime->Connect(
605 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
606 m_choiceTimezone->Connect(
607 wxEVT_COMMAND_CHOICE_SELECTED,
608 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
609 m_dvlcWaypoints->Connect(
610 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
611 wxDataViewEventHandler(
612 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
614 m_dvlcWaypoints->Connect(
615 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
616 wxDataViewEventHandler(
617 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
619 m_dvlcWaypoints->Connect(
620 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
621 wxDataViewEventHandler(
622 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
624 m_dvlcWaypoints->Connect(
625 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
626 wxDataViewEventHandler(
627 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
629 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
630 wxCommandEventHandler(RoutePropDlg::ItemEditOnMenuSelection),
631 this, m_menuItemEdit->GetId());
632 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
633 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
634 this, m_menuItemAdd->GetId());
636 wxEVT_COMMAND_MENU_SELECTED,
637 wxCommandEventHandler(RoutePropDlg::ItemDeleteOnMenuSelection),
this,
638 m_menuItemDelete->GetId());
639 m_btnAddLink->Connect(
640 wxEVT_COMMAND_BUTTON_CLICKED,
641 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
642 m_toggleBtnEdit->Connect(
643 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
644 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
645 m_menuLinks->Bind(wxEVT_COMMAND_MENU_SELECTED,
646 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
647 this, m_menuItemAddLink->GetId());
648 m_btnPrint->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
649 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick),
651 m_btnExtend->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
652 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick),
654 m_btnSplit->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
655 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick),
657 m_sdbSizerBtnsCancel->Connect(
658 wxEVT_COMMAND_BUTTON_CLICKED,
659 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
660 m_sdbSizerBtnsOK->Connect(
661 wxEVT_COMMAND_BUTTON_CLICKED,
662 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
665 auto navobj = NavObjectChanges::getInstance();
667 navobj_del_track_listener.Listen(navobj->evt_delete_track,
this,
668 EVT_ROUTEMAN_DEL_TRK);
670 auto t = std::const_pointer_cast<Track>(UnpackEvtPointer<Track>(ev));
673 wxDEFINE_EVENT(EVT_ROUTEMAN_DEL_ROUTE,
ObservedEvt);
674 navobj_del_route_listener.Listen(navobj->evt_delete_route,
this,
675 EVT_ROUTEMAN_DEL_ROUTE);
676 Bind(EVT_ROUTEMAN_DEL_ROUTE, [&](
ObservedEvt& ev) {
677 auto r = std::const_pointer_cast<Route>(UnpackEvtPointer<Route>(ev));
683RoutePropDlg::~RoutePropDlg() {
685 this->Disconnect(wxEVT_CLOSE_WINDOW,
686 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
687 this->Disconnect(wxEVT_SIZE,
688 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
689 m_ntbRteProp->Disconnect(
690 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
691 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
693 m_tcPlanSpeed->Disconnect(
694 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
696 m_tcPlanSpeed->Disconnect(
697 wxEVT_COMMAND_TEXT_ENTER,
698 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
699 m_tcPlanSpeed->Disconnect(
700 wxEVT_COMMAND_TEXT_UPDATED,
701 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
704 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
707 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
708 m_choiceTimezone->Disconnect(
709 wxEVT_COMMAND_CHOICE_SELECTED,
710 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
711 m_dvlcWaypoints->Disconnect(
712 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
713 wxDataViewEventHandler(
714 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
716 m_dvlcWaypoints->Disconnect(
717 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
718 wxDataViewEventHandler(
719 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
721 m_dvlcWaypoints->Disconnect(
722 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
723 wxDataViewEventHandler(
724 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
726 m_dvlcWaypoints->Disconnect(
727 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
728 wxDataViewEventHandler(
729 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
731 m_btnAddLink->Disconnect(
732 wxEVT_COMMAND_BUTTON_CLICKED,
733 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
734 m_toggleBtnEdit->Disconnect(
735 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
736 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
737 m_btnPrint->Disconnect(
738 wxEVT_COMMAND_BUTTON_CLICKED,
739 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick), NULL,
this);
740 m_btnExtend->Disconnect(
741 wxEVT_COMMAND_BUTTON_CLICKED,
742 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick), NULL,
this);
743 m_btnSplit->Disconnect(
744 wxEVT_COMMAND_BUTTON_CLICKED,
745 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick), NULL,
this);
746 m_sdbSizerBtnsCancel->Disconnect(
747 wxEVT_COMMAND_BUTTON_CLICKED,
748 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
749 m_sdbSizerBtnsOK->Disconnect(
750 wxEVT_COMMAND_BUTTON_CLICKED,
751 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
757void RoutePropDlg::OnKeyChar(wxKeyEvent& event) {
758 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)
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
RoutePropDlgImpl * pRoutePropDialog
Global instance.
Routeman * g_pRouteMan
Global instance.
Callbacks for RoutePropDlg.