27#include "model/georef.h"
29#include "model/navutil_base.h"
30#include "model/own_ship.h"
32#include "model/route.h"
33#include "model/routeman.h"
34#include "model/select.h"
35#include "model/track.h"
41#include "ocpn_frame.h"
42#include "OCPNPlatform.h"
43#include "pluginmanager.h"
44#include "print_dialog.h"
45#include "routemanagerdialog.h"
46#include "routeman_gui.h"
47#include "track_printout.h"
48#include "TrackPropDlg.h"
51#include "androidUTIL.h"
60#define GLOBAL_SETTINGS_INPUT 3
63#define DISPLAY_FORMAT 2
64#define TIMESTAMP_FORMAT 3
66extern std::vector<Track*> g_TrackList;
74bool TrackPropDlg::instanceFlag =
false;
76TrackPropDlg* TrackPropDlg::getInstance(wxWindow* parent, wxWindowID
id,
77 const wxString& title,
78 const wxPoint& pos,
const wxSize& size,
81 single =
new TrackPropDlg(parent,
id, title, pos, size, style);
89TrackPropDlg::TrackPropDlg(wxWindow* parent, wxWindowID
id,
90 const wxString& title,
const wxPoint& pos,
91 const wxSize& size,
long style)
92 : DIALOG_PARENT(parent, id, title, pos, size, style) {
96 SetWindowStyleFlag(style);
98 m_scrolledWindowLinks = NULL;
99 m_tDescription = NULL;
105 CreateControlsCompact();
115 m_sdbBtmBtnsSizerCancel->Connect(
116 wxEVT_COMMAND_BUTTON_CLICKED,
117 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
118 m_sdbBtmBtnsSizerOK->Connect(
119 wxEVT_COMMAND_BUTTON_CLICKED,
120 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
121 if (m_sdbBtmBtnsSizerPrint)
122 m_sdbBtmBtnsSizerPrint->Connect(
123 wxEVT_COMMAND_BUTTON_CLICKED,
124 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
125 m_sdbBtmBtnsSizerSplit->Connect(
126 wxEVT_COMMAND_BUTTON_CLICKED,
127 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
128 m_sdbBtmBtnsSizerExtend->Connect(
129 wxEVT_COMMAND_BUTTON_CLICKED,
130 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
131 m_sdbBtmBtnsSizerToRoute->Connect(
132 wxEVT_COMMAND_BUTTON_CLICKED,
133 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
134 if (m_sdbBtmBtnsSizerExport)
135 m_sdbBtmBtnsSizerExport->Connect(
136 wxEVT_COMMAND_BUTTON_CLICKED,
137 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
138 m_lcPoints->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
139 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
141 Connect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
142 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
this);
143 Connect(wxEVT_COMMAND_MENU_SELECTED,
144 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
148 Connect(wxEVT_ACTIVATE, wxActivateEventHandler(TrackPropDlg::OnActivate),
153 m_buttonAddLink->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
154 wxCommandEventHandler(TrackPropDlg::OnAddLink),
156 m_toggleBtnEdit->Connect(
157 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
158 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
162 m_rbShowTimeUTC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
163 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
166 m_rbShowTimePC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
167 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
169 if (m_rbShowTimeLocal)
170 m_rbShowTimeLocal->Connect(
171 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
172 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
174 if (m_rbShowTimeGlobalSettings)
175 m_rbShowTimeGlobalSettings->Connect(
176 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
177 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
179 m_pMyLinkList = NULL;
182TrackPropDlg::~TrackPropDlg() {
184 m_sdbBtmBtnsSizerCancel->Disconnect(
185 wxEVT_COMMAND_BUTTON_CLICKED,
186 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
187 m_sdbBtmBtnsSizerOK->Disconnect(
188 wxEVT_COMMAND_BUTTON_CLICKED,
189 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
190 if (m_sdbBtmBtnsSizerPrint)
191 m_sdbBtmBtnsSizerPrint->Disconnect(
192 wxEVT_COMMAND_BUTTON_CLICKED,
193 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
194 m_sdbBtmBtnsSizerSplit->Disconnect(
195 wxEVT_COMMAND_BUTTON_CLICKED,
196 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
197 m_sdbBtmBtnsSizerExtend->Disconnect(
198 wxEVT_COMMAND_BUTTON_CLICKED,
199 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
200 m_sdbBtmBtnsSizerToRoute->Disconnect(
201 wxEVT_COMMAND_BUTTON_CLICKED,
202 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
203 if (m_sdbBtmBtnsSizerExport)
204 m_sdbBtmBtnsSizerExport->Disconnect(
205 wxEVT_COMMAND_BUTTON_CLICKED,
206 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
207 m_lcPoints->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
208 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
210 Disconnect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
211 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
213 Disconnect(wxEVT_COMMAND_MENU_SELECTED,
214 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
217 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
219 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
220 wxCommandEventHandler(TrackPropDlg::OnEditLink));
221 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
222 wxCommandEventHandler(TrackPropDlg::OnAddLink));
225 m_buttonAddLink->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
226 wxCommandEventHandler(TrackPropDlg::OnAddLink),
228 m_toggleBtnEdit->Disconnect(
229 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
230 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
234 m_rbShowTimeUTC->Disconnect(
235 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
236 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
239 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
240 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
243 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
244 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
247 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
248 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
250 instanceFlag =
false;
253static wxString getDatetimeTimezoneSelector(
int selection) {
261 case GLOBAL_SETTINGS_INPUT:
263 return wxEmptyString;
267void TrackPropDlg::OnActivate(wxActivateEvent& event) {
268 auto pWin =
dynamic_cast<DIALOG_PARENT*
>(
event.GetEventObject());
269 long int style = pWin->GetWindowStyle();
270 if (event.GetActive())
271 pWin->SetWindowStyle(style | wxSTAY_ON_TOP);
273 pWin->SetWindowStyle(style ^ wxSTAY_ON_TOP);
276void TrackPropDlg::RecalculateSize(
void) {
280 esize.x = GetCharWidth() * 110;
281 esize.y = GetCharHeight() * 40;
283 wxSize dsize = GetParent()->GetClientSize();
284 esize.y = wxMin(esize.y, dsize.y - (2 * GetCharHeight()));
285 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
286 SetClientSize(esize);
288 wxSize fsize = GetSize();
289 fsize.y = wxMin(fsize.y, dsize.y - (2 * GetCharHeight()));
290 fsize.x = wxMin(fsize.x, dsize.x - (2 * GetCharHeight()));
294 int sy = GetCharHeight() * m_lcPoints->GetItemCount();
297 m_lcPoints->SetSize(wxSize(GetClientSize().x - 40, sy));
299 if (m_lcPoints->GetItemCount()) Layout();
305static void addColumns(wxListCtrl* lctrl,
int dx) {
306 lctrl->InsertColumn(0, _(
"Leg"), wxLIST_FORMAT_LEFT, dx * 6);
307 lctrl->InsertColumn(1, _(
"Distance"), wxLIST_FORMAT_LEFT, dx * 11);
308 lctrl->InsertColumn(2, _(
"Bearing"), wxLIST_FORMAT_LEFT, dx * 8);
310 lctrl->InsertColumn(3, _(
"Latitude"), wxLIST_FORMAT_LEFT, dx * 15);
311 lctrl->InsertColumn(4, _(
"Longitude"), wxLIST_FORMAT_LEFT, dx * 15);
314 lctrl->InsertColumn(5, _(
"Timestamp"), wxLIST_FORMAT_LEFT, dx * 26);
315 lctrl->InsertColumn(6, _(
"Speed"), wxLIST_FORMAT_CENTER, dx * 8);
317 lctrl->SetMinSize(wxSize(-1, 50));
320void TrackPropDlg::CreateControlsCompact() {
321 wxBoxSizer* itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
322 SetSizer(itemBoxSizer1);
324 itemDialog1 =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
325 wxSize(-1, -1), wxVSCROLL);
326 itemDialog1->SetScrollRate(0, 1);
332 wxString wqs = getFontQtStylesheet(qFont);
333 wxCharBuffer sbuf = wqs.ToUTF8();
334 QString qsb = QString(sbuf.data());
336 QString qsbq = getQtStyleSheet();
338 itemDialog1->GetHandle()->setStyleSheet(qsb +
342 itemBoxSizer1->Add(itemDialog1, 1, wxEXPAND | wxALL, 0);
344 wxBoxSizer* itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
345 itemDialog1->SetSizer(itemBoxSizer2);
347 wxStaticText* itemStaticText4 =
new wxStaticText(
348 itemDialog1, wxID_STATIC, _(
"Name"), wxDefaultPosition, wxDefaultSize, 0);
349 itemBoxSizer2->Add(itemStaticText4, 0,
350 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5);
352 m_tName =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
354 itemBoxSizer2->Add(m_tName, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM, 5);
356 wxStaticText* itemStaticText7 =
357 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Depart From"),
358 wxDefaultPosition, wxDefaultSize, 0);
359 itemBoxSizer2->Add(itemStaticText7, 0,
360 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
363 m_tFrom =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
365 itemBoxSizer2->Add(m_tFrom, 0,
366 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
367 wxLEFT | wxRIGHT | wxBOTTOM,
370 wxStaticText* itemStaticText8 =
371 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Destination"),
372 wxDefaultPosition, wxDefaultSize, 0);
373 itemBoxSizer2->Add(itemStaticText8, 0,
374 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
377 m_tTo =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
379 itemBoxSizer2->Add(m_tTo, 0,
380 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
381 wxLEFT | wxRIGHT | wxBOTTOM,
384 m_cbShow =
new wxCheckBox(itemDialog1, wxID_ANY, _(
"Show on chart"),
385 wxDefaultPosition, wxDefaultSize, 0);
386 itemBoxSizer2->Add(m_cbShow, 0, wxALL, 5);
388 wxFlexGridSizer* itemFlexGridSizer6a =
new wxFlexGridSizer(4, 2, 0, 0);
389 itemFlexGridSizer6a->AddGrowableCol(1, 0);
391 itemBoxSizer2->Add(itemFlexGridSizer6a, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
394 wxStaticText* itemStaticText11 =
395 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Total distance"),
396 wxDefaultPosition, wxDefaultSize, 0);
397 itemFlexGridSizer6a->Add(
399 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
402 new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
403 wxSize(-1, -1), wxTE_READONLY);
404 itemFlexGridSizer6a->Add(m_tTotDistance, 0,
405 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
406 wxLEFT | wxRIGHT | wxBOTTOM,
409 m_stAvgSpeed =
new wxStaticText(itemDialog1, wxID_STATIC, _(
"Avg. speed"),
410 wxDefaultPosition, wxDefaultSize, 0);
411 itemFlexGridSizer6a->Add(
413 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
415 m_tAvgSpeed =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
416 wxSize(150, -1), wxTE_PROCESS_ENTER);
417 itemFlexGridSizer6a->Add(
419 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
422 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time Enroute"),
423 wxDefaultPosition, wxDefaultSize, 0);
424 itemFlexGridSizer6a->Add(
426 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
429 new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
430 wxSize(-1, -1), wxTE_READONLY);
431 itemFlexGridSizer6a->Add(m_tTimeEnroute, 0,
432 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
433 wxLEFT | wxRIGHT | wxBOTTOM,
450 wxString pDispTimeZone[] = {_(
"UTC"), _(
"Local Time"), _(
"LMT@Location"),
451 _(
"Honor Global Settings")};
453 wxStaticText* itemStaticText12b =
454 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time shown as"),
455 wxDefaultPosition, wxDefaultSize, 0);
456 itemBoxSizer2->Add(itemStaticText12b, 0, wxEXPAND | wxALL, 5);
459 new wxRadioButton(itemDialog1, wxID_ANY, _(
"UTC"), wxDefaultPosition,
460 wxDefaultSize, wxRB_GROUP);
463 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
465 m_rbShowTimePC =
new wxRadioButton(itemDialog1, wxID_ANY, _(
"Local Time"));
468 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
471 new wxRadioButton(itemDialog1, wxID_ANY, _(
"LMT@Location"));
474 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
477 new wxRadioButton(itemDialog1, wxID_ANY, _(
"Honor Global Settings"));
480 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
482 wxFlexGridSizer* itemFlexGridSizer6b =
new wxFlexGridSizer(3, 2, 0, 0);
483 itemBoxSizer2->Add(itemFlexGridSizer6b, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
486 wxStaticText* m_staticText1 =
487 new wxStaticText(itemDialog1, wxID_ANY, _(
"Color") + _T(
":"),
488 wxDefaultPosition, wxDefaultSize, 0);
489 itemFlexGridSizer6b->Add(m_staticText1, 0, wxALIGN_CENTER_VERTICAL | wxALL,
492 wxString m_chColorChoices[] = {
493 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
494 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
495 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
496 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
498 int m_chColorNChoices =
sizeof(m_chColorChoices) /
sizeof(wxString);
500 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(250, -1),
501 m_chColorNChoices, m_chColorChoices, 0);
502 m_cColor->SetSelection(0);
503 itemFlexGridSizer6b->Add(m_cColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
505 wxStaticText* staticTextStyle =
506 new wxStaticText(itemDialog1, wxID_ANY, _(
"Style") + _T(
":"),
507 wxDefaultPosition, wxDefaultSize, 0);
508 itemFlexGridSizer6b->Add(staticTextStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL,
511 wxString m_chStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
512 _(
"Long dash"), _(
"Short dash")};
513 int m_chStyleNChoices =
sizeof(m_chStyleChoices) /
sizeof(wxString);
515 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
516 m_chStyleNChoices, m_chStyleChoices, 0);
517 m_cStyle->SetSelection(0);
518 itemFlexGridSizer6b->Add(m_cStyle, 0,
519 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
522 staticTextStyle->Hide();
526 m_stWidth =
new wxStaticText(itemDialog1, wxID_ANY, _(
"Width") + _T(
":"),
527 wxDefaultPosition, wxDefaultSize, 0);
528 itemFlexGridSizer6b->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
530 wxString m_chWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
531 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
532 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
533 _(
"9 pixels"), _(
"10 pixels")};
534 int m_chWidthNChoices =
sizeof(m_chWidthChoices) /
sizeof(wxString);
536 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(150, -1),
537 m_chWidthNChoices, m_chWidthChoices, 0);
538 m_cWidth->SetSelection(0);
539 itemFlexGridSizer6b->Add(m_cWidth, 0,
540 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
542 wxStaticBox* itemStaticBoxSizer14Static =
543 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Waypoints"));
544 wxStaticBoxSizer* m_pListSizer =
545 new wxStaticBoxSizer(itemStaticBoxSizer14Static, wxVERTICAL);
546 itemBoxSizer2->Add(m_pListSizer, 1, wxEXPAND | wxALL, 1);
548 wxScrolledWindow* itemlistWin =
549 new wxScrolledWindow(itemDialog1, wxID_ANY, wxDefaultPosition,
550 wxDefaultSize, wxHSCROLL | wxVSCROLL);
551 itemlistWin->SetScrollRate(2, 2);
553 m_pListSizer->Add(itemlistWin, 0, wxEXPAND | wxALL, 6);
555 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
557 flags |= wxLC_VIRTUAL;
561 wxSize(100, 500), flags);
562 addColumns(m_lcPoints, GetCharWidth());
567 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
572 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
573 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
577 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
578 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
579 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
581 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
585 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
586 wxDefaultPosition, wxDefaultSize, 0);
587 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
588 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
589 m_sdbBtmBtnsSizerPrint->Enable(
true);
591 m_sdbBtmBtnsSizerPrint = NULL;
594 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
595 wxDefaultPosition, wxDefaultSize, 0);
596 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
597 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
598 m_sdbBtmBtnsSizerSplit->Enable(
false);
600 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"),
601 wxDefaultPosition, wxDefaultSize, 0);
602 m_sdbBtmBtnsSizerExtend->SetToolTip(
603 _(
"Extends this track by connecting it to another track.\n"
604 "Disabled when the track is active, the track is in a layer, or no "
605 "suitable track to connect to exists.\n"
606 "A suitable track is one that is visible, is different from this "
607 "track, and has its last point's timestamp earlier than or equal to "
608 "this track's first point's timestamp."));
609 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
610 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
612 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
613 wxDefaultPosition, wxDefaultSize, 0);
614 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
615 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
617 m_sdbBtmBtnsSizerExport = NULL;
623 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
624 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
626 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
627 wxDefaultPosition, wxDefaultSize, 0);
628 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0,
629 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
631 m_sdbBtmBtnsSizerOK =
632 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
633 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0,
634 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
635 m_sdbBtmBtnsSizerOK->SetDefault();
637 int char_size = GetCharWidth();
640 width = g_monitor_info[g_current_monitor].width;
641 height = g_monitor_info[g_current_monitor].height;
642 SetSizeHints(-1, -1, width - 100, height - 100);
645void TrackPropDlg::CreateControls(
void) {
646 wxBoxSizer* bSizerMain;
647 bSizerMain =
new wxBoxSizer(wxVERTICAL);
648 SetSizer(bSizerMain);
651 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
653 bSizerMain->Add(m_notebook1, 1, wxEXPAND | wxALL, 5);
656 new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize);
657 m_notebook1->AddPage(m_panel0, _(
"Basic"),
true);
659 wxBoxSizer* bSizer0 =
new wxBoxSizer(wxVERTICAL);
660 m_panel0->SetSizer(bSizer0);
662 wxBoxSizer* bSizer1 =
new wxBoxSizer(wxVERTICAL);
663 bSizer0->Add(bSizer1, 1, wxEXPAND | wxALL, 5);
665 m_panelBasic =
new wxScrolledWindow(m_panel0, wxID_ANY, wxDefaultPosition,
667 wxHSCROLL | wxVSCROLL | wxTAB_TRAVERSAL);
673 wxString wqs = getFontQtStylesheet(qFont);
674 wxCharBuffer sbuf = wqs.ToUTF8();
675 QString qsb = QString(sbuf.data());
677 QString qsbq = getQtStyleSheet();
679 m_panelBasic->GetHandle()->setStyleSheet(qsb +
688 wxBoxSizer* bSizerBasic =
new wxBoxSizer(wxVERTICAL);
689 m_panelBasic->SetSizer(bSizerBasic);
691 bSizer1->Add(m_panelBasic, 1, wxEXPAND | wxALL, 5);
693 wxBoxSizer* bSizerName;
694 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
695 bSizerBasic->Add(bSizerName, 0, wxALL | wxEXPAND, 5);
697 m_stName =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Name"),
698 wxDefaultPosition, wxDefaultSize, 0);
700 bSizerName->Add(m_stName, 0, wxALL, 5);
702 m_tName =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
703 wxDefaultPosition, wxDefaultSize, 0);
704 bSizerName->Add(m_tName, 1, 0, 5);
706 wxBoxSizer* bSizerFromTo;
707 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
708 bSizerBasic->Add(bSizerFromTo, 0, wxALL | wxEXPAND, 5);
710 m_stFrom =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"From"),
711 wxDefaultPosition, wxDefaultSize, 0);
713 bSizerFromTo->Add(m_stFrom, 0, wxALL, 5);
715 m_tFrom =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
716 wxDefaultPosition, wxDefaultSize, 0);
717 bSizerFromTo->Add(m_tFrom, 1, 0, 5);
719 m_stTo =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
722 bSizerFromTo->Add(m_stTo, 0, wxALL, 5);
724 m_tTo =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
725 wxDefaultPosition, wxDefaultSize, 0);
726 bSizerFromTo->Add(m_tTo, 1, 0, 5);
728 wxStaticBoxSizer* sbSizerParams;
729 sbSizerParams =
new wxStaticBoxSizer(
730 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Display parameters")),
732 bSizerBasic->Add(sbSizerParams, 0, wxALL | wxEXPAND, 5);
734 m_cbShow =
new wxCheckBox(m_panelBasic, wxID_ANY, _(
"Show on chart"),
735 wxDefaultPosition, wxDefaultSize, 0);
736 sbSizerParams->Add(m_cbShow, 0, wxALL, 5);
738 m_stColor =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Color"),
739 wxDefaultPosition, wxDefaultSize, 0);
741 sbSizerParams->Add(m_stColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
743 wxString m_cColorChoices[] = {
744 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
745 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
746 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
747 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
749 int m_cColorNChoices =
sizeof(m_cColorChoices) /
sizeof(wxString);
750 m_cColor =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
751 wxDefaultSize, m_cColorNChoices, m_cColorChoices, 0);
752 m_cColor->SetSelection(0);
753 sbSizerParams->Add(m_cColor, 1, 0, 5);
755 m_stStyle =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Style"),
756 wxDefaultPosition, wxDefaultSize, 0);
758 sbSizerParams->Add(m_stStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
760 wxString m_cStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
761 _(
"Long dash"), _(
"Short dash")};
762 int m_cStyleNChoices =
sizeof(m_cStyleChoices) /
sizeof(wxString);
763 m_cStyle =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
764 wxDefaultSize, m_cStyleNChoices, m_cStyleChoices, 0);
765 m_cStyle->SetSelection(0);
766 sbSizerParams->Add(m_cStyle, 1, 0, 5);
768 m_stWidth =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Width"),
769 wxDefaultPosition, wxDefaultSize, 0);
771 sbSizerParams->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
773 wxString m_cWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
774 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
775 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
776 _(
"9 pixels"), _(
"10 pixels")};
777 int m_cWidthNChoices =
sizeof(m_cWidthChoices) /
sizeof(wxString);
778 m_cWidth =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
779 wxDefaultSize, m_cWidthNChoices, m_cWidthChoices, 0);
780 m_cWidth->SetSelection(0);
781 sbSizerParams->Add(m_cWidth, 1, 0, 5);
783 wxStaticBoxSizer* sbSizerStats;
784 sbSizerStats =
new wxStaticBoxSizer(
785 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Statistics")), wxVERTICAL);
786 bSizerBasic->Add(sbSizerStats, 0, wxALL | wxEXPAND, 5);
788 wxBoxSizer* bSizerStats;
789 bSizerStats =
new wxBoxSizer(wxHORIZONTAL);
792 new wxStaticText(m_panelBasic, wxID_ANY, _(
"Total distance"),
793 wxDefaultPosition, wxDefaultSize, 0);
795 bSizerStats->Add(m_stTotDistance, 0, wxALL, 5);
798 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
799 wxDefaultSize, wxTE_READONLY);
800 bSizerStats->Add(m_tTotDistance, 1, 0, 5);
802 m_stAvgSpeed =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Avg. speed"),
803 wxDefaultPosition, wxDefaultSize, 0);
805 bSizerStats->Add(m_stAvgSpeed, 0, wxALL, 5);
807 m_tAvgSpeed =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
808 wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
809 bSizerStats->Add(m_tAvgSpeed, 1, 0, 5);
811 m_stTimeEnroute =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Time enroute"),
812 wxDefaultPosition, wxDefaultSize, 0);
814 bSizerStats->Add(m_stTimeEnroute, 0, wxALL, 5);
817 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
818 wxDefaultSize, wxTE_READONLY);
819 bSizerStats->Add(m_tTimeEnroute, 2, 0, 5);
821 sbSizerStats->Add(bSizerStats, 0, wxEXPAND, 5);
823 wxStaticBoxSizer* sbSizerPoints;
824 sbSizerPoints =
new wxStaticBoxSizer(
825 new wxStaticBox(m_panel0, wxID_ANY, _(
"Recorded points")), wxVERTICAL);
826 bSizer1->Add(sbSizerPoints, 1, wxALL | wxEXPAND, 5);
828 wxBoxSizer* bSizerShowTime;
829 bSizerShowTime =
new wxBoxSizer(wxHORIZONTAL);
831 m_stShowTime =
new wxStaticText(m_panel0, wxID_ANY, _(
"Time shown as"),
832 wxDefaultPosition, wxDefaultSize, 0);
834 bSizerShowTime->Add(m_stShowTime, 0, wxALL, 5);
836 m_rbShowTimeUTC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"UTC"),
837 wxDefaultPosition, wxDefaultSize, 0);
838 bSizerShowTime->Add(m_rbShowTimeUTC, 0,
839 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
842 m_rbShowTimePC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"Local Time"),
843 wxDefaultPosition, wxDefaultSize, 0);
845 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
849 new wxRadioButton(m_panel0, wxID_ANY, _(
"LMT@Track Start"),
850 wxDefaultPosition, wxDefaultSize, 0);
852 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
856 new wxRadioButton(m_panel0, wxID_ANY, _(
"Honor Global Settings"),
857 wxDefaultPosition, wxDefaultSize, 0);
859 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
864 sbSizerPoints->Add(bSizerShowTime, 0, wxEXPAND, 5);
866 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
868 flags |= wxLC_VIRTUAL;
872 wxDefaultSize, flags);
873 addColumns(m_lcPoints, GetCharWidth());
875 sbSizerPoints->Add(m_lcPoints, 1, wxALL | wxEXPAND, 5);
878 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
892 m_panelAdvanced =
new wxScrolledWindow(
893 m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
895 wxBoxSizer* bSizerAdvanced;
896 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
899 new wxStaticText(m_panelAdvanced, wxID_ANY, _(
"Description"),
900 wxDefaultPosition, wxDefaultSize, 0);
902 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
905 new wxTextCtrl(m_panelAdvanced, wxID_ANY, wxEmptyString,
906 wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
907 bSizerAdvanced->Add(m_tDescription, 1, wxALL | wxEXPAND, 5);
909 sbSizerLinks =
new wxStaticBoxSizer(
910 new wxStaticBox(m_panelAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
912 m_scrolledWindowLinks =
913 new wxScrolledWindow(m_panelAdvanced, wxID_ANY, wxDefaultPosition,
914 wxDefaultSize, wxHSCROLL | wxVSCROLL);
915 m_scrolledWindowLinks->SetScrollRate(5, 5);
916 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
919 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
920 wxT(
"http://www.wxformbuilder.org"),
921 wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
922 m_menuLink =
new wxMenu();
924 new wxMenuItem(m_menuLink, ID_TRK_MENU_EDIT, wxString(_(
"Edit")),
925 wxEmptyString, wxITEM_NORMAL);
926 m_menuLink->Append(m_menuItemEdit);
929 new wxMenuItem(m_menuLink, ID_TRK_MENU_ADD, wxString(_(
"Add new")),
930 wxEmptyString, wxITEM_NORMAL);
931 m_menuLink->Append(m_menuItemAdd);
934 new wxMenuItem(m_menuLink, ID_TRK_MENU_DELETE, wxString(_(
"Delete")),
935 wxEmptyString, wxITEM_NORMAL);
936 m_menuLink->Append(m_menuItemDelete);
938 m_hyperlink1->Connect(
940 wxMouseEventHandler(TrackPropDlg::m_hyperlink1OnContextMenu), NULL,
this);
942 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
944 m_scrolledWindowLinks->SetSizer(bSizerLinks);
945 m_scrolledWindowLinks->Layout();
946 bSizerLinks->Fit(m_scrolledWindowLinks);
947 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
949 wxBoxSizer* bSizerLinkBtns;
950 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
953 new wxButton(m_panelAdvanced, wxID_ANY, _(
"Add"), wxDefaultPosition,
954 wxDefaultSize, wxBU_EXACTFIT);
955 bSizerLinkBtns->Add(m_buttonAddLink, 0, wxALL, 5);
957 m_toggleBtnEdit =
new wxToggleButton(m_panelAdvanced, wxID_ANY, _(
"Edit"),
958 wxDefaultPosition, wxDefaultSize, 0);
959 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
961 m_staticTextEditEnabled =
new wxStaticText(
962 m_panelAdvanced, wxID_ANY, _(
"Links are opened in the default browser."),
963 wxDefaultPosition, wxDefaultSize, 0);
965 bSizerLinkBtns->Add(m_staticTextEditEnabled, 0,
966 wxALIGN_CENTER_VERTICAL | wxALL, 5);
968 sbSizerLinks->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
970 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
972 m_panelAdvanced->SetSizer(bSizerAdvanced);
973 m_notebook1->AddPage(m_panelAdvanced, _(
"Advanced"),
false);
977 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
978 bSizerMain->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
984 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
985 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
986 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
988 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
992 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
993 wxDefaultPosition, wxDefaultSize, 0);
994 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
995 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
996 m_sdbBtmBtnsSizerPrint->Enable(
true);
998 m_sdbBtmBtnsSizerPrint = NULL;
1001 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
1002 wxDefaultPosition, wxDefaultSize, 0);
1003 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
1004 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1005 m_sdbBtmBtnsSizerSplit->Enable(
false);
1007 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend track"),
1008 wxDefaultPosition, wxDefaultSize, 0);
1009 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
1010 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1012 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
1013 wxDefaultPosition, wxDefaultSize, 0);
1014 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
1015 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1017 m_sdbBtmBtnsSizerExport =
new wxButton(
this, wxID_ANY, _(
"Export"),
1018 wxDefaultPosition, wxDefaultSize, 0);
1019 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExport, 0,
1020 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1022 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
1023 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
1025 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
1026 wxDefaultPosition, wxDefaultSize, 0);
1027 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0, wxALIGN_BOTTOM | wxALL, 5);
1029 m_sdbBtmBtnsSizerOK =
1030 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
1031 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0, wxALIGN_BOTTOM | wxALL, 5);
1032 m_sdbBtmBtnsSizerOK->SetDefault();
1036 ((wxWindowBase*)m_stName)->GetSize(&w1, &h);
1037 ((wxWindowBase*)m_stFrom)->GetSize(&w2, &h);
1038 ((wxWindowBase*)m_stName)->SetMinSize(wxSize(wxMax(w1, w2), h));
1039 ((wxWindowBase*)m_stFrom)->SetMinSize(wxSize(wxMax(w1, w2), h));
1041 m_panelBasic->SetScrollRate(5, 5);
1042 m_panelAdvanced->SetScrollRate(5, 5);
1045void TrackPropDlg::SetTrackAndUpdate(
Track* pt) {
1048 m_lcPoints->DeleteAllItems();
1050 if (m_pMyLinkList)
delete m_pMyLinkList;
1051 m_pMyLinkList =
new HyperlinkList();
1053 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1054 if (NbrOfLinks > 0) {
1055 wxHyperlinkListNode* linknode = m_pTrack->m_TrackHyperlinkList->GetFirst();
1060 h->DescrText = link->DescrText;
1061 h->Link = link->Link;
1062 h->LType = link->LType;
1064 m_pMyLinkList->Append(h);
1066 linknode = linknode->GetNext();
1076void TrackPropDlg::InitializeList() {
1077 if (NULL == m_pTrack)
return;
1079 m_lcPoints->m_pTrack = m_pTrack;
1081 if (m_pTrack->GetnPoints()) {
1084 m_lcPoints->m_LMT_Offset = long((prp->m_lon) * 3600. / 15.);
1086 m_lcPoints->m_LMT_Offset = 0;
1089 if (m_lcPoints->IsVirtual())
1090 m_lcPoints->SetItemCount(m_pTrack->GetnPoints());
1093 for (
int in = 0; in < m_pTrack->GetnPoints(); in++) {
1097 m_lcPoints->InsertItem(item);
1098 for (
int j = 0; j < 7; j++) {
1100 item.SetText(m_lcPoints->OnGetItemText(in, j));
1101 m_lcPoints->SetItem(item);
1108 if (NULL == m_pTrack)
return false;
1110 ::wxBeginBusyCursor();
1112 if (m_scrolledWindowLinks) {
1113 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1114 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1115 wxWindowListNode* node = kids.Item(i);
1116 wxWindow* win = node->GetData();
1118 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1120 link_win->Disconnect(
1121 wxEVT_COMMAND_HYPERLINK,
1122 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1123 link_win->Disconnect(
1125 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1130 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1131 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1133 if (NbrOfLinks > 0) {
1134 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1137 wxString Link = link->Link;
1138 wxString Descr = link->DescrText;
1140 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1141 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1142 wxDefaultSize, wxHL_DEFAULT_STYLE);
1143 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1144 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1146 if (!m_pTrack->m_bIsInLayer)
1149 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu), NULL,
1152 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1154 linknode = linknode->GetNext();
1157 bSizerLinks->Fit(m_scrolledWindowLinks);
1160 m_tName->SetValue(m_pTrack->GetName());
1161 m_tFrom->SetValue(m_pTrack->m_TrackStartString);
1162 m_tTo->SetValue(m_pTrack->m_TrackEndString);
1163 if (m_tDescription) m_tDescription->SetValue(m_pTrack->m_TrackDescription);
1165 m_tTotDistance->SetValue(_T(
""));
1166 m_tTimeEnroute->SetValue(_T(
""));
1168 m_sdbBtmBtnsSizerSplit->Enable(
false);
1169 m_sdbBtmBtnsSizerExtend->Enable(
false);
1172 TrackPoint* last_point = m_pTrack->GetLastPoint();
1173 TrackPoint* first_point = m_pTrack->GetPoint(0);
1174 double trackLength = m_pTrack->Length();
1175 double total_seconds = 0.;
1177 wxString speed(_T(
"--"));
1179 if (last_point && first_point) {
1186 if (total_seconds != 0.) {
1187 m_avgspeed = trackLength / total_seconds * 3600;
1191 speed.Printf(_T(
"%5.2f"), toUsrSpeed(m_avgspeed));
1195 m_tAvgSpeed->SetValue(speed);
1199 slen.Printf(wxT(
"%5.2f ") + getUsrDistanceUnit(), toUsrDistance(trackLength));
1201 m_tTotDistance->SetValue(slen);
1205 wxTimeSpan time(0, 0, (
int)total_seconds, 0);
1207 if (total_seconds > 3600. * 24.)
1208 time_form = time.Format(
"%H:%M");
1209 else if (total_seconds > 0.)
1210 time_form = time.Format(
"%H:%M");
1212 time_form = _T(
"--");
1213 m_tTimeEnroute->SetValue(time_form);
1215 m_cbShow->SetValue(m_pTrack->IsVisible());
1217 if (m_pTrack->m_Colour == wxEmptyString)
1218 m_cColor->Select(0);
1220 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
1222 if (m_pTrack->m_Colour == ::GpxxColorNames[i]) {
1223 m_cColor->Select(i + 1);
1229 for (
unsigned int i = 0; i <
sizeof(::StyleValues) /
sizeof(
int); i++) {
1230 if (m_pTrack->m_style == ::StyleValues[i]) {
1231 m_cStyle->Select(i);
1236 for (
unsigned int i = 0; i <
sizeof(::WidthValues) /
sizeof(
int); i++) {
1237 if (m_pTrack->m_width == ::WidthValues[i]) {
1238 m_cWidth->Select(i);
1243 if (m_pTrack->m_bIsInLayer) {
1244 m_tName->SetEditable(
false);
1245 m_tFrom->SetEditable(
false);
1246 m_tTo->SetEditable(
false);
1247 if (m_tDescription) m_tDescription->SetEditable(
false);
1248 m_cbShow->Enable(
false);
1249 m_cColor->Enable(
false);
1250 m_cStyle->Enable(
false);
1251 m_cWidth->Enable(
false);
1252 m_sdbBtmBtnsSizerExtend->Enable(
false);
1253 m_sdbBtmBtnsSizerSplit->Enable(
false);
1254 SetTitle(wxString::Format(_T(
"%s, %s: %d"), _(
"Track properties"),
1255 _T(
"Layer"), m_pTrack->m_LayerID));
1257 m_tName->SetEditable(
true);
1258 m_tFrom->SetEditable(
true);
1259 m_tTo->SetEditable(
true);
1260 if (m_tDescription) m_tDescription->SetEditable(
true);
1261 m_cbShow->Enable(
true);
1262 m_cColor->Enable(
true);
1263 m_cStyle->Enable(
true);
1264 m_cWidth->Enable(
true);
1266 m_sdbBtmBtnsSizerExtend->Enable(IsThisTrackExtendable());
1268 SetTitle(_(
"Track properties"));
1271 ::wxEndBusyCursor();
1276bool TrackPropDlg::IsThisTrackExtendable() {
1277 m_pExtendTrack = NULL;
1278 m_pExtendPoint = NULL;
1279 if (m_pTrack == g_pActiveTrack || m_pTrack->m_bIsInLayer) {
1283 TrackPoint* pLastPoint = m_pTrack->GetPoint(0);
1288 for (
Track* ptrack : g_TrackList) {
1289 if (ptrack->IsVisible() && (ptrack->m_GUID != m_pTrack->m_GUID)) {
1290 TrackPoint* track_node = ptrack->GetLastPoint();
1294 if (!m_pExtendPoint ||
1296 m_pExtendPoint = track_node;
1297 m_pExtendTrack = ptrack;
1304 if (m_pExtendTrack) {
1305 return (!m_pExtendTrack->m_bIsInLayer);
1311void TrackPropDlg::OnExtendBtnClick(wxCommandEvent& event) {
1312 TrackPoint* pFirstPoint = m_pTrack->GetPoint(0);
1314 if (IsThisTrackExtendable()) {
1319 pSelect->DeleteAllSelectableTrackSegments(m_pExtendTrack);
1320 m_pExtendTrack->Clone(m_pTrack, begin, m_pTrack->GetnPoints(), _(
"_plus"));
1321 pSelect->AddAllSelectableTrackSegments(m_pExtendTrack);
1322 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1325 SetTrackAndUpdate(m_pExtendTrack);
1328 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1329 pRouteManagerDialog->UpdateTrkListCtrl();
1334void TrackPropDlg::OnSplitBtnClick(wxCommandEvent& event) {
1335 m_sdbBtmBtnsSizerSplit->Enable(
false);
1337 if (m_pTrack->m_bIsInLayer) {
1341 if ((m_nSelected > 1) && (m_nSelected < m_pTrack->GetnPoints())) {
1344 pHead->Clone(m_pTrack, 0, m_nSelected - 1, _(
"_A"));
1345 pTail->Clone(m_pTrack, m_nSelected - 1, m_pTrack->GetnPoints(), _(
"_B"));
1347 g_TrackList.push_back(pHead);
1348 NavObj_dB::GetInstance().AddNewTrack(pHead);
1350 g_TrackList.push_back(pTail);
1351 NavObj_dB::GetInstance().AddNewTrack(pTail);
1353 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1355 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1357 pSelect->AddAllSelectableTrackSegments(pTail);
1358 pSelect->AddAllSelectableTrackSegments(pHead);
1360 SetTrackAndUpdate(pTail);
1363 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1364 pRouteManagerDialog->UpdateTrkListCtrl();
1369void TrackPropDlg::OnTrackPropCopyTxtClick(wxCommandEvent& event) {
1370 wxString tab(
"\t", wxConvUTF8);
1371 wxString eol(
"\n", wxConvUTF8);
1374 csvString << this->GetTitle() << eol << _(
"Name") << tab
1375 << m_pTrack->GetName() << eol << _(
"Depart From") << tab
1376 << m_pTrack->m_TrackStartString << eol << _(
"Destination") << tab
1377 << m_pTrack->m_TrackEndString << eol << _(
"Total distance") << tab
1378 << m_tTotDistance->GetValue() << eol << _(
"Speed") << tab
1379 << m_tAvgSpeed->GetValue() << eol
1380 << _(
"Departure Time") + _T(
" ") + _(
"(m/d/y h:m)") << tab
1382 << _(
"Time enroute") << tab << m_tTimeEnroute->GetValue() << eol
1387 noCols = m_lcPoints->GetColumnCount();
1388 noRows = m_lcPoints->GetItemCount();
1390 item.SetMask(wxLIST_MASK_TEXT);
1392 for (
int i = 0; i < noCols; i++) {
1393 m_lcPoints->GetColumn(i, item);
1394 csvString << item.GetText() << tab;
1398 for (
int j = 0; j < noRows; j++) {
1400 for (
int i = 0; i < noCols; i++) {
1402 m_lcPoints->GetItem(item);
1403 csvString << item.GetText() << tab;
1408 if (wxTheClipboard->Open()) {
1409 wxTextDataObject* data =
new wxTextDataObject;
1410 data->SetText(csvString);
1411 wxTheClipboard->SetData(data);
1412 wxTheClipboard->Close();
1416void TrackPropDlg::OnPrintBtnClick(wxCommandEvent& event) {
1417 static std::set<int> s_options;
1419 int result = dlg.ShowModal();
1421 if (result == wxID_OK) {
1422 dlg.GetSelected(s_options);
1425 printer.Initialize(wxPORTRAIT);
1426 printer.EnablePageNumbers(
true);
1427 printer.Print(
this, &printout);
1431void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1434 wxMenuItem* copyItem =
1435 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1440void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1446 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1450 selected_no = itemno;
1452 m_pTrack->m_HighlightedTrackPoint = -1;
1455 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1457 m_pTrack->m_HighlightedTrackPoint = itemno;
1459 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack == g_pActiveTrack)) {
1460 m_nSelected = selected_no + 1;
1461 m_sdbBtmBtnsSizerSplit->Enable(
true);
1463 if (gFrame->GetFocusCanvas()) {
1464 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), prp->m_lat, prp->m_lon,
1465 gFrame->GetFocusCanvas()->GetVPScale());
1468 if (m_lcPoints) m_lcPoints->SetFocus();
1472 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1473 m_sdbBtmBtnsSizerSplit->Enable(
false);
1476void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1477 switch (event.GetId()) {
1478 case ID_RCLK_MENU_COPY_TEXT:
1479 OnTrackPropCopyTxtClick(event);
1484void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1485 pRouteManagerDialog->TrackToRoute(m_pTrack);
1486 if (NULL != pRouteManagerDialog && pRouteManagerDialog->IsVisible())
1487 pRouteManagerDialog->UpdateRouteListCtrl();
1490void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1491 wxString suggested_name = _(
"track");
1492 std::vector<Track*> list = {m_pTrack};
1493 if (m_pTrack->GetName() != wxEmptyString)
1494 suggested_name = m_pTrack->GetName();
1495 ExportGPXTracks(
this, &list, suggested_name);
1498void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1499 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1501 wxEVT_COMMAND_MENU_SELECTED,
1502 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1503 m_scrolledWindowLinks->PopupMenu(
1504 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1505 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1508void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1509 switch (event.GetId()) {
1510 case ID_TRK_MENU_ADD:
1513 case ID_TRK_MENU_EDIT:
1516 case ID_TRK_MENU_DELETE:
1525 wxHyperlinkListNode* nodeToDelete = NULL;
1526 wxString findurl = m_pEditedLink->GetURL();
1527 wxString findlabel = m_pEditedLink->GetLabel();
1529 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1530 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1531 wxWindowListNode* node = kids.Item(i);
1532 wxWindow* win = node->GetData();
1534 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1536 link_win->Disconnect(
1537 wxEVT_COMMAND_HYPERLINK,
1538 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1539 link_win->Disconnect(
1541 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1547 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1548 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1550 if (NbrOfLinks > 0) {
1551 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1554 wxString Link = link->Link;
1555 wxString Descr = link->DescrText;
1556 if (Link == findurl &&
1557 (Descr == findlabel || (Link == findlabel && Descr == wxEmptyString)))
1558 nodeToDelete = linknode;
1560 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1561 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1562 wxDefaultSize, wxHL_DEFAULT_STYLE);
1563 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1564 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1566 ctrl->Connect(wxEVT_RIGHT_DOWN,
1567 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1570 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1572 linknode = linknode->GetNext();
1575 if (nodeToDelete) hyperlinklist->DeleteNode(nodeToDelete);
1576 m_scrolledWindowLinks->InvalidateBestSize();
1577 m_scrolledWindowLinks->Layout();
1578 sbSizerLinks->Layout();
1582void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1583 wxString findurl = m_pEditedLink->GetURL();
1584 wxString findlabel = m_pEditedLink->GetLabel();
1587 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1588 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1589 DimeControl(LinkPropDlg);
1590 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1591 findlabel](
int retcode) {
1592 if (retcode == wxID_OK) {
1593 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1594 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1596 if (NbrOfLinks > 0) {
1597 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1600 wxString Link = link->Link;
1601 wxString Descr = link->DescrText;
1602 if (Link == findurl &&
1603 (Descr == findlabel ||
1604 (Link == findlabel && Descr == wxEmptyString))) {
1605 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1607 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1608 wxHyperlinkCtrl* h =
1609 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1612 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1613 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1616 linknode = linknode->GetNext();
1620 m_scrolledWindowLinks->InvalidateBestSize();
1621 m_scrolledWindowLinks->Layout();
1622 sbSizerLinks->Layout();
1628void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1630 LinkPropDlg->m_textCtrlLinkDescription->SetValue(wxEmptyString);
1631 LinkPropDlg->m_textCtrlLinkUrl->SetValue(wxEmptyString);
1632 DimeControl(LinkPropDlg);
1633 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1634 if (retcode == wxID_OK) {
1635 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1636 if (desc == wxEmptyString)
1637 desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1638 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1639 m_scrolledWindowLinks, wxID_ANY, desc,
1640 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1641 wxDefaultSize, wxHL_DEFAULT_STYLE);
1642 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1643 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1645 ctrl->Connect(wxEVT_RIGHT_DOWN,
1646 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1649 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1650 bSizerLinks->Fit(m_scrolledWindowLinks);
1654 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1655 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1656 h->LType = wxEmptyString;
1657 m_pTrack->m_TrackHyperlinkList->Append(h);
1662 m_scrolledWindowLinks->InvalidateBestSize();
1663 m_scrolledWindowLinks->Layout();
1664 sbSizerLinks->Layout();
1669void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1670 if (m_toggleBtnEdit->GetValue())
1671 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1673 m_staticTextEditEnabled->SetLabel(
1674 _(
"Links are opened in the default browser."));
1678void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1679 if (m_toggleBtnEdit->GetValue()) {
1680 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1695 wxString cc =
event.GetURL();
1696 if (cc.Find(_T(
"#")) != wxNOT_FOUND) {
1698 wxString(_T(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command")));
1699 if (RegKey.Exists()) {
1700 wxString command_line;
1701 RegKey.QueryValue(wxString(_T(
"")), command_line);
1704 command_line.Replace(wxString(_T(
"\"")), wxString(_T(
"")));
1707 int l = command_line.Find(_T(
".exe"));
1708 if (wxNOT_FOUND == l) l = command_line.Find(_T(
".EXE"));
1710 if (wxNOT_FOUND != l) {
1711 wxString cl = command_line.Mid(0, l + 4);
1713 cc.Prepend(_T(
"\""));
1714 cc.Append(_T(
"\""));
1722 wxString url =
event.GetURL();
1723 url.Replace(_T(
" "), _T(
"%20"));
1724 ::wxLaunchDefaultBrowser(url);
1729void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1730 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1739 throw std::logic_error(
"Unexpected time zone selection");
1740 m_lcPoints->DeleteAllItems();
1744bool TrackPropDlg::SaveChanges(
void) {
1745 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1747 m_pTrack->SetName(m_tName->GetValue());
1748 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1749 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1751 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1752 m_pTrack->SetVisible(m_cbShow->GetValue());
1753 if (m_cColor->GetSelection() == 0)
1754 m_pTrack->m_Colour = wxEmptyString;
1756 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1757 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1758 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1760 NavObj_dB::GetInstance().UpdateDBTrackAttributes(m_pTrack);
1762 pConfig->UpdateSettings();
1765 if (m_pTrack && m_pTrack->IsRunning()) {
1767 v[_T(
"Changed")] =
true;
1768 v[_T(
"Name")] = m_pTrack->GetName();
1769 v[_T(
"GUID")] = m_pTrack->m_GUID;
1770 wxString msg_id(_T(
"OCPN_TRK_ACTIVATED"));
1771 SendJSONMessageToAllPlugins(msg_id, v);
1777void TrackPropDlg::OnOKBtnClick(wxCommandEvent& event) {
1781 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1782 m_pTrack) != g_TrackList.end();
1784 if (b_found_track) {
1786 m_pTrack->ClearHighlights();
1789 m_bStartNow =
false;
1791 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1792 pRouteManagerDialog->UpdateTrkListCtrl();
1795 gFrame->InvalidateAllGL();
1796 gFrame->RefreshAllCanvas(
false);
1801void TrackPropDlg::OnCancelBtnClick(wxCommandEvent& event) {
1802 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1803 m_pTrack) != g_TrackList.end();
1805 if (b_found_track) m_pTrack->ClearHighlights();
1808 gFrame->InvalidateAllGL();
1809 gFrame->RefreshAllCanvas(
false);
1818OCPNTrackListCtrl::OCPNTrackListCtrl(wxWindow* parent, wxWindowID
id,
1819 const wxPoint& pos,
const wxSize& size,
1821 : wxListCtrl(parent, id, pos, size, style) {
1823 m_tz_selection = GLOBAL_SETTINGS_INPUT;
1827OCPNTrackListCtrl::~OCPNTrackListCtrl() {}
1830 if (m_pTrack->GetnPoints()) {
1832 if (prp)
return prp->m_lon;
1837wxString OCPNTrackListCtrl::OnGetItemText(
long item,
long column)
const {
1840 if (item < 0 || item >= m_pTrack->GetnPoints())
return wxEmptyString;
1842 TrackPoint* this_point = m_pTrack->GetPoint(item);
1843 TrackPoint* prev_point = item > 0 ? m_pTrack->GetPoint(item - 1) : NULL;
1845 if (!this_point)
return wxEmptyString;
1847 double gt_brg, gt_leg_dist;
1853 slat = prev_point->m_lat;
1854 slon = prev_point->m_lon;
1862 ret.Printf(_T(
"%ld"), item);
1866 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1867 >_brg, >_leg_dist);
1869 ret.Printf(_T(
"%6.2f ") + getUsrDistanceUnit(),
1870 toUsrDistance(gt_leg_dist));
1874 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1875 >_brg, >_leg_dist);
1876 ret.Printf(
"%03.0f %cT", gt_brg, 0x00B0);
1880 ret = toSDMM(1, this_point->m_lat, 1);
1884 ret = toSDMM(2, this_point->m_lon, 1);
1889 if (timestamp.IsValid()) {
1894 ret = ocpn::toUsrDateTimeFormat(timestamp.FromUTC(), opts);
1902 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat,
1903 slon, >_brg, >_leg_dist);
1910 if (seconds > 0.) speed = gt_leg_dist / seconds * 3600;
1912 ret.Printf(_T(
"%5.2f"), toUsrSpeed(speed));
1924int OCPNTrackListCtrl::OnGetItemColumnImage(
long item,
long column)
const {
Represents an active track that is currently being recorded.
int m_tz_selection
The timezone to use when formatting date/time.
double getStartPointLongitude() const
Return the longitude at the start point of the track.
static PrintDialog & GetInstance()
Get instance to handle the print process,.
Represents a single point in a track.
wxDateTime GetCreateTime(void)
Retrieves the creation timestamp of a track point as a wxDateTime object.
Input dialog with track print selection.
Printout a table with track selected information.
void OnDeleteLink(wxCommandEvent &event)
wxRadioButton * m_rbShowTimeLocal
Use Local Mean Time (LMT) at the location to format date/time.
wxRadioButton * m_rbShowTimePC
Use system timezone to format date/time, i.e.
wxRadioButton * m_rbShowTimeGlobalSettings
Honor OpenCPN global setting to format date/time.
Represents a track, which is a series of connected track points.
The JSON value class implementation.
wxFont * GetOCPNScaledFont(wxString item, int default_size)
Retrieves a font from FontMgr, optionally scaled for physical readability.
General purpose GUI support.
Tools to send data to plugins.