Warn about 2 digit years being assumed to be 19xx
[survex.git] / src / mainfrm.h
blob9dafec39e35f29f127fd417296f2232afd5f7fb0
1 //
2 // mainfrm.h
3 //
4 // Main frame handling for Aven.
5 //
6 // Copyright (C) 2000-2003,2005 Mark R. Shinwell
7 // Copyright (C) 2001-2003,2004,2005,2006,2010,2011,2012,2013,2014,2015,2016 Olly Betts
8 //
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #ifndef mainfrm_h
25 #define mainfrm_h
27 #include "wx.h"
28 #include <wx/docview.h> // for m_FileHistory
29 #include <wx/listctrl.h>
30 #include <wx/notebook.h>
31 #include <wx/print.h>
32 #include <wx/printdlg.h>
34 #include "aventreectrl.h"
35 #include "gfxcore.h"
36 #include "guicontrol.h"
37 #include "img_hosted.h"
38 #include "labelinfo.h"
39 #include "message.h"
40 #include "vector3.h"
41 #include "aven.h"
42 //#include "prefsdlg.h"
44 #include <list>
45 #include <vector>
47 using namespace std;
49 #include <math.h>
50 #include <time.h>
52 #ifdef __WXMAC__
53 // Currently on OS X, we force use of a generic toolbar, which needs to be put
54 // in a sizer.
55 # define USING_GENERIC_TOOLBAR
56 #endif
58 #define MARK_FIRST 1
59 #define MARK_NEXT 2
60 #define MARK_PREV 3
62 enum {
63 menu_FILE_LOG = 1000,
64 menu_FILE_OPEN_TERRAIN,
65 menu_FILE_PAGE_SETUP,
66 menu_FILE_SCREENSHOT,
67 menu_FILE_EXPORT,
68 menu_FILE_EXTEND,
69 menu_PRES_NEW,
70 menu_PRES_OPEN,
71 menu_PRES_SAVE,
72 menu_PRES_SAVE_AS,
73 menu_PRES_MARK,
74 menu_PRES_EXPORT_MOVIE,
75 menu_PRES_FREWIND,
76 menu_PRES_REWIND,
77 menu_PRES_REVERSE,
78 menu_PRES_PLAY,
79 menu_PRES_FF,
80 menu_PRES_FFF,
81 menu_PRES_PAUSE,
82 menu_ROTATION_START,
83 menu_ROTATION_STOP,
84 menu_ROTATION_TOGGLE,
85 menu_ROTATION_REVERSE,
86 menu_ORIENT_MOVE_NORTH,
87 menu_ORIENT_MOVE_EAST,
88 menu_ORIENT_MOVE_SOUTH,
89 menu_ORIENT_MOVE_WEST,
90 menu_ORIENT_PLAN,
91 menu_ORIENT_ELEVATION,
92 menu_ORIENT_DEFAULTS,
93 menu_VIEW_SHOW_LEGS,
94 menu_VIEW_SPLAYS,
95 menu_SPLAYS_HIDE,
96 menu_SPLAYS_SHOW_DASHED,
97 menu_SPLAYS_SHOW_FADED,
98 menu_SPLAYS_SHOW_NORMAL,
99 menu_VIEW_DUPES,
100 menu_DUPES_HIDE,
101 menu_DUPES_SHOW_DASHED,
102 menu_DUPES_SHOW_FADED,
103 menu_DUPES_SHOW_NORMAL,
104 menu_VIEW_SHOW_CROSSES,
105 menu_VIEW_SHOW_NAMES,
106 menu_VIEW_SHOW_SURFACE,
107 menu_VIEW_SHOW_OVERLAPPING_NAMES,
108 menu_VIEW_SHOW_ENTRANCES,
109 menu_VIEW_SHOW_FIXED_PTS,
110 menu_VIEW_SHOW_EXPORTED_PTS,
111 menu_VIEW_STATUS_BAR,
112 menu_VIEW_GRID,
113 menu_VIEW_BOUNDING_BOX,
114 menu_VIEW_TERRAIN,
115 menu_VIEW_SHOW_TUBES,
116 menu_VIEW_PERSPECTIVE,
117 menu_VIEW_SMOOTH_SHADING,
118 menu_VIEW_TEXTURED,
119 menu_VIEW_FOG,
120 menu_VIEW_SMOOTH_LINES,
121 menu_VIEW_FULLSCREEN,
122 menu_VIEW_COLOUR_BY,
123 menu_COLOUR_BY_DEPTH,
124 menu_COLOUR_BY_DATE,
125 menu_COLOUR_BY_ERROR,
126 menu_COLOUR_BY_GRADIENT,
127 menu_COLOUR_BY_LENGTH,
128 menu_IND_COMPASS,
129 menu_IND_CLINO,
130 menu_IND_COLOUR_KEY,
131 menu_IND_SCALE_BAR,
132 menu_CTL_INDICATORS,
133 menu_CTL_SIDE_PANEL,
134 menu_CTL_METRIC,
135 menu_CTL_DEGREES,
136 menu_CTL_PERCENT,
137 menu_CTL_REVERSE,
138 menu_CTL_CANCEL_DIST_LINE,
139 menu_SURVEY_RESTRICT,
140 menu_SURVEY_SHOW_ALL,
141 textctrl_FIND,
142 button_HIDE,
143 listctrl_PRES
146 class PointInfo : public Point {
147 int date;
149 public:
150 PointInfo() : Point(), date(-1) { }
151 explicit PointInfo(const img_point & pt) : Point(pt), date(-1) { }
152 PointInfo(const img_point & pt, int date_) : Point(pt), date(date_) { }
153 PointInfo(const Point & p, int date_) : Point(p), date(date_) { }
154 int GetDate() const { return date; }
157 class XSect : public PointInfo {
158 friend class MainFrm;
159 Double l, r, u, d;
160 Double right_bearing;
162 public:
163 XSect() : PointInfo(), l(0), r(0), u(0), d(0), right_bearing(0) { }
164 XSect(const Point &p, int date_,
165 Double l_, Double r_, Double u_, Double d_)
166 : PointInfo(p, date_), l(l_), r(r_), u(u_), d(d_), right_bearing(0) { }
167 Double GetL() const { return l; }
168 Double GetR() const { return r; }
169 Double GetU() const { return u; }
170 Double GetD() const { return d; }
171 Double get_right_bearing() const { return right_bearing; }
172 void set_right_bearing(Double right_bearing_) {
173 right_bearing = right_bearing_;
177 class AvenPresList;
179 class traverse : public vector<PointInfo> {
180 public:
181 int n_legs;
182 // Bitmask of img_FLAG_SURFACE, img_FLAG_SPLAY and img_FLAG_DUPLICATE.
183 int flags;
184 double length;
185 double E, H, V;
187 traverse()
188 : n_legs(0), flags(0),
189 length(0), E(-1), H(-1), V(-1) { }
192 class MainFrm : public wxFrame {
193 wxFileHistory m_history;
194 int m_SashPosition;
195 bool was_showing_sidepanel_before_fullscreen;
196 list<traverse> traverses[8];
197 list<vector<XSect> > tubes;
198 list<LabelInfo*> m_Labels;
199 Vector3 m_Ext;
200 Double m_DepthMin, m_DepthExt;
201 int m_DateMin, m_DateExt;
202 bool complete_dateinfo;
203 GfxCore* m_Gfx;
204 wxWindow* m_Log;
205 GUIControl* m_Control;
206 int m_NumEntrances;
207 int m_NumFixedPts;
208 int m_NumExportedPts;
209 int m_NumHighlighted;
210 bool m_HasUndergroundLegs;
211 bool m_HasSplays;
212 bool m_HasDupes;
213 bool m_HasSurfaceLegs;
214 bool m_HasErrorInformation;
215 wxSplitterWindow* m_Splitter;
216 AvenTreeCtrl* m_Tree;
217 wxTextCtrl* m_FindBox;
218 // wxCheckBox* m_RegexpCheckBox;
219 wxNotebook* m_Notebook;
220 AvenPresList* m_PresList;
221 wxString m_File;
222 // Processed version of data - same as m_File if m_File is processed data.
223 wxString m_FileProcessed;
224 wxString m_Survey;
225 public: // FIXME for m_cs_proj
226 wxString m_Title, m_cs_proj, m_DateStamp;
227 private:
228 time_t m_DateStamp_numeric;
229 wxChar separator; // character separating survey levels (often '.')
230 Vector3 m_Offsets;
232 // Strings for status bar reporting of distances.
233 wxString here_text, coords_text, dist_text, distfree_text;
235 bool m_IsExtendedElevation;
236 bool pending_find;
238 bool fullscreen_showing_menus;
240 #ifdef PREFDLG
241 PrefsDlg* m_PrefsDlg;
242 #endif
244 void FillTree(const wxString & root_name);
245 bool ProcessSVXFile(const wxString & file);
246 // void FixLRUD(traverse & centreline);
247 void CentreDataset(const Vector3 & vmin);
249 void CreateMenuBar();
250 void MakeToolBar();
251 void CreateSidePanel();
253 void UpdateStatusBar();
255 #ifdef USING_GENERIC_TOOLBAR
256 wxToolBar * GetToolBar() const {
257 wxSizer * sizer = GetSizer();
258 if (!sizer) return NULL;
259 return (wxToolBar*)sizer->GetItem(size_t(0))->GetWindow();
261 #endif
263 public:
264 MainFrm(const wxString& title, const wxPoint& pos, const wxSize& size);
266 // public for CavernLog.
267 bool LoadData(const wxString& file, const wxString& prefix);
268 void AddToFileHistory(const wxString & file);
270 void InitialiseAfterLoad(const wxString & file, const wxString & prefix);
271 void OnShowLog(wxCommandEvent& event);
273 void OnMRUFile(wxCommandEvent& event);
274 void OpenFile(const wxString& file, const wxString& survey = wxString());
276 void OnPresNewUpdate(wxUpdateUIEvent& event);
277 void OnPresOpenUpdate(wxUpdateUIEvent& event);
278 void OnPresSaveUpdate(wxUpdateUIEvent& event);
279 void OnPresSaveAsUpdate(wxUpdateUIEvent& event);
280 void OnPresMarkUpdate(wxUpdateUIEvent& event);
281 void OnPresFRewindUpdate(wxUpdateUIEvent& event);
282 void OnPresRewindUpdate(wxUpdateUIEvent& event);
283 void OnPresReverseUpdate(wxUpdateUIEvent& event);
284 void OnPresPlayUpdate(wxUpdateUIEvent& event);
285 void OnPresFFUpdate(wxUpdateUIEvent& event);
286 void OnPresFFFUpdate(wxUpdateUIEvent& event);
287 void OnPresPauseUpdate(wxUpdateUIEvent& event);
288 void OnPresStopUpdate(wxUpdateUIEvent& event);
289 void OnPresExportMovieUpdate(wxUpdateUIEvent& event);
290 void OnOpenTerrainUpdate(wxUpdateUIEvent& event);
292 void DoFind();
293 void OnFind(wxCommandEvent& event);
294 void OnIdle(wxIdleEvent& event);
295 void OnGotoFound(wxCommandEvent& event);
296 void OnHide(wxCommandEvent& event);
297 void OnHideUpdate(wxUpdateUIEvent& ui);
299 void OnOpen(wxCommandEvent& event);
300 void OnOpenTerrain(wxCommandEvent&);
301 void HideLog(wxWindow * log_window);
302 void OnScreenshot(wxCommandEvent& event);
303 void OnScreenshotUpdate(wxUpdateUIEvent& event);
304 void OnFilePreferences(wxCommandEvent& event);
305 void OnPrint(wxCommandEvent& event);
306 void PrintAndExit();
307 void OnPageSetup(wxCommandEvent& event);
308 void OnPresNew(wxCommandEvent& event);
309 void OnPresOpen(wxCommandEvent& event);
310 void OnPresSave(wxCommandEvent& event);
311 void OnPresSaveAs(wxCommandEvent& event);
312 void OnPresMark(wxCommandEvent& event);
313 void OnPresFRewind(wxCommandEvent& event);
314 void OnPresRewind(wxCommandEvent& event);
315 void OnPresReverse(wxCommandEvent& event);
316 void OnPresPlay(wxCommandEvent& event);
317 void OnPresFF(wxCommandEvent& event);
318 void OnPresFFF(wxCommandEvent& event);
319 void OnPresPause(wxCommandEvent& event);
320 void OnPresStop(wxCommandEvent& event);
321 void OnPresExportMovie(wxCommandEvent& event);
322 void OnExport(wxCommandEvent& event);
323 void OnExtend(wxCommandEvent& event);
324 void OnQuit(wxCommandEvent& event);
326 void OnAbout(wxCommandEvent& event);
327 void OnClose(wxCloseEvent&);
329 void OnSetFocus(wxFocusEvent &) { if (m_Gfx) m_Gfx->SetFocus(); }
331 void OnKeyPress(wxKeyEvent &e) {
332 if (m_Gfx) {
333 m_Gfx->SetFocus();
334 m_Gfx->OnKeyPress(e);
338 void OnShowLogUpdate(wxUpdateUIEvent &ui) {
339 ui.Enable(m_Log != NULL || (m_Splitter->GetWindow1() != m_Gfx && m_Splitter->GetWindow2() != m_Gfx));
340 ui.Check(m_Log == NULL);
342 void OnPrintUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_File.empty()); }
343 void OnExportUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_File.empty()); }
344 void OnExtendUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_IsExtendedElevation); }
346 // temporary bodges until event handling problem is sorted out:
347 void OnDefaultsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDefaultsUpdate(event); }
348 void OnPlanUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnPlanUpdate(event); }
349 void OnElevationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnElevationUpdate(event); }
350 void OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDisplayOverlappingNamesUpdate(event); }
351 void OnColourByUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByUpdate(event); }
352 void OnColourByDepthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByDepthUpdate(event); }
353 void OnColourByDateUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByDateUpdate(event); }
354 void OnColourByErrorUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByErrorUpdate(event); }
355 void OnColourByGradientUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByGradientUpdate(event); }
356 void OnColourByLengthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByLengthUpdate(event); }
357 void OnShowCrossesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowCrossesUpdate(event); }
358 void OnShowEntrancesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowEntrancesUpdate(event); }
359 void OnShowFixedPtsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowFixedPtsUpdate(event); }
360 void OnShowExportedPtsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowExportedPtsUpdate(event); }
361 void OnShowStationNamesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowStationNamesUpdate(event); }
362 void OnShowSurveyLegsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSurveyLegsUpdate(event); }
363 void OnSplaysUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnSplaysUpdate(event); }
364 void OnHideSplaysUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnHideSplaysUpdate(event); }
365 void OnShowSplaysDashedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysDashedUpdate(event); }
366 void OnShowSplaysFadedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysFadedUpdate(event); }
367 void OnShowSplaysNormalUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysNormalUpdate(event); }
368 void OnDupesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDupesUpdate(event); }
369 void OnHideDupesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnHideDupesUpdate(event); }
370 void OnShowDupesDashedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowDupesDashedUpdate(event); }
371 void OnShowDupesFadedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowDupesFadedUpdate(event); }
372 void OnShowDupesNormalUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowDupesNormalUpdate(event); }
373 void OnShowSurfaceUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSurfaceUpdate(event); }
374 void OnMoveEastUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveEastUpdate(event); }
375 void OnMoveNorthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveNorthUpdate(event); }
376 void OnMoveSouthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveSouthUpdate(event); }
377 void OnMoveWestUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveWestUpdate(event); }
378 void OnToggleRotationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleRotationUpdate(event); }
379 void OnReverseControlsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnReverseControlsUpdate(event); }
380 void OnToggleScalebarUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleScalebarUpdate(event); }
381 void OnToggleColourKeyUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleColourKeyUpdate(event); }
382 void OnViewCompassUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewCompassUpdate(event); }
383 void OnViewGridUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewGridUpdate(event); }
384 void OnViewBoundingBoxUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewBoundingBoxUpdate(event); }
385 void OnViewTerrainUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewTerrainUpdate(event); }
386 void OnViewClinoUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewClinoUpdate(event); }
387 void OnViewPerspectiveUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewPerspectiveUpdate(event); }
388 void OnViewSmoothShadingUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewSmoothShadingUpdate(event); }
389 void OnViewTexturedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewTexturedUpdate(event); }
390 void OnViewFogUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewFogUpdate(event); }
391 void OnViewSmoothLinesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewSmoothLinesUpdate(event); }
392 void OnViewFullScreenUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewFullScreenUpdate(event); }
393 void OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnReverseDirectionOfRotationUpdate(event); }
394 void OnCancelDistLineUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnCancelDistLineUpdate(event); }
395 void OnIndicatorsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnIndicatorsUpdate(event); }
397 void OnDefaults(wxCommandEvent&) { if (m_Control) m_Control->OnDefaults(); }
398 void OnPlan(wxCommandEvent&) { if (m_Control) m_Control->OnPlan(); }
399 void OnElevation(wxCommandEvent&) { if (m_Control) m_Control->OnElevation(); }
400 void OnDisplayOverlappingNames(wxCommandEvent&) { if (m_Control) m_Control->OnDisplayOverlappingNames(); }
401 void OnColourByDepth(wxCommandEvent&) { if (m_Control) m_Control->OnColourByDepth(); }
402 void OnColourByDate(wxCommandEvent&) { if (m_Control) m_Control->OnColourByDate(); }
403 void OnColourByError(wxCommandEvent&) { if (m_Control) m_Control->OnColourByError(); }
404 void OnColourByGradient(wxCommandEvent&) { if (m_Control) m_Control->OnColourByGradient(); }
405 void OnColourByLength(wxCommandEvent&) { if (m_Control) m_Control->OnColourByLength(); }
406 void OnShowCrosses(wxCommandEvent&) { if (m_Control) m_Control->OnShowCrosses(); }
407 void OnShowEntrances(wxCommandEvent&) { if (m_Control) m_Control->OnShowEntrances(); }
408 void OnShowFixedPts(wxCommandEvent&) { if (m_Control) m_Control->OnShowFixedPts(); }
409 void OnShowExportedPts(wxCommandEvent&) { if (m_Control) m_Control->OnShowExportedPts(); }
410 void OnShowStationNames(wxCommandEvent&) { if (m_Control) m_Control->OnShowStationNames(); }
411 void OnShowSurveyLegs(wxCommandEvent&) { if (m_Control) m_Control->OnShowSurveyLegs(); }
412 void OnHideSplays(wxCommandEvent&) { if (m_Control) m_Control->OnHideSplays(); }
413 void OnShowSplaysDashed(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysDashed(); }
414 void OnShowSplaysFaded(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysFaded(); }
415 void OnShowSplaysNormal(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysNormal(); }
416 void OnHideDupes(wxCommandEvent&) { if (m_Control) m_Control->OnHideDupes(); }
417 void OnShowDupesDashed(wxCommandEvent&) { if (m_Control) m_Control->OnShowDupesDashed(); }
418 void OnShowDupesFaded(wxCommandEvent&) { if (m_Control) m_Control->OnShowDupesFaded(); }
419 void OnShowDupesNormal(wxCommandEvent&) { if (m_Control) m_Control->OnShowDupesNormal(); }
420 void OnShowSurface(wxCommandEvent&) { if (m_Control) m_Control->OnShowSurface(); }
421 void OnMoveEast(wxCommandEvent&) { if (m_Control) m_Control->OnMoveEast(); }
422 void OnMoveNorth(wxCommandEvent&) { if (m_Control) m_Control->OnMoveNorth(); }
423 void OnMoveSouth(wxCommandEvent&) { if (m_Control) m_Control->OnMoveSouth(); }
424 void OnMoveWest(wxCommandEvent&) { if (m_Control) m_Control->OnMoveWest(); }
425 void OnToggleRotation(wxCommandEvent&) { if (m_Control) m_Control->OnToggleRotation(); }
426 void OnReverseControls(wxCommandEvent&) { if (m_Control) m_Control->OnReverseControls(); }
427 void OnToggleScalebar(wxCommandEvent&) { if (m_Control) m_Control->OnToggleScalebar(); }
428 void OnToggleColourKey(wxCommandEvent&) { if (m_Control) m_Control->OnToggleColourKey(); }
429 void OnViewCompass(wxCommandEvent&) { if (m_Control) m_Control->OnViewCompass(); }
430 void OnViewClino(wxCommandEvent&) { if (m_Control) m_Control->OnViewClino(); }
431 void OnViewGrid(wxCommandEvent&) { if (m_Control) m_Control->OnViewGrid(); }
432 void OnViewBoundingBox(wxCommandEvent&) { if (m_Control) m_Control->OnViewBoundingBox(); }
433 void OnViewTerrain(wxCommandEvent&) { if (m_Control) m_Control->OnViewTerrain(); }
434 void OnViewPerspective(wxCommandEvent&) { if (m_Control) m_Control->OnViewPerspective(); }
435 void OnViewSmoothShading(wxCommandEvent&) { if (m_Control) m_Control->OnViewSmoothShading(); }
436 void OnViewTextured(wxCommandEvent&) { if (m_Control) m_Control->OnViewTextured(); }
437 void OnViewFog(wxCommandEvent&) { if (m_Control) m_Control->OnViewFog(); }
438 void OnViewSmoothLines(wxCommandEvent&) { if (m_Control) m_Control->OnViewSmoothLines(); }
439 void OnViewFullScreen(wxCommandEvent&) { ViewFullScreen(); }
440 void ViewFullScreen();
441 bool FullScreenModeShowingMenus() const;
442 void FullScreenModeShowMenus(bool show);
443 void OnReverseDirectionOfRotation(wxCommandEvent&) { if (m_Control) m_Control->OnReverseDirectionOfRotation(); }
444 void OnCancelDistLine(wxCommandEvent&) { if (m_Control) m_Control->OnCancelDistLine(); }
446 void OnToggleMetric(wxCommandEvent&) { if (m_Control) m_Control->OnToggleMetric(); }
447 void OnToggleDegrees(wxCommandEvent&) { if (m_Control) m_Control->OnToggleDegrees(); }
448 void OnTogglePercent(wxCommandEvent&) { if (m_Control) m_Control->OnTogglePercent(); }
449 void OnToggleTubes(wxCommandEvent&) { if (m_Control) m_Control->OnToggleTubes(); }
451 void OnToggleMetricUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleMetricUpdate(event); }
452 void OnToggleDegreesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleDegreesUpdate(event); }
453 void OnTogglePercentUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnTogglePercentUpdate(event); }
454 void OnToggleTubesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleTubesUpdate(event); }
456 // end of horrible bodges
458 void OnViewSidePanelUpdate(wxUpdateUIEvent& event);
459 void OnViewSidePanel(wxCommandEvent& event);
460 void ToggleSidePanel();
461 bool ShowingSidePanel();
463 const Vector3 & GetExtent() const { return m_Ext; }
464 Double GetXExtent() const { return m_Ext.GetX(); }
465 Double GetYExtent() const { return m_Ext.GetY(); }
466 Double GetZExtent() const { return m_Ext.GetZ(); }
468 Double GetDepthExtent() const { return m_DepthExt; }
469 Double GetDepthMin() const { return m_DepthMin; }
471 bool HasCompleteDateInfo() const { return complete_dateinfo; }
472 int GetDateExtent() const { return m_DateExt; }
473 int GetDateMin() const { return m_DateMin; }
475 void SelectTreeItem(const LabelInfo* label) {
476 if (label->tree_id.IsOk())
477 m_Tree->SelectItem(label->tree_id);
478 else
479 m_Tree->UnselectAll();
482 void ClearTreeSelection();
484 int GetNumFixedPts() const { return m_NumFixedPts; }
485 int GetNumExportedPts() const { return m_NumExportedPts; }
486 int GetNumEntrances() const { return m_NumEntrances; }
487 int GetNumHighlightedPts() const { return m_NumHighlighted; }
489 bool HasUndergroundLegs() const { return m_HasUndergroundLegs; }
490 bool HasSplays() const { return m_HasSplays; }
491 bool HasDupes() const { return m_HasDupes; }
492 bool HasSurfaceLegs() const { return m_HasSurfaceLegs; }
493 bool HasTubes() const { return !tubes.empty(); }
494 bool HasErrorInformation() const { return m_HasErrorInformation; }
496 bool IsExtendedElevation() const { return m_IsExtendedElevation; }
498 void ClearCoords();
499 void SetCoords(const Vector3 &v);
500 const LabelInfo * GetTreeSelection() const;
501 void SetCoords(Double x, Double y, const LabelInfo * there);
502 void SetAltitude(Double z, const LabelInfo * there);
504 const Vector3 & GetOffset() const { return m_Offsets; }
506 wxChar GetSeparator() const { return separator; }
508 list<traverse>::const_iterator traverses_begin(unsigned flags) const {
509 if (flags >= sizeof(traverses)) return traverses[0].end();
510 return traverses[flags].begin();
513 list<traverse>::const_iterator traverses_end(unsigned flags) const {
514 if (flags >= sizeof(traverses)) flags = 0;
515 return traverses[flags].end();
518 list<vector<XSect> >::const_iterator tubes_begin() const {
519 return tubes.begin();
522 list<vector<XSect> >::const_iterator tubes_end() const {
523 return tubes.end();
526 list<vector<XSect> >::iterator tubes_begin() {
527 return tubes.begin();
530 list<vector<XSect> >::iterator tubes_end() {
531 return tubes.end();
534 list<LabelInfo*>::const_iterator GetLabels() const {
535 return m_Labels.begin();
538 list<LabelInfo*>::const_iterator GetLabelsEnd() const {
539 return m_Labels.end();
542 list<LabelInfo*>::const_reverse_iterator GetRevLabels() const {
543 return m_Labels.rbegin();
546 list<LabelInfo*>::const_reverse_iterator GetRevLabelsEnd() const {
547 return m_Labels.rend();
550 list<LabelInfo*>::iterator GetLabelsNC() {
551 return m_Labels.begin();
554 list<LabelInfo*>::iterator GetLabelsNCEnd() {
555 return m_Labels.end();
558 void ShowInfo(const LabelInfo *here = NULL, const LabelInfo *there = NULL);
559 void DisplayTreeInfo(const wxTreeItemData* data = NULL);
560 void TreeItemSelected(const wxTreeItemData* data, bool zoom);
561 PresentationMark GetPresMark(int which);
562 bool Animating() const { return m_Gfx && m_Gfx->Animating(); }
564 // Restrict to subsurvey `survey` (or show all if `survey` empty).
565 void RestrictTo(const wxString & survey);
567 wxString GetSurvey() const { return m_Survey; }
569 private:
570 DECLARE_EVENT_TABLE()
573 // Older wxGTK loses pop-up dialogs under the always-on-top, maximised window.
574 // Not sure when this got fixed, but wx 2.8.10 definitely works properly on
575 // Debian squeeze.
577 // To work around this issue, create this object on the stack, and it will
578 // temporarily un-fullscreen the window while the dialog as a workaround.
579 class AvenAllowOnTop {
580 #if defined __WXGTK__ && !wxCHECK_VERSION(2,8,10)
581 MainFrm * mainfrm;
582 public:
583 explicit AvenAllowOnTop(MainFrm * mainfrm_) {
584 if (mainfrm_ && mainfrm_->IsFullScreen()) {
585 mainfrm = mainfrm_;
586 mainfrm->ViewFullScreen();
587 } else {
588 mainfrm = 0;
591 ~AvenAllowOnTop() {
592 if (mainfrm) mainfrm->ViewFullScreen();
594 #else
595 public:
596 AvenAllowOnTop(MainFrm *) { }
597 #endif
600 #endif