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"
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;
77bool TrackPropDlg::instanceFlag =
false;
79TrackPropDlg* TrackPropDlg::getInstance(wxWindow* parent, wxWindowID
id,
80 const wxString& title,
81 const wxPoint& pos,
const wxSize& size,
84 single =
new TrackPropDlg(parent,
id, title, pos, size, style);
92TrackPropDlg::TrackPropDlg(wxWindow* parent, wxWindowID
id,
93 const wxString& title,
const wxPoint& pos,
94 const wxSize& size,
long style)
95 : DIALOG_PARENT(parent, id, title, pos, size, style) {
99 SetWindowStyleFlag(style);
101 m_scrolledWindowLinks = NULL;
102 m_tDescription = NULL;
108 CreateControlsCompact();
118 m_sdbBtmBtnsSizerCancel->Connect(
119 wxEVT_COMMAND_BUTTON_CLICKED,
120 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
121 m_sdbBtmBtnsSizerOK->Connect(
122 wxEVT_COMMAND_BUTTON_CLICKED,
123 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
124 if (m_sdbBtmBtnsSizerPrint)
125 m_sdbBtmBtnsSizerPrint->Connect(
126 wxEVT_COMMAND_BUTTON_CLICKED,
127 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
128 m_sdbBtmBtnsSizerSplit->Connect(
129 wxEVT_COMMAND_BUTTON_CLICKED,
130 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
131 m_sdbBtmBtnsSizerExtend->Connect(
132 wxEVT_COMMAND_BUTTON_CLICKED,
133 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
134 m_sdbBtmBtnsSizerToRoute->Connect(
135 wxEVT_COMMAND_BUTTON_CLICKED,
136 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
137 if (m_sdbBtmBtnsSizerExport)
138 m_sdbBtmBtnsSizerExport->Connect(
139 wxEVT_COMMAND_BUTTON_CLICKED,
140 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
141 m_lcPoints->Connect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
142 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
144 Connect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
145 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
this);
146 Connect(wxEVT_COMMAND_MENU_SELECTED,
147 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
151 Connect(wxEVT_ACTIVATE, wxActivateEventHandler(TrackPropDlg::OnActivate),
156 m_buttonAddLink->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
157 wxCommandEventHandler(TrackPropDlg::OnAddLink),
159 m_toggleBtnEdit->Connect(
160 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
161 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
165 m_rbShowTimeUTC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
166 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
169 m_rbShowTimePC->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED,
170 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ),
172 if (m_rbShowTimeLocal)
173 m_rbShowTimeLocal->Connect(
174 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
175 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
177 if (m_rbShowTimeGlobalSettings)
178 m_rbShowTimeGlobalSettings->Connect(
179 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
180 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
182 m_pMyLinkList = NULL;
185TrackPropDlg::~TrackPropDlg() {
187 m_sdbBtmBtnsSizerCancel->Disconnect(
188 wxEVT_COMMAND_BUTTON_CLICKED,
189 wxCommandEventHandler(TrackPropDlg::OnCancelBtnClick), NULL,
this);
190 m_sdbBtmBtnsSizerOK->Disconnect(
191 wxEVT_COMMAND_BUTTON_CLICKED,
192 wxCommandEventHandler(TrackPropDlg::OnOKBtnClick), NULL,
this);
193 if (m_sdbBtmBtnsSizerPrint)
194 m_sdbBtmBtnsSizerPrint->Disconnect(
195 wxEVT_COMMAND_BUTTON_CLICKED,
196 wxCommandEventHandler(TrackPropDlg::OnPrintBtnClick), NULL,
this);
197 m_sdbBtmBtnsSizerSplit->Disconnect(
198 wxEVT_COMMAND_BUTTON_CLICKED,
199 wxCommandEventHandler(TrackPropDlg::OnSplitBtnClick), NULL,
this);
200 m_sdbBtmBtnsSizerExtend->Disconnect(
201 wxEVT_COMMAND_BUTTON_CLICKED,
202 wxCommandEventHandler(TrackPropDlg::OnExtendBtnClick), NULL,
this);
203 m_sdbBtmBtnsSizerToRoute->Disconnect(
204 wxEVT_COMMAND_BUTTON_CLICKED,
205 wxCommandEventHandler(TrackPropDlg::OnToRouteBtnClick), NULL,
this);
206 if (m_sdbBtmBtnsSizerExport)
207 m_sdbBtmBtnsSizerExport->Disconnect(
208 wxEVT_COMMAND_BUTTON_CLICKED,
209 wxCommandEventHandler(TrackPropDlg::OnExportBtnClick), NULL,
this);
210 m_lcPoints->Disconnect(wxEVT_COMMAND_LIST_ITEM_SELECTED,
211 wxListEventHandler(TrackPropDlg::OnTrackPropListClick),
213 Disconnect(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
214 wxListEventHandler(TrackPropDlg::OnTrackPropRightClick), NULL,
216 Disconnect(wxEVT_COMMAND_MENU_SELECTED,
217 wxCommandEventHandler(TrackPropDlg::OnTrackPropMenuSelected), NULL,
220 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
222 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
223 wxCommandEventHandler(TrackPropDlg::OnEditLink));
224 Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED,
225 wxCommandEventHandler(TrackPropDlg::OnAddLink));
228 m_buttonAddLink->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED,
229 wxCommandEventHandler(TrackPropDlg::OnAddLink),
231 m_toggleBtnEdit->Disconnect(
232 wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
233 wxCommandEventHandler(TrackPropDlg::OnEditLinkToggle), NULL,
this);
237 m_rbShowTimeUTC->Disconnect(
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);
250 wxEVT_COMMAND_RADIOBUTTON_SELECTED,
251 wxCommandEventHandler(TrackPropDlg::OnShowTimeTZ), NULL,
this);
253 instanceFlag =
false;
256static wxString getDatetimeTimezoneSelector(
int selection) {
264 case GLOBAL_SETTINGS_INPUT:
266 return wxEmptyString;
270void TrackPropDlg::OnActivate(wxActivateEvent& event) {
271 auto pWin =
dynamic_cast<DIALOG_PARENT*
>(
event.GetEventObject());
272 long int style = pWin->GetWindowStyle();
273 if (event.GetActive())
274 pWin->SetWindowStyle(style | wxSTAY_ON_TOP);
276 pWin->SetWindowStyle(style ^ wxSTAY_ON_TOP);
279void TrackPropDlg::RecalculateSize(
void) {
283 esize.x = GetCharWidth() * 110;
284 esize.y = GetCharHeight() * 40;
286 wxSize dsize = GetParent()->GetClientSize();
287 esize.y = wxMin(esize.y, dsize.y - (2 * GetCharHeight()));
288 esize.x = wxMin(esize.x, dsize.x - (2 * GetCharHeight()));
289 SetClientSize(esize);
291 wxSize fsize = GetSize();
292 fsize.y = wxMin(fsize.y, dsize.y - (2 * GetCharHeight()));
293 fsize.x = wxMin(fsize.x, dsize.x - (2 * GetCharHeight()));
297 int sy = GetCharHeight() * m_lcPoints->GetItemCount();
300 m_lcPoints->SetSize(wxSize(GetClientSize().x - 40, sy));
302 if (m_lcPoints->GetItemCount()) Layout();
308static void addColumns(wxListCtrl* lctrl,
int dx) {
309 lctrl->InsertColumn(0, _(
"Leg"), wxLIST_FORMAT_LEFT, dx * 6);
310 lctrl->InsertColumn(1, _(
"Distance"), wxLIST_FORMAT_LEFT, dx * 11);
311 lctrl->InsertColumn(2, _(
"Bearing"), wxLIST_FORMAT_LEFT, dx * 8);
313 lctrl->InsertColumn(3, _(
"Latitude"), wxLIST_FORMAT_LEFT, dx * 15);
314 lctrl->InsertColumn(4, _(
"Longitude"), wxLIST_FORMAT_LEFT, dx * 15);
317 lctrl->InsertColumn(5, _(
"Timestamp"), wxLIST_FORMAT_LEFT, dx * 26);
318 lctrl->InsertColumn(6, _(
"Speed"), wxLIST_FORMAT_CENTER, dx * 8);
320 lctrl->SetMinSize(wxSize(-1, 50));
323void TrackPropDlg::CreateControlsCompact() {
324 wxBoxSizer* itemBoxSizer1 =
new wxBoxSizer(wxVERTICAL);
325 SetSizer(itemBoxSizer1);
327 itemDialog1 =
new wxScrolledWindow(
this, wxID_ANY, wxDefaultPosition,
328 wxSize(-1, -1), wxVSCROLL);
329 itemDialog1->SetScrollRate(0, 1);
335 wxString wqs = getFontQtStylesheet(qFont);
336 wxCharBuffer sbuf = wqs.ToUTF8();
337 QString qsb = QString(sbuf.data());
339 QString qsbq = getQtStyleSheet();
341 itemDialog1->GetHandle()->setStyleSheet(qsb +
345 itemBoxSizer1->Add(itemDialog1, 1, wxEXPAND | wxALL, 0);
347 wxBoxSizer* itemBoxSizer2 =
new wxBoxSizer(wxVERTICAL);
348 itemDialog1->SetSizer(itemBoxSizer2);
350 wxStaticText* itemStaticText4 =
new wxStaticText(
351 itemDialog1, wxID_STATIC, _(
"Name"), wxDefaultPosition, wxDefaultSize, 0);
352 itemBoxSizer2->Add(itemStaticText4, 0,
353 wxALIGN_LEFT | wxLEFT | wxRIGHT | wxTOP, 5);
355 m_tName =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
357 itemBoxSizer2->Add(m_tName, 0, wxALIGN_LEFT | wxLEFT | wxRIGHT | wxBOTTOM, 5);
359 wxStaticText* itemStaticText7 =
360 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Depart From"),
361 wxDefaultPosition, wxDefaultSize, 0);
362 itemBoxSizer2->Add(itemStaticText7, 0,
363 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
366 m_tFrom =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
368 itemBoxSizer2->Add(m_tFrom, 0,
369 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
370 wxLEFT | wxRIGHT | wxBOTTOM,
373 wxStaticText* itemStaticText8 =
374 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Destination"),
375 wxDefaultPosition, wxDefaultSize, 0);
376 itemBoxSizer2->Add(itemStaticText8, 0,
377 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
380 m_tTo =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
382 itemBoxSizer2->Add(m_tTo, 0,
383 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
384 wxLEFT | wxRIGHT | wxBOTTOM,
387 m_cbShow =
new wxCheckBox(itemDialog1, wxID_ANY, _(
"Show on chart"),
388 wxDefaultPosition, wxDefaultSize, 0);
389 itemBoxSizer2->Add(m_cbShow, 0, wxALL, 5);
391 wxFlexGridSizer* itemFlexGridSizer6a =
new wxFlexGridSizer(4, 2, 0, 0);
392 itemFlexGridSizer6a->AddGrowableCol(1, 0);
394 itemBoxSizer2->Add(itemFlexGridSizer6a, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
397 wxStaticText* itemStaticText11 =
398 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Total distance"),
399 wxDefaultPosition, wxDefaultSize, 0);
400 itemFlexGridSizer6a->Add(
402 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
404 m_tTotDistance =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
405 wxSize(-1, -1), wxTE_READONLY);
406 itemFlexGridSizer6a->Add(m_tTotDistance, 0,
407 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
408 wxLEFT | wxRIGHT | wxBOTTOM,
411 m_stAvgSpeed =
new wxStaticText(itemDialog1, wxID_STATIC, _(
"Avg. speed"),
412 wxDefaultPosition, wxDefaultSize, 0);
413 itemFlexGridSizer6a->Add(
415 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
417 m_tAvgSpeed =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
418 wxSize(150, -1), wxTE_PROCESS_ENTER);
419 itemFlexGridSizer6a->Add(
421 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
424 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time Enroute"),
425 wxDefaultPosition, wxDefaultSize, 0);
426 itemFlexGridSizer6a->Add(
428 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxTOP, 5);
430 m_tTimeEnroute =
new wxTextCtrl(itemDialog1, wxID_ANY,
"", wxDefaultPosition,
431 wxSize(-1, -1), wxTE_READONLY);
432 itemFlexGridSizer6a->Add(m_tTimeEnroute, 0,
433 wxEXPAND | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL |
434 wxLEFT | wxRIGHT | wxBOTTOM,
451 wxString pDispTimeZone[] = {_(
"UTC"), _(
"Local Time"), _(
"LMT@Location"),
452 _(
"Honor Global Settings")};
454 wxStaticText* itemStaticText12b =
455 new wxStaticText(itemDialog1, wxID_STATIC, _(
"Time shown as"),
456 wxDefaultPosition, wxDefaultSize, 0);
457 itemBoxSizer2->Add(itemStaticText12b, 0, wxEXPAND | wxALL, 5);
460 new wxRadioButton(itemDialog1, wxID_ANY, _(
"UTC"), wxDefaultPosition,
461 wxDefaultSize, wxRB_GROUP);
464 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
466 m_rbShowTimePC =
new wxRadioButton(itemDialog1, wxID_ANY, _(
"Local Time"));
469 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
472 new wxRadioButton(itemDialog1, wxID_ANY, _(
"LMT@Location"));
475 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
478 new wxRadioButton(itemDialog1, wxID_ANY, _(
"Honor Global Settings"));
481 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, 5);
483 wxFlexGridSizer* itemFlexGridSizer6b =
new wxFlexGridSizer(3, 2, 0, 0);
484 itemBoxSizer2->Add(itemFlexGridSizer6b, 0, wxEXPAND | wxALIGN_LEFT | wxALL,
487 wxStaticText* m_staticText1 =
488 new wxStaticText(itemDialog1, wxID_ANY, _(
"Color") +
":",
489 wxDefaultPosition, wxDefaultSize, 0);
490 itemFlexGridSizer6b->Add(m_staticText1, 0, wxALIGN_CENTER_VERTICAL | wxALL,
493 wxString m_chColorChoices[] = {
494 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
495 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
496 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
497 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
499 int m_chColorNChoices =
sizeof(m_chColorChoices) /
sizeof(wxString);
501 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(250, -1),
502 m_chColorNChoices, m_chColorChoices, 0);
503 m_cColor->SetSelection(0);
504 itemFlexGridSizer6b->Add(m_cColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
506 wxStaticText* staticTextStyle =
507 new wxStaticText(itemDialog1, wxID_ANY, _(
"Style") +
":",
508 wxDefaultPosition, wxDefaultSize, 0);
509 itemFlexGridSizer6b->Add(staticTextStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL,
512 wxString m_chStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
513 _(
"Long dash"), _(
"Short dash")};
514 int m_chStyleNChoices =
sizeof(m_chStyleChoices) /
sizeof(wxString);
516 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
517 m_chStyleNChoices, m_chStyleChoices, 0);
518 m_cStyle->SetSelection(0);
519 itemFlexGridSizer6b->Add(m_cStyle, 0,
520 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
523 staticTextStyle->Hide();
527 m_stWidth =
new wxStaticText(itemDialog1, wxID_ANY, _(
"Width") +
":",
528 wxDefaultPosition, wxDefaultSize, 0);
529 itemFlexGridSizer6b->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
531 wxString m_chWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
532 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
533 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
534 _(
"9 pixels"), _(
"10 pixels")};
535 int m_chWidthNChoices =
sizeof(m_chWidthChoices) /
sizeof(wxString);
537 new wxChoice(itemDialog1, wxID_ANY, wxDefaultPosition, wxSize(150, -1),
538 m_chWidthNChoices, m_chWidthChoices, 0);
539 m_cWidth->SetSelection(0);
540 itemFlexGridSizer6b->Add(m_cWidth, 0,
541 wxEXPAND | wxALIGN_CENTER_VERTICAL | wxALL, 5);
543 wxStaticBox* itemStaticBoxSizer14Static =
544 new wxStaticBox(itemDialog1, wxID_ANY, _(
"Waypoints"));
545 wxStaticBoxSizer* m_pListSizer =
546 new wxStaticBoxSizer(itemStaticBoxSizer14Static, wxVERTICAL);
547 itemBoxSizer2->Add(m_pListSizer, 1, wxEXPAND | wxALL, 1);
549 wxScrolledWindow* itemlistWin =
550 new wxScrolledWindow(itemDialog1, wxID_ANY, wxDefaultPosition,
551 wxDefaultSize, wxHSCROLL | wxVSCROLL);
552 itemlistWin->SetScrollRate(2, 2);
554 m_pListSizer->Add(itemlistWin, 0, wxEXPAND | wxALL, 6);
556 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
558 flags |= wxLC_VIRTUAL;
562 wxSize(100, 500), flags);
563 addColumns(m_lcPoints, GetCharWidth());
568 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
573 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
574 itemBoxSizer1->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
578 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
579 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
580 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
582 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
586 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
587 wxDefaultPosition, wxDefaultSize, 0);
588 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
589 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
590 m_sdbBtmBtnsSizerPrint->Enable(
true);
592 m_sdbBtmBtnsSizerPrint = NULL;
595 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
596 wxDefaultPosition, wxDefaultSize, 0);
597 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
598 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
599 m_sdbBtmBtnsSizerSplit->Enable(
false);
601 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend"),
602 wxDefaultPosition, wxDefaultSize, 0);
603 m_sdbBtmBtnsSizerExtend->SetToolTip(
604 _(
"Extends this track by connecting it to another track.\n"
605 "Disabled when the track is active, the track is in a layer, or no "
606 "suitable track to connect to exists.\n"
607 "A suitable track is one that is visible, is different from this "
608 "track, and has its last point's timestamp earlier than or equal to "
609 "this track's first point's timestamp."));
610 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
611 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
613 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
614 wxDefaultPosition, wxDefaultSize, 0);
615 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
616 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
618 m_sdbBtmBtnsSizerExport = NULL;
624 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
625 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
627 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
628 wxDefaultPosition, wxDefaultSize, 0);
629 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0,
630 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
632 m_sdbBtmBtnsSizerOK =
633 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
634 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0,
635 wxALIGN_RIGHT | wxALIGN_BOTTOM | wxALL, 5);
636 m_sdbBtmBtnsSizerOK->SetDefault();
638 int char_size = GetCharWidth();
641 width = g_monitor_info[g_current_monitor].width;
642 height = g_monitor_info[g_current_monitor].height;
643 SetSizeHints(-1, -1, width - 100, height - 100);
646void TrackPropDlg::CreateControls(
void) {
647 wxBoxSizer* bSizerMain;
648 bSizerMain =
new wxBoxSizer(wxVERTICAL);
649 SetSizer(bSizerMain);
652 new wxNotebook(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0);
654 bSizerMain->Add(m_notebook1, 1, wxEXPAND | wxALL, 5);
657 new wxPanel(m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize);
658 m_notebook1->AddPage(m_panel0, _(
"Basic"),
true);
660 wxBoxSizer* bSizer0 =
new wxBoxSizer(wxVERTICAL);
661 m_panel0->SetSizer(bSizer0);
663 wxBoxSizer* bSizer1 =
new wxBoxSizer(wxVERTICAL);
664 bSizer0->Add(bSizer1, 1, wxEXPAND | wxALL, 5);
666 m_panelBasic =
new wxScrolledWindow(m_panel0, wxID_ANY, wxDefaultPosition,
668 wxHSCROLL | wxVSCROLL | wxTAB_TRAVERSAL);
674 wxString wqs = getFontQtStylesheet(qFont);
675 wxCharBuffer sbuf = wqs.ToUTF8();
676 QString qsb = QString(sbuf.data());
678 QString qsbq = getQtStyleSheet();
680 m_panelBasic->GetHandle()->setStyleSheet(qsb +
689 wxBoxSizer* bSizerBasic =
new wxBoxSizer(wxVERTICAL);
690 m_panelBasic->SetSizer(bSizerBasic);
692 bSizer1->Add(m_panelBasic, 1, wxEXPAND | wxALL, 5);
694 wxBoxSizer* bSizerName;
695 bSizerName =
new wxBoxSizer(wxHORIZONTAL);
696 bSizerBasic->Add(bSizerName, 0, wxALL | wxEXPAND, 5);
698 m_stName =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Name"),
699 wxDefaultPosition, wxDefaultSize, 0);
701 bSizerName->Add(m_stName, 0, wxALL, 5);
703 m_tName =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
704 wxDefaultPosition, wxDefaultSize, 0);
705 bSizerName->Add(m_tName, 1, 0, 5);
707 wxBoxSizer* bSizerFromTo;
708 bSizerFromTo =
new wxBoxSizer(wxHORIZONTAL);
709 bSizerBasic->Add(bSizerFromTo, 0, wxALL | wxEXPAND, 5);
711 m_stFrom =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"From"),
712 wxDefaultPosition, wxDefaultSize, 0);
714 bSizerFromTo->Add(m_stFrom, 0, wxALL, 5);
716 m_tFrom =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
717 wxDefaultPosition, wxDefaultSize, 0);
718 bSizerFromTo->Add(m_tFrom, 1, 0, 5);
720 m_stTo =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"To"), wxDefaultPosition,
723 bSizerFromTo->Add(m_stTo, 0, wxALL, 5);
725 m_tTo =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
726 wxDefaultPosition, wxDefaultSize, 0);
727 bSizerFromTo->Add(m_tTo, 1, 0, 5);
729 wxStaticBoxSizer* sbSizerParams;
730 sbSizerParams =
new wxStaticBoxSizer(
731 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Display parameters")),
733 bSizerBasic->Add(sbSizerParams, 0, wxALL | wxEXPAND, 5);
735 m_cbShow =
new wxCheckBox(m_panelBasic, wxID_ANY, _(
"Show on chart"),
736 wxDefaultPosition, wxDefaultSize, 0);
737 sbSizerParams->Add(m_cbShow, 0, wxALL, 5);
739 m_stColor =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Color"),
740 wxDefaultPosition, wxDefaultSize, 0);
742 sbSizerParams->Add(m_stColor, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
744 wxString m_cColorChoices[] = {
745 _(
"Default color"), _(
"Black"), _(
"Dark Red"), _(
"Dark Green"),
746 _(
"Dark Yellow"), _(
"Dark Blue"), _(
"Dark Magenta"), _(
"Dark Cyan"),
747 _(
"Light Gray"), _(
"Dark Gray"), _(
"Red"), _(
"Green"),
748 _(
"Yellow"), _(
"Blue"), _(
"Magenta"), _(
"Cyan"),
750 int m_cColorNChoices =
sizeof(m_cColorChoices) /
sizeof(wxString);
751 m_cColor =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
752 wxDefaultSize, m_cColorNChoices, m_cColorChoices, 0);
753 m_cColor->SetSelection(0);
754 sbSizerParams->Add(m_cColor, 1, 0, 5);
756 m_stStyle =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Style"),
757 wxDefaultPosition, wxDefaultSize, 0);
759 sbSizerParams->Add(m_stStyle, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
761 wxString m_cStyleChoices[] = {_(
"Default"), _(
"Solid"), _(
"Dot"),
762 _(
"Long dash"), _(
"Short dash")};
763 int m_cStyleNChoices =
sizeof(m_cStyleChoices) /
sizeof(wxString);
764 m_cStyle =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
765 wxDefaultSize, m_cStyleNChoices, m_cStyleChoices, 0);
766 m_cStyle->SetSelection(0);
767 sbSizerParams->Add(m_cStyle, 1, 0, 5);
769 m_stWidth =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Width"),
770 wxDefaultPosition, wxDefaultSize, 0);
772 sbSizerParams->Add(m_stWidth, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
774 wxString m_cWidthChoices[] = {_(
"Default"), _(
"1 pixel"), _(
"2 pixels"),
775 _(
"3 pixels"), _(
"4 pixels"), _(
"5 pixels"),
776 _(
"6 pixels"), _(
"7 pixels"), _(
"8 pixels"),
777 _(
"9 pixels"), _(
"10 pixels")};
778 int m_cWidthNChoices =
sizeof(m_cWidthChoices) /
sizeof(wxString);
779 m_cWidth =
new wxChoice(m_panelBasic, wxID_ANY, wxDefaultPosition,
780 wxDefaultSize, m_cWidthNChoices, m_cWidthChoices, 0);
781 m_cWidth->SetSelection(0);
782 sbSizerParams->Add(m_cWidth, 1, 0, 5);
784 wxStaticBoxSizer* sbSizerStats;
785 sbSizerStats =
new wxStaticBoxSizer(
786 new wxStaticBox(m_panelBasic, wxID_ANY, _(
"Statistics")), wxVERTICAL);
787 bSizerBasic->Add(sbSizerStats, 0, wxALL | wxEXPAND, 5);
789 wxBoxSizer* bSizerStats;
790 bSizerStats =
new wxBoxSizer(wxHORIZONTAL);
793 new wxStaticText(m_panelBasic, wxID_ANY, _(
"Total distance"),
794 wxDefaultPosition, wxDefaultSize, 0);
796 bSizerStats->Add(m_stTotDistance, 0, wxALL, 5);
799 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
800 wxDefaultSize, wxTE_READONLY);
801 bSizerStats->Add(m_tTotDistance, 1, 0, 5);
803 m_stAvgSpeed =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Avg. speed"),
804 wxDefaultPosition, wxDefaultSize, 0);
806 bSizerStats->Add(m_stAvgSpeed, 0, wxALL, 5);
808 m_tAvgSpeed =
new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString,
809 wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
810 bSizerStats->Add(m_tAvgSpeed, 1, 0, 5);
812 m_stTimeEnroute =
new wxStaticText(m_panelBasic, wxID_ANY, _(
"Time enroute"),
813 wxDefaultPosition, wxDefaultSize, 0);
815 bSizerStats->Add(m_stTimeEnroute, 0, wxALL, 5);
818 new wxTextCtrl(m_panelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition,
819 wxDefaultSize, wxTE_READONLY);
820 bSizerStats->Add(m_tTimeEnroute, 2, 0, 5);
822 sbSizerStats->Add(bSizerStats, 0, wxEXPAND, 5);
824 wxStaticBoxSizer* sbSizerPoints;
825 sbSizerPoints =
new wxStaticBoxSizer(
826 new wxStaticBox(m_panel0, wxID_ANY, _(
"Recorded points")), wxVERTICAL);
827 bSizer1->Add(sbSizerPoints, 1, wxALL | wxEXPAND, 5);
829 wxBoxSizer* bSizerShowTime;
830 bSizerShowTime =
new wxBoxSizer(wxHORIZONTAL);
832 m_stShowTime =
new wxStaticText(m_panel0, wxID_ANY, _(
"Time shown as"),
833 wxDefaultPosition, wxDefaultSize, 0);
835 bSizerShowTime->Add(m_stShowTime, 0, wxALL, 5);
837 m_rbShowTimeUTC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"UTC"),
838 wxDefaultPosition, wxDefaultSize, 0);
839 bSizerShowTime->Add(m_rbShowTimeUTC, 0,
840 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
843 m_rbShowTimePC =
new wxRadioButton(m_panel0, wxID_ANY, _(
"Local Time"),
844 wxDefaultPosition, wxDefaultSize, 0);
846 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
850 new wxRadioButton(m_panel0, wxID_ANY, _(
"LMT@Track Start"),
851 wxDefaultPosition, wxDefaultSize, 0);
853 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
857 new wxRadioButton(m_panel0, wxID_ANY, _(
"Honor Global Settings"),
858 wxDefaultPosition, wxDefaultSize, 0);
860 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
865 sbSizerPoints->Add(bSizerShowTime, 0, wxEXPAND, 5);
867 long flags = wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_EDIT_LABELS;
869 flags |= wxLC_VIRTUAL;
873 wxDefaultSize, flags);
874 addColumns(m_lcPoints, GetCharWidth());
876 sbSizerPoints->Add(m_lcPoints, 1, wxALL | wxEXPAND, 5);
879 m_lcPoints->GetHandle()->setStyleSheet(getQtStyleSheet());
893 m_panelAdvanced =
new wxScrolledWindow(
894 m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
896 wxBoxSizer* bSizerAdvanced;
897 bSizerAdvanced =
new wxBoxSizer(wxVERTICAL);
900 new wxStaticText(m_panelAdvanced, wxID_ANY, _(
"Description"),
901 wxDefaultPosition, wxDefaultSize, 0);
903 bSizerAdvanced->Add(m_stDescription, 0, wxALL, 5);
906 new wxTextCtrl(m_panelAdvanced, wxID_ANY, wxEmptyString,
907 wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
908 bSizerAdvanced->Add(m_tDescription, 1, wxALL | wxEXPAND, 5);
910 sbSizerLinks =
new wxStaticBoxSizer(
911 new wxStaticBox(m_panelAdvanced, wxID_ANY, _(
"Links")), wxVERTICAL);
913 m_scrolledWindowLinks =
914 new wxScrolledWindow(m_panelAdvanced, wxID_ANY, wxDefaultPosition,
915 wxDefaultSize, wxHSCROLL | wxVSCROLL);
916 m_scrolledWindowLinks->SetScrollRate(5, 5);
917 bSizerLinks =
new wxBoxSizer(wxVERTICAL);
920 new wxHyperlinkCtrl(m_scrolledWindowLinks, wxID_ANY, _(
"wxFB Website"),
921 "http://www.wxformbuilder.org", wxDefaultPosition,
922 wxDefaultSize, wxHL_DEFAULT_STYLE);
923 m_menuLink =
new wxMenu();
925 new wxMenuItem(m_menuLink, ID_TRK_MENU_EDIT, wxString(_(
"Edit")),
926 wxEmptyString, wxITEM_NORMAL);
927 m_menuLink->Append(m_menuItemEdit);
930 new wxMenuItem(m_menuLink, ID_TRK_MENU_ADD, wxString(_(
"Add new")),
931 wxEmptyString, wxITEM_NORMAL);
932 m_menuLink->Append(m_menuItemAdd);
935 new wxMenuItem(m_menuLink, ID_TRK_MENU_DELETE, wxString(_(
"Delete")),
936 wxEmptyString, wxITEM_NORMAL);
937 m_menuLink->Append(m_menuItemDelete);
939 m_hyperlink1->Connect(
941 wxMouseEventHandler(TrackPropDlg::m_hyperlink1OnContextMenu), NULL,
this);
943 bSizerLinks->Add(m_hyperlink1, 0, wxALL, 5);
945 m_scrolledWindowLinks->SetSizer(bSizerLinks);
946 m_scrolledWindowLinks->Layout();
947 bSizerLinks->Fit(m_scrolledWindowLinks);
948 sbSizerLinks->Add(m_scrolledWindowLinks, 1, wxEXPAND | wxALL, 5);
950 wxBoxSizer* bSizerLinkBtns;
951 bSizerLinkBtns =
new wxBoxSizer(wxHORIZONTAL);
954 new wxButton(m_panelAdvanced, wxID_ANY, _(
"Add"), wxDefaultPosition,
955 wxDefaultSize, wxBU_EXACTFIT);
956 bSizerLinkBtns->Add(m_buttonAddLink, 0, wxALL, 5);
958 m_toggleBtnEdit =
new wxToggleButton(m_panelAdvanced, wxID_ANY, _(
"Edit"),
959 wxDefaultPosition, wxDefaultSize, 0);
960 bSizerLinkBtns->Add(m_toggleBtnEdit, 0, wxALL, 5);
962 m_staticTextEditEnabled =
new wxStaticText(
963 m_panelAdvanced, wxID_ANY, _(
"Links are opened in the default browser."),
964 wxDefaultPosition, wxDefaultSize, 0);
966 bSizerLinkBtns->Add(m_staticTextEditEnabled, 0,
967 wxALIGN_CENTER_VERTICAL | wxALL, 5);
969 sbSizerLinks->Add(bSizerLinkBtns, 0, wxEXPAND, 5);
971 bSizerAdvanced->Add(sbSizerLinks, 1, wxEXPAND, 5);
973 m_panelAdvanced->SetSizer(bSizerAdvanced);
974 m_notebook1->AddPage(m_panelAdvanced, _(
"Advanced"),
false);
978 wxBoxSizer* itemBoxSizerBottom =
new wxBoxSizer(wxVERTICAL);
979 bSizerMain->Add(itemBoxSizerBottom, 0, wxALIGN_LEFT | wxALL | wxEXPAND, 5);
985 wxFlexGridSizer* itemBoxSizerAux =
new wxFlexGridSizer(0, n_col, 0, 0);
986 itemBoxSizerAux->SetFlexibleDirection(wxBOTH);
987 itemBoxSizerAux->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
989 itemBoxSizerBottom->Add(itemBoxSizerAux, 1, wxALIGN_LEFT | wxALL, 5);
993 m_sdbBtmBtnsSizerPrint =
new wxButton(
this, wxID_ANY, _(
"Print"),
994 wxDefaultPosition, wxDefaultSize, 0);
995 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerPrint, 0,
996 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
997 m_sdbBtmBtnsSizerPrint->Enable(
true);
999 m_sdbBtmBtnsSizerPrint = NULL;
1002 m_sdbBtmBtnsSizerSplit =
new wxButton(
this, wxID_ANY, _(
"Split"),
1003 wxDefaultPosition, wxDefaultSize, 0);
1004 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerSplit, 0,
1005 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1006 m_sdbBtmBtnsSizerSplit->Enable(
false);
1008 m_sdbBtmBtnsSizerExtend =
new wxButton(
this, wxID_ANY, _(
"Extend track"),
1009 wxDefaultPosition, wxDefaultSize, 0);
1010 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExtend, 0,
1011 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1013 m_sdbBtmBtnsSizerToRoute =
new wxButton(
this, wxID_ANY, _(
"To route"),
1014 wxDefaultPosition, wxDefaultSize, 0);
1015 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerToRoute, 0,
1016 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1018 m_sdbBtmBtnsSizerExport =
new wxButton(
this, wxID_ANY, _(
"Export"),
1019 wxDefaultPosition, wxDefaultSize, 0);
1020 itemBoxSizerAux->Add(m_sdbBtmBtnsSizerExport, 0,
1021 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 5);
1023 wxBoxSizer* itemBoxSizer16 =
new wxBoxSizer(wxHORIZONTAL);
1024 itemBoxSizerBottom->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
1026 m_sdbBtmBtnsSizerCancel =
new wxButton(
this, wxID_CANCEL, _(
"Cancel"),
1027 wxDefaultPosition, wxDefaultSize, 0);
1028 itemBoxSizer16->Add(m_sdbBtmBtnsSizerCancel, 0, wxALIGN_BOTTOM | wxALL, 5);
1030 m_sdbBtmBtnsSizerOK =
1031 new wxButton(
this, wxID_OK, _(
"OK"), wxDefaultPosition, wxDefaultSize, 0);
1032 itemBoxSizer16->Add(m_sdbBtmBtnsSizerOK, 0, wxALIGN_BOTTOM | wxALL, 5);
1033 m_sdbBtmBtnsSizerOK->SetDefault();
1037 ((wxWindowBase*)m_stName)->GetSize(&w1, &h);
1038 ((wxWindowBase*)m_stFrom)->GetSize(&w2, &h);
1039 ((wxWindowBase*)m_stName)->SetMinSize(wxSize(wxMax(w1, w2), h));
1040 ((wxWindowBase*)m_stFrom)->SetMinSize(wxSize(wxMax(w1, w2), h));
1042 m_panelBasic->SetScrollRate(5, 5);
1043 m_panelAdvanced->SetScrollRate(5, 5);
1046void TrackPropDlg::SetTrackAndUpdate(
Track* pt) {
1049 m_lcPoints->DeleteAllItems();
1051 if (m_pMyLinkList)
delete m_pMyLinkList;
1052 m_pMyLinkList =
new HyperlinkList();
1054 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1055 if (NbrOfLinks > 0) {
1056 wxHyperlinkListNode* linknode = m_pTrack->m_TrackHyperlinkList->GetFirst();
1061 h->DescrText = link->DescrText;
1062 h->Link = link->Link;
1063 h->LType = link->LType;
1065 m_pMyLinkList->Append(h);
1067 linknode = linknode->GetNext();
1077void TrackPropDlg::InitializeList() {
1078 if (NULL == m_pTrack)
return;
1080 m_lcPoints->m_pTrack = m_pTrack;
1082 if (m_pTrack->GetnPoints()) {
1085 m_lcPoints->m_LMT_Offset = long((prp->m_lon) * 3600. / 15.);
1087 m_lcPoints->m_LMT_Offset = 0;
1090 if (m_lcPoints->IsVirtual())
1091 m_lcPoints->SetItemCount(m_pTrack->GetnPoints());
1094 for (
int in = 0; in < m_pTrack->GetnPoints(); in++) {
1098 m_lcPoints->InsertItem(item);
1099 for (
int j = 0; j < 7; j++) {
1101 item.SetText(m_lcPoints->OnGetItemText(in, j));
1102 m_lcPoints->SetItem(item);
1109 if (NULL == m_pTrack)
return false;
1111 ::wxBeginBusyCursor();
1113 if (m_scrolledWindowLinks) {
1114 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1115 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1116 wxWindowListNode* node = kids.Item(i);
1117 wxWindow* win = node->GetData();
1119 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1121 link_win->Disconnect(
1122 wxEVT_COMMAND_HYPERLINK,
1123 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1124 link_win->Disconnect(
1126 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1131 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1132 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1134 if (NbrOfLinks > 0) {
1135 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1138 wxString Link = link->Link;
1139 wxString Descr = link->DescrText;
1141 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1142 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1143 wxDefaultSize, wxHL_DEFAULT_STYLE);
1144 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1145 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1147 if (!m_pTrack->m_bIsInLayer)
1150 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu), NULL,
1153 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1155 linknode = linknode->GetNext();
1158 bSizerLinks->Fit(m_scrolledWindowLinks);
1161 m_tName->SetValue(m_pTrack->GetName());
1162 m_tFrom->SetValue(m_pTrack->m_TrackStartString);
1163 m_tTo->SetValue(m_pTrack->m_TrackEndString);
1164 if (m_tDescription) m_tDescription->SetValue(m_pTrack->m_TrackDescription);
1166 m_tTotDistance->SetValue(
"");
1167 m_tTimeEnroute->SetValue(
"");
1169 m_sdbBtmBtnsSizerSplit->Enable(
false);
1170 m_sdbBtmBtnsSizerExtend->Enable(
false);
1173 TrackPoint* last_point = m_pTrack->GetLastPoint();
1174 TrackPoint* first_point = m_pTrack->GetPoint(0);
1175 double trackLength = m_pTrack->Length();
1176 double total_seconds = 0.;
1178 wxString speed(
"--");
1180 if (last_point && first_point) {
1187 if (total_seconds != 0.) {
1188 m_avgspeed = trackLength / total_seconds * 3600;
1192 speed.Printf(
"%5.2f", toUsrSpeed(m_avgspeed));
1196 m_tAvgSpeed->SetValue(speed);
1200 slen.Printf(
"%5.2f " + getUsrDistanceUnit(), toUsrDistance(trackLength));
1202 m_tTotDistance->SetValue(slen);
1206 wxTimeSpan time(0, 0, (
int)total_seconds, 0);
1208 if (total_seconds > 3600. * 24.)
1209 time_form = time.Format(
"%H:%M");
1210 else if (total_seconds > 0.)
1211 time_form = time.Format(
"%H:%M");
1214 m_tTimeEnroute->SetValue(time_form);
1216 m_cbShow->SetValue(m_pTrack->IsVisible());
1218 if (m_pTrack->m_Colour == wxEmptyString)
1219 m_cColor->Select(0);
1221 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
1223 if (m_pTrack->m_Colour == ::GpxxColorNames[i]) {
1224 m_cColor->Select(i + 1);
1230 for (
unsigned int i = 0; i <
sizeof(::StyleValues) /
sizeof(
int); i++) {
1231 if (m_pTrack->m_style == ::StyleValues[i]) {
1232 m_cStyle->Select(i);
1237 for (
unsigned int i = 0; i <
sizeof(::WidthValues) /
sizeof(
int); i++) {
1238 if (m_pTrack->m_width == ::WidthValues[i]) {
1239 m_cWidth->Select(i);
1244 if (m_pTrack->m_bIsInLayer) {
1245 m_tName->SetEditable(
false);
1246 m_tFrom->SetEditable(
false);
1247 m_tTo->SetEditable(
false);
1248 if (m_tDescription) m_tDescription->SetEditable(
false);
1249 m_cbShow->Enable(
false);
1250 m_cColor->Enable(
false);
1251 m_cStyle->Enable(
false);
1252 m_cWidth->Enable(
false);
1253 m_sdbBtmBtnsSizerExtend->Enable(
false);
1254 m_sdbBtmBtnsSizerSplit->Enable(
false);
1255 SetTitle(wxString::Format(
"%s, %s: %d", _(
"Track properties"),
"Layer",
1256 m_pTrack->m_LayerID));
1258 m_tName->SetEditable(
true);
1259 m_tFrom->SetEditable(
true);
1260 m_tTo->SetEditable(
true);
1261 if (m_tDescription) m_tDescription->SetEditable(
true);
1262 m_cbShow->Enable(
true);
1263 m_cColor->Enable(
true);
1264 m_cStyle->Enable(
true);
1265 m_cWidth->Enable(
true);
1267 m_sdbBtmBtnsSizerExtend->Enable(IsThisTrackExtendable());
1269 SetTitle(_(
"Track properties"));
1272 ::wxEndBusyCursor();
1277bool TrackPropDlg::IsThisTrackExtendable() {
1278 m_pExtendTrack = NULL;
1279 m_pExtendPoint = NULL;
1280 if (m_pTrack == g_pActiveTrack || m_pTrack->m_bIsInLayer) {
1284 TrackPoint* pLastPoint = m_pTrack->GetPoint(0);
1289 for (
Track* ptrack : g_TrackList) {
1290 if (ptrack->IsVisible() && (ptrack->m_GUID != m_pTrack->m_GUID)) {
1291 TrackPoint* track_node = ptrack->GetLastPoint();
1295 if (!m_pExtendPoint ||
1297 m_pExtendPoint = track_node;
1298 m_pExtendTrack = ptrack;
1305 if (m_pExtendTrack) {
1306 return (!m_pExtendTrack->m_bIsInLayer);
1312void TrackPropDlg::OnExtendBtnClick(wxCommandEvent& event) {
1313 TrackPoint* pFirstPoint = m_pTrack->GetPoint(0);
1315 if (IsThisTrackExtendable()) {
1320 pSelect->DeleteAllSelectableTrackSegments(m_pExtendTrack);
1321 m_pExtendTrack->Clone(m_pTrack, begin, m_pTrack->GetnPoints(), _(
"_plus"));
1322 pSelect->AddAllSelectableTrackSegments(m_pExtendTrack);
1323 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1324 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1327 SetTrackAndUpdate(m_pExtendTrack);
1328 NavObj_dB::GetInstance().UpdateTrack(m_pTrack);
1331 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1332 pRouteManagerDialog->UpdateTrkListCtrl();
1337void TrackPropDlg::OnSplitBtnClick(wxCommandEvent& event) {
1338 m_sdbBtmBtnsSizerSplit->Enable(
false);
1340 if (m_pTrack->m_bIsInLayer) {
1344 if ((m_nSelected > 1) && (m_nSelected < m_pTrack->GetnPoints())) {
1347 pHead->Clone(m_pTrack, 0, m_nSelected - 1, _(
"_A"));
1348 pTail->Clone(m_pTrack, m_nSelected - 1, m_pTrack->GetnPoints(), _(
"_B"));
1350 g_TrackList.push_back(pHead);
1351 NavObj_dB::GetInstance().InsertTrack(pHead);
1353 g_TrackList.push_back(pTail);
1354 NavObj_dB::GetInstance().InsertTrack(pTail);
1356 NavObj_dB::GetInstance().DeleteTrack(m_pTrack);
1358 pSelect->DeleteAllSelectableTrackSegments(m_pTrack);
1360 pSelect->AddAllSelectableTrackSegments(pTail);
1361 pSelect->AddAllSelectableTrackSegments(pHead);
1363 SetTrackAndUpdate(pTail);
1366 if (pRouteManagerDialog && pRouteManagerDialog->IsShown()) {
1367 pRouteManagerDialog->UpdateTrkListCtrl();
1372void TrackPropDlg::OnTrackPropCopyTxtClick(wxCommandEvent& event) {
1373 wxString tab(
"\t", wxConvUTF8);
1374 wxString eol(
"\n", wxConvUTF8);
1377 csvString << this->GetTitle() << eol << _(
"Name") << tab
1378 << m_pTrack->GetName() << eol << _(
"Depart From") << tab
1379 << m_pTrack->m_TrackStartString << eol << _(
"Destination") << tab
1380 << m_pTrack->m_TrackEndString << eol << _(
"Total distance") << tab
1381 << m_tTotDistance->GetValue() << eol << _(
"Speed") << tab
1382 << m_tAvgSpeed->GetValue() << eol
1383 << _(
"Departure Time") +
" " + _(
"(m/d/y h:m)") << tab
1385 << _(
"Time enroute") << tab << m_tTimeEnroute->GetValue() << eol
1390 noCols = m_lcPoints->GetColumnCount();
1391 noRows = m_lcPoints->GetItemCount();
1393 item.SetMask(wxLIST_MASK_TEXT);
1395 for (
int i = 0; i < noCols; i++) {
1396 m_lcPoints->GetColumn(i, item);
1397 csvString << item.GetText() << tab;
1401 for (
int j = 0; j < noRows; j++) {
1403 for (
int i = 0; i < noCols; i++) {
1405 m_lcPoints->GetItem(item);
1406 csvString << item.GetText() << tab;
1411 if (wxTheClipboard->Open()) {
1412 wxTextDataObject* data =
new wxTextDataObject;
1413 data->SetText(csvString);
1414 wxTheClipboard->SetData(data);
1415 wxTheClipboard->Close();
1419void TrackPropDlg::OnPrintBtnClick(wxCommandEvent& event) {
1420 static std::set<int> s_options;
1422 int result = dlg.ShowModal();
1424 if (result == wxID_OK) {
1425 dlg.GetSelected(s_options);
1428 printer.Initialize(wxPORTRAIT);
1429 printer.EnablePageNumbers(
true);
1430 printer.Print(
this, &printout);
1434void TrackPropDlg::OnTrackPropRightClick(wxListEvent& event) {
1437 wxMenuItem* copyItem =
1438 menu.Append(ID_RCLK_MENU_COPY_TEXT, _(
"&Copy all as text"));
1443void TrackPropDlg::OnTrackPropListClick(wxListEvent& event) {
1449 m_lcPoints->GetNextItem(itemno, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
1453 selected_no = itemno;
1455 m_pTrack->m_HighlightedTrackPoint = -1;
1458 TrackPoint* prp = m_pTrack->GetPoint(itemno);
1460 m_pTrack->m_HighlightedTrackPoint = itemno;
1462 if (!(m_pTrack->m_bIsInLayer) && !(m_pTrack == g_pActiveTrack)) {
1463 m_nSelected = selected_no + 1;
1464 m_sdbBtmBtnsSizerSplit->Enable(
true);
1466 if (gFrame->GetFocusCanvas()) {
1467 gFrame->JumpToPosition(gFrame->GetFocusCanvas(), prp->m_lat, prp->m_lon,
1468 gFrame->GetFocusCanvas()->GetVPScale());
1471 if (m_lcPoints) m_lcPoints->SetFocus();
1475 if (selected_no == 0 || selected_no == m_pTrack->GetnPoints() - 1)
1476 m_sdbBtmBtnsSizerSplit->Enable(
false);
1479void TrackPropDlg::OnTrackPropMenuSelected(wxCommandEvent& event) {
1480 switch (event.GetId()) {
1481 case ID_RCLK_MENU_COPY_TEXT:
1482 OnTrackPropCopyTxtClick(event);
1487void TrackPropDlg::OnToRouteBtnClick(wxCommandEvent& event) {
1488 pRouteManagerDialog->TrackToRoute(m_pTrack);
1489 if (NULL != pRouteManagerDialog && pRouteManagerDialog->IsVisible())
1490 pRouteManagerDialog->UpdateRouteListCtrl();
1493void TrackPropDlg::OnExportBtnClick(wxCommandEvent& event) {
1494 wxString suggested_name = _(
"track");
1495 std::vector<Track*> list = {m_pTrack};
1496 if (m_pTrack->GetName() != wxEmptyString)
1497 suggested_name = m_pTrack->GetName();
1498 ExportGPXTracks(
this, &list, suggested_name);
1501void TrackPropDlg::m_hyperlinkContextMenu(wxMouseEvent& event) {
1502 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1504 wxEVT_COMMAND_MENU_SELECTED,
1505 (wxObjectEventFunction)(wxEventFunction)&TrackPropDlg::PopupMenuHandler);
1506 m_scrolledWindowLinks->PopupMenu(
1507 m_menuLink, m_pEditedLink->GetPosition().x + event.GetPosition().x,
1508 m_pEditedLink->GetPosition().y + event.GetPosition().y);
1511void TrackPropDlg::PopupMenuHandler(wxCommandEvent& event) {
1512 switch (event.GetId()) {
1513 case ID_TRK_MENU_ADD:
1516 case ID_TRK_MENU_EDIT:
1519 case ID_TRK_MENU_DELETE:
1528 wxHyperlinkListNode* nodeToDelete = NULL;
1529 wxString findurl = m_pEditedLink->GetURL();
1530 wxString findlabel = m_pEditedLink->GetLabel();
1532 wxWindowList kids = m_scrolledWindowLinks->GetChildren();
1533 for (
unsigned int i = 0; i < kids.GetCount(); i++) {
1534 wxWindowListNode* node = kids.Item(i);
1535 wxWindow* win = node->GetData();
1537 auto link_win =
dynamic_cast<wxHyperlinkCtrl*
>(win);
1539 link_win->Disconnect(
1540 wxEVT_COMMAND_HYPERLINK,
1541 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick));
1542 link_win->Disconnect(
1544 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu));
1550 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1551 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1553 if (NbrOfLinks > 0) {
1554 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1557 wxString Link = link->Link;
1558 wxString Descr = link->DescrText;
1559 if (Link == findurl &&
1560 (Descr == findlabel || (Link == findlabel && Descr == wxEmptyString)))
1561 nodeToDelete = linknode;
1563 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1564 m_scrolledWindowLinks, wxID_ANY, Descr, Link, wxDefaultPosition,
1565 wxDefaultSize, wxHL_DEFAULT_STYLE);
1566 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1567 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1569 ctrl->Connect(wxEVT_RIGHT_DOWN,
1570 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1573 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1575 linknode = linknode->GetNext();
1578 if (nodeToDelete) hyperlinklist->DeleteNode(nodeToDelete);
1579 m_scrolledWindowLinks->InvalidateBestSize();
1580 m_scrolledWindowLinks->Layout();
1581 sbSizerLinks->Layout();
1585void TrackPropDlg::OnEditLink(wxCommandEvent& event) {
1586 wxString findurl = m_pEditedLink->GetURL();
1587 wxString findlabel = m_pEditedLink->GetLabel();
1590 LinkPropDlg->m_textCtrlLinkDescription->SetValue(findlabel);
1591 LinkPropDlg->m_textCtrlLinkUrl->SetValue(findurl);
1592 DimeControl(LinkPropDlg);
1593 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg, findurl,
1594 findlabel](
int retcode) {
1595 if (retcode == wxID_OK) {
1596 int NbrOfLinks = m_pTrack->m_TrackHyperlinkList->GetCount();
1597 HyperlinkList* hyperlinklist = m_pTrack->m_TrackHyperlinkList;
1599 if (NbrOfLinks > 0) {
1600 wxHyperlinkListNode* linknode = hyperlinklist->GetFirst();
1603 wxString Link = link->Link;
1604 wxString Descr = link->DescrText;
1605 if (Link == findurl &&
1606 (Descr == findlabel ||
1607 (Link == findlabel && Descr == wxEmptyString))) {
1608 link->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1610 LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1611 wxHyperlinkCtrl* h =
1612 (wxHyperlinkCtrl*)m_scrolledWindowLinks->FindWindowByLabel(
1615 h->SetLabel(LinkPropDlg->m_textCtrlLinkDescription->GetValue());
1616 h->SetURL(LinkPropDlg->m_textCtrlLinkUrl->GetValue());
1619 linknode = linknode->GetNext();
1623 m_scrolledWindowLinks->InvalidateBestSize();
1624 m_scrolledWindowLinks->Layout();
1625 sbSizerLinks->Layout();
1631void TrackPropDlg::OnAddLink(wxCommandEvent& event) {
1633 LinkPropDlg->m_textCtrlLinkDescription->SetValue(wxEmptyString);
1634 LinkPropDlg->m_textCtrlLinkUrl->SetValue(wxEmptyString);
1635 DimeControl(LinkPropDlg);
1636 LinkPropDlg->ShowWindowModalThenDo([
this, LinkPropDlg](
int retcode) {
1637 if (retcode == wxID_OK) {
1638 wxString desc = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1639 if (desc == wxEmptyString)
1640 desc = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1641 wxHyperlinkCtrl* ctrl =
new wxHyperlinkCtrl(
1642 m_scrolledWindowLinks, wxID_ANY, desc,
1643 LinkPropDlg->m_textCtrlLinkUrl->GetValue(), wxDefaultPosition,
1644 wxDefaultSize, wxHL_DEFAULT_STYLE);
1645 ctrl->Connect(wxEVT_COMMAND_HYPERLINK,
1646 wxHyperlinkEventHandler(TrackPropDlg::OnHyperLinkClick),
1648 ctrl->Connect(wxEVT_RIGHT_DOWN,
1649 wxMouseEventHandler(TrackPropDlg::m_hyperlinkContextMenu),
1652 bSizerLinks->Add(ctrl, 0, wxALL, 5);
1653 bSizerLinks->Fit(m_scrolledWindowLinks);
1657 h->DescrText = LinkPropDlg->m_textCtrlLinkDescription->GetValue();
1658 h->Link = LinkPropDlg->m_textCtrlLinkUrl->GetValue();
1659 h->LType = wxEmptyString;
1660 m_pTrack->m_TrackHyperlinkList->Append(h);
1665 m_scrolledWindowLinks->InvalidateBestSize();
1666 m_scrolledWindowLinks->Layout();
1667 sbSizerLinks->Layout();
1672void TrackPropDlg::OnEditLinkToggle(wxCommandEvent& event) {
1673 if (m_toggleBtnEdit->GetValue())
1674 m_staticTextEditEnabled->SetLabel(_(
"Links are opened for editing."));
1676 m_staticTextEditEnabled->SetLabel(
1677 _(
"Links are opened in the default browser."));
1681void TrackPropDlg::OnHyperLinkClick(wxHyperlinkEvent& event) {
1682 if (m_toggleBtnEdit->GetValue()) {
1683 m_pEditedLink = (wxHyperlinkCtrl*)event.GetEventObject();
1698 wxString cc =
event.GetURL();
1699 if (cc.Find(
"#") != wxNOT_FOUND) {
1700 wxRegKey RegKey(wxString(
"HKEY_CLASSES_ROOT\\HTTP\\shell\\open\\command"));
1701 if (RegKey.Exists()) {
1702 wxString command_line;
1703 RegKey.QueryValue(wxString(
""), command_line);
1706 command_line.Replace(wxString(
"\""), wxString(
""));
1709 int l = command_line.Find(
".exe");
1710 if (wxNOT_FOUND == l) l = command_line.Find(
".EXE");
1712 if (wxNOT_FOUND != l) {
1713 wxString cl = command_line.Mid(0, l + 4);
1724 wxString url =
event.GetURL();
1725 url.Replace(
" ",
"%20");
1726 ::wxLaunchDefaultBrowser(url);
1731void TrackPropDlg::OnShowTimeTZ(wxCommandEvent& event) {
1732 if (m_rbShowTimeUTC && m_rbShowTimeUTC->GetValue())
1741 throw std::logic_error(
"Unexpected time zone selection");
1742 m_lcPoints->DeleteAllItems();
1746bool TrackPropDlg::SaveChanges(
void) {
1747 if (m_pTrack && !m_pTrack->m_bIsInLayer) {
1749 m_pTrack->SetName(m_tName->GetValue());
1750 m_pTrack->m_TrackStartString = m_tFrom->GetValue();
1751 m_pTrack->m_TrackEndString = m_tTo->GetValue();
1753 m_pTrack->m_TrackDescription = m_tDescription->GetValue();
1754 m_pTrack->SetVisible(m_cbShow->GetValue());
1755 if (m_cColor->GetSelection() == 0)
1756 m_pTrack->m_Colour = wxEmptyString;
1758 m_pTrack->m_Colour = ::GpxxColorNames[m_cColor->GetSelection() - 1];
1759 m_pTrack->m_style = (wxPenStyle)::StyleValues[m_cStyle->GetSelection()];
1760 m_pTrack->m_width = ::WidthValues[m_cWidth->GetSelection()];
1762 NavObj_dB::GetInstance().UpdateDBTrackAttributes(m_pTrack);
1764 pConfig->UpdateSettings();
1767 if (m_pTrack && m_pTrack->IsRunning()) {
1769 v[
"Changed"] =
true;
1770 v[
"Name"] = m_pTrack->GetName();
1771 v[
"GUID"] = m_pTrack->m_GUID;
1772 wxString msg_id(
"OCPN_TRK_ACTIVATED");
1773 SendJSONMessageToAllPlugins(msg_id, v);
1779void TrackPropDlg::OnOKBtnClick(wxCommandEvent& event) {
1783 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1784 m_pTrack) != g_TrackList.end();
1786 if (b_found_track) {
1788 m_pTrack->ClearHighlights();
1791 m_bStartNow =
false;
1793 if (pRouteManagerDialog && pRouteManagerDialog->IsShown())
1794 pRouteManagerDialog->UpdateTrkListCtrl();
1797 gFrame->InvalidateAllGL();
1798 gFrame->RefreshAllCanvas(
false);
1803void TrackPropDlg::OnCancelBtnClick(wxCommandEvent& event) {
1804 bool b_found_track = std::find(g_TrackList.begin(), g_TrackList.end(),
1805 m_pTrack) != g_TrackList.end();
1807 if (b_found_track) m_pTrack->ClearHighlights();
1810 gFrame->InvalidateAllGL();
1811 gFrame->RefreshAllCanvas(
false);
1820OCPNTrackListCtrl::OCPNTrackListCtrl(wxWindow* parent, wxWindowID
id,
1821 const wxPoint& pos,
const wxSize& size,
1823 : wxListCtrl(parent, id, pos, size, style) {
1825 m_tz_selection = GLOBAL_SETTINGS_INPUT;
1829OCPNTrackListCtrl::~OCPNTrackListCtrl() {}
1832 if (m_pTrack->GetnPoints()) {
1834 if (prp)
return prp->m_lon;
1839wxString OCPNTrackListCtrl::OnGetItemText(
long item,
long column)
const {
1842 if (item < 0 || item >= m_pTrack->GetnPoints())
return wxEmptyString;
1844 TrackPoint* this_point = m_pTrack->GetPoint(item);
1845 TrackPoint* prev_point = item > 0 ? m_pTrack->GetPoint(item - 1) : NULL;
1847 if (!this_point)
return wxEmptyString;
1849 double gt_brg, gt_leg_dist;
1855 slat = prev_point->m_lat;
1856 slon = prev_point->m_lon;
1864 ret.Printf(
"%ld", item);
1868 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1869 >_brg, >_leg_dist);
1871 ret.Printf(
"%6.2f " + getUsrDistanceUnit(), toUsrDistance(gt_leg_dist));
1875 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat, slon,
1876 >_brg, >_leg_dist);
1877 ret.Printf(
"%03.0f %cT", gt_brg, 0x00B0);
1881 ret = toSDMM(1, this_point->m_lat, 1);
1885 ret = toSDMM(2, this_point->m_lon, 1);
1890 if (timestamp.IsValid()) {
1895 ret = ocpn::toUsrDateTimeFormat(timestamp.FromUTC(), opts);
1903 DistanceBearingMercator(this_point->m_lat, this_point->m_lon, slat,
1904 slon, >_brg, >_leg_dist);
1911 if (seconds > 0.) speed = gt_leg_dist / seconds * 3600;
1913 ret.Printf(
"%5.2f", toUsrSpeed(speed));
1925int OCPNTrackListCtrl::OnGetItemColumnImage(
long item,
long column)
const {
Generic Chart canvas base.
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.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.