Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGLEmbeddedViewer.cxx
Go to the documentation of this file.
1 // @(#)root/gl:$Id$
2 // Author: Bertrand Bellenot 23/01/2008
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TGFrame.h"
13 #include "TGLayout.h"
14 #include "TGLWidget.h"
15 #include "TGLSAFrame.h"
16 #include "TString.h"
17 #include "TGLPShapeObj.h"
18 #include "TGLPhysicalShape.h"
19 #include "TGLLogicalShape.h"
20 #include "TGLEmbeddedViewer.h"
21 #include "TGLEventHandler.h"
22 
23 /** \class TGLEmbeddedViewer
24 \ingroup opengl
25 Minimal GL-viewer that can be embedded in a standard ROOT frames.
26 */
27 
28 ClassImp(TGLEmbeddedViewer);
29 
30 ////////////////////////////////////////////////////////////////////////////////
31 /// Constructor.
32 /// Argument 'border' specifies how many pixels to pad on each side of the
33 /// viewer. This area can be used for highlightning of the active viewer.
34 
35 TGLEmbeddedViewer::TGLEmbeddedViewer(const TGWindow *parent, TVirtualPad *pad,
36  Int_t border) :
37  TGLViewer(pad, 0, 0, 400, 300),
38  fFrame(0),
39  fBorder(border)
40 {
41  Init(parent);
42 }
43 
44 ////////////////////////////////////////////////////////////////////////////////
45 /// Constructor allowing to also specify an GED editor to use.
46 /// Argument 'border' specifies how many pixels to pad on each side of the
47 /// viewer. This area can be used for highlightning of the active viewer.
48 
49 TGLEmbeddedViewer::TGLEmbeddedViewer(const TGWindow *parent, TVirtualPad *pad,
50  TGedEditor *ged, Int_t border) :
51  TGLViewer(pad, 0, 0, 400, 300),
52  fFrame(0),
53  fBorder(border)
54 {
55  fGedEditor = ged;
56  Init(parent);
57 }
58 
59 ////////////////////////////////////////////////////////////////////////////////
60 /// Destroy standalone viewer object.
61 
62 TGLEmbeddedViewer::~TGLEmbeddedViewer()
63 {
64  delete fFrame;
65  fGLWidget = 0;
66 }
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// Common initialization from all constructors.
70 
71 void TGLEmbeddedViewer::Init(const TGWindow *parent)
72 {
73  fFrame = new TGCompositeFrame(parent);
74 
75  CreateFrames();
76 
77  fFrame->MapSubwindows();
78  fFrame->Resize(fFrame->GetDefaultSize());
79  fFrame->Resize(400, 300);
80 }
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 /// Internal frames creation.
84 
85 void TGLEmbeddedViewer::CreateFrames()
86 {
87  fGLWidget = TGLWidget::Create(fFrame, kTRUE, kTRUE, 0, 10, 10);
88 
89  // Direct events from the TGWindow directly to the base viewer
90  fEventHandler = new TGLEventHandler(0, this);
91  fGLWidget->SetEventHandler(fEventHandler);
92 
93  fFrame->AddFrame(fGLWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
94  fBorder, fBorder, fBorder, fBorder));
95 }
96 
97 ////////////////////////////////////////////////////////////////////////////////
98 /// Create a GLwidget, it is an error if it is already created.
99 /// This is needed for frame-swapping on mac.
100 
101 void TGLEmbeddedViewer::CreateGLWidget()
102 {
103  if (fGLWidget) {
104  Error("CreateGLWidget", "Widget already exists.");
105  return;
106  }
107 
108  fGLWidget = TGLWidget::Create(fFrame, kTRUE, kTRUE, 0, 10, 10);
109  fGLWidget->SetEventHandler(fEventHandler);
110 
111  fFrame->AddFrame(fGLWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
112  fBorder, fBorder, fBorder, fBorder));
113  fFrame->Layout();
114 
115  fGLWidget->MapWindow();
116 }
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// Destroy the GLwidget, it is an error if it does not exist.
120 /// This is needed for frame-swapping on mac.
121 
122 void TGLEmbeddedViewer::DestroyGLWidget()
123 {
124  if (fGLWidget == 0) {
125  Error("DestroyGLWidget", "Widget does not exist.");
126  return;
127  }
128 
129  fGLWidget->UnmapWindow();
130  fGLWidget->SetEventHandler(0);
131 
132  fFrame->RemoveFrame(fGLWidget);
133  fGLWidget->DeleteWindow();
134  fGLWidget = 0;
135 }