4 // Main frame handling for Aven.
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
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
28 #include <wx/docview.h> // for m_FileHistory
29 #include <wx/listctrl.h>
30 #include <wx/notebook.h>
32 #include <wx/printdlg.h>
34 #include "aventreectrl.h"
36 #include "guicontrol.h"
37 #include "img_hosted.h"
38 #include "labelinfo.h"
42 //#include "prefsdlg.h"
53 // Currently on OS X, we force use of a generic toolbar, which needs to be put
55 # define USING_GENERIC_TOOLBAR
64 menu_FILE_OPEN_TERRAIN
,
74 menu_PRES_EXPORT_MOVIE
,
85 menu_ROTATION_REVERSE
,
86 menu_ORIENT_MOVE_NORTH
,
87 menu_ORIENT_MOVE_EAST
,
88 menu_ORIENT_MOVE_SOUTH
,
89 menu_ORIENT_MOVE_WEST
,
91 menu_ORIENT_ELEVATION
,
96 menu_SPLAYS_SHOW_FADED
,
97 menu_SPLAYS_SHOW_NORMAL
,
100 menu_DUPES_SHOW_DASHED
,
101 menu_DUPES_SHOW_NORMAL
,
102 menu_VIEW_SHOW_CROSSES
,
103 menu_VIEW_SHOW_NAMES
,
104 menu_VIEW_SHOW_SURFACE
,
105 menu_VIEW_SHOW_OVERLAPPING_NAMES
,
106 menu_VIEW_SHOW_ENTRANCES
,
107 menu_VIEW_SHOW_FIXED_PTS
,
108 menu_VIEW_SHOW_EXPORTED_PTS
,
109 menu_VIEW_STATUS_BAR
,
111 menu_VIEW_BOUNDING_BOX
,
113 menu_VIEW_SHOW_TUBES
,
114 menu_VIEW_PERSPECTIVE
,
115 menu_VIEW_SMOOTH_SHADING
,
118 menu_VIEW_SMOOTH_LINES
,
119 menu_VIEW_FULLSCREEN
,
121 menu_COLOUR_BY_DEPTH
,
123 menu_COLOUR_BY_ERROR
,
124 menu_COLOUR_BY_GRADIENT
,
125 menu_COLOUR_BY_LENGTH
,
136 menu_CTL_CANCEL_DIST_LINE
,
137 menu_SURVEY_RESTRICT
,
138 menu_SURVEY_SHOW_ALL
,
144 class PointInfo
: public Point
{
148 PointInfo() : Point(), date(-1) { }
149 explicit PointInfo(const img_point
& pt
) : Point(pt
), date(-1) { }
150 PointInfo(const img_point
& pt
, int date_
) : Point(pt
), date(date_
) { }
151 PointInfo(const Point
& p
, int date_
) : Point(p
), date(date_
) { }
152 int GetDate() const { return date
; }
155 class XSect
: public PointInfo
{
156 friend class MainFrm
;
158 Double right_bearing
;
161 XSect() : PointInfo(), l(0), r(0), u(0), d(0), right_bearing(0) { }
162 XSect(const Point
&p
, int date_
,
163 Double l_
, Double r_
, Double u_
, Double d_
)
164 : PointInfo(p
, date_
), l(l_
), r(r_
), u(u_
), d(d_
), right_bearing(0) { }
165 Double
GetL() const { return l
; }
166 Double
GetR() const { return r
; }
167 Double
GetU() const { return u
; }
168 Double
GetD() const { return d
; }
169 Double
get_right_bearing() const { return right_bearing
; }
170 void set_right_bearing(Double right_bearing_
) {
171 right_bearing
= right_bearing_
;
177 class traverse
: public vector
<PointInfo
> {
185 traverse() : n_legs(0), isSplay(false), isDupe(false), length(0), E(-1), H(-1), V(-1) { }
188 class MainFrm
: public wxFrame
{
189 wxFileHistory m_history
;
191 bool was_showing_sidepanel_before_fullscreen
;
192 list
<traverse
> traverses
;
193 list
<traverse
> surface_traverses
;
194 list
<vector
<XSect
> > tubes
;
195 list
<LabelInfo
*> m_Labels
;
197 Double m_DepthMin
, m_DepthExt
;
198 int m_DateMin
, m_DateExt
;
199 bool complete_dateinfo
;
202 GUIControl
* m_Control
;
205 int m_NumExportedPts
;
206 int m_NumHighlighted
;
207 bool m_HasUndergroundLegs
;
210 bool m_HasSurfaceLegs
;
211 bool m_HasErrorInformation
;
212 wxSplitterWindow
* m_Splitter
;
213 AvenTreeCtrl
* m_Tree
;
214 wxTextCtrl
* m_FindBox
;
215 // wxCheckBox* m_RegexpCheckBox;
216 wxNotebook
* m_Notebook
;
217 AvenPresList
* m_PresList
;
219 // Processed version of data - same as m_File if m_File is processed data.
220 wxString m_FileProcessed
;
222 public: // FIXME for m_cs_proj
223 wxString m_Title
, m_cs_proj
, m_DateStamp
;
225 time_t m_DateStamp_numeric
;
226 wxChar separator
; // character separating survey levels (often '.')
229 // Strings for status bar reporting of distances.
230 wxString here_text
, coords_text
, dist_text
, distfree_text
;
232 bool m_IsExtendedElevation
;
235 bool fullscreen_showing_menus
;
238 PrefsDlg
* m_PrefsDlg
;
241 void FillTree(const wxString
& root_name
);
242 bool ProcessSVXFile(const wxString
& file
);
243 // void FixLRUD(traverse & centreline);
244 void CentreDataset(const Vector3
& vmin
);
246 void CreateMenuBar();
248 void CreateSidePanel();
250 void UpdateStatusBar();
252 #ifdef USING_GENERIC_TOOLBAR
253 wxToolBar
* GetToolBar() const {
254 wxSizer
* sizer
= GetSizer();
255 if (!sizer
) return NULL
;
256 return (wxToolBar
*)sizer
->GetItem(size_t(0))->GetWindow();
261 MainFrm(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
263 // public for CavernLog.
264 bool LoadData(const wxString
& file
, const wxString
& prefix
);
265 void AddToFileHistory(const wxString
& file
);
267 void InitialiseAfterLoad(const wxString
& file
, const wxString
& prefix
);
268 void OnShowLog(wxCommandEvent
& event
);
270 void OnMRUFile(wxCommandEvent
& event
);
271 void OpenFile(const wxString
& file
, const wxString
& survey
= wxString());
273 void OnPresNewUpdate(wxUpdateUIEvent
& event
);
274 void OnPresOpenUpdate(wxUpdateUIEvent
& event
);
275 void OnPresSaveUpdate(wxUpdateUIEvent
& event
);
276 void OnPresSaveAsUpdate(wxUpdateUIEvent
& event
);
277 void OnPresMarkUpdate(wxUpdateUIEvent
& event
);
278 void OnPresFRewindUpdate(wxUpdateUIEvent
& event
);
279 void OnPresRewindUpdate(wxUpdateUIEvent
& event
);
280 void OnPresReverseUpdate(wxUpdateUIEvent
& event
);
281 void OnPresPlayUpdate(wxUpdateUIEvent
& event
);
282 void OnPresFFUpdate(wxUpdateUIEvent
& event
);
283 void OnPresFFFUpdate(wxUpdateUIEvent
& event
);
284 void OnPresPauseUpdate(wxUpdateUIEvent
& event
);
285 void OnPresStopUpdate(wxUpdateUIEvent
& event
);
286 void OnPresExportMovieUpdate(wxUpdateUIEvent
& event
);
287 void OnOpenTerrainUpdate(wxUpdateUIEvent
& event
);
290 void OnFind(wxCommandEvent
& event
);
291 void OnIdle(wxIdleEvent
& event
);
292 void OnGotoFound(wxCommandEvent
& event
);
293 void OnHide(wxCommandEvent
& event
);
294 void OnHideUpdate(wxUpdateUIEvent
& ui
);
296 void OnOpen(wxCommandEvent
& event
);
297 void OnOpenTerrain(wxCommandEvent
&);
298 void HideLog(wxWindow
* log_window
);
299 void OnScreenshot(wxCommandEvent
& event
);
300 void OnScreenshotUpdate(wxUpdateUIEvent
& event
);
301 void OnFilePreferences(wxCommandEvent
& event
);
302 void OnPrint(wxCommandEvent
& event
);
304 void OnPageSetup(wxCommandEvent
& event
);
305 void OnPresNew(wxCommandEvent
& event
);
306 void OnPresOpen(wxCommandEvent
& event
);
307 void OnPresSave(wxCommandEvent
& event
);
308 void OnPresSaveAs(wxCommandEvent
& event
);
309 void OnPresMark(wxCommandEvent
& event
);
310 void OnPresFRewind(wxCommandEvent
& event
);
311 void OnPresRewind(wxCommandEvent
& event
);
312 void OnPresReverse(wxCommandEvent
& event
);
313 void OnPresPlay(wxCommandEvent
& event
);
314 void OnPresFF(wxCommandEvent
& event
);
315 void OnPresFFF(wxCommandEvent
& event
);
316 void OnPresPause(wxCommandEvent
& event
);
317 void OnPresStop(wxCommandEvent
& event
);
318 void OnPresExportMovie(wxCommandEvent
& event
);
319 void OnExport(wxCommandEvent
& event
);
320 void OnExtend(wxCommandEvent
& event
);
321 void OnQuit(wxCommandEvent
& event
);
323 void OnAbout(wxCommandEvent
& event
);
324 void OnClose(wxCloseEvent
&);
326 void OnSetFocus(wxFocusEvent
&) { if (m_Gfx
) m_Gfx
->SetFocus(); }
328 void OnKeyPress(wxKeyEvent
&e
) {
331 m_Gfx
->OnKeyPress(e
);
335 void OnShowLogUpdate(wxUpdateUIEvent
&ui
) {
336 ui
.Enable(m_Log
!= NULL
|| (m_Splitter
->GetWindow1() != m_Gfx
&& m_Splitter
->GetWindow2() != m_Gfx
));
337 ui
.Check(m_Log
== NULL
);
339 void OnPrintUpdate(wxUpdateUIEvent
&ui
) { ui
.Enable(!m_File
.empty()); }
340 void OnExportUpdate(wxUpdateUIEvent
&ui
) { ui
.Enable(!m_File
.empty()); }
341 void OnExtendUpdate(wxUpdateUIEvent
&ui
) { ui
.Enable(!m_IsExtendedElevation
); }
343 // temporary bodges until event handling problem is sorted out:
344 void OnDefaultsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDefaultsUpdate(event
); }
345 void OnPlanUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnPlanUpdate(event
); }
346 void OnElevationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnElevationUpdate(event
); }
347 void OnDisplayOverlappingNamesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDisplayOverlappingNamesUpdate(event
); }
348 void OnColourByUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByUpdate(event
); }
349 void OnColourByDepthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByDepthUpdate(event
); }
350 void OnColourByDateUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByDateUpdate(event
); }
351 void OnColourByErrorUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByErrorUpdate(event
); }
352 void OnColourByGradientUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByGradientUpdate(event
); }
353 void OnColourByLengthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnColourByLengthUpdate(event
); }
354 void OnShowCrossesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowCrossesUpdate(event
); }
355 void OnShowEntrancesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowEntrancesUpdate(event
); }
356 void OnShowFixedPtsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowFixedPtsUpdate(event
); }
357 void OnShowExportedPtsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowExportedPtsUpdate(event
); }
358 void OnShowStationNamesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowStationNamesUpdate(event
); }
359 void OnShowSurveyLegsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSurveyLegsUpdate(event
); }
360 void OnSplaysUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnSplaysUpdate(event
); }
361 void OnHideSplaysUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnHideSplaysUpdate(event
); }
362 void OnShowSplaysNormalUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSplaysNormalUpdate(event
); }
363 void OnShowSplaysFadedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSplaysFadedUpdate(event
); }
364 void OnDupesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnDupesUpdate(event
); }
365 void OnHideDupesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnHideDupesUpdate(event
); }
366 void OnShowDupesNormalUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowDupesNormalUpdate(event
); }
367 void OnShowDupesDashedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowDupesDashedUpdate(event
); }
368 void OnShowSurfaceUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnShowSurfaceUpdate(event
); }
369 void OnMoveEastUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveEastUpdate(event
); }
370 void OnMoveNorthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveNorthUpdate(event
); }
371 void OnMoveSouthUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveSouthUpdate(event
); }
372 void OnMoveWestUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnMoveWestUpdate(event
); }
373 void OnToggleRotationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleRotationUpdate(event
); }
374 void OnReverseControlsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnReverseControlsUpdate(event
); }
375 void OnToggleScalebarUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleScalebarUpdate(event
); }
376 void OnToggleColourKeyUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleColourKeyUpdate(event
); }
377 void OnViewCompassUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewCompassUpdate(event
); }
378 void OnViewGridUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewGridUpdate(event
); }
379 void OnViewBoundingBoxUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewBoundingBoxUpdate(event
); }
380 void OnViewTerrainUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewTerrainUpdate(event
); }
381 void OnViewClinoUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewClinoUpdate(event
); }
382 void OnViewPerspectiveUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewPerspectiveUpdate(event
); }
383 void OnViewSmoothShadingUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewSmoothShadingUpdate(event
); }
384 void OnViewTexturedUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewTexturedUpdate(event
); }
385 void OnViewFogUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewFogUpdate(event
); }
386 void OnViewSmoothLinesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewSmoothLinesUpdate(event
); }
387 void OnViewFullScreenUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnViewFullScreenUpdate(event
); }
388 void OnReverseDirectionOfRotationUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnReverseDirectionOfRotationUpdate(event
); }
389 void OnCancelDistLineUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnCancelDistLineUpdate(event
); }
390 void OnIndicatorsUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnIndicatorsUpdate(event
); }
392 void OnDefaults(wxCommandEvent
&) { if (m_Control
) m_Control
->OnDefaults(); }
393 void OnPlan(wxCommandEvent
&) { if (m_Control
) m_Control
->OnPlan(); }
394 void OnElevation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnElevation(); }
395 void OnDisplayOverlappingNames(wxCommandEvent
&) { if (m_Control
) m_Control
->OnDisplayOverlappingNames(); }
396 void OnColourByDepth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByDepth(); }
397 void OnColourByDate(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByDate(); }
398 void OnColourByError(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByError(); }
399 void OnColourByGradient(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByGradient(); }
400 void OnColourByLength(wxCommandEvent
&) { if (m_Control
) m_Control
->OnColourByLength(); }
401 void OnShowCrosses(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowCrosses(); }
402 void OnShowEntrances(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowEntrances(); }
403 void OnShowFixedPts(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowFixedPts(); }
404 void OnShowExportedPts(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowExportedPts(); }
405 void OnShowStationNames(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowStationNames(); }
406 void OnShowSurveyLegs(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSurveyLegs(); }
407 void OnHideSplays(wxCommandEvent
&) { if (m_Control
) m_Control
->OnHideSplays(); }
408 void OnShowSplaysNormal(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSplaysNormal(); }
409 void OnShowSplaysFaded(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSplaysFaded(); }
410 void OnHideDupes(wxCommandEvent
&) { if (m_Control
) m_Control
->OnHideDupes(); }
411 void OnShowDupesNormal(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowDupesNormal(); }
412 void OnShowDupesDashed(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowDupesDashed(); }
413 void OnShowSurface(wxCommandEvent
&) { if (m_Control
) m_Control
->OnShowSurface(); }
414 void OnMoveEast(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveEast(); }
415 void OnMoveNorth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveNorth(); }
416 void OnMoveSouth(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveSouth(); }
417 void OnMoveWest(wxCommandEvent
&) { if (m_Control
) m_Control
->OnMoveWest(); }
418 void OnToggleRotation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleRotation(); }
419 void OnReverseControls(wxCommandEvent
&) { if (m_Control
) m_Control
->OnReverseControls(); }
420 void OnToggleScalebar(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleScalebar(); }
421 void OnToggleColourKey(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleColourKey(); }
422 void OnViewCompass(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewCompass(); }
423 void OnViewClino(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewClino(); }
424 void OnViewGrid(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewGrid(); }
425 void OnViewBoundingBox(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewBoundingBox(); }
426 void OnViewTerrain(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewTerrain(); }
427 void OnViewPerspective(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewPerspective(); }
428 void OnViewSmoothShading(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewSmoothShading(); }
429 void OnViewTextured(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewTextured(); }
430 void OnViewFog(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewFog(); }
431 void OnViewSmoothLines(wxCommandEvent
&) { if (m_Control
) m_Control
->OnViewSmoothLines(); }
432 void OnViewFullScreen(wxCommandEvent
&) { ViewFullScreen(); }
433 void ViewFullScreen();
434 bool FullScreenModeShowingMenus() const;
435 void FullScreenModeShowMenus(bool show
);
436 void OnReverseDirectionOfRotation(wxCommandEvent
&) { if (m_Control
) m_Control
->OnReverseDirectionOfRotation(); }
437 void OnCancelDistLine(wxCommandEvent
&) { if (m_Control
) m_Control
->OnCancelDistLine(); }
439 void OnToggleMetric(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleMetric(); }
440 void OnToggleDegrees(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleDegrees(); }
441 void OnTogglePercent(wxCommandEvent
&) { if (m_Control
) m_Control
->OnTogglePercent(); }
442 void OnToggleTubes(wxCommandEvent
&) { if (m_Control
) m_Control
->OnToggleTubes(); }
444 void OnToggleMetricUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleMetricUpdate(event
); }
445 void OnToggleDegreesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleDegreesUpdate(event
); }
446 void OnTogglePercentUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnTogglePercentUpdate(event
); }
447 void OnToggleTubesUpdate(wxUpdateUIEvent
& event
) { if (m_Control
) m_Control
->OnToggleTubesUpdate(event
); }
449 // end of horrible bodges
451 void OnViewSidePanelUpdate(wxUpdateUIEvent
& event
);
452 void OnViewSidePanel(wxCommandEvent
& event
);
453 void ToggleSidePanel();
454 bool ShowingSidePanel();
456 const Vector3
& GetExtent() const { return m_Ext
; }
457 Double
GetXExtent() const { return m_Ext
.GetX(); }
458 Double
GetYExtent() const { return m_Ext
.GetY(); }
459 Double
GetZExtent() const { return m_Ext
.GetZ(); }
461 Double
GetDepthExtent() const { return m_DepthExt
; }
462 Double
GetDepthMin() const { return m_DepthMin
; }
464 bool HasCompleteDateInfo() const { return complete_dateinfo
; }
465 int GetDateExtent() const { return m_DateExt
; }
466 int GetDateMin() const { return m_DateMin
; }
468 void SelectTreeItem(const LabelInfo
* label
) {
469 if (label
->tree_id
.IsOk())
470 m_Tree
->SelectItem(label
->tree_id
);
472 m_Tree
->UnselectAll();
475 void ClearTreeSelection();
477 int GetNumFixedPts() const { return m_NumFixedPts
; }
478 int GetNumExportedPts() const { return m_NumExportedPts
; }
479 int GetNumEntrances() const { return m_NumEntrances
; }
480 int GetNumHighlightedPts() const { return m_NumHighlighted
; }
482 bool HasUndergroundLegs() const { return m_HasUndergroundLegs
; }
483 bool HasSplays() const { return m_HasSplays
; }
484 bool HasDupes() const { return m_HasDupes
; }
485 bool HasSurfaceLegs() const { return m_HasSurfaceLegs
; }
486 bool HasTubes() const { return !tubes
.empty(); }
487 bool HasErrorInformation() const { return m_HasErrorInformation
; }
489 bool IsExtendedElevation() const { return m_IsExtendedElevation
; }
492 void SetCoords(const Vector3
&v
);
493 const LabelInfo
* GetTreeSelection() const;
494 void SetCoords(Double x
, Double y
, const LabelInfo
* there
);
495 void SetAltitude(Double z
, const LabelInfo
* there
);
497 const Vector3
& GetOffset() const { return m_Offsets
; }
499 wxChar
GetSeparator() const { return separator
; }
501 list
<traverse
>::const_iterator
traverses_begin() const {
502 return traverses
.begin();
505 list
<traverse
>::const_iterator
traverses_end() const {
506 return traverses
.end();
509 list
<traverse
>::const_iterator
surface_traverses_begin() const {
510 return surface_traverses
.begin();
513 list
<traverse
>::const_iterator
surface_traverses_end() const {
514 return surface_traverses
.end();
517 list
<vector
<XSect
> >::const_iterator
tubes_begin() const {
518 return tubes
.begin();
521 list
<vector
<XSect
> >::const_iterator
tubes_end() const {
525 list
<vector
<XSect
> >::iterator
tubes_begin() {
526 return tubes
.begin();
529 list
<vector
<XSect
> >::iterator
tubes_end() {
533 list
<LabelInfo
*>::const_iterator
GetLabels() const {
534 return m_Labels
.begin();
537 list
<LabelInfo
*>::const_iterator
GetLabelsEnd() const {
538 return m_Labels
.end();
541 list
<LabelInfo
*>::const_reverse_iterator
GetRevLabels() const {
542 return m_Labels
.rbegin();
545 list
<LabelInfo
*>::const_reverse_iterator
GetRevLabelsEnd() const {
546 return m_Labels
.rend();
549 list
<LabelInfo
*>::iterator
GetLabelsNC() {
550 return m_Labels
.begin();
553 list
<LabelInfo
*>::iterator
GetLabelsNCEnd() {
554 return m_Labels
.end();
557 void ShowInfo(const LabelInfo
*here
= NULL
, const LabelInfo
*there
= NULL
);
558 void DisplayTreeInfo(const wxTreeItemData
* data
= NULL
);
559 void TreeItemSelected(const wxTreeItemData
* data
, bool zoom
);
560 PresentationMark
GetPresMark(int which
);
561 bool Animating() const { return m_Gfx
&& m_Gfx
->Animating(); }
563 // Restrict to subsurvey `survey` (or show all if `survey` empty).
564 void RestrictTo(const wxString
& survey
);
566 wxString
GetSurvey() const { return m_Survey
; }
569 DECLARE_EVENT_TABLE()
572 // Older wxGTK loses pop-up dialogs under the always-on-top, maximised window.
573 // Not sure when this got fixed, but wx 2.8.10 definitely works properly on
576 // To work around this issue, create this object on the stack, and it will
577 // temporarily un-fullscreen the window while the dialog as a workaround.
578 class AvenAllowOnTop
{
579 #if defined __WXGTK__ && !wxCHECK_VERSION(2,8,10)
582 explicit AvenAllowOnTop(MainFrm
* mainfrm_
) {
583 if (mainfrm_
&& mainfrm_
->IsFullScreen()) {
585 mainfrm
->ViewFullScreen();
591 if (mainfrm
) mainfrm
->ViewFullScreen();
595 AvenAllowOnTop(MainFrm
*) { }