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
,
98 menu_VIEW_SHOW_CROSSES
,
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
,
107 menu_VIEW_BOUNDING_BOX
,
109 menu_VIEW_SHOW_TUBES
,
110 menu_VIEW_PERSPECTIVE
,
111 menu_VIEW_SMOOTH_SHADING
,
114 menu_VIEW_SMOOTH_LINES
,
115 menu_VIEW_FULLSCREEN
,
117 menu_COLOUR_BY_DEPTH
,
119 menu_COLOUR_BY_ERROR
,
120 menu_COLOUR_BY_GRADIENT
,
121 menu_COLOUR_BY_LENGTH
,
132 menu_CTL_CANCEL_DIST_LINE
,
133 menu_SURVEY_RESTRICT
,
134 menu_SURVEY_SHOW_ALL
,
140 class PointInfo
: public Point
{
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
;
154 Double right_bearing
;
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_
;
173 class traverse
: public vector
<PointInfo
> {
180 traverse() : n_legs(0), isSplay(false), length(0), E(-1), H(-1), V(-1) { }
183 class MainFrm
: public wxFrame
{
184 wxFileHistory m_history
;
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
;
192 Double m_DepthMin
, m_DepthExt
;
193 int m_DateMin
, m_DateExt
;
194 bool complete_dateinfo
;
197 GUIControl
* m_Control
;
200 int m_NumExportedPts
;
201 int m_NumHighlighted
;
202 bool m_HasUndergroundLegs
;
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
;
213 // Processed version of data - same as m_File if m_File is processed data.
214 wxString m_FileProcessed
;
216 public: // FIXME for m_cs_proj
217 wxString m_Title
, m_cs_proj
, m_DateStamp
;
219 time_t m_DateStamp_numeric
;
220 wxChar separator
; // character separating survey levels (often '.')
223 // Strings for status bar reporting of distances.
224 wxString here_text
, coords_text
, dist_text
, distfree_text
;
226 bool m_IsExtendedElevation
;
229 bool fullscreen_showing_menus
;
232 PrefsDlg
* m_PrefsDlg
;
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();
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();
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
);
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
);
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
) {
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
);
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
; }
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 {
511 list
<vector
<XSect
> >::iterator
tubes_begin() {
512 return tubes
.begin();
515 list
<vector
<XSect
> >::iterator
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
; }
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
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)
568 explicit AvenAllowOnTop(MainFrm
* mainfrm_
) {
569 if (mainfrm_
&& mainfrm_
->IsFullScreen()) {
571 mainfrm
->ViewFullScreen();
577 if (mainfrm
) mainfrm
->ViewFullScreen();
581 AvenAllowOnTop(MainFrm
*) { }