OpenCPN Partial API docs
Loading...
Searching...
No Matches
ocpn_frame.h
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#ifndef _OFRAME_H
25#define _OFRAME_H
26
27#include <wx/print.h>
28#include <wx/power.h>
29#include <wx/artprov.h>
30#include <wx/socket.h>
31#include <wx/html/htmlwin.h>
32#include <wx/aui/aui.h>
33#include <wx/aui/dockart.h>
34
35#include <memory>
36#ifdef __WXMSW__
37#include <wx/msw/private.h>
38#endif
39
40#include "ocpn_plugin.h"
41
43#include "model/gui.h"
44#include "model/idents.h"
45#include "model/ocpn_types.h"
46#include "model/track.h"
48#include "model/rest_server.h"
49
50#include "bbox.h"
51#include "canvas_menu.h"
52#include "chartbase.h"
53#include "chartdbs.h"
54#include "chcanv.h"
55#include "color_handler.h"
56#include "connections_dlg.h"
57#include "data_monitor.h"
58#include "displays.h"
59#include "gui_lib.h"
60#include "load_errors_dlg.h"
61#include "observable_evtvar.h"
62#include "options.h"
63#include "pluginmanager.h"
64#include "s52_plib_utils.h"
65#include "s52s57.h"
66#include "s57registrar_mgr.h"
67#include "senc_manager.h"
68#include "toolbar.h"
69#include "top_frame.h"
70#include "undo_defs.h"
71
72//----------------------------------------------------------------------------
73// constants
74//----------------------------------------------------------------------------
75
76#define TIMER_GFRAME_1 999
77
78// Command identifiers for wxCommandEvents coming from the outside world.
79// Removed from enum to facilitate constant definition
80//
81// NOLINTBEGIN
82#define ID_CMD_APPLY_SETTINGS 300
83#define ID_CMD_NULL_REFRESH 301
84#define ID_CMD_TRIGGER_RESIZE 302
85#define ID_CMD_SETVP 303
86#define ID_CMD_POST_JSON_TO_PLUGINS 304
87#define ID_CMD_SOUND_FINISHED 306
88// NOLINTEND
89
90using OpenFileFunc = std::function<bool(const std::string& path)>;
91//----------------------------------------------------------------------------
92// fwd class declarations
93//----------------------------------------------------------------------------
94
95class MyFrame; // forward
96extern MyFrame* gFrame;
98// FIXME (leamas) to have utility functions in top window is a really bad idea.
99bool ShowNavWarning();
100
101void ApplyLocale(void);
102
108class MyFrame : public AbstractTopFrame, public S52PlibUtils {
109public:
110 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,
111 RestServer& rest_server, wxAuiDefaultDockArt* pauidockart,
112 OpenFileFunc open_gpx_file);
113
114 ~MyFrame();
115
116 void SetGPSCompassScale() override;
117 void FastClose() override;
118 void RefreshAllCanvas(bool bErase = true) override;
119 void UpdateStatusBar() override;
120 void ToggleFullScreen() override;
121 Track* TrackOff(bool do_add_point = false) override;
122 void TrackOn(void) override;
123 void ProcessOptionsDialog(int resultFlags) override {
124 ProcessOptionsDialog(resultFlags, nullptr);
125 }
126
127 void SetAlertString(wxString msg) override {
128 GetPrimaryCanvas()->SetAlertString(msg);
129 }
130
131 void JumpToPosition(double lat, double lon) override {
132 if (!GetFocusCanvas()) return;
133 JumpToPosition(GetFocusCanvas(), lat, lon, GetFocusCanvas()->GetVPScale());
134 }
135
136 void JumpToPosition(double lat, double lon, double scale) override {
137 if (!GetFocusCanvas()) return;
138 JumpToPosition(GetFocusCanvas(), lat, lon, scale);
139 }
140
141 void JumpToPosition(AbstractChartCanvas* acc, double lat, double lon,
142 double scale) override {
143 if (!acc) return;
144 auto cc = dynamic_cast<ChartCanvas*>(acc);
145 assert(cc);
146 JumpToPosition(cc, lat, lon, scale);
147 }
148 void JumpToPosition(AbstractChartCanvas* acc, double lat,
149 double lon) override {
150 if (!acc) return;
151 auto cc = dynamic_cast<ChartCanvas*>(acc);
152 assert(cc);
153 JumpToPosition(cc, lat, lon, GetFocusCanvas()->GetVPScale());
154 }
155
156 AbstractChartCanvas* GetAbstractPrimaryCanvas() override {
157 return GetPrimaryCanvas();
158 }
159
160 AbstractChartCanvas* GetAbstractFocusCanvas() override {
161 return GetFocusCanvas();
162 }
163
164 void SwitchKBFocus(AbstractChartCanvas* acc) override {
165 return SwitchKBFocus(dynamic_cast<ChartCanvas*>(acc));
166 }
167
168 double GetCanvasTrueScale() override {
169 return GetPrimaryCanvas()->GetCanvasTrueScale();
170 }
171
172 double GetPixPerMM() override { return GetPrimaryCanvas()->GetPixPerMM(); }
173
174 double GetContentScaleFactor() override {
175 if (GetPrimaryCanvas())
176 return GetPrimaryCanvas()->GetContentScaleFactor();
177 else
178 return 1.0;
179 }
180
181 void RequestNewToolbars(bool bforcenew = false) override;
182
183 bool GetCanvasPointPix(double rlat, double rlon, wxPoint* r) override {
184 return GetFocusCanvas()->GetCanvasPointPix(rlat, rlon, r);
185 }
186
187 virtual wxSize GetFocusCanvasSize() override {
188 return GetFocusCanvas() ? GetFocusCanvas()->GetSize() : wxSize(0, 0);
189 }
190
191 void CancelAllMouseRoute() override;
192 void InvalidateAllCanvasUndo() override;
193 void PositionConsole() override;
194 void InvalidateAllGL() override;
195 double GetBestVPScale(AbstractChart* arg) override {
196 auto chart = dynamic_cast<ChartBase*>(arg);
197 assert(chart);
198 return GetPrimaryCanvas()->GetBestVPScale(chart);
199 }
200
201 void DoStackUp(AbstractChartCanvas* cc) override;
202 void DoStackDown(AbstractChartCanvas* cc) override;
203 void LoadHarmonics() override;
204
205 bool DropMarker(bool atOwnShip = true) override;
206 double GetMag(double a, double lat, double lon) override;
207 void SetMasterToolbarItemState(int tool_id, bool state) override;
208 bool DoChartUpdate() override;
209 void ProcessCanvasResize() override;
210 bool SetGlobalToolbarViz(bool viz) override;
211 void ToggleQuiltMode(AbstractChartCanvas* acc) override {
212 auto cc = dynamic_cast<ChartCanvas*>(acc);
213 ToggleQuiltMode(cc);
214 }
215 void UpdateGlobalMenuItems(AbstractChartCanvas* acc) override {
216 UpdateGlobalMenuItems(dynamic_cast<ChartCanvas*>(acc));
217 }
218 void UpdateGlobalMenuItems() override;
219 void RefreshCanvasOther(AbstractChartCanvas* ccThis) override {
220 RefreshCanvasOther(dynamic_cast<ChartCanvas*>(ccThis));
221 }
222 virtual double* GetCOGTable() override { return COGTable; }
223 virtual void StartCogTimer() override {
224 FrameCOGTimer.Start(100, wxTIMER_CONTINUOUS);
225 }
226
227 wxWindow* GetPrimaryCanvasWindow() override { return GetPrimaryCanvas(); }
228 void ApplyGlobalSettings(bool bnewtoolbar) override;
229 void SetMenubarItemState(int item_id, bool state) override;
230 void ToggleColorScheme() override;
231 void ActivateMOB() override;
232 void ToggleTestPause() override;
233
234 void ToggleChartBar(AbstractChartCanvas* acc) override {
235 ToggleChartBar(dynamic_cast<ChartCanvas*>(acc));
236 }
237 void DoSettings() override;
238
239 void UpdateRotationState(double rotation) override;
240 void SetChartUpdatePeriod() override;
241 wxStatusBar* GetStatusBar() override { return wxFrame::GetStatusBar(); }
242 wxStatusBar* GetFrameStatusBar() const override { return m_pStatusBar; }
243 void SetENCDisplayCategory(AbstractChartCanvas* acc,
244 enum _DisCat nset) override {
245 SetENCDisplayCategory(dynamic_cast<ChartCanvas*>(acc), nset);
246 }
247 int GetCanvasIndexUnderMouse() override;
248
249 double GetCanvasRefScale() override {
250 return GetPrimaryCanvas()->GetVP().ref_scale;
251 ;
252 }
253
254#ifdef ocpnUSE_GL
255 void SendGlJsonConfigMsg() override {
256 if (GetPrimaryCanvas() && GetPrimaryCanvas()->GetglCanvas())
257 GetPrimaryCanvas()->GetglCanvas()->SendJSONConfigMessage();
258 }
259 bool CanAccelerateGlPanning() override {
260 return GetPrimaryCanvas()->GetglCanvas()->CanAcceleratePanning();
261 }
262 void SetupGlCompression() override {
263 GetPrimaryCanvas()->GetglCanvas()->SetupCompression();
264 }
265 wxString GetGlVersionString() override {
266 return GetPrimaryCanvas()->GetglCanvas()->GetVersionString();
267 }
268 wxGLCanvas* GetWxGlCanvas() override {
269 return GetPrimaryCanvas()->GetglCanvas();
270 }
271
272#else
273 void SendGlJsonConfigMsg() override {}
274 bool CanAccelerateGlPanning() override { return false; }
275 void SetupGlCompression() override {}
276 wxString GetGlVersionString() override { return ""; }
277 wxGLCanvas* GetWxGlCanvas() override { return nullptr; }
278#endif
279 void SwitchKBFocus(ChartCanvas* pCanvas);
280 int GetNextToolbarToolId() override {
281 return m_next_available_plugin_tool_id;
282 }
283 void SetToolbarItemBitmaps(int tool_id, wxBitmap* bitmap,
284 wxBitmap* bmpDisabled) override;
285 void SetToolbarItemSVG(int tool_id, wxString normalSVGfile,
286 wxString rolloverSVGfile,
287 wxString toggledSVGfile) override;
288 void UpdateAllFonts() override;
289 void ScheduleReconfigAndSettingsReload(bool reload, bool new_dialog) override;
290 void ScheduleReloadCharts() override;
291 void ChartsRefresh() override;
292 void FreezeCharts() override;
293 void ThawCharts() override;
294
295 void ScheduleDeleteSettingsDialog() override;
296
297 void BeforeUndoableAction(UndoType undo_type, RoutePoint* point,
298 UndoBeforePointerType pointer_type,
299 UndoItemPointer pointer) override {
300 if (!GetPrimaryCanvas()) return;
301 GetPrimaryCanvas()->undo->BeforeUndoableAction(undo_type, point,
302 pointer_type, pointer);
303 }
304
305 virtual void AfterUndoableAction(UndoItemPointer pointer) override {
306 GetPrimaryCanvas()->undo->AfterUndoableAction(pointer);
307 }
308 virtual void TouchAISActive() override;
309 virtual void UpdateAISMOBRoute(const AisTargetData* ptarget) override;
310 virtual void ActivateAISMOBRoute(const AisTargetData* ptarget) override;
311 void EnableSettingsTool(bool _enable) override {
312 if (g_MainToolbar) {
313 g_MainToolbar->EnableTool(ID_SETTINGS, _enable);
314 g_MainToolbar->GetToolbar()->SetDirty(true);
315 g_MainToolbar->RefreshToolbar();
316 }
317 }
318 void OnToolLeftClick(wxCommandEvent& event) override;
319
320 void SetENCDisplayCategory(ChartCanvas* cc, enum _DisCat nset);
321 void ToggleQuiltMode(ChartCanvas* cc);
322
323 wxFont* GetFont(wxFont* font, double scale) override;
324 wxFont* GetDefaultFont(wxString label, int Ptsize) override;
325 wxFont* GetScaledFont(int pointSize, wxFontFamily family, wxFontStyle style,
326 wxFontWeight weight, const wxString faceName,
327 double scale) override;
328
329 int GetApplicationMemoryUse(void);
330
331 void OnEraseBackground(wxEraseEvent& event);
332 void OnMaximize(wxMaximizeEvent& event);
333 void OnCloseWindow(wxCloseEvent& event);
334 void OnExit(wxCommandEvent& event);
335 void OnSize(wxSizeEvent& event);
336 void OnMove(wxMoveEvent& event);
337 void OnInitTimer(wxTimerEvent& event);
338
347 void OnFrameTimer1(wxTimerEvent& event);
348
349 void OnEvtPlugInMessage(OCPN_MsgEvent& event);
350 void OnMemFootTimer(wxTimerEvent& event);
351 void OnRecaptureTimer(wxTimerEvent& event);
352 void OnSENCEvtThread(OCPN_BUILDSENC_ThreadEvent& event);
353 void OnIconize(wxIconizeEvent& event);
354 void OnBellsFinished(wxCommandEvent& event);
355
367 void OnFrameTenHzTimer(wxTimerEvent& event);
368
369#ifdef wxHAS_POWER_EVENTS
370 void OnSuspending(wxPowerEvent& event);
371 void OnSuspended(wxPowerEvent& event);
372 void OnSuspendCancel(wxPowerEvent& event);
373 void OnResume(wxPowerEvent& event);
374#endif // wxHAS_POWER_EVENTS
375
376 void RefreshCanvasOther(ChartCanvas* ccThis);
377 void selectChartDisplay(int type, int family);
378 void applySettingsString(wxString settings);
379 void setStringVP(wxString VPS);
380 void InvalidateAllQuilts();
381
382 void SetUpMode(ChartCanvas* cc, int mode);
383
384 ChartCanvas* GetPrimaryCanvas();
385 ChartCanvas* GetFocusCanvas();
386 void DoStackUp(ChartCanvas* cc);
387 void DoStackDown(ChartCanvas* cc);
388 void NotifyChildrenResize();
389
390 void DoStackDelta(ChartCanvas* cc, int direction);
391 void DoSettingsNew(void);
392 ChartCanvas* GetCanvasUnderMouse();
393
394 void TriggerRecaptureTimer();
395
396 void MouseEvent(wxMouseEvent& event);
397 void CenterView(ChartCanvas* cc, const LLBBox& bbox);
398
399 void JumpToPosition(ChartCanvas* cc, double lat, double lon, double scale);
400
401 void BuildMenuBar(void);
402 void RegisterGlobalMenuItems();
403 void UpdateGlobalMenuItems(ChartCanvas* cc);
404 void DoOptionsDialog();
405 void ProcessOptionsDialog(int resultFlags, ArrayOfCDI* pNewDirArray);
406 void PrepareOptionsClose(options* settings, int settings_return_value);
407
408 void DoPrint(void);
409 void ToggleDataQuality(ChartCanvas* cc);
410 void TogglebFollow(ChartCanvas* cc);
411 void ToggleChartBar(ChartCanvas* cc);
412 void SetbFollow(ChartCanvas* cc);
413 void ClearbFollow(ChartCanvas* cc);
414 void ToggleChartOutlines(ChartCanvas* cc);
415 void ToggleENCText(ChartCanvas* cc);
416 void ToggleSoundings(ChartCanvas* cc);
417#if 0
418 void ToggleRocks(void);
419#endif
420 bool ToggleLights(ChartCanvas* cc);
421 void ToggleAnchor(ChartCanvas* cc);
422 void ToggleAISDisplay(ChartCanvas* cc);
423 void ToggleAISMinimizeTargets(ChartCanvas* cc);
424
425 void ToggleNavobjects(ChartCanvas* cc);
426
427 void TrackDailyRestart(void);
428 bool ShouldRestartTrack();
429 void InitializeTrackRestart();
430
431 void UpdateControlBar(ChartCanvas* cc);
432
433 void SubmergeAllCanvasToolbars(void);
434 void SurfaceAllCanvasToolbars(void);
435 void SetAllToolbarScale(void);
436
437 void RefreshGroupIndices(void);
438
439 double GetBestVPScale(ChartBase* pchart);
440
441 DataMonitor* GetDataMonitor() const { return m_data_monitor; }
442
443 void SetAndApplyColorScheme(ColorScheme cs);
444
445 void OnFrameTCTimer(wxTimerEvent& event);
446 void OnFrameCOGTimer(wxTimerEvent& event);
447
448 void HandleBasicNavMsg(std::shared_ptr<const BasicNavDataMsg> msg);
449 void HandleGPSWatchdogMsg(std::shared_ptr<const GPSWatchdogMsg> msg);
450
451 bool CheckGroup(int igroup);
452 bool SendJSON_WMM_Var_Request(double lat, double lon, wxDateTime date);
453
454 void DestroyPersistentDialogs();
455 void UpdateAISTool(void);
456 wxMenuBar* m_pMenuBar;
457 bool m_bTimeIsSet;
458
459 wxTimer InitTimer;
460 int m_iInitCount;
461 bool m_initializing;
462
463 wxTimer FrameTCTimer;
464 wxTimer FrameTimer1;
465 wxTimer FrameCOGTimer;
466 wxTimer MemFootTimer;
467 wxTimer m_resizeTimer;
468 wxTimer FrameTenHzTimer;
469
470 int m_BellsToPlay;
471 wxTimer BellsTimer;
472
473 wxGenericProgressDialog* Updateprog = nullptr;
474
475 // PlugIn support
476 void RequestNewToolbarArgEvent(wxCommandEvent& WXUNUSED(event)) {
477 return RequestNewMasterToolbar();
478 }
479
480 void UpdateGPSCompassStatusBoxes(bool b_force_new = false);
481
482 bool UpdateChartDatabaseInplace(ArrayOfCDI& DirArray, bool b_force,
483 bool b_prog,
484 const wxString& ChartListFileName);
485 void FinalizeChartDBUpdate();
486
487 bool m_bdefer_resize;
488 wxSize m_defer_size;
489 double COGTable[kMaxCogAverageSeconds];
490
491 void CreateCanvasLayout(bool b_useStoredSize = false);
492 void ReloadAllVP();
493 void SetCanvasSizes(wxSize frameSize);
494
495 ocpnToolBarSimple* CreateMasterToolbar();
496 void RequestNewMasterToolbar(bool bforcenew = true);
497 bool CheckAndAddPlugInTool();
498 bool AddDefaultPositionPlugInTools();
499
500 void UpdateCanvasConfigDescriptors();
501 void ScheduleSettingsDialog();
502 void ScheduleSettingsDialogNew();
503 static void RebuildChartDatabase();
504 void PositionIENCToolbar();
505
506 void InitAppMsgBusListener();
507 void InitApiListeners();
508 void ReleaseApiListeners();
509 void ConfigureStatusBar();
510
511private:
512 void ProcessUnitTest();
513 bool ProcessQuitFlag();
514 void ProcessDeferredTrackOn();
515 void SendFixToPlugins();
516 void ProcessAnchorWatch();
517 void ProcessLogAndBells();
518 void CalculateCOGAverage();
519 void CheckToolbarPosition();
520
521 void ODoSetSize(void);
522 void DoCOGSet(void);
523
524 void UpdateAllToolbars(ColorScheme cs);
525
526 void FilterCogSog(void);
527
528 void ApplyGlobalColorSchemetoStatusBar(void);
529
530 bool ScrubGroupArray();
531
532 void OnToolbarAnimateTimer(wxTimerEvent& event);
533 bool CollapseGlobalToolbar();
534
535 int m_StatusBarFieldCount;
536
537 wxDateTime m_MMEAeventTime;
538 unsigned long m_ulLastNMEATicktime;
539 int m_tick_idx;
540 wxDateTime m_fix_start_time;
541
542 wxString m_last_reported_chart_name;
543 wxString m_last_reported_chart_pubdate;
544
545 wxString m_lastAISiconName;
546
547 // Plugin Support
548 int m_next_available_plugin_tool_id;
549
550 double COGFilterTable[kMaxCogsogFilterSeconds];
551 double SOGFilterTable[kMaxCogsogFilterSeconds];
552
553 int m_ChartUpdatePeriod;
554 bool m_last_bGPSValid;
555 bool m_last_bVelocityValid;
556 double m_last_hdt;
557
558 wxString prev_locale;
559
567 time_t m_fixtime;
568 bool b_autofind;
569
570 wxDateTime m_target_rotate_time;
571
572 wxTimer ToolbarAnimateTimer;
573 int m_nMasterToolCountShown;
574 wxTimer m_recaptureTimer;
575
576 std::unique_ptr<LoadErrorsDlgCtrl> m_load_errors_dlg_ctrl;
577 wxString m_gshhg_chart_loc;
578
579private:
580 ObservableListener listener_basic_navdata;
581 ObservableListener listener_gps_watchdog;
582 ObsListener m_on_raise_listener;
583 ObsListener m_on_quit_listener;
584 ObsListener m_routes_update_listener;
585 ObsListener m_evt_drv_msg_listener;
586 ObsListener m_update_statusbar_listener;
587 ObsListener m_center_aistarget_listener;
588 ObsListener m_reload_charts_listener;
589 ToolbarDlgCallbacks m_toolbar_callbacks;
590
591 wxStatusBar* m_pStatusBar;
592 ConnectionsDlg* m_connections_dlg;
593 bool m_need_new_options;
594 wxArrayString pathArray;
595 double restoreScale[4];
596 unsigned int last_canvasConfig;
597 DataMonitor* m_data_monitor;
598 wxAuiDefaultDockArt* m_pauidockart;
599 RestServer& m_rest_server;
600 OpenFileFunc m_open_gpx_file;
601
602 void CenterAisTarget(const std::shared_ptr<const AisTargetData>& ais_target);
603
604 DECLARE_EVENT_TABLE()
605};
606
607#endif // _OFRAME_H
AIS target definitions.
Canvas context (right click) menu handler.
General chart base definitions.
Basic chart info storage.
Generic Chart canvas base.
Minimal ChartCAnvas interface with very little dependencies.
Minimal Chart interface, for now just an anonymous pointer.
Base class for all chart types.
Definition chartbase.h:126
ChartCanvas - Main chart display and interaction component.
Definition chcanv.h:173
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
Definition chcanv.cpp:4571
double GetPixPerMM()
Get the number of logical pixels per millimeter on the screen.
Definition chcanv.h:542
Options | Connections tab implementation, basically a UI for maintaining the list of connections.
Overall logging handler, outputs to screen and log file.
Main application frame.
Definition ocpn_frame.h:108
void OnFrameTimer1(wxTimerEvent &event)
Main application timer handler called approximately once per second.
void InitApiListeners()
Setup handling of events from the local ipc/dbus API.
void OnFrameTenHzTimer(wxTimerEvent &event)
High-frequency timer handler running at 10Hz for smooth navigation updates.
Define an action to be performed when a KeyProvider is notified.
Definition observable.h:257
Keeps listening over its lifespan, removes itself on destruction.
Definition observable.h:155
AbstractRestServer implementation and interface to underlying IO thread.
Represents a waypoint or mark within the navigation system.
Definition route_point.h:71
Represents a track, which is a series of connected track points.
Definition track.h:117
double ref_scale
The nominal scale of the "reference chart" for this view.
Definition viewport.h:221
Generic toolbar implementation in pure wxWidgets adapted from wxToolBarSimple (deprecated).
Definition toolbar.h:109
Global color handling by name.
Decoded messages send/receive support.
Options | Connections GUI tab managing connections
New NMEA Debugger successor main window.
Display utilities.
Hooks into gui available in model.
General purpose GUI support.
GUI constant definitions.
A common variable shared between producer and consumer which supports Listen() and Notify().
MyFrame * gFrame
Global instance.
PlugIn Object Definition/API.
Navigation data types.
Options dialog.
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
REST API server.
S57 Chart Object.
ocpnFloatingToolbarDialog * g_MainToolbar
Global instance.
Definition toolbar.cpp:66
OpenCPN Toolbar.
Abstract gFrame/MyFrame interface.
Recorded track abstraction.
Undo features argument definitions.