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->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);
169 new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
170 wxDefaultSize, wxTE_PROCESS_ENTER);
171 m_tcPlanSpeed->SetMaxSize(wxSize(maxFieldSize, -1));
172 m_tcPlanSpeed->SetMinSize(wxSize(maxFieldSize, -1));
174 bSizerSpeed->Add(m_tcPlanSpeed, 0, wxALL, 5);
176 wSizerParams->Add(bSizerSpeed, 1, wxEXPAND, 0);
179 wxBoxSizer* bSizerEnroute;
180 bSizerEnroute =
new wxBoxSizer(wxVERTICAL);
182 m_stEnroute =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Enroute"),
183 wxDefaultPosition, wxDefaultSize, 0);
184 m_stEnroute->Wrap(-1);
185 bSizerEnroute->Add(m_stEnroute, 0, wxALL, 5);
187 m_tcEnroute =
new wxTextCtrl(m_pnlBasic, wxID_ANY, wxEmptyString,
188 wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
189 m_tcEnroute->SetMaxSize(wxSize(maxFieldSize, -1));
190 m_tcEnroute->SetMinSize(wxSize(maxFieldSize, -1));
192 bSizerEnroute->Add(m_tcEnroute, 0, wxALL, 5);
194 wSizerParams->Add(bSizerEnroute, 1, wxEXPAND, 0);
197 wxBoxSizer* bSizerDeparture;
198 bSizerDeparture =
new wxBoxSizer(wxVERTICAL);
200 m_stDeparture =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Departure"),
201 wxDefaultPosition, wxDefaultSize, 0);
202 m_stDeparture->Wrap(-1);
203 bSizerDeparture->Add(m_stDeparture, 0, wxALL, 5);
205 wxBoxSizer* bSizerDepartureTS;
206 bSizerDepartureTS =
new wxBoxSizer(wxHORIZONTAL);
207 bSizerDeparture->Add(bSizerDepartureTS, 0, 0, 5);
210 new wxDatePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
211 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
212 bSizerDepartureTS->Add(m_dpDepartureDate, 0, wxALIGN_CENTER_VERTICAL | wxALL,
215 int ys = GetCharHeight();
216 m_dpDepartureDate->SetMinSize(wxSize(-1, ys * 15 / 10));
220 m_tpDepartureTime =
new TimeCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
221 wxDefaultPosition, wxDefaultSize);
224 new wxTimePickerCtrl(m_pnlBasic, wxID_ANY, wxDefaultDateTime,
225 wxDefaultPosition, wxDefaultSize, wxDP_DEFAULT);
227 bSizerDepartureTS->Add(m_tpDepartureTime, 0, wxALIGN_CENTER_VERTICAL | wxALL,
230 wSizerParams->Add(bSizerDeparture, 1, wxEXPAND, 0);
232 wxBoxSizer* bSizerTime;
233 bSizerTime =
new wxBoxSizer(wxVERTICAL);
235 m_stTimeZone =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Time"),
236 wxDefaultPosition, wxDefaultSize, 0);
237 m_stTimeZone->Wrap(-1);
238 bSizerTime->Add(m_stTimeZone, 0, wxALL, 5);
241 wxString m_choiceTimezoneChoices[] = {
242 _(
"UTC"), _(
"Local Time"), _(
"LMT@Location"), _(
"Honor Global Settings")};
243 int m_choiceTimezoneNChoices =
244 sizeof(m_choiceTimezoneChoices) /
sizeof(wxString);
246 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
247 m_choiceTimezoneNChoices, m_choiceTimezoneChoices, 0);
248 m_choiceTimezone->SetSelection(3 );
249 m_choiceTimezone->SetMaxSize(wxSize(GetCharWidth() * 12, -1));
251 bSizerTime->Add(m_choiceTimezone, 0, wxALL, 5);
253 wSizerParams->Add(bSizerTime, 1, wxEXPAND, 0);
255 wxBoxSizer* bSizerColor;
256 bSizerColor =
new wxBoxSizer(wxVERTICAL);
258 m_staticTextColor =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Color"),
259 wxDefaultPosition, wxDefaultSize, 0);
260 m_staticTextColor->Wrap(-1);
261 bSizerColor->Add(m_staticTextColor, 0, wxALL, 5);
263 wxString m_choiceColorChoices[] = {
264 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
265 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
266 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
267 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
269 int m_choiceColorNChoices =
sizeof(m_choiceColorChoices) /
sizeof(wxString);
271 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
272 m_choiceColorNChoices, m_choiceColorChoices, 0);
273 m_choiceColor->SetSelection(0);
274 bSizerColor->Add(m_choiceColor, 0, wxALL, 5);
276 wSizerParams->Add(bSizerColor, 1, wxEXPAND, 5);
278 wxBoxSizer* bSizerStyle;
279 bSizerStyle =
new wxBoxSizer(wxVERTICAL);
281 m_stStyle =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Style"),
282 wxDefaultPosition, wxDefaultSize, 0);
284 bSizerStyle->Add(m_stStyle, 0, wxALL, 5);
286 wxString m_choiceStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
287 _(
"Long dash"), _(
"Short dash")};
288 int m_choiceStyleNChoices =
sizeof(m_choiceStyleChoices) /
sizeof(wxString);
290 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
291 m_choiceStyleNChoices, m_choiceStyleChoices, 0);
292 m_choiceStyle->SetSelection(0);
293 bSizerStyle->Add(m_choiceStyle, 0, wxALL, 5);
295 wSizerParams->Add(bSizerStyle, 1, wxEXPAND, 5);
297 wxBoxSizer* bSizerWidth;
298 bSizerWidth =
new wxBoxSizer(wxVERTICAL);
300 m_stWidth =
new wxStaticText(m_pnlBasic, wxID_ANY, _(
"Width"),
301 wxDefaultPosition, wxDefaultSize, 0);
303 bSizerWidth->Add(m_stWidth, 0, wxALL, 5);
305 wxString m_choiceWidthChoices[] = {
306 _(
"Default"), _(
"1 px"), _(
"2px"), _(
"3 px"), _(
"4 px"), _(
"5 px"),
307 _(
"6 px"), _(
"7 px"), _(
"8 px"), _(
"9 px"), _(
"10 px")};
308 int m_choiceWidthNChoices =
sizeof(m_choiceWidthChoices) /
sizeof(wxString);
310 new wxChoice(m_pnlBasic, wxID_ANY, wxDefaultPosition, wxDefaultSize,
311 m_choiceWidthNChoices, m_choiceWidthChoices, 0);
312 m_choiceWidth->SetSelection(0);
313 bSizerWidth->Add(m_choiceWidth, 0, wxALL, 5);
315 wSizerParams->Add(bSizerWidth, 1, wxEXPAND, 5);
320 wxString toLabel = _(
"To waypoint");
323 int columWidths[] = {
324 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
325 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
326 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
327 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE,
328 wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE, wxCOL_WIDTH_AUTOSIZE};
330 toLabel = _(
"To WP");
333 int columWidths[] = {
349 int colFlags = wxDATAVIEW_COL_RESIZABLE;
353 bSizerData->Add(wSizerParams, 0, wxEXPAND, 0);
356 new wxDataViewListCtrl(m_pnlBasic, wxID_ANY, wxDefaultPosition,
357 wxDefaultSize, wxDV_VERT_RULES | wxDV_HORIZ_RULES);
358 m_dataViewListColumnLeg = m_dvlcWaypoints->AppendTextColumn(
359 _(
"Leg"), wxDATAVIEW_CELL_INERT, columWidths[0],
360 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
361 m_dataViewListColumnLeg->GetRenderer()->EnableEllipsize(wxELLIPSIZE_NONE);
362 m_dataViewListColumnToWpt = m_dvlcWaypoints->AppendTextColumn(
363 toLabel, wxDATAVIEW_CELL_INERT, columWidths[1],
364 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
365 m_dataViewListColumnToWpt->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
366 m_dataViewListColumnDistance = m_dvlcWaypoints->AppendTextColumn(
367 _(
"Distance"), wxDATAVIEW_CELL_INERT, columWidths[2],
368 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
369 m_dataViewListColumnDistance->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
370 m_dataViewListColumnBearing = m_dvlcWaypoints->AppendTextColumn(
371 _(
"Bearing"), wxDATAVIEW_CELL_INERT, columWidths[3],
372 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
373 m_dataViewListColumnBearing->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
374 m_dataViewListColumnTotalDistance = m_dvlcWaypoints->AppendTextColumn(
375 _(
"Total Distance"), wxDATAVIEW_CELL_INERT, columWidths[4],
376 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
377 m_dataViewListColumnTotalDistance->GetRenderer()->EnableEllipsize(
379 m_dataViewListColumnLat = m_dvlcWaypoints->AppendTextColumn(
380 _(
"Latitude"), wxDATAVIEW_CELL_INERT, columWidths[5],
381 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
382 m_dataViewListColumnLat->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
383 m_dataViewListColumnLon = m_dvlcWaypoints->AppendTextColumn(
384 _(
"Longitude"), wxDATAVIEW_CELL_INERT, columWidths[6],
385 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
386 m_dataViewListColumnLon->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
387 m_dataViewListColumnETE = m_dvlcWaypoints->AppendTextColumn(
388 _(
"ETE"), wxDATAVIEW_CELL_INERT, columWidths[7],
389 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
390 m_dataViewListColumnETE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
391 m_dataViewListColumnETA = m_dvlcWaypoints->AppendTextColumn(
392 _(
"ETA"), wxDATAVIEW_CELL_INERT, columWidths[8],
393 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
394 m_dataViewListColumnETA->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
395 m_dataViewListColumnSpeed = m_dvlcWaypoints->AppendTextColumn(
396 _(
"Speed"), CELL_EDITABLE, columWidths[9],
397 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
398 m_dataViewListColumnSpeed->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
399 m_dataViewListColumnNTE = m_dvlcWaypoints->AppendTextColumn(
400 _(
"Next tide event"), wxDATAVIEW_CELL_INERT, columWidths[10],
401 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
402 m_dataViewListColumnNTE->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
403 m_dataViewListColumnDesc = m_dvlcWaypoints->AppendTextColumn(
404 _(
"Description"), wxDATAVIEW_CELL_INERT, columWidths[11],
405 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
406 m_dataViewListColumnDesc->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
407 m_dataViewListColumnCourse = m_dvlcWaypoints->AppendTextColumn(
408 _(
"Course"), wxDATAVIEW_CELL_INERT, columWidths[12],
409 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
410 m_dataViewListColumnCourse->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
411 m_dataViewListColumnETD = m_dvlcWaypoints->AppendTextColumn(
412 _(
"ETD"), CELL_EDITABLE, columWidths[13],
413 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
414 m_dataViewListColumnETD->GetRenderer()->EnableEllipsize(wxELLIPSIZE_END);
415 m_dataViewListColumnEmpty = m_dvlcWaypoints->AppendTextColumn(
416 wxEmptyString, wxDATAVIEW_CELL_INERT, columWidths[14],
417 static_cast<wxAlignment
>(wxALIGN_LEFT), colFlags);
418 bSizerData->Add(m_dvlcWaypoints, 1, wxALL | wxEXPAND, 5);
420 m_pnlBasic->SetSizer(bSizerData);
421 m_pnlBasic->Layout();
422 bSizerData->Fit(m_pnlBasic);
423 m_ntbRteProp->AddPage(m_pnlBasic, _(
"Basic"),
false);
424 m_pnlAdvanced =
new wxPanel(m_ntbRteProp, wxID_ANY, wxDefaultPosition,
425 wxDefaultSize, wxTAB_TRAVERSAL);
426 wxBoxSizer* bSizerAdvanced;
427 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
429 m_stDescription =
new wxStaticText(m_pnlAdvanced, wxID_ANY, _(
"Description"),
430 wxDefaultPosition, wxDefaultSize, 0);
431 m_stDescription->Wrap(-1);
432 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
435 new wxTextCtrl(m_pnlAdvanced, wxID_ANY, wxEmptyString, wxDefaultPosition,
436 wxDefaultSize, wxTE_MULTILINE);
437 bSizerAdvanced->Add(m_tcDescription, 0, wxALL | wxEXPAND, 5);
439 wxStaticBoxSizer* sbSizerLinks;
440 sbSizerLinks =
new wxStaticBoxSizer(
441 new wxStaticBox(m_pnlAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
443 m_scrolledWindowLinks =
new wxScrolledWindow(
444 sbSizerLinks->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize,
445 wxHSCROLL | wxVSCROLL);
446 m_scrolledWindowLinks->SetScrollRate(5, 5);
447 wxBoxSizer* bSizerLinksWnd;
448 bSizerLinksWnd =
new wxBoxSizer(wxVERTICAL);
450 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
453 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
454 wxT(
"http://www.wxformbuilder.org"),
455 wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
456 m_hyperlink1->Enable(
false);
457 m_hyperlink1->Hide();
459 m_menuLink =
new wxMenu();
460 wxMenuItem* m_menuItemEdit;
461 m_menuItemEdit =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Edit")),
462 wxEmptyString, wxITEM_NORMAL);
463 m_menuLink->Append(m_menuItemEdit);
465 wxMenuItem* m_menuItemAdd;
466 m_menuItemAdd =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Add new")),
467 wxEmptyString, wxITEM_NORMAL);
468 m_menuLink->Append(m_menuItemAdd);
470 wxMenuItem* m_menuItemDelete;
471 m_menuItemDelete =
new wxMenuItem(m_menuLink, wxID_ANY, wxString(_(
"Delete")),
472 wxEmptyString, wxITEM_NORMAL);
473 m_menuLink->Append(m_menuItemDelete);
475 m_hyperlink1->Connect(
477 wxMouseEventHandler(RoutePropDlg::m_hyperlink1OnContextMenu), NULL,
this);
479 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
481 bSizerLinksWnd->Add(bSizerLinks, 1, wxEXPAND, 5);
483 wxBoxSizer* bSizerLinkBtns;
484 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
486 m_btnAddLink =
new wxButton(m_scrolledWindowLinks, wxID_ANY, _(
"Add"),
487 wxDefaultPosition, wxDefaultSize, 0);
488 bSizerLinkBtns->Add(m_btnAddLink, 0, wxALL, 5);
491 new wxToggleButton(m_scrolledWindowLinks, wxID_ANY, _(
"Edit"),
492 wxDefaultPosition, wxDefaultSize, 0);
493 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
496 new wxStaticText(m_scrolledWindowLinks, wxID_ANY,
497 _(
"Links are opened in the default browser."),
498 wxDefaultPosition, wxDefaultSize, 0);
499 m_stEditEnabled->Wrap(-1);
500 bSizerLinkBtns->Add(m_stEditEnabled, 0, wxALL, 5);
502 bSizerLinksWnd->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
504 m_scrolledWindowLinks->SetSizer(bSizerLinksWnd);
505 m_scrolledWindowLinks->Layout();
506 bSizerLinksWnd->Fit(m_scrolledWindowLinks);
507 m_menuLinks =
new wxMenu();
508 wxMenuItem* m_menuItemAddLink;
510 new wxMenuItem(m_menuLinks, wxID_ANY, wxString(_(
"Add new")),
511 wxEmptyString, wxITEM_NORMAL);
512 m_menuLinks->Append(m_menuItemAddLink);
514 m_scrolledWindowLinks->Connect(
516 wxMouseEventHandler(RoutePropDlg::m_scrolledWindowLinksOnContextMenu),
519 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
521 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
523 m_pnlAdvanced->SetSizer(bSizerAdvanced);
524 m_pnlAdvanced->Layout();
525 bSizerAdvanced->Fit(m_pnlAdvanced);
526 m_ntbRteProp->AddPage(m_pnlAdvanced, _(
"Advanced"),
false);
528 bSizerMain->Add(m_ntbRteProp, 1, wxEXPAND | wxALL, 5);
530 wxWrapSizer* wSizerCustomBtns;
531 wSizerCustomBtns =
new wxWrapSizer(wxHORIZONTAL, wxWRAPSIZER_DEFAULT_FLAGS);
533 m_btnPrint =
new wxButton(
this, wxID_ANY, _(
"Print"), wxDefaultPosition,
535 wSizerCustomBtns->Add(m_btnPrint, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
537#ifdef __OCPN__ANDROID__
541 m_btnExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"), wxDefaultPosition,
543 m_btnExtend->SetToolTip(_(
544 "Extend this route by connecting it to another route. The button is "
545 "disabled when: the route is active, is part of a layer, or there is no "
546 "suitable route to connect to. A suitable route must be visible, "
547 "different from this route, and share a common waypoint with this route "
548 "(or have a waypoint very close to the last point of this route)."));
549 wSizerCustomBtns->Add(m_btnExtend, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
551 m_btnSplit =
new wxButton(
this, wxID_ANY, _(
"Split"), wxDefaultPosition,
553 wSizerCustomBtns->Add(m_btnSplit, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
555 wSizerCustomBtns->Add(0, 0, 1, wxEXPAND, 5);
557 m_sdbSizerBtns =
new wxStdDialogButtonSizer();
558 m_sdbSizerBtnsOK =
new wxButton(
this, wxID_OK);
559 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsOK);
560 m_sdbSizerBtnsCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"));
561 m_sdbSizerBtns->AddButton(m_sdbSizerBtnsCancel);
562 m_sdbSizerBtns->Realize();
564 wSizerCustomBtns->Add(m_sdbSizerBtns, 1, wxEXPAND, 5);
566 bSizerMain->Add(wSizerCustomBtns, 0, wxEXPAND, 0);
568 this->SetSizer(bSizerMain);
571 this->Centre(wxBOTH);
574 this->Connect(wxEVT_CLOSE_WINDOW,
575 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
576 this->Connect(wxEVT_SIZE,
577 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
578 m_ntbRteProp->Connect(
579 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
580 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
582 m_tcPlanSpeed->Connect(
583 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
585 m_tcPlanSpeed->Connect(
586 wxEVT_COMMAND_TEXT_ENTER,
587 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
588 m_tcPlanSpeed->Connect(
589 wxEVT_COMMAND_TEXT_UPDATED,
590 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
591 m_dpDepartureDate->Connect(
593 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
594 m_tpDepartureTime->Connect(
596 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
597 m_choiceTimezone->Connect(
598 wxEVT_COMMAND_CHOICE_SELECTED,
599 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
600 m_dvlcWaypoints->Connect(
601 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
602 wxDataViewEventHandler(
603 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
605 m_dvlcWaypoints->Connect(
606 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
607 wxDataViewEventHandler(
608 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
610 m_dvlcWaypoints->Connect(
611 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
612 wxDataViewEventHandler(
613 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
615 m_dvlcWaypoints->Connect(
616 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
617 wxDataViewEventHandler(
618 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
620 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
621 wxCommandEventHandler(RoutePropDlg::ItemEditOnMenuSelection),
622 this, m_menuItemEdit->GetId());
623 m_menuLink->Bind(wxEVT_COMMAND_MENU_SELECTED,
624 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
625 this, m_menuItemAdd->GetId());
627 wxEVT_COMMAND_MENU_SELECTED,
628 wxCommandEventHandler(RoutePropDlg::ItemDeleteOnMenuSelection),
this,
629 m_menuItemDelete->GetId());
630 m_btnAddLink->Connect(
631 wxEVT_COMMAND_BUTTON_CLICKED,
632 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
633 m_toggleBtnEdit->Connect(
634 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
635 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
636 m_menuLinks->Bind(wxEVT_COMMAND_MENU_SELECTED,
637 wxCommandEventHandler(RoutePropDlg::ItemAddOnMenuSelection),
638 this, m_menuItemAddLink->GetId());
639 m_btnPrint->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
640 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick),
642 m_btnExtend->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
643 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick),
645 m_btnSplit->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
646 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick),
648 m_sdbSizerBtnsCancel->Connect(
649 wxEVT_COMMAND_BUTTON_CLICKED,
650 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
651 m_sdbSizerBtnsOK->Connect(
652 wxEVT_COMMAND_BUTTON_CLICKED,
653 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
655 auto navobj = NavObjectChanges::getInstance();
657 navobj_del_track_listener.Listen(navobj->evt_delete_track,
this,
658 EVT_ROUTEMAN_DEL_TRK);
660 auto t = std::const_pointer_cast<Track>(UnpackEvtPointer<Track>(ev));
664 wxDEFINE_EVENT(EVT_ROUTEMAN_DEL_ROUTE,
ObservedEvt);
665 navobj_del_route_listener.Listen(navobj->evt_delete_route,
this,
666 EVT_ROUTEMAN_DEL_ROUTE);
667 Bind(EVT_ROUTEMAN_DEL_ROUTE, [&](
ObservedEvt& ev) {
668 auto r = std::const_pointer_cast<Route>(UnpackEvtPointer<Route>(ev));
673RoutePropDlg::~RoutePropDlg() {
675 this->Disconnect(wxEVT_CLOSE_WINDOW,
676 wxCloseEventHandler(RoutePropDlg::RoutePropDlgOnClose));
677 this->Disconnect(wxEVT_SIZE,
678 wxSizeEventHandler(RoutePropDlg::RoutePropDlgOnSize));
679 m_ntbRteProp->Disconnect(
680 wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
681 wxNotebookEventHandler(RoutePropDlg::RoutePropDlgOnNotebookPageChanged),
683 m_tcPlanSpeed->Disconnect(
684 wxEVT_KILL_FOCUS, wxFocusEventHandler(RoutePropDlg::PlanSpeedOnKillFocus),
686 m_tcPlanSpeed->Disconnect(
687 wxEVT_COMMAND_TEXT_ENTER,
688 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
689 m_tcPlanSpeed->Disconnect(
690 wxEVT_COMMAND_TEXT_UPDATED,
691 wxCommandEventHandler(RoutePropDlg::PlanSpeedOnTextEnter), NULL,
this);
694 wxDateEventHandler(RoutePropDlg::DepartureDateOnDateChanged), NULL,
this);
697 wxDateEventHandler(RoutePropDlg::DepartureTimeOnTimeChanged), NULL,
this);
698 m_choiceTimezone->Disconnect(
699 wxEVT_COMMAND_CHOICE_SELECTED,
700 wxCommandEventHandler(RoutePropDlg::TimezoneOnChoice), NULL,
this);
701 m_dvlcWaypoints->Disconnect(
702 wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU,
703 wxDataViewEventHandler(
704 RoutePropDlg::WaypointsOnDataViewListCtrlItemContextMenu),
706 m_dvlcWaypoints->Disconnect(
707 wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE,
708 wxDataViewEventHandler(
709 RoutePropDlg::WaypointsOnDataViewListCtrlItemEditingDone),
711 m_dvlcWaypoints->Disconnect(
712 wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED,
713 wxDataViewEventHandler(
714 RoutePropDlg::WaypointsOnDataViewListCtrlItemValueChanged),
716 m_dvlcWaypoints->Disconnect(
717 wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED,
718 wxDataViewEventHandler(
719 RoutePropDlg::WaypointsOnDataViewListCtrlSelectionChanged),
721 m_btnAddLink->Disconnect(
722 wxEVT_COMMAND_BUTTON_CLICKED,
723 wxCommandEventHandler(RoutePropDlg::AddLinkOnButtonClick), NULL,
this);
724 m_toggleBtnEdit->Disconnect(
725 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
726 wxCommandEventHandler(RoutePropDlg::BtnEditOnToggleButton), NULL,
this);
727 m_btnPrint->Disconnect(
728 wxEVT_COMMAND_BUTTON_CLICKED,
729 wxCommandEventHandler(RoutePropDlg::PrintOnButtonClick), NULL,
this);
730 m_btnExtend->Disconnect(
731 wxEVT_COMMAND_BUTTON_CLICKED,
732 wxCommandEventHandler(RoutePropDlg::ExtendOnButtonClick), NULL,
this);
733 m_btnSplit->Disconnect(
734 wxEVT_COMMAND_BUTTON_CLICKED,
735 wxCommandEventHandler(RoutePropDlg::SplitOnButtonClick), NULL,
this);
736 m_sdbSizerBtnsCancel->Disconnect(
737 wxEVT_COMMAND_BUTTON_CLICKED,
738 wxCommandEventHandler(RoutePropDlg::BtnsOnCancelButtonClick), NULL,
this);
739 m_sdbSizerBtnsOK->Disconnect(
740 wxEVT_COMMAND_BUTTON_CLICKED,
741 wxCommandEventHandler(RoutePropDlg::BtnsOnOKButtonClick), NULL,
this);
747void RoutePropDlg::OnKeyChar(wxKeyEvent& event) {
748 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.