27#include "model/georef.h"
28#include "model/navutil_base.h"
29#include "model/own_ship.h"
31#include "model/route.h"
32#include "model/routeman.h"
33#include "model/select.h"
34#include "model/track.h"
40#include "ocpn_frame.h"
41#include "OCPNPlatform.h"
42#include "pluginmanager.h"
43#include "print_dialog.h"
44#include "routemanagerdialog.h"
45#include "routeman_gui.h"
46#include "track_printout.h"
47#include "TrackPropDlg.h"
50#include "androidUTIL.h"
59#define GLOBAL_SETTINGS_INPUT 3
62#define DISPLAY_FORMAT 2
63#define TIMESTAMP_FORMAT 3
65extern std::vector<Track*> g_TrackList;
73bool TrackPropDlg::instanceFlag =
false;
75TrackPropDlg* TrackPropDlg::getInstance(wxWindow* parent, wxWindowID
id,
76 const wxString& title,
77 const wxPoint& pos,
const wxSize& size,
80 single =
new TrackPropDlg(parent,
id, title, pos, size, style);
88TrackPropDlg::TrackPropDlg(wxWindow* parent, wxWindowID
id,
89 const wxString& title,
const wxPoint& pos,
90 const wxSize& size,
long style)
91 : DIALOG_PARENT(parent, id, title, pos, size, style) {
95 SetWindowStyleFlag(style);
97 m_scrolledWindowLinks = NULL;
98 m_tDescription = NULL;
104 CreateControlsCompact();
114 m_sdbBtmBtnsSizerCancel->Connect(
115 wxEVT_COMMAND_BUTTON_CLICKED,
116 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
117 m_sdbBtmBtnsSizerOK->Connect(
118 wxEVT_COMMAND_BUTTON_CLICKED,
119 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
120 if (m_sdbBtmBtnsSizerPrint)
121 m_sdbBtmBtnsSizerPrint->Connect(
122 wxEVT_COMMAND_BUTTON_CLICKED,
123 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
124 m_sdbBtmBtnsSizerSplit->Connect(
125 wxEVT_COMMAND_BUTTON_CLICKED,
126 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
127 m_sdbBtmBtnsSizerExtend->Connect(
128 wxEVT_COMMAND_BUTTON_CLICKED,
129 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
130 m_sdbBtmBtnsSizerToRoute->Connect(
131 wxEVT_COMMAND_BUTTON_CLICKED,
132 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
133 if (m_sdbBtmBtnsSizerExport)
134 m_sdbBtmBtnsSizerExport->Connect(
135 wxEVT_COMMAND_BUTTON_CLICKED,
136 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
137 m_lcPoints->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
138 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
140 Connect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
141 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
this);
142 Connect(wxEVT_COMMAND_MENU_SELECTED,
143 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
147 Connect(wxEVT_ACTIVATE, wxActivateEventHandler(TrackPropDlg::OnActivate),
152 m_buttonAddLink->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
153 wxCommandEventHandler(TrackPropDlg::OnAddLink),
155 m_toggleBtnEdit->Connect(
156 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
157 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
161 m_rbShowTimeUTC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
162 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
165 m_rbShowTimePC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
166 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
168 if (m_rbShowTimeLocal)
169 m_rbShowTimeLocal->Connect(
170 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
171 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
173 if (m_rbShowTimeGlobalSettings)
174 m_rbShowTimeGlobalSettings->Connect(
175 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
176 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
178 m_pMyLinkList = NULL;
181TrackPropDlg::~TrackPropDlg() {
183 m_sdbBtmBtnsSizerCancel->Disconnect(
184 wxEVT_COMMAND_BUTTON_CLICKED,
185 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
186 m_sdbBtmBtnsSizerOK->Disconnect(
187 wxEVT_COMMAND_BUTTON_CLICKED,
188 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
189 if (m_sdbBtmBtnsSizerPrint)
190 m_sdbBtmBtnsSizerPrint->Disconnect(
191 wxEVT_COMMAND_BUTTON_CLICKED,
192 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
193 m_sdbBtmBtnsSizerSplit->Disconnect(
194 wxEVT_COMMAND_BUTTON_CLICKED,
195 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
196 m_sdbBtmBtnsSizerExtend->Disconnect(
197 wxEVT_COMMAND_BUTTON_CLICKED,
198 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
199 m_sdbBtmBtnsSizerToRoute->Disconnect(
200 wxEVT_COMMAND_BUTTON_CLICKED,
201 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
202 if (m_sdbBtmBtnsSizerExport)
203 m_sdbBtmBtnsSizerExport->Disconnect(
204 wxEVT_COMMAND_BUTTON_CLICKED,
205 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
206 m_lcPoints->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
207 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
209 Disconnect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
210 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
212 Disconnect(wxEVT_COMMAND_MENU_SELECTED,
213 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
216 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
218 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
219 wxCommandEventHandler(TrackPropDlg::OnEditLink));
220 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
221 wxCommandEventHandler(TrackPropDlg::OnAddLink));
224 m_buttonAddLink->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
225 wxCommandEventHandler(TrackPropDlg::OnAddLink),
227 m_toggleBtnEdit->Disconnect(
228 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
229 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
233 m_rbShowTimeUTC->Disconnect(
234 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
235 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
238 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
239 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
242 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
243 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
246 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
247 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
249 instanceFlag =
false;
252static wxString getDatetimeTimezoneSelector(
int selection) {
260 case GLOBAL_SETTINGS_INPUT:
262 return wxEmptyString;
266void TrackPropDlg::OnActivate(wxActivateEvent& event) {
267 auto pWin =
dynamic_cast<DIALOG_PARENT*
>(
event.GetEventObject());
268 long int style = pWin->GetWindowStyle();
269 if (event.GetActive())
270 pWin->SetWindowStyle(style | wxSTAY_ON_TOP);
272 pWin->SetWindowStyle(style ^ wxSTAY_ON_TOP);
275void TrackPropDlg::RecalculateSize(
void) {
279 esize.x = GetCharWidth() * 110;
280 esize.y = GetCharHeight() * 40;
282 wxSize dsize = GetParent()->GetClientSize();
283 esize.y = wxMin(esize.y, dsize.y - (2 * GetCharHeight()));
284 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
285 SetClientSize(esize);
287 wxSize fsize = GetSize();
288 fsize.y = wxMin(fsize.y, dsize.y - (2 * GetCharHeight()));
289 fsize.x = wxMin(fsize.x, dsize.x - (2 * GetCharHeight()));
293 int sy = GetCharHeight() * m_lcPoints->GetItemCount();
296 m_lcPoints->SetSize(wxSize(GetClientSize().x - 40, sy));
298 if (m_lcPoints->GetItemCount()) Layout();
304static void addColumns(wxListCtrl* lctrl,
int dx) {
305 lctrl->InsertColumn(0, _(
"Leg"), wxLIST_FORMAT_LEFT, dx * 6);
306 lctrl->InsertColumn(1, _(
"Distance"), wxLIST_FORMAT_LEFT, dx * 11);
307 lctrl->InsertColumn(2, _(
"Bearing"), wxLIST_FORMAT_LEFT, dx * 8);
309 lctrl->InsertColumn(3, _(
"Latitude"), wxLIST_FORMAT_LEFT, dx * 15);
310 lctrl->InsertColumn(4, _(
"Longitude"), wxLIST_FORMAT_LEFT, dx * 15);
313 lctrl->InsertColumn(5, _(
"Timestamp"), wxLIST_FORMAT_LEFT, dx * 26);
314 lctrl->InsertColumn(6, _(
"Speed"), wxLIST_FORMAT_CENTER, dx * 8);
316 lctrl->SetMinSize(wxSize(-1, 50));
319void TrackPropDlg::CreateControlsCompact() {
320 wxBoxSizer* itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
321 SetSizer(itemBoxSizer1);
323 itemDialog1 =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
324 wxSize(-1, -1), wxVSCROLL);
325 itemDialog1->SetScrollRate(0, 1);
331 wxString wqs = getFontQtStylesheet(qFont);
332 wxCharBuffer sbuf = wqs.ToUTF8();
333 QString qsb = QString(sbuf.data());
335 QString qsbq = getQtStyleSheet();
337 itemDialog1->GetHandle()->setStyleSheet(qsb +
341 itemBoxSizer1->Add(itemDialog1, 1, wxEXPAND | wxALL, 0);
343 wxBoxSizer* itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
344 itemDialog1->SetSizer(itemBoxSizer2);
346 wxStaticText* itemStaticText4 =
new wxStaticText(
347 itemDialog1, wxID_STATIC, _(
"Name"), wxDefaultPosition, wxDefaultSize, 0);
348 itemBoxSizer2->Add(itemStaticText4, 0,
349 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5);
351 m_tName =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
353 itemBoxSizer2->Add(m_tName, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM, 5);
355 wxStaticText* itemStaticText7 =
356 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Depart From"),
357 wxDefaultPosition, wxDefaultSize, 0);
358 itemBoxSizer2->Add(itemStaticText7, 0,
359 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
362 m_tFrom =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
364 itemBoxSizer2->Add(m_tFrom, 0,
365 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
366 wxLEFT | wxRIGHT | wxBOTTOM,
369 wxStaticText* itemStaticText8 =
370 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Destination"),
371 wxDefaultPosition, wxDefaultSize, 0);
372 itemBoxSizer2->Add(itemStaticText8, 0,
373 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
376 m_tTo =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
378 itemBoxSizer2->Add(m_tTo, 0,
379 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
380 wxLEFT | wxRIGHT | wxBOTTOM,
383 m_cbShow =
new wxCheckBox(itemDialog1, wxID_ANY, _(
"Show on chart"),
384 wxDefaultPosition, wxDefaultSize, 0);
385 itemBoxSizer2->Add(m_cbShow, 0, wxALL, 5);
387 wxFlexGridSizer* itemFlexGridSizer6a =
new wxFlexGridSizer(4, 2, 0, 0);
388 itemFlexGridSizer6a->AddGrowableCol(1, 0);
390 itemBoxSizer2->Add(itemFlexGridSizer6a, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
393 wxStaticText* itemStaticText11 =
394 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Total distance"),
395 wxDefaultPosition, wxDefaultSize, 0);
396 itemFlexGridSizer6a->Add(
398 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
401 new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
402 wxSize(-1, -1), wxTE_READONLY);
403 itemFlexGridSizer6a->Add(m_tTotDistance, 0,
404 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
405 wxLEFT | wxRIGHT | wxBOTTOM,
408 m_stAvgSpeed =
new wxStaticText(itemDialog1, wxID_STATIC, _(
"Avg. speed"),
409 wxDefaultPosition, wxDefaultSize, 0);
410 itemFlexGridSizer6a->Add(
412 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
414 m_tAvgSpeed =
new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
415 wxSize(150, -1), wxTE_PROCESS_ENTER);
416 itemFlexGridSizer6a->Add(
418 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
421 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time Enroute"),
422 wxDefaultPosition, wxDefaultSize, 0);
423 itemFlexGridSizer6a->Add(
425 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
428 new wxTextCtrl(itemDialog1, wxID_ANY, _T(
""), wxDefaultPosition,
429 wxSize(-1, -1), wxTE_READONLY);
430 itemFlexGridSizer6a->Add(m_tTimeEnroute, 0,
431 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
432 wxLEFT | wxRIGHT | wxBOTTOM,
449 wxString pDispTimeZone[] = {_(
"UTC"), _(
"Local Time"), _(
"LMT@Location"),
450 _(
"Honor Global Settings")};
452 wxStaticText* itemStaticText12b =
453 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time shown as"),
454 wxDefaultPosition, wxDefaultSize, 0);
455 itemBoxSizer2->Add(itemStaticText12b, 0, wxEXPAND | wxALL, 5);
458 new wxRadioButton(itemDialog1, wxID_ANY, _(
"UTC"), wxDefaultPosition,
459 wxDefaultSize, wxRB_GROUP);
462 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
464 m_rbShowTimePC =
new wxRadioButton(itemDialog1, wxID_ANY, _(
"Local Time"));
467 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
470 new wxRadioButton(itemDialog1, wxID_ANY, _(
"LMT@Location"));
473 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
476 new wxRadioButton(itemDialog1, wxID_ANY, _(
"Honor Global Settings"));
479 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
481 wxFlexGridSizer* itemFlexGridSizer6b =
new wxFlexGridSizer(3, 2, 0, 0);
482 itemBoxSizer2->Add(itemFlexGridSizer6b, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
485 wxStaticText* m_staticText1 =
486 new wxStaticText(itemDialog1, wxID_ANY, _(
"Color") + _T(
":"),
487 wxDefaultPosition, wxDefaultSize, 0);
488 itemFlexGridSizer6b->Add(m_staticText1, 0, wxALIGN_CENTER_VERTICAL | wxALL,
491 wxString m_chColorChoices[] = {
492 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
493 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
494 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
495 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
497 int m_chColorNChoices =
sizeof(m_chColorChoices) /
sizeof(wxString);
499 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(250, -1),
500 m_chColorNChoices, m_chColorChoices, 0);
501 m_cColor->SetSelection(0);
502 itemFlexGridSizer6b->Add(m_cColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
504 wxStaticText* staticTextStyle =
505 new wxStaticText(itemDialog1, wxID_ANY, _(
"Style") + _T(
":"),
506 wxDefaultPosition, wxDefaultSize, 0);
507 itemFlexGridSizer6b->Add(staticTextStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL,
510 wxString m_chStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
511 _(
"Long dash"), _(
"Short dash")};
512 int m_chStyleNChoices =
sizeof(m_chStyleChoices) /
sizeof(wxString);
514 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
515 m_chStyleNChoices, m_chStyleChoices, 0);
516 m_cStyle->SetSelection(0);
517 itemFlexGridSizer6b->Add(m_cStyle, 0,
518 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
521 staticTextStyle->Hide();
525 m_stWidth =
new wxStaticText(itemDialog1, wxID_ANY, _(
"Width") + _T(
":"),
526 wxDefaultPosition, wxDefaultSize, 0);
527 itemFlexGridSizer6b->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
529 wxString m_chWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
530 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
531 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
532 _(
"9 pixels"), _(
"10 pixels")};
533 int m_chWidthNChoices =
sizeof(m_chWidthChoices) /
sizeof(wxString);
535 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(150, -1),
536 m_chWidthNChoices, m_chWidthChoices, 0);
537 m_cWidth->SetSelection(0);
538 itemFlexGridSizer6b->Add(m_cWidth, 0,
539 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
541 wxStaticBox* itemStaticBoxSizer14Static =
542 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Waypoints"));
543 wxStaticBoxSizer* m_pListSizer =
544 new wxStaticBoxSizer(itemStaticBoxSizer14Static, wxVERTICAL);
545 itemBoxSizer2->Add(m_pListSizer, 1, wxEXPAND | wxALL, 1);
547 wxScrolledWindow* itemlistWin =
548 new wxScrolledWindow(itemDialog1, wxID_ANY, wxDefaultPosition,
549 wxDefaultSize, wxHSCROLL | wxVSCROLL);
550 itemlistWin->SetScrollRate(2, 2);
552 m_pListSizer->Add(itemlistWin, 0, wxEXPAND | wxALL, 6);
554 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
556 flags |= wxLC_VIRTUAL;
560 wxSize(100, 500), flags);
561 addColumns(m_lcPoints, GetCharWidth());
566 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
571 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
572 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
576 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
577 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
578 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
580 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
584 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
585 wxDefaultPosition, wxDefaultSize, 0);
586 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
587 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
588 m_sdbBtmBtnsSizerPrint->Enable(
true);
590 m_sdbBtmBtnsSizerPrint = NULL;
593 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
594 wxDefaultPosition, wxDefaultSize, 0);
595 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
596 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
597 m_sdbBtmBtnsSizerSplit->Enable(
false);
599 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"),
600 wxDefaultPosition, wxDefaultSize, 0);
601 m_sdbBtmBtnsSizerExtend->SetToolTip(
602 _(
"Extends this track by connecting it to another track.\n"
603 "Disabled when the track is active, the track is in a layer, or no "
604 "suitable track to connect to exists.\n"
605 "A suitable track is one that is visible, is different from this "
606 "track, and has its last point's timestamp earlier than or equal to "
607 "this track's first point's timestamp."));
608 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
609 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
611 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
612 wxDefaultPosition, wxDefaultSize, 0);
613 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
614 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
616 m_sdbBtmBtnsSizerExport = NULL;
622 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
623 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
625 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
626 wxDefaultPosition, wxDefaultSize, 0);
627 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0,
628 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
630 m_sdbBtmBtnsSizerOK =
631 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
632 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0,
633 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
634 m_sdbBtmBtnsSizerOK->SetDefault();
636 int char_size = GetCharWidth();
639 width = g_monitor_info[g_current_monitor].width;
640 height = g_monitor_info[g_current_monitor].height;
641 SetSizeHints(-1, -1, width - 100, height - 100);
644void TrackPropDlg::CreateControls(
void) {
645 wxBoxSizer* bSizerMain;
646 bSizerMain =
new wxBoxSizer(wxVERTICAL);
647 SetSizer(bSizerMain);
650 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
652 bSizerMain->Add(m_notebook1, 1, wxEXPAND | wxALL, 5);
655 new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize);
656 m_notebook1->AddPage(m_panel0, _(
"Basic"),
true);
658 wxBoxSizer* bSizer0 =
new wxBoxSizer(wxVERTICAL);
659 m_panel0->SetSizer(bSizer0);
661 wxBoxSizer* bSizer1 =
new wxBoxSizer(wxVERTICAL);
662 bSizer0->Add(bSizer1, 1, wxEXPAND | wxALL, 5);
664 m_panelBasic =
new wxScrolledWindow(m_panel0, wxID_ANY, wxDefaultPosition,
666 wxHSCROLL | wxVSCROLL | wxTAB_TRAVERSAL);
672 wxString wqs = getFontQtStylesheet(qFont);
673 wxCharBuffer sbuf = wqs.ToUTF8();
674 QString qsb = QString(sbuf.data());
676 QString qsbq = getQtStyleSheet();
678 m_panelBasic->GetHandle()->setStyleSheet(qsb +
687 wxBoxSizer* bSizerBasic =
new wxBoxSizer(wxVERTICAL);
688 m_panelBasic->SetSizer(bSizerBasic);
690 bSizer1->Add(m_panelBasic, 1, wxEXPAND | wxALL, 5);
692 wxBoxSizer* bSizerName;
693 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
694 bSizerBasic->Add(bSizerName, 0, wxALL | wxEXPAND, 5);
696 m_stName =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Name"),
697 wxDefaultPosition, wxDefaultSize, 0);
699 bSizerName->Add(m_stName, 0, wxALL, 5);
701 m_tName =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
702 wxDefaultPosition, wxDefaultSize, 0);
703 bSizerName->Add(m_tName, 1, 0, 5);
705 wxBoxSizer* bSizerFromTo;
706 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
707 bSizerBasic->Add(bSizerFromTo, 0, wxALL | wxEXPAND, 5);
709 m_stFrom =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"From"),
710 wxDefaultPosition, wxDefaultSize, 0);
712 bSizerFromTo->Add(m_stFrom, 0, wxALL, 5);
714 m_tFrom =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
715 wxDefaultPosition, wxDefaultSize, 0);
716 bSizerFromTo->Add(m_tFrom, 1, 0, 5);
718 m_stTo =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
721 bSizerFromTo->Add(m_stTo, 0, wxALL, 5);
723 m_tTo =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
724 wxDefaultPosition, wxDefaultSize, 0);
725 bSizerFromTo->Add(m_tTo, 1, 0, 5);
727 wxStaticBoxSizer* sbSizerParams;
728 sbSizerParams =
new wxStaticBoxSizer(
729 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Display parameters")),
731 bSizerBasic->Add(sbSizerParams, 0, wxALL | wxEXPAND, 5);
733 m_cbShow =
new wxCheckBox(m_panelBasic, wxID_ANY, _(
"Show on chart"),
734 wxDefaultPosition, wxDefaultSize, 0);
735 sbSizerParams->Add(m_cbShow, 0, wxALL, 5);
737 m_stColor =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Color"),
738 wxDefaultPosition, wxDefaultSize, 0);
740 sbSizerParams->Add(m_stColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
742 wxString m_cColorChoices[] = {
743 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
744 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
745 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
746 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
748 int m_cColorNChoices =
sizeof(m_cColorChoices) /
sizeof(wxString);
749 m_cColor =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
750 wxDefaultSize, m_cColorNChoices, m_cColorChoices, 0);
751 m_cColor->SetSelection(0);
752 sbSizerParams->Add(m_cColor, 1, 0, 5);
754 m_stStyle =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Style"),
755 wxDefaultPosition, wxDefaultSize, 0);
757 sbSizerParams->Add(m_stStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
759 wxString m_cStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
760 _(
"Long dash"), _(
"Short dash")};
761 int m_cStyleNChoices =
sizeof(m_cStyleChoices) /
sizeof(wxString);
762 m_cStyle =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
763 wxDefaultSize, m_cStyleNChoices, m_cStyleChoices, 0);
764 m_cStyle->SetSelection(0);
765 sbSizerParams->Add(m_cStyle, 1, 0, 5);
767 m_stWidth =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Width"),
768 wxDefaultPosition, wxDefaultSize, 0);
770 sbSizerParams->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
772 wxString m_cWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
773 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
774 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
775 _(
"9 pixels"), _(
"10 pixels")};
776 int m_cWidthNChoices =
sizeof(m_cWidthChoices) /
sizeof(wxString);
777 m_cWidth =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
778 wxDefaultSize, m_cWidthNChoices, m_cWidthChoices, 0);
779 m_cWidth->SetSelection(0);
780 sbSizerParams->Add(m_cWidth, 1, 0, 5);
782 wxStaticBoxSizer* sbSizerStats;
783 sbSizerStats =
new wxStaticBoxSizer(
784 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Statistics")), wxVERTICAL);
785 bSizerBasic->Add(sbSizerStats, 0, wxALL | wxEXPAND, 5);
787 wxBoxSizer* bSizerStats;
788 bSizerStats =
new wxBoxSizer(wxHORIZONTAL);
791 new wxStaticText(m_panelBasic, wxID_ANY, _(
"Total distance"),
792 wxDefaultPosition, wxDefaultSize, 0);
794 bSizerStats->Add(m_stTotDistance, 0, wxALL, 5);
797 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
798 wxDefaultSize, wxTE_READONLY);
799 bSizerStats->Add(m_tTotDistance, 1, 0, 5);
801 m_stAvgSpeed =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Avg. speed"),
802 wxDefaultPosition, wxDefaultSize, 0);
804 bSizerStats->Add(m_stAvgSpeed, 0, wxALL, 5);
806 m_tAvgSpeed =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
807 wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
808 bSizerStats->Add(m_tAvgSpeed, 1, 0, 5);
810 m_stTimeEnroute =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Time enroute"),
811 wxDefaultPosition, wxDefaultSize, 0);
813 bSizerStats->Add(m_stTimeEnroute, 0, wxALL, 5);
816 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
817 wxDefaultSize, wxTE_READONLY);
818 bSizerStats->Add(m_tTimeEnroute, 2, 0, 5);
820 sbSizerStats->Add(bSizerStats, 0, wxEXPAND, 5);
822 wxStaticBoxSizer* sbSizerPoints;
823 sbSizerPoints =
new wxStaticBoxSizer(
824 new wxStaticBox(m_panel0, wxID_ANY, _(
"Recorded points")), wxVERTICAL);
825 bSizer1->Add(sbSizerPoints, 1, wxALL | wxEXPAND, 5);
827 wxBoxSizer* bSizerShowTime;
828 bSizerShowTime =
new wxBoxSizer(wxHORIZONTAL);
830 m_stShowTime =
new wxStaticText(m_panel0, wxID_ANY, _(
"Time shown as"),
831 wxDefaultPosition, wxDefaultSize, 0);
833 bSizerShowTime->Add(m_stShowTime, 0, wxALL, 5);
835 m_rbShowTimeUTC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"UTC"),
836 wxDefaultPosition, wxDefaultSize, 0);
837 bSizerShowTime->Add(m_rbShowTimeUTC, 0,
838 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
841 m_rbShowTimePC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"Local Time"),
842 wxDefaultPosition, wxDefaultSize, 0);
844 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
848 new wxRadioButton(m_panel0, wxID_ANY, _(
"LMT@Track Start"),
849 wxDefaultPosition, wxDefaultSize, 0);
851 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
855 new wxRadioButton(m_panel0, wxID_ANY, _(
"Honor Global Settings"),
856 wxDefaultPosition, wxDefaultSize, 0);
858 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
863 sbSizerPoints->Add(bSizerShowTime, 0, wxEXPAND, 5);
865 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
867 flags |= wxLC_VIRTUAL;
871 wxDefaultSize, flags);
872 addColumns(m_lcPoints, GetCharWidth());
874 sbSizerPoints->Add(m_lcPoints, 1, wxALL | wxEXPAND, 5);
877 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
891 m_panelAdvanced =
new wxScrolledWindow(
892 m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
894 wxBoxSizer* bSizerAdvanced;
895 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
898 new wxStaticText(m_panelAdvanced, wxID_ANY, _(
"Description"),
899 wxDefaultPosition, wxDefaultSize, 0);
901 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
904 new wxTextCtrl(m_panelAdvanced, wxID_ANY, wxEmptyString,
905 wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
906 bSizerAdvanced->Add(m_tDescription, 1, wxALL | wxEXPAND, 5);
908 sbSizerLinks =
new wxStaticBoxSizer(
909 new wxStaticBox(m_panelAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
911 m_scrolledWindowLinks =
912 new wxScrolledWindow(m_panelAdvanced, wxID_ANY, wxDefaultPosition,
913 wxDefaultSize, wxHSCROLL | wxVSCROLL);
914 m_scrolledWindowLinks->SetScrollRate(5, 5);
915 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
918 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
919 wxT(
"http://www.wxformbuilder.org"),
920 wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE);
921 m_menuLink =
new wxMenu();
923 new wxMenuItem(m_menuLink, ID_TRK_MENU_EDIT, wxString(_(
"Edit")),
924 wxEmptyString, wxITEM_NORMAL);
925 m_menuLink->Append(m_menuItemEdit);
928 new wxMenuItem(m_menuLink, ID_TRK_MENU_ADD, wxString(_(
"Add new")),
929 wxEmptyString, wxITEM_NORMAL);
930 m_menuLink->Append(m_menuItemAdd);
933 new wxMenuItem(m_menuLink, ID_TRK_MENU_DELETE, wxString(_(
"Delete")),
934 wxEmptyString, wxITEM_NORMAL);
935 m_menuLink->Append(m_menuItemDelete);
937 m_hyperlink1->Connect(
939 wxMouseEventHandler(TrackPropDlg::m_hyperlink1OnContextMenu), NULL,
this);
941 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
943 m_scrolledWindowLinks->SetSizer(bSizerLinks);
944 m_scrolledWindowLinks->Layout();
945 bSizerLinks->Fit(m_scrolledWindowLinks);
946 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
948 wxBoxSizer* bSizerLinkBtns;
949 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
952 new wxButton(m_panelAdvanced, wxID_ANY, _(
"Add"), wxDefaultPosition,
953 wxDefaultSize, wxBU_EXACTFIT);
954 bSizerLinkBtns->Add(m_buttonAddLink, 0, wxALL, 5);
956 m_toggleBtnEdit =
new wxToggleButton(m_panelAdvanced, wxID_ANY, _(
"Edit"),
957 wxDefaultPosition, wxDefaultSize, 0);
958 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
960 m_staticTextEditEnabled =
new wxStaticText(
961 m_panelAdvanced, wxID_ANY, _(
"Links are opened in the default browser."),
962 wxDefaultPosition, wxDefaultSize, 0);
964 bSizerLinkBtns->Add(m_staticTextEditEnabled, 0,
965 wxALIGN_CENTER_VERTICAL | wxALL, 5);
967 sbSizerLinks->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
969 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
971 m_panelAdvanced->SetSizer(bSizerAdvanced);
972 m_notebook1->AddPage(m_panelAdvanced, _(
"Advanced"),
false);
976 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
977 bSizerMain->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
983 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
984 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
985 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
987 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
991 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
992 wxDefaultPosition, wxDefaultSize, 0);
993 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
994 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
995 m_sdbBtmBtnsSizerPrint->Enable(
true);
997 m_sdbBtmBtnsSizerPrint = NULL;
1000 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
1001 wxDefaultPosition, wxDefaultSize, 0);
1002 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
1003 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1004 m_sdbBtmBtnsSizerSplit->Enable(
false);
1006 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend track"),
1007 wxDefaultPosition, wxDefaultSize, 0);
1008 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
1009 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1011 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
1012 wxDefaultPosition, wxDefaultSize, 0);
1013 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
1014 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1016 m_sdbBtmBtnsSizerExport =
new wxButton(
this, wxID_ANY, _(
"Export"),
1017 wxDefaultPosition, wxDefaultSize, 0);
1018 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExport, 0,
1019 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1021 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
1022 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
1024 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
1025 wxDefaultPosition, wxDefaultSize, 0);
1026 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0, wxALIGN_BOTTOM | wxALL, 5);
1028 m_sdbBtmBtnsSizerOK =
1029 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
1030 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0, wxALIGN_BOTTOM | wxALL, 5);
1031 m_sdbBtmBtnsSizerOK->SetDefault();
1035 ((wxWindowBase*)m_stName)->GetSize(&w1, &h);
1036 ((wxWindowBase*)m_stFrom)->GetSize(&w2, &h);
1037 ((wxWindowBase*)m_stName)->SetMinSize(wxSize(wxMax(w1, w2), h));
1038 ((wxWindowBase*)m_stFrom)->SetMinSize(wxSize(wxMax(w1, w2), h));
1040 m_panelBasic->SetScrollRate(5, 5);
1041 m_panelAdvanced->SetScrollRate(5, 5);
1044void TrackPropDlg::SetTrackAndUpdate(
Track* pt) {
1047 m_lcPoints->DeleteAllItems();
1049 if (m_pMyLinkList)
delete m_pMyLinkList;
1050 m_pMyLinkList =
new HyperlinkList();
1052 int NbrOfLinks = m_pTrack->m_HyperlinkList->GetCount();
1053 if (NbrOfLinks > 0) {
1054 wxHyperlinkListNode* linknode = m_pTrack->m_HyperlinkList->GetFirst();
1059 h->DescrText = link->DescrText;
1060 h->Link = link->Link;
1061 h->LType = link->LType;
1063 m_pMyLinkList->Append(h);
1065 linknode = linknode->GetNext();
1075void TrackPropDlg::InitializeList() {
1076 if (NULL == m_pTrack)
return;
1078 m_lcPoints->m_pTrack = m_pTrack;
1080 if (m_pTrack->GetnPoints()) {
1083 m_lcPoints->m_LMT_Offset = long((prp->m_lon) * 3600. / 15.);
1085 m_lcPoints->m_LMT_Offset = 0;
1088 if (m_lcPoints->IsVirtual())
1089 m_lcPoints->SetItemCount(m_pTrack->GetnPoints());
1092 for (
int in = 0; in < m_pTrack->GetnPoints(); in++) {
1096 m_lcPoints->InsertItem(item);
1097 for (
int j = 0; j < 7; j++) {
1099 item.SetText(m_lcPoints->OnGetItemText(in, j));
1100 m_lcPoints->SetItem(item);
1107 if (NULL == m_pTrack)
return false;
1109 ::wxBeginBusyCursor();
1111 if (m_scrolledWindowLinks) {
1112 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1113 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1114 wxWindowListNode* node = kids.Item(i);
1115 wxWindow* win = node->GetData();
1117 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1119 link_win->Disconnect(
1120 wxEVT_COMMAND_HYPERLINK,
1121 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1122 link_win->Disconnect(
1124 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1129 int NbrOfLinks = m_pTrack->m_HyperlinkList->GetCount();
1130 HyperlinkList* hyperlinklist = m_pTrack->m_HyperlinkList;
1132 if (NbrOfLinks > 0) {
1133 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1136 wxString Link = link->Link;
1137 wxString Descr = link->DescrText;
1139 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1140 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1141 wxDefaultSize, wxHL_DEFAULT_STYLE);
1142 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1143 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1145 if (!m_pTrack->m_bIsInLayer)
1148 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu), NULL,
1151 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1153 linknode = linknode->GetNext();
1156 bSizerLinks->Fit(m_scrolledWindowLinks);
1159 m_tName->SetValue(m_pTrack->GetName());
1160 m_tFrom->SetValue(m_pTrack->m_TrackStartString);
1161 m_tTo->SetValue(m_pTrack->m_TrackEndString);
1162 if (m_tDescription) m_tDescription->SetValue(m_pTrack->m_TrackDescription);
1164 m_tTotDistance->SetValue(_T(
""));
1165 m_tTimeEnroute->SetValue(_T(
""));
1167 m_sdbBtmBtnsSizerSplit->Enable(
false);
1168 m_sdbBtmBtnsSizerExtend->Enable(
false);
1171 TrackPoint* last_point = m_pTrack->GetLastPoint();
1172 TrackPoint* first_point = m_pTrack->GetPoint(0);
1173 double trackLength = m_pTrack->Length();
1174 double total_seconds = 0.;
1176 wxString speed(_T(
"--"));
1178 if (last_point && first_point) {
1185 if (total_seconds != 0.) {
1186 m_avgspeed = trackLength / total_seconds * 3600;
1190 speed.Printf(_T(
"%5.2f"), toUsrSpeed(m_avgspeed));
1194 m_tAvgSpeed->SetValue(speed);
1198 slen.Printf(wxT(
"%5.2f ") + getUsrDistanceUnit(), toUsrDistance(trackLength));
1200 m_tTotDistance->SetValue(slen);
1204 wxTimeSpan time(0, 0, (
int)total_seconds, 0);
1206 if (total_seconds > 3600. * 24.)
1207 time_form = time.Format(
"%H:%M");
1208 else if (total_seconds > 0.)
1209 time_form = time.Format(
"%H:%M");
1211 time_form = _T(
"--");
1212 m_tTimeEnroute->SetValue(time_form);
1214 m_cbShow->SetValue(m_pTrack->IsVisible());
1216 if (m_pTrack->m_Colour == wxEmptyString)
1217 m_cColor->Select(0);
1219 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
1221 if (m_pTrack->m_Colour == ::GpxxColorNames[i]) {
1222 m_cColor->Select(i + 1);
1228 for (
unsigned int i = 0; i <
sizeof(::StyleValues) /
sizeof(
int); i++) {
1229 if (m_pTrack->m_style == ::StyleValues[i]) {
1230 m_cStyle->Select(i);
1235 for (
unsigned int i = 0; i <
sizeof(::WidthValues) /
sizeof(
int); i++) {
1236 if (m_pTrack->m_width == ::WidthValues[i]) {
1237 m_cWidth->Select(i);
1242 if (m_pTrack->m_bIsInLayer) {
1243 m_tName->SetEditable(
false);
1244 m_tFrom->SetEditable(
false);
1245 m_tTo->SetEditable(
false);
1246 if (m_tDescription) m_tDescription->SetEditable(
false);
1247 m_cbShow->Enable(
false);
1248 m_cColor->Enable(
false);
1249 m_cStyle->Enable(
false);
1250 m_cWidth->Enable(
false);
1251 m_sdbBtmBtnsSizerExtend->Enable(
false);
1252 m_sdbBtmBtnsSizerSplit->Enable(
false);
1253 SetTitle(wxString::Format(_T(
"%s, %s: %d"), _(
"Track properties"),
1254 _T(
"Layer"), m_pTrack->m_LayerID));
1256 m_tName->SetEditable(
true);
1257 m_tFrom->SetEditable(
true);
1258 m_tTo->SetEditable(
true);
1259 if (m_tDescription) m_tDescription->SetEditable(
true);
1260 m_cbShow->Enable(
true);
1261 m_cColor->Enable(
true);
1262 m_cStyle->Enable(
true);
1263 m_cWidth->Enable(
true);
1265 m_sdbBtmBtnsSizerExtend->Enable(IsThisTrackExtendable());
1267 SetTitle(_(
"Track properties"));
1270 ::wxEndBusyCursor();
1275bool TrackPropDlg::IsThisTrackExtendable() {
1276 m_pExtendTrack = NULL;
1277 m_pExtendPoint = NULL;
1278 if (m_pTrack == g_pActiveTrack || m_pTrack->m_bIsInLayer) {
1282 TrackPoint* pLastPoint = m_pTrack->GetPoint(0);
1287 for (
Track* ptrack : g_TrackList) {
1288 if (ptrack->IsVisible() && (ptrack->m_GUID != m_pTrack->m_GUID)) {
1289 TrackPoint* track_node = ptrack->GetLastPoint();
1293 if (!m_pExtendPoint ||
1295 m_pExtendPoint = track_node;
1296 m_pExtendTrack = ptrack;
1303 if (m_pExtendTrack) {
1304 return (!m_pExtendTrack->m_bIsInLayer);
1310void TrackPropDlg::OnExtendBtnClick(wxCommandEvent& event) {
1311 TrackPoint* pFirstPoint = m_pTrack->GetPoint(0);
1313 if (IsThisTrackExtendable()) {
1318 pSelect->DeleteAllSelectableTrackSegments(m_pExtendTrack);
1319 m_pExtendTrack->Clone(m_pTrack, begin, m_pTrack->GetnPoints(), _(
"_plus"));
1320 pSelect->AddAllSelectableTrackSegments(m_pExtendTrack);
1321 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1324 SetTrackAndUpdate(m_pExtendTrack);
1327 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1328 pRouteManagerDialog->UpdateTrkListCtrl();
1333void TrackPropDlg::OnSplitBtnClick(wxCommandEvent& event) {
1334 m_sdbBtmBtnsSizerSplit->Enable(
false);
1336 if (m_pTrack->m_bIsInLayer) {
1340 if ((m_nSelected > 1) && (m_nSelected < m_pTrack->GetnPoints())) {
1343 pHead->Clone(m_pTrack, 0, m_nSelected - 1, _(
"_A"));
1344 pTail->Clone(m_pTrack, m_nSelected - 1, m_pTrack->GetnPoints(), _(
"_B"));
1345 g_TrackList.push_back(pHead);
1346 pConfig->AddNewTrack(pHead);
1348 g_TrackList.push_back(pTail);
1349 pConfig->AddNewTrack(pTail);
1351 pConfig->DeleteConfigTrack(m_pTrack);
1353 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1355 pSelect->AddAllSelectableTrackSegments(pTail);
1356 pSelect->AddAllSelectableTrackSegments(pHead);
1358 SetTrackAndUpdate(pTail);
1361 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1362 pRouteManagerDialog->UpdateTrkListCtrl();
1367void TrackPropDlg::OnTrackPropCopyTxtClick(wxCommandEvent& event) {
1368 wxString tab(
"\t", wxConvUTF8);
1369 wxString eol(
"\n", wxConvUTF8);
1372 csvString << this->GetTitle() << eol << _(
"Name") << tab
1373 << m_pTrack->GetName() << eol << _(
"Depart From") << tab
1374 << m_pTrack->m_TrackStartString << eol << _(
"Destination") << tab
1375 << m_pTrack->m_TrackEndString << eol << _(
"Total distance") << tab
1376 << m_tTotDistance->GetValue() << eol << _(
"Speed") << tab
1377 << m_tAvgSpeed->GetValue() << eol
1378 << _(
"Departure Time") + _T(
" ") + _(
"(m/d/y h:m)") << tab
1380 << _(
"Time enroute") << tab << m_tTimeEnroute->GetValue() << eol
1385 noCols = m_lcPoints->GetColumnCount();
1386 noRows = m_lcPoints->GetItemCount();
1388 item.SetMask(wxLIST_MASK_TEXT);
1390 for (
int i = 0; i < noCols; i++) {
1391 m_lcPoints->GetColumn(i, item);
1392 csvString << item.GetText() << tab;
1396 for (
int j = 0; j < noRows; j++) {
1398 for (
int i = 0; i < noCols; i++) {
1400 m_lcPoints->GetItem(item);
1401 csvString << item.GetText() << tab;
1406 if (wxTheClipboard->Open()) {
1407 wxTextDataObject* data =
new wxTextDataObject;
1408 data->SetText(csvString);
1409 wxTheClipboard->SetData(data);
1410 wxTheClipboard->Close();
1414void TrackPropDlg::OnPrintBtnClick(wxCommandEvent& event) {
1415 static std::set<int> s_options;
1417 int result = dlg.ShowModal();
1419 if (result == wxID_OK) {
1420 dlg.GetSelected(s_options);
1423 printer.Initialize(wxPORTRAIT);
1424 printer.EnablePageNumbers(
true);
1425 printer.Print(
this, &printout);
1429void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1432 wxMenuItem* copyItem =
1433 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1438void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1444 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1448 selected_no = itemno;
1450 m_pTrack->m_HighlightedTrackPoint = -1;
1453 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1455 m_pTrack->m_HighlightedTrackPoint = itemno;
1457 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack == g_pActiveTrack)) {
1458 m_nSelected = selected_no + 1;
1459 m_sdbBtmBtnsSizerSplit->Enable(
true);
1461 if (gFrame->GetFocusCanvas()) {
1462 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), prp->m_lat, prp->m_lon,
1463 gFrame->GetFocusCanvas()->GetVPScale());
1466 if (m_lcPoints) m_lcPoints->SetFocus();
1470 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1471 m_sdbBtmBtnsSizerSplit->Enable(
false);
1474void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1475 switch (event.GetId()) {
1476 case ID_RCLK_MENU_COPY_TEXT:
1477 OnTrackPropCopyTxtClick(event);
1482void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1483 pRouteManagerDialog->TrackToRoute(m_pTrack);
1484 if (NULL != pRouteManagerDialog && pRouteManagerDialog->IsVisible())
1485 pRouteManagerDialog->UpdateRouteListCtrl();
1488void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1489 wxString suggested_name = _(
"track");
1490 std::vector<Track*> list = {m_pTrack};
1491 if (m_pTrack->GetName() != wxEmptyString)
1492 suggested_name = m_pTrack->GetName();
1493 ExportGPXTracks(
this, &list, suggested_name);
1496void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1497 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1499 wxEVT_COMMAND_MENU_SELECTED,
1500 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1501 m_scrolledWindowLinks->PopupMenu(
1502 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1503 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1506void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1507 switch (event.GetId()) {
1508 case ID_TRK_MENU_ADD:
1511 case ID_TRK_MENU_EDIT:
1514 case ID_TRK_MENU_DELETE:
1523 wxHyperlinkListNode* nodeToDelete = NULL;
1524 wxString findurl = m_pEditedLink->GetURL();
1525 wxString findlabel = m_pEditedLink->GetLabel();
1527 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1528 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1529 wxWindowListNode* node = kids.Item(i);
1530 wxWindow* win = node->GetData();
1532 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1534 link_win->Disconnect(
1535 wxEVT_COMMAND_HYPERLINK,
1536 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1537 link_win->Disconnect(
1539 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1545 int NbrOfLinks = m_pTrack->m_HyperlinkList->GetCount();
1546 HyperlinkList* hyperlinklist = m_pTrack->m_HyperlinkList;
1548 if (NbrOfLinks > 0) {
1549 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1552 wxString Link = link->Link;
1553 wxString Descr = link->DescrText;
1554 if (Link == findurl &&
1555 (Descr == findlabel || (Link == findlabel && Descr == wxEmptyString)))
1556 nodeToDelete = linknode;
1558 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1559 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1560 wxDefaultSize, wxHL_DEFAULT_STYLE);
1561 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1562 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1564 ctrl->Connect(wxEVT_RIGHT_DOWN,
1565 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1568 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1570 linknode = linknode->GetNext();
1573 if (nodeToDelete) hyperlinklist->DeleteNode(nodeToDelete);
1574 m_scrolledWindowLinks->InvalidateBestSize();
1575 m_scrolledWindowLinks->Layout();
1576 sbSizerLinks->Layout();
1580void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1581 wxString findurl = m_pEditedLink->GetURL();
1582 wxString findlabel = m_pEditedLink->GetLabel();
1585 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1586 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1587 DimeControl(LinkPropDlg);
1588 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1589 findlabel](
int retcode) {
1590 if (retcode == wxID_OK) {
1591 int NbrOfLinks = m_pTrack->m_HyperlinkList->GetCount();
1592 HyperlinkList* hyperlinklist = m_pTrack->m_HyperlinkList;
1594 if (NbrOfLinks > 0) {
1595 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1598 wxString Link = link->Link;
1599 wxString Descr = link->DescrText;
1600 if (Link == findurl &&
1601 (Descr == findlabel ||
1602 (Link == findlabel && Descr == wxEmptyString))) {
1603 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1605 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1606 wxHyperlinkCtrl* h =
1607 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1610 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1611 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1614 linknode = linknode->GetNext();
1618 m_scrolledWindowLinks->InvalidateBestSize();
1619 m_scrolledWindowLinks->Layout();
1620 sbSizerLinks->Layout();
1626void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1628 LinkPropDlg->m_textCtrlLinkDescription->SetValue(wxEmptyString);
1629 LinkPropDlg->m_textCtrlLinkUrl->SetValue(wxEmptyString);
1630 DimeControl(LinkPropDlg);
1631 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1632 if (retcode == wxID_OK) {
1633 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1634 if (desc == wxEmptyString)
1635 desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1636 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1637 m_scrolledWindowLinks, wxID_ANY, desc,
1638 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1639 wxDefaultSize, wxHL_DEFAULT_STYLE);
1640 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1641 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1643 ctrl->Connect(wxEVT_RIGHT_DOWN,
1644 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1647 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1648 bSizerLinks->Fit(m_scrolledWindowLinks);
1652 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1653 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1654 h->LType = wxEmptyString;
1655 m_pTrack->m_HyperlinkList->Append(h);
1660 m_scrolledWindowLinks->InvalidateBestSize();
1661 m_scrolledWindowLinks->Layout();
1662 sbSizerLinks->Layout();
1667void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1668 if (m_toggleBtnEdit->GetValue())
1669 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1671 m_staticTextEditEnabled->SetLabel(
1672 _(
"Links are opened in the default browser."));
1676void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1677 if (m_toggleBtnEdit->GetValue()) {
1678 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1693 wxString cc =
event.GetURL();
1694 if (cc.Find(_T(
"#")) != wxNOT_FOUND) {
1696 wxString(_T(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command")));
1697 if (RegKey.Exists()) {
1698 wxString command_line;
1699 RegKey.QueryValue(wxString(_T(
"")), command_line);
1702 command_line.Replace(wxString(_T(
"\"")), wxString(_T(
"")));
1705 int l = command_line.Find(_T(
".exe"));
1706 if (wxNOT_FOUND == l) l = command_line.Find(_T(
".EXE"));
1708 if (wxNOT_FOUND != l) {
1709 wxString cl = command_line.Mid(0, l + 4);
1711 cc.Prepend(_T(
"\""));
1712 cc.Append(_T(
"\""));
1720 wxString url =
event.GetURL();
1721 url.Replace(_T(
" "), _T(
"%20"));
1722 ::wxLaunchDefaultBrowser(url);
1727void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1728 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1737 throw std::logic_error(
"Unexpected time zone selection");
1738 m_lcPoints->DeleteAllItems();
1742bool TrackPropDlg::SaveChanges(
void) {
1743 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1745 m_pTrack->SetName(m_tName->GetValue());
1746 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1747 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1749 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1750 m_pTrack->SetVisible(m_cbShow->GetValue());
1751 if (m_cColor->GetSelection() == 0)
1752 m_pTrack->m_Colour = wxEmptyString;
1754 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1755 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1756 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1758 pConfig->UpdateTrack(m_pTrack);
1759 pConfig->UpdateSettings();
1762 if (m_pTrack && m_pTrack->IsRunning()) {
1764 v[_T(
"Changed")] =
true;
1765 v[_T(
"Name")] = m_pTrack->GetName();
1766 v[_T(
"GUID")] = m_pTrack->m_GUID;
1767 wxString msg_id(_T(
"OCPN_TRK_ACTIVATED"));
1768 SendJSONMessageToAllPlugins(msg_id, v);
1774void TrackPropDlg::OnOKBtnClick(wxCommandEvent& event) {
1778 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1779 m_pTrack) != g_TrackList.end();
1781 if (b_found_track) {
1783 m_pTrack->ClearHighlights();
1786 m_bStartNow =
false;
1788 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1789 pRouteManagerDialog->UpdateTrkListCtrl();
1792 gFrame->InvalidateAllGL();
1793 gFrame->RefreshAllCanvas(
false);
1798void TrackPropDlg::OnCancelBtnClick(wxCommandEvent& event) {
1799 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1800 m_pTrack) != g_TrackList.end();
1802 if (b_found_track) m_pTrack->ClearHighlights();
1805 gFrame->InvalidateAllGL();
1806 gFrame->RefreshAllCanvas(
false);
1815OCPNTrackListCtrl::OCPNTrackListCtrl(wxWindow* parent, wxWindowID
id,
1816 const wxPoint& pos,
const wxSize& size,
1818 : wxListCtrl(parent, id, pos, size, style) {
1820 m_tz_selection = GLOBAL_SETTINGS_INPUT;
1824OCPNTrackListCtrl::~OCPNTrackListCtrl() {}
1827 if (m_pTrack->GetnPoints()) {
1829 if (prp)
return prp->m_lon;
1834wxString OCPNTrackListCtrl::OnGetItemText(
long item,
long column)
const {
1837 if (item < 0 || item >= m_pTrack->GetnPoints())
return wxEmptyString;
1839 TrackPoint* this_point = m_pTrack->GetPoint(item);
1840 TrackPoint* prev_point = item > 0 ? m_pTrack->GetPoint(item - 1) : NULL;
1842 if (!this_point)
return wxEmptyString;
1844 double gt_brg, gt_leg_dist;
1850 slat = prev_point->m_lat;
1851 slon = prev_point->m_lon;
1859 ret.Printf(_T(
"%ld"), item);
1863 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1864 >_brg, >_leg_dist);
1866 ret.Printf(_T(
"%6.2f ") + getUsrDistanceUnit(),
1867 toUsrDistance(gt_leg_dist));
1871 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1872 >_brg, >_leg_dist);
1873 ret.Printf(
"%03.0f %cT", gt_brg, 0x00B0);
1877 ret = toSDMM(1, this_point->m_lat, 1);
1881 ret = toSDMM(2, this_point->m_lon, 1);
1886 if (timestamp.IsValid()) {
1891 ret = ocpn::toUsrDateTimeFormat(timestamp.FromUTC(), opts);
1899 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat,
1900 slon, >_brg, >_leg_dist);
1907 if (seconds > 0.) speed = gt_leg_dist / seconds * 3600;
1909 ret.Printf(_T(
"%5.2f"), toUsrSpeed(speed));
1921int 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.