OpenCPN Partial API docs
nav_object_database.h
1 /******************************************************************************
2  *
3  * Project: OpenCPN
4  *
5  ***************************************************************************
6  * Copyright (C) 2010 by David S. Register *
7  * *
8  * This program is free software; you can redistribute it and/or modify *
9  * it under the terms of the GNU General Public License as published by *
10  * the Free Software Foundation; either version 2 of the License, or *
11  * (at your option) any later version. *
12  * *
13  * This program is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16  * GNU General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU General Public License *
19  * along with this program; if not, write to the *
20  * Free Software Foundation, Inc., *
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
22  ***************************************************************************
23  */
24 
25 #ifndef _NAVOBJECTCOLLECTION_H__
26 #define _NAVOBJECTCOLLECTION_H__
27 
28 #include <memory>
29 #include <vector>
30 
31 #include <wx/checkbox.h>
32 #include <wx/string.h>
33 
34 #include "pugixml.hpp"
35 #include "bbox.h"
36 #include "observable_evtvar.h"
37 
38 class Track;
39 class TrackPoint;
40 class RouteList;
41 class RoutePointList;
42 class Route;
43 class RoutePoint;
44 
45 // Bitfield definition controlling the GPX nodes output for point objects
46 #define OUT_TYPE 1 << 1 // Output point type
47 #define OUT_TIME 1 << 2 // Output time as ISO string
48 #define OUT_NAME 1 << 3 // Output point name if defined
49 #define OUT_NAME_FORCE 1 << 4 // Output point name, even if empty
50 #define OUT_DESC 1 << 5 // Output description if defined
51 #define OUT_DESC_FORCE 1 << 6 // Output description, even if empty
52 #define OUT_SYM_FORCE 1 << 7 // Output symbol name, using "empty" if undefined
53 #define OUT_GUID 1 << 8 // Output GUID if defined
54 #define OUT_VIZ 1 << 9 // Output point viz, if non-zero(true)
55 #define OUT_VIZ_NAME 1 << 10 // Output point name viz, if non-zero(true)
56 #define OUT_SHARED 1 << 11 // Output point shared state, if non-zero(true)
57 #define OUT_AUTO_NAME \
58  1 << 12 // Output point auto_name state, if non-zero(true)
59 #define OUT_HYPERLINKS 1 << 13 // Output point Hyperlinks, if present
60 #define OUT_ACTION_ADD 1 << 14 // opencpn:action node support
61 #define OUT_ACTION_DEL 1 << 15
62 #define OUT_ACTION_UPD 1 << 16
63 #define OUT_EXTENSION 1 << 17
64 #define OUT_ARRIVAL_RADIUS 1 << 18
65 #define OUT_WAYPOINT_RANGE_RINGS 1 << 19
66 #define OUT_WAYPOINT_SCALE 1 << 20
67 #define OUT_TIDE_STATION 1 << 21
68 #define OUT_RTE_PROPERTIES 1 << 22
69 
70 #define OPT_TRACKPT OUT_TIME
71 #define OPT_WPT \
72  (OUT_TYPE) + (OUT_TIME) + (OUT_NAME) + (OUT_DESC) + (OUT_SYM_FORCE) + \
73  (OUT_GUID) + (OUT_VIZ) + (OUT_VIZ_NAME) + (OUT_SHARED) + \
74  (OUT_AUTO_NAME) + (OUT_HYPERLINKS) + (OUT_ARRIVAL_RADIUS) + \
75  (OUT_WAYPOINT_RANGE_RINGS) + (OUT_WAYPOINT_SCALE) + (OUT_TIDE_STATION)
76 #define OPT_ROUTEPT OPT_WPT + (OUT_RTE_PROPERTIES)
77 
78 // Bitfield definitions controlling the GPX nodes output for Route.Track
79 // objects
80 #define RT_OUT_ACTION_ADD 1 << 1 // opencpn:action node support
81 #define RT_OUT_ACTION_DEL 1 << 2
82 #define RT_OUT_ACTION_UPD 1 << 3
83 #define RT_OUT_NO_RTPTS 1 << 4
84 
85 class NavObjectCollection1; // forward
86 
87 bool WptIsInRouteList(RoutePoint *pr);
88 RoutePoint *WaypointExists(const wxString &name, double lat, double lon);
89 RoutePoint *WaypointExists(const wxString &guid);
90 Route *RouteExists(const wxString &guid);
91 Route *RouteExists(Route *pTentRoute);
92 Track *TrackExists(const wxString &guid);
93 
94 Route *FindRouteContainingWaypoint(RoutePoint *pWP);
95 
96 Route *GPXLoadRoute1(pugi::xml_node &wpt_node, bool b_fullviz, bool b_layer,
97  bool b_layerviz, int layer_id, bool b_change, bool load_points = true);
98 
99 RoutePoint *GPXLoadWaypoint1(pugi::xml_node &wpt_node, wxString symbol_name,
100  wxString GUID, bool b_fullviz, bool b_layer,
101  bool b_layerviz, int layer_id);
102 
103 
104 bool InsertRouteA(Route* pTentRoute, NavObjectCollection1* navobj);
105 bool InsertTrack(Track* pTentTrack, bool bApplyChanges = false);
106 bool InsertWpt(RoutePoint* pWp, bool overwrite);
107 
108 
109 Track *GPXLoadTrack1(pugi::xml_node &trk_node, bool b_fullviz,
110  bool b_layer, bool b_layerviz, int layer_id);
111 
112 class NavObjectCollection1 : public pugi::xml_document {
113 public:
115  virtual ~NavObjectCollection1();
116 
117  bool CreateNavObjGPXPoints(void);
118  bool CreateNavObjGPXRoutes(void);
119  bool CreateNavObjGPXTracks(void);
120 
121  void AddGPXRoutesList(RouteList *pRoutes);
122  void AddGPXTracksList(std::vector<Track*> *pTracks);
123  bool AddGPXPointsList(RoutePointList *pRoutePoints);
124  bool AddGPXRoute(Route *pRoute);
125  bool AddGPXTrack(Track *pTrk);
126  bool AddGPXWaypoint(RoutePoint *pWP);
127 
128  bool CreateAllGPXObjects();
129  bool LoadAllGPXObjects(bool b_full_viz, int &wpt_duplicates,
130  bool b_compute_bbox = false);
131  int LoadAllGPXObjectsAsLayer(int layer_id, bool b_layerviz,
132  wxCheckBoxState b_namesviz);
133 
134  bool SaveFile(const wxString filename);
135 
136  void SetRootGPXNode(void);
137  bool IsOpenCPN();
138  LLBBox &GetBBox() { return BBox; };
139 
140  LLBBox BBox;
141  bool m_bSkipChangeSetUpdate;
142 };
143 
145 friend class MyConfig;
146 
147 public:
148  static std::unique_ptr<NavObjectChanges> getTempInstance() {
149  return std::unique_ptr<NavObjectChanges>(new NavObjectChanges());
150  }
151 
152  static NavObjectChanges* getInstance() {
153  static NavObjectChanges* instance = 0;
154  if (!instance) instance = new NavObjectChanges();
155  return instance;
156  }
157 
158  void Init(const wxString& path) {
159  m_filename = path;
160  m_changes_file = fopen(m_filename.mb_str(), "a");
161  }
162 
163  NavObjectChanges(const NavObjectChanges&) = delete;
164  void operator=(const NavObjectChanges&) = delete;
165  ~NavObjectChanges();
166 
167  void AddRoute(Route *pr, const char *action); // support "changes" file set
168  void AddTrack(Track *pr, const char *action);
169  void AddWP(RoutePoint *pr, const char *action);
170  void AddTrackPoint(TrackPoint *pWP, const char *action,
171  const wxString &parent_GUID);
172 
173  virtual void AddNewRoute(Route *pr);
174  virtual void UpdateRoute(Route *pr);
175  virtual void DeleteConfigRoute(Route *pr);
176 
177  virtual void AddNewTrack(Track *pt);
178  virtual void UpdateTrack(Track *pt);
179  virtual void DeleteConfigTrack(Track *pt);
180 
181  virtual void AddNewWayPoint(RoutePoint *pWP, int ConfigRouteNum = -1);
182  virtual void UpdateWayPoint(RoutePoint *pWP);
183  virtual void DeleteWayPoint(RoutePoint *pWP);
184  virtual void AddNewTrackPoint(TrackPoint *pWP, const wxString &parent_GUID);
185 
186  bool ApplyChanges(void);
187  bool IsDirty() { return m_bdirty; }
188 
199 
200 
201 private:
203  m_changes_file = 0;
204  m_bdirty = false;
205  }
206  NavObjectChanges(wxString file_name);
207 
208  wxString m_filename;
209  FILE *m_changes_file;
210  bool m_bdirty;
211 };
212 
213 #endif // _NAVOBJECTCOLLECTION_H__
Generic event handling between MVC Model and Controller based on a shared EventVar variable.
EventVar evt_delete_track
Notified when Routeman (?) should delete a track.
EventVar evt_delete_route
Notified when Routeman (?) should delete a Route*.
Definition: route.h:75
Definition: track.h:78