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_DASHED
,
97 menu_SPLAYS_SHOW_FADED
,
98 menu_SPLAYS_SHOW_NORMAL
,
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
,
113 menu_VIEW_BOUNDING_BOX
,
115 menu_VIEW_SHOW_TUBES
,
116 menu_VIEW_PERSPECTIVE
,
117 menu_VIEW_SMOOTH_SHADING
,
120 menu_VIEW_SMOOTH_LINES
,
121 menu_VIEW_FULLSCREEN
,
123 menu_COLOUR_BY_DEPTH
,
125 menu_COLOUR_BY_ERROR
,
126 menu_COLOUR_BY_GRADIENT
,
127 menu_COLOUR_BY_LENGTH
,
138 menu_CTL_CANCEL_DIST_LINE
,
139 menu_SURVEY_RESTRICT
,
140 menu_SURVEY_SHOW_ALL
,
146 class PointInfo
: public Point
{
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
;
160 Double right_bearing
;
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_
;
179 class traverse
: public vector
<PointInfo
> {
182 // Bitmask of img_FLAG_SURFACE, img_FLAG_SPLAY and img_FLAG_DUPLICATE.
188 : n_legs(0), flags(0),
189 length(0), E(-1), H(-1), V(-1) { }
192 class MainFrm
: public wxFrame
{
193 wxFileHistory m_history
;
195 bool was_showing_sidepanel_before_fullscreen
;
196 list
<traverse
> traverses
[8];
197 list
<vector
<XSect
> > tubes
;
198 list
<LabelInfo
*> m_Labels
;
200 Double m_DepthMin
, m_DepthExt
;
201 int m_DateMin
, m_DateExt
;
202 bool complete_dateinfo
;
205 GUIControl
* m_Control
;
208 int m_NumExportedPts
;
209 int m_NumHighlighted
;
210 bool m_HasUndergroundLegs
;
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
;
222 // Processed version of data - same as m_File if m_File is processed data.
223 wxString m_FileProcessed
;
225 public: // FIXME for m_cs_proj
226 wxString m_Title
, m_cs_proj
, m_DateStamp
;
228 time_t m_DateStamp_numeric
;
229 wxChar separator
; // character separating survey levels (often '.')
232 // Strings for status bar reporting of distances.
233 wxString here_text
, coords_text
, dist_text
, distfree_text
;
235 bool m_IsExtendedElevation
;
238 bool fullscreen_showing_menus
;
241 PrefsDlg
* m_PrefsDlg
;
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();
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();
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
);
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
);
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
) {
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
);
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
; }
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 {
526 list
<vector
<XSect
> >::iterator
tubes_begin() {
527 return tubes
.begin();
530 list
<vector
<XSect
> >::iterator
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
; }
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
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)
583 explicit AvenAllowOnTop(MainFrm
* mainfrm_
) {
584 if (mainfrm_
&& mainfrm_
->IsFullScreen()) {
586 mainfrm
->ViewFullScreen();
592 if (mainfrm
) mainfrm
->ViewFullScreen();
596 AvenAllowOnTop(MainFrm
*) { }