Tweak code formatting
[survex.git] / src / mainfrm.h
blob1eece14c35de628b8c170b9dbf898f561b6d71a9
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_FADED,
97 menu_SPLAYS_SHOW_NORMAL,
98 menu_VIEW_SHOW_CROSSES,
99 menu_VIEW_SHOW_NAMES,
100 menu_VIEW_SHOW_SURFACE,
101 menu_VIEW_SHOW_OVERLAPPING_NAMES,
102 menu_VIEW_SHOW_ENTRANCES,
103 menu_VIEW_SHOW_FIXED_PTS,
104 menu_VIEW_SHOW_EXPORTED_PTS,
105 menu_VIEW_STATUS_BAR,
106 menu_VIEW_GRID,
107 menu_VIEW_BOUNDING_BOX,
108 menu_VIEW_TERRAIN,
109 menu_VIEW_SHOW_TUBES,
110 menu_VIEW_PERSPECTIVE,
111 menu_VIEW_SMOOTH_SHADING,
112 menu_VIEW_TEXTURED,
113 menu_VIEW_FOG,
114 menu_VIEW_SMOOTH_LINES,
115 menu_VIEW_FULLSCREEN,
116 menu_VIEW_COLOUR_BY,
117 menu_COLOUR_BY_DEPTH,
118 menu_COLOUR_BY_DATE,
119 menu_COLOUR_BY_ERROR,
120 menu_COLOUR_BY_GRADIENT,
121 menu_COLOUR_BY_LENGTH,
122 menu_IND_COMPASS,
123 menu_IND_CLINO,
124 menu_IND_COLOUR_KEY,
125 menu_IND_SCALE_BAR,
126 menu_CTL_INDICATORS,
127 menu_CTL_SIDE_PANEL,
128 menu_CTL_METRIC,
129 menu_CTL_DEGREES,
130 menu_CTL_PERCENT,
131 menu_CTL_REVERSE,
132 menu_CTL_CANCEL_DIST_LINE,
133 menu_SURVEY_RESTRICT,
134 menu_SURVEY_SHOW_ALL,
135 textctrl_FIND,
136 button_HIDE,
137 listctrl_PRES
140 class PointInfo : public Point {
141 int date;
143 public:
144 PointInfo() : Point(), date(-1) { }
145 explicit PointInfo(const img_point & pt) : Point(pt), date(-1) { }
146 PointInfo(const img_point & pt, int date_) : Point(pt), date(date_) { }
147 PointInfo(const Point & p, int date_) : Point(p), date(date_) { }
148 int GetDate() const { return date; }
151 class XSect : public PointInfo {
152 friend class MainFrm;
153 Double l, r, u, d;
154 Double right_bearing;
156 public:
157 XSect() : PointInfo(), l(0), r(0), u(0), d(0), right_bearing(0) { }
158 XSect(const Point &p, int date_,
159 Double l_, Double r_, Double u_, Double d_)
160 : PointInfo(p, date_), l(l_), r(r_), u(u_), d(d_), right_bearing(0) { }
161 Double GetL() const { return l; }
162 Double GetR() const { return r; }
163 Double GetU() const { return u; }
164 Double GetD() const { return d; }
165 Double get_right_bearing() const { return right_bearing; }
166 void set_right_bearing(Double right_bearing_) {
167 right_bearing = right_bearing_;
171 class AvenPresList;
173 class traverse : public vector<PointInfo> {
174 public:
175 int n_legs;
176 bool isSplay;
177 double length;
178 double E, H, V;
180 traverse() : n_legs(0), isSplay(false), length(0), E(-1), H(-1), V(-1) { }
183 class MainFrm : public wxFrame {
184 wxFileHistory m_history;
185 int m_SashPosition;
186 bool was_showing_sidepanel_before_fullscreen;
187 list<traverse> traverses;
188 list<traverse> surface_traverses;
189 list<vector<XSect> > tubes;
190 list<LabelInfo*> m_Labels;
191 Vector3 m_Ext;
192 Double m_DepthMin, m_DepthExt;
193 int m_DateMin, m_DateExt;
194 bool complete_dateinfo;
195 GfxCore* m_Gfx;
196 wxWindow* m_Log;
197 GUIControl* m_Control;
198 int m_NumEntrances;
199 int m_NumFixedPts;
200 int m_NumExportedPts;
201 int m_NumHighlighted;
202 bool m_HasUndergroundLegs;
203 bool m_HasSplays;
204 bool m_HasSurfaceLegs;
205 bool m_HasErrorInformation;
206 wxSplitterWindow* m_Splitter;
207 AvenTreeCtrl* m_Tree;
208 wxTextCtrl* m_FindBox;
209 // wxCheckBox* m_RegexpCheckBox;
210 wxNotebook* m_Notebook;
211 AvenPresList* m_PresList;
212 wxString m_File;
213 // Processed version of data - same as m_File if m_File is processed data.
214 wxString m_FileProcessed;
215 wxString m_Survey;
216 public: // FIXME for m_cs_proj
217 wxString m_Title, m_cs_proj, m_DateStamp;
218 private:
219 time_t m_DateStamp_numeric;
220 wxChar separator; // character separating survey levels (often '.')
221 Vector3 m_Offsets;
223 // Strings for status bar reporting of distances.
224 wxString here_text, coords_text, dist_text, distfree_text;
226 bool m_IsExtendedElevation;
227 bool pending_find;
229 bool fullscreen_showing_menus;
231 #ifdef PREFDLG
232 PrefsDlg* m_PrefsDlg;
233 #endif
235 void FillTree(const wxString & root_name);
236 bool ProcessSVXFile(const wxString & file);
237 // void FixLRUD(traverse & centreline);
238 void CentreDataset(const Vector3 & vmin);
240 void CreateMenuBar();
241 void MakeToolBar();
242 void CreateSidePanel();
244 void UpdateStatusBar();
246 #ifdef USING_GENERIC_TOOLBAR
247 wxToolBar * GetToolBar() const {
248 wxSizer * sizer = GetSizer();
249 if (!sizer) return NULL;
250 return (wxToolBar*)sizer->GetItem(size_t(0))->GetWindow();
252 #endif
254 public:
255 MainFrm(const wxString& title, const wxPoint& pos, const wxSize& size);
257 // public for CavernLog.
258 bool LoadData(const wxString& file, const wxString& prefix);
259 void AddToFileHistory(const wxString & file);
261 void InitialiseAfterLoad(const wxString & file, const wxString & prefix);
262 void OnShowLog(wxCommandEvent& event);
264 void OnMRUFile(wxCommandEvent& event);
265 void OpenFile(const wxString& file, const wxString& survey = wxString());
267 void OnPresNewUpdate(wxUpdateUIEvent& event);
268 void OnPresOpenUpdate(wxUpdateUIEvent& event);
269 void OnPresSaveUpdate(wxUpdateUIEvent& event);
270 void OnPresSaveAsUpdate(wxUpdateUIEvent& event);
271 void OnPresMarkUpdate(wxUpdateUIEvent& event);
272 void OnPresFRewindUpdate(wxUpdateUIEvent& event);
273 void OnPresRewindUpdate(wxUpdateUIEvent& event);
274 void OnPresReverseUpdate(wxUpdateUIEvent& event);
275 void OnPresPlayUpdate(wxUpdateUIEvent& event);
276 void OnPresFFUpdate(wxUpdateUIEvent& event);
277 void OnPresFFFUpdate(wxUpdateUIEvent& event);
278 void OnPresPauseUpdate(wxUpdateUIEvent& event);
279 void OnPresStopUpdate(wxUpdateUIEvent& event);
280 void OnPresExportMovieUpdate(wxUpdateUIEvent& event);
281 void OnOpenTerrainUpdate(wxUpdateUIEvent& event);
283 void DoFind();
284 void OnFind(wxCommandEvent& event);
285 void OnIdle(wxIdleEvent& event);
286 void OnGotoFound(wxCommandEvent& event);
287 void OnHide(wxCommandEvent& event);
288 void OnHideUpdate(wxUpdateUIEvent& ui);
290 void OnOpen(wxCommandEvent& event);
291 void OnOpenTerrain(wxCommandEvent&);
292 void HideLog(wxWindow * log_window);
293 void OnScreenshot(wxCommandEvent& event);
294 void OnScreenshotUpdate(wxUpdateUIEvent& event);
295 void OnFilePreferences(wxCommandEvent& event);
296 void OnPrint(wxCommandEvent& event);
297 void PrintAndExit();
298 void OnPageSetup(wxCommandEvent& event);
299 void OnPresNew(wxCommandEvent& event);
300 void OnPresOpen(wxCommandEvent& event);
301 void OnPresSave(wxCommandEvent& event);
302 void OnPresSaveAs(wxCommandEvent& event);
303 void OnPresMark(wxCommandEvent& event);
304 void OnPresFRewind(wxCommandEvent& event);
305 void OnPresRewind(wxCommandEvent& event);
306 void OnPresReverse(wxCommandEvent& event);
307 void OnPresPlay(wxCommandEvent& event);
308 void OnPresFF(wxCommandEvent& event);
309 void OnPresFFF(wxCommandEvent& event);
310 void OnPresPause(wxCommandEvent& event);
311 void OnPresStop(wxCommandEvent& event);
312 void OnPresExportMovie(wxCommandEvent& event);
313 void OnExport(wxCommandEvent& event);
314 void OnExtend(wxCommandEvent& event);
315 void OnQuit(wxCommandEvent& event);
317 void OnAbout(wxCommandEvent& event);
318 void OnClose(wxCloseEvent&);
320 void OnSetFocus(wxFocusEvent &) { if (m_Gfx) m_Gfx->SetFocus(); }
322 void OnKeyPress(wxKeyEvent &e) {
323 if (m_Gfx) {
324 m_Gfx->SetFocus();
325 m_Gfx->OnKeyPress(e);
329 void OnShowLogUpdate(wxUpdateUIEvent &ui) {
330 ui.Enable(m_Log != NULL || (m_Splitter->GetWindow1() != m_Gfx && m_Splitter->GetWindow2() != m_Gfx));
331 ui.Check(m_Log == NULL);
333 void OnPrintUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_File.empty()); }
334 void OnExportUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_File.empty()); }
335 void OnExtendUpdate(wxUpdateUIEvent &ui) { ui.Enable(!m_IsExtendedElevation); }
337 // temporary bodges until event handling problem is sorted out:
338 void OnDefaultsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDefaultsUpdate(event); }
339 void OnPlanUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnPlanUpdate(event); }
340 void OnElevationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnElevationUpdate(event); }
341 void OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnDisplayOverlappingNamesUpdate(event); }
342 void OnColourByUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByUpdate(event); }
343 void OnColourByDepthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByDepthUpdate(event); }
344 void OnColourByDateUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByDateUpdate(event); }
345 void OnColourByErrorUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByErrorUpdate(event); }
346 void OnColourByGradientUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByGradientUpdate(event); }
347 void OnColourByLengthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnColourByLengthUpdate(event); }
348 void OnShowCrossesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowCrossesUpdate(event); }
349 void OnShowEntrancesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowEntrancesUpdate(event); }
350 void OnShowFixedPtsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowFixedPtsUpdate(event); }
351 void OnShowExportedPtsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowExportedPtsUpdate(event); }
352 void OnShowStationNamesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowStationNamesUpdate(event); }
353 void OnShowSurveyLegsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSurveyLegsUpdate(event); }
354 void OnSplaysUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnSplaysUpdate(event); }
355 void OnHideSplaysUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnHideSplaysUpdate(event); }
356 void OnShowSplaysNormalUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysNormalUpdate(event); }
357 void OnShowSplaysFadedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSplaysFadedUpdate(event); }
358 void OnShowSurfaceUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnShowSurfaceUpdate(event); }
359 void OnMoveEastUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveEastUpdate(event); }
360 void OnMoveNorthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveNorthUpdate(event); }
361 void OnMoveSouthUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveSouthUpdate(event); }
362 void OnMoveWestUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnMoveWestUpdate(event); }
363 void OnToggleRotationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleRotationUpdate(event); }
364 void OnReverseControlsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnReverseControlsUpdate(event); }
365 void OnToggleScalebarUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleScalebarUpdate(event); }
366 void OnToggleColourKeyUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleColourKeyUpdate(event); }
367 void OnViewCompassUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewCompassUpdate(event); }
368 void OnViewGridUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewGridUpdate(event); }
369 void OnViewBoundingBoxUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewBoundingBoxUpdate(event); }
370 void OnViewTerrainUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewTerrainUpdate(event); }
371 void OnViewClinoUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewClinoUpdate(event); }
372 void OnViewPerspectiveUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewPerspectiveUpdate(event); }
373 void OnViewSmoothShadingUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewSmoothShadingUpdate(event); }
374 void OnViewTexturedUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewTexturedUpdate(event); }
375 void OnViewFogUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewFogUpdate(event); }
376 void OnViewSmoothLinesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewSmoothLinesUpdate(event); }
377 void OnViewFullScreenUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnViewFullScreenUpdate(event); }
378 void OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnReverseDirectionOfRotationUpdate(event); }
379 void OnCancelDistLineUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnCancelDistLineUpdate(event); }
380 void OnIndicatorsUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnIndicatorsUpdate(event); }
382 void OnDefaults(wxCommandEvent&) { if (m_Control) m_Control->OnDefaults(); }
383 void OnPlan(wxCommandEvent&) { if (m_Control) m_Control->OnPlan(); }
384 void OnElevation(wxCommandEvent&) { if (m_Control) m_Control->OnElevation(); }
385 void OnDisplayOverlappingNames(wxCommandEvent&) { if (m_Control) m_Control->OnDisplayOverlappingNames(); }
386 void OnColourByDepth(wxCommandEvent&) { if (m_Control) m_Control->OnColourByDepth(); }
387 void OnColourByDate(wxCommandEvent&) { if (m_Control) m_Control->OnColourByDate(); }
388 void OnColourByError(wxCommandEvent&) { if (m_Control) m_Control->OnColourByError(); }
389 void OnColourByGradient(wxCommandEvent&) { if (m_Control) m_Control->OnColourByGradient(); }
390 void OnColourByLength(wxCommandEvent&) { if (m_Control) m_Control->OnColourByLength(); }
391 void OnShowCrosses(wxCommandEvent&) { if (m_Control) m_Control->OnShowCrosses(); }
392 void OnShowEntrances(wxCommandEvent&) { if (m_Control) m_Control->OnShowEntrances(); }
393 void OnShowFixedPts(wxCommandEvent&) { if (m_Control) m_Control->OnShowFixedPts(); }
394 void OnShowExportedPts(wxCommandEvent&) { if (m_Control) m_Control->OnShowExportedPts(); }
395 void OnShowStationNames(wxCommandEvent&) { if (m_Control) m_Control->OnShowStationNames(); }
396 void OnShowSurveyLegs(wxCommandEvent&) { if (m_Control) m_Control->OnShowSurveyLegs(); }
397 void OnHideSplays(wxCommandEvent&) { if (m_Control) m_Control->OnHideSplays(); }
398 void OnShowSplaysNormal(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysNormal(); }
399 void OnShowSplaysFaded(wxCommandEvent&) { if (m_Control) m_Control->OnShowSplaysFaded(); }
400 void OnShowSurface(wxCommandEvent&) { if (m_Control) m_Control->OnShowSurface(); }
401 void OnMoveEast(wxCommandEvent&) { if (m_Control) m_Control->OnMoveEast(); }
402 void OnMoveNorth(wxCommandEvent&) { if (m_Control) m_Control->OnMoveNorth(); }
403 void OnMoveSouth(wxCommandEvent&) { if (m_Control) m_Control->OnMoveSouth(); }
404 void OnMoveWest(wxCommandEvent&) { if (m_Control) m_Control->OnMoveWest(); }
405 void OnToggleRotation(wxCommandEvent&) { if (m_Control) m_Control->OnToggleRotation(); }
406 void OnReverseControls(wxCommandEvent&) { if (m_Control) m_Control->OnReverseControls(); }
407 void OnToggleScalebar(wxCommandEvent&) { if (m_Control) m_Control->OnToggleScalebar(); }
408 void OnToggleColourKey(wxCommandEvent&) { if (m_Control) m_Control->OnToggleColourKey(); }
409 void OnViewCompass(wxCommandEvent&) { if (m_Control) m_Control->OnViewCompass(); }
410 void OnViewClino(wxCommandEvent&) { if (m_Control) m_Control->OnViewClino(); }
411 void OnViewGrid(wxCommandEvent&) { if (m_Control) m_Control->OnViewGrid(); }
412 void OnViewBoundingBox(wxCommandEvent&) { if (m_Control) m_Control->OnViewBoundingBox(); }
413 void OnViewTerrain(wxCommandEvent&) { if (m_Control) m_Control->OnViewTerrain(); }
414 void OnViewPerspective(wxCommandEvent&) { if (m_Control) m_Control->OnViewPerspective(); }
415 void OnViewSmoothShading(wxCommandEvent&) { if (m_Control) m_Control->OnViewSmoothShading(); }
416 void OnViewTextured(wxCommandEvent&) { if (m_Control) m_Control->OnViewTextured(); }
417 void OnViewFog(wxCommandEvent&) { if (m_Control) m_Control->OnViewFog(); }
418 void OnViewSmoothLines(wxCommandEvent&) { if (m_Control) m_Control->OnViewSmoothLines(); }
419 void OnViewFullScreen(wxCommandEvent&) { ViewFullScreen(); }
420 void ViewFullScreen();
421 bool FullScreenModeShowingMenus() const;
422 void FullScreenModeShowMenus(bool show);
423 void OnReverseDirectionOfRotation(wxCommandEvent&) { if (m_Control) m_Control->OnReverseDirectionOfRotation(); }
424 void OnCancelDistLine(wxCommandEvent&) { if (m_Control) m_Control->OnCancelDistLine(); }
426 void OnToggleMetric(wxCommandEvent&) { if (m_Control) m_Control->OnToggleMetric(); }
427 void OnToggleDegrees(wxCommandEvent&) { if (m_Control) m_Control->OnToggleDegrees(); }
428 void OnTogglePercent(wxCommandEvent&) { if (m_Control) m_Control->OnTogglePercent(); }
429 void OnToggleTubes(wxCommandEvent&) { if (m_Control) m_Control->OnToggleTubes(); }
431 void OnToggleMetricUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleMetricUpdate(event); }
432 void OnToggleDegreesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleDegreesUpdate(event); }
433 void OnTogglePercentUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnTogglePercentUpdate(event); }
434 void OnToggleTubesUpdate(wxUpdateUIEvent& event) { if (m_Control) m_Control->OnToggleTubesUpdate(event); }
436 // end of horrible bodges
438 void OnViewSidePanelUpdate(wxUpdateUIEvent& event);
439 void OnViewSidePanel(wxCommandEvent& event);
440 void ToggleSidePanel();
441 bool ShowingSidePanel();
443 const Vector3 & GetExtent() const { return m_Ext; }
444 Double GetXExtent() const { return m_Ext.GetX(); }
445 Double GetYExtent() const { return m_Ext.GetY(); }
446 Double GetZExtent() const { return m_Ext.GetZ(); }
448 Double GetDepthExtent() const { return m_DepthExt; }
449 Double GetDepthMin() const { return m_DepthMin; }
451 bool HasCompleteDateInfo() const { return complete_dateinfo; }
452 int GetDateExtent() const { return m_DateExt; }
453 int GetDateMin() const { return m_DateMin; }
455 void SelectTreeItem(const LabelInfo* label) {
456 if (label->tree_id.IsOk())
457 m_Tree->SelectItem(label->tree_id);
458 else
459 m_Tree->UnselectAll();
462 void ClearTreeSelection();
464 int GetNumFixedPts() const { return m_NumFixedPts; }
465 int GetNumExportedPts() const { return m_NumExportedPts; }
466 int GetNumEntrances() const { return m_NumEntrances; }
467 int GetNumHighlightedPts() const { return m_NumHighlighted; }
469 bool HasUndergroundLegs() const { return m_HasUndergroundLegs; }
470 bool HasSplays() const { return m_HasSplays; }
471 bool HasSurfaceLegs() const { return m_HasSurfaceLegs; }
472 bool HasTubes() const { return !tubes.empty(); }
473 bool HasErrorInformation() const { return m_HasErrorInformation; }
475 bool IsExtendedElevation() const { return m_IsExtendedElevation; }
477 void ClearCoords();
478 void SetCoords(const Vector3 &v);
479 const LabelInfo * GetTreeSelection() const;
480 void SetCoords(Double x, Double y, const LabelInfo * there);
481 void SetAltitude(Double z, const LabelInfo * there);
483 const Vector3 & GetOffset() const { return m_Offsets; }
485 wxChar GetSeparator() const { return separator; }
487 list<traverse>::const_iterator traverses_begin() const {
488 return traverses.begin();
491 list<traverse>::const_iterator traverses_end() const {
492 return traverses.end();
495 list<traverse>::const_iterator surface_traverses_begin() const {
496 return surface_traverses.begin();
499 list<traverse>::const_iterator surface_traverses_end() const {
500 return surface_traverses.end();
503 list<vector<XSect> >::const_iterator tubes_begin() const {
504 return tubes.begin();
507 list<vector<XSect> >::const_iterator tubes_end() const {
508 return tubes.end();
511 list<vector<XSect> >::iterator tubes_begin() {
512 return tubes.begin();
515 list<vector<XSect> >::iterator tubes_end() {
516 return tubes.end();
519 list<LabelInfo*>::const_iterator GetLabels() const {
520 return m_Labels.begin();
523 list<LabelInfo*>::const_iterator GetLabelsEnd() const {
524 return m_Labels.end();
527 list<LabelInfo*>::const_reverse_iterator GetRevLabels() const {
528 return m_Labels.rbegin();
531 list<LabelInfo*>::const_reverse_iterator GetRevLabelsEnd() const {
532 return m_Labels.rend();
535 list<LabelInfo*>::iterator GetLabelsNC() {
536 return m_Labels.begin();
539 list<LabelInfo*>::iterator GetLabelsNCEnd() {
540 return m_Labels.end();
543 void ShowInfo(const LabelInfo *here = NULL, const LabelInfo *there = NULL);
544 void DisplayTreeInfo(const wxTreeItemData* data = NULL);
545 void TreeItemSelected(const wxTreeItemData* data, bool zoom);
546 PresentationMark GetPresMark(int which);
547 bool Animating() const { return m_Gfx && m_Gfx->Animating(); }
549 // Restrict to subsurvey `survey` (or show all if `survey` empty).
550 void RestrictTo(const wxString & survey);
552 wxString GetSurvey() const { return m_Survey; }
554 private:
555 DECLARE_EVENT_TABLE()
558 // Older wxGTK loses pop-up dialogs under the always-on-top, maximised window.
559 // Not sure when this got fixed, but wx 2.8.10 definitely works properly on
560 // Debian squeeze.
562 // To work around this issue, create this object on the stack, and it will
563 // temporarily un-fullscreen the window while the dialog as a workaround.
564 class AvenAllowOnTop {
565 #if defined __WXGTK__ && !wxCHECK_VERSION(2,8,10)
566 MainFrm * mainfrm;
567 public:
568 explicit AvenAllowOnTop(MainFrm * mainfrm_) {
569 if (mainfrm_ && mainfrm_->IsFullScreen()) {
570 mainfrm = mainfrm_;
571 mainfrm->ViewFullScreen();
572 } else {
573 mainfrm = 0;
576 ~AvenAllowOnTop() {
577 if (mainfrm) mainfrm->ViewFullScreen();
579 #else
580 public:
581 AvenAllowOnTop(MainFrm *) { }
582 #endif
585 #endif