ROOT logo
// @(#)root/gl:$Id: TGLEmbeddedViewer.cxx 31330 2009-11-19 17:34:19Z matevz $
// Author: Bertrand Bellenot 23/01/2008

/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TGFrame.h"
#include "TGLayout.h"
#include "TGLWidget.h"
#include "TGLSAFrame.h"
#include "TString.h"
#include "TGLPShapeObj.h"
#include "TGLPhysicalShape.h"
#include "TGLLogicalShape.h"
#include "TGLEmbeddedViewer.h"
#include "TGLEventHandler.h"

//==============================================================================
// TGLEmbeddedViewer
//==============================================================================

//______________________________________________________________________________
//
// Minimal GL-viewer that can be embedded in a standard ROOT frames.

ClassImp(TGLEmbeddedViewer);

//______________________________________________________________________________
TGLEmbeddedViewer::TGLEmbeddedViewer(const TGWindow *parent, TVirtualPad *pad,
                                     Int_t border) :
   TGLViewer(pad, 0, 0, 400, 300),
   fFrame(0),
   fBorder(border)
{
   // Constructor.
   // Argument 'border' specifies how many pixels to pad on each side of the
   // viewer. This area can be used for highlightning of the active viewer.

   Init(parent);
}

//______________________________________________________________________________
TGLEmbeddedViewer::TGLEmbeddedViewer(const TGWindow *parent, TVirtualPad *pad,
                                     TGedEditor *ged, Int_t border) :
   TGLViewer(pad, 0, 0, 400, 300),
   fFrame(0),
   fBorder(border)
{
   // Constructor allowing to also specify an GED editor to use.
   // Argument 'border' specifies how many pixels to pad on each side of the
   // viewer. This area can be used for highlightning of the active viewer.

   fGedEditor = ged;
   Init(parent);
}

//______________________________________________________________________________
TGLEmbeddedViewer::~TGLEmbeddedViewer()
{
   // Destroy standalone viewer object.

   delete fFrame;
   fGLWidget = 0;
}

//______________________________________________________________________________
void TGLEmbeddedViewer::Init(const TGWindow *parent)
{
   // Common initialization from all constructors.

   fFrame = new TGCompositeFrame(parent);

   CreateFrames();

   fFrame->MapSubwindows();
   fFrame->Resize(fFrame->GetDefaultSize());
   fFrame->Resize(400, 300);
}
 
//______________________________________________________________________________
void TGLEmbeddedViewer::CreateFrames()
{
   // Internal frames creation.

   fGLWidget = TGLWidget::Create(fFrame, kTRUE, kTRUE, 0, 10, 10);

   // Direct events from the TGWindow directly to the base viewer
   fEventHandler = new TGLEventHandler(0, this);
   fGLWidget->SetEventHandler(fEventHandler);

   fFrame->AddFrame(fGLWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
                                                 fBorder, fBorder, fBorder, fBorder));
}

//______________________________________________________________________________
void TGLEmbeddedViewer::CreateGLWidget()
{
   // Create a GLwidget, it is an error if it is already created.
   // This is needed for frame-swapping on mac.

   if (fGLWidget) {
      Error("CreateGLWidget", "Widget already exists.");
      return;
   }

   ResetInitGL();

   fGLWidget = TGLWidget::Create(fFrame, kTRUE, kTRUE, 0, 10, 10);
   fGLWidget->SetEventHandler(fEventHandler);

   fFrame->AddFrame(fGLWidget, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,
                                                 fBorder, fBorder, fBorder, fBorder));
   fFrame->Layout();

   fGLWidget->MapWindow();
}

//______________________________________________________________________________
void TGLEmbeddedViewer::DestroyGLWidget()
{
   // Destroy the GLwidget, it is an error if it does not exist.
   // This is needed for frame-swapping on mac.

   if (fGLWidget == 0) {
      Error("DestroyGLWidget", "Widget does not exist.");
      return;
   }

   ResetInitGL();

   fGLWidget->UnmapWindow();
   fGLWidget->SetEventHandler(0);

   fFrame->RemoveFrame(fGLWidget);
   fGLWidget->DeleteWindow();
   fGLWidget = 0;
}
 TGLEmbeddedViewer.cxx:1
 TGLEmbeddedViewer.cxx:2
 TGLEmbeddedViewer.cxx:3
 TGLEmbeddedViewer.cxx:4
 TGLEmbeddedViewer.cxx:5
 TGLEmbeddedViewer.cxx:6
 TGLEmbeddedViewer.cxx:7
 TGLEmbeddedViewer.cxx:8
 TGLEmbeddedViewer.cxx:9
 TGLEmbeddedViewer.cxx:10
 TGLEmbeddedViewer.cxx:11
 TGLEmbeddedViewer.cxx:12
 TGLEmbeddedViewer.cxx:13
 TGLEmbeddedViewer.cxx:14
 TGLEmbeddedViewer.cxx:15
 TGLEmbeddedViewer.cxx:16
 TGLEmbeddedViewer.cxx:17
 TGLEmbeddedViewer.cxx:18
 TGLEmbeddedViewer.cxx:19
 TGLEmbeddedViewer.cxx:20
 TGLEmbeddedViewer.cxx:21
 TGLEmbeddedViewer.cxx:22
 TGLEmbeddedViewer.cxx:23
 TGLEmbeddedViewer.cxx:24
 TGLEmbeddedViewer.cxx:25
 TGLEmbeddedViewer.cxx:26
 TGLEmbeddedViewer.cxx:27
 TGLEmbeddedViewer.cxx:28
 TGLEmbeddedViewer.cxx:29
 TGLEmbeddedViewer.cxx:30
 TGLEmbeddedViewer.cxx:31
 TGLEmbeddedViewer.cxx:32
 TGLEmbeddedViewer.cxx:33
 TGLEmbeddedViewer.cxx:34
 TGLEmbeddedViewer.cxx:35
 TGLEmbeddedViewer.cxx:36
 TGLEmbeddedViewer.cxx:37
 TGLEmbeddedViewer.cxx:38
 TGLEmbeddedViewer.cxx:39
 TGLEmbeddedViewer.cxx:40
 TGLEmbeddedViewer.cxx:41
 TGLEmbeddedViewer.cxx:42
 TGLEmbeddedViewer.cxx:43
 TGLEmbeddedViewer.cxx:44
 TGLEmbeddedViewer.cxx:45
 TGLEmbeddedViewer.cxx:46
 TGLEmbeddedViewer.cxx:47
 TGLEmbeddedViewer.cxx:48
 TGLEmbeddedViewer.cxx:49
 TGLEmbeddedViewer.cxx:50
 TGLEmbeddedViewer.cxx:51
 TGLEmbeddedViewer.cxx:52
 TGLEmbeddedViewer.cxx:53
 TGLEmbeddedViewer.cxx:54
 TGLEmbeddedViewer.cxx:55
 TGLEmbeddedViewer.cxx:56
 TGLEmbeddedViewer.cxx:57
 TGLEmbeddedViewer.cxx:58
 TGLEmbeddedViewer.cxx:59
 TGLEmbeddedViewer.cxx:60
 TGLEmbeddedViewer.cxx:61
 TGLEmbeddedViewer.cxx:62
 TGLEmbeddedViewer.cxx:63
 TGLEmbeddedViewer.cxx:64
 TGLEmbeddedViewer.cxx:65
 TGLEmbeddedViewer.cxx:66
 TGLEmbeddedViewer.cxx:67
 TGLEmbeddedViewer.cxx:68
 TGLEmbeddedViewer.cxx:69
 TGLEmbeddedViewer.cxx:70
 TGLEmbeddedViewer.cxx:71
 TGLEmbeddedViewer.cxx:72
 TGLEmbeddedViewer.cxx:73
 TGLEmbeddedViewer.cxx:74
 TGLEmbeddedViewer.cxx:75
 TGLEmbeddedViewer.cxx:76
 TGLEmbeddedViewer.cxx:77
 TGLEmbeddedViewer.cxx:78
 TGLEmbeddedViewer.cxx:79
 TGLEmbeddedViewer.cxx:80
 TGLEmbeddedViewer.cxx:81
 TGLEmbeddedViewer.cxx:82
 TGLEmbeddedViewer.cxx:83
 TGLEmbeddedViewer.cxx:84
 TGLEmbeddedViewer.cxx:85
 TGLEmbeddedViewer.cxx:86
 TGLEmbeddedViewer.cxx:87
 TGLEmbeddedViewer.cxx:88
 TGLEmbeddedViewer.cxx:89
 TGLEmbeddedViewer.cxx:90
 TGLEmbeddedViewer.cxx:91
 TGLEmbeddedViewer.cxx:92
 TGLEmbeddedViewer.cxx:93
 TGLEmbeddedViewer.cxx:94
 TGLEmbeddedViewer.cxx:95
 TGLEmbeddedViewer.cxx:96
 TGLEmbeddedViewer.cxx:97
 TGLEmbeddedViewer.cxx:98
 TGLEmbeddedViewer.cxx:99
 TGLEmbeddedViewer.cxx:100
 TGLEmbeddedViewer.cxx:101
 TGLEmbeddedViewer.cxx:102
 TGLEmbeddedViewer.cxx:103
 TGLEmbeddedViewer.cxx:104
 TGLEmbeddedViewer.cxx:105
 TGLEmbeddedViewer.cxx:106
 TGLEmbeddedViewer.cxx:107
 TGLEmbeddedViewer.cxx:108
 TGLEmbeddedViewer.cxx:109
 TGLEmbeddedViewer.cxx:110
 TGLEmbeddedViewer.cxx:111
 TGLEmbeddedViewer.cxx:112
 TGLEmbeddedViewer.cxx:113
 TGLEmbeddedViewer.cxx:114
 TGLEmbeddedViewer.cxx:115
 TGLEmbeddedViewer.cxx:116
 TGLEmbeddedViewer.cxx:117
 TGLEmbeddedViewer.cxx:118
 TGLEmbeddedViewer.cxx:119
 TGLEmbeddedViewer.cxx:120
 TGLEmbeddedViewer.cxx:121
 TGLEmbeddedViewer.cxx:122
 TGLEmbeddedViewer.cxx:123
 TGLEmbeddedViewer.cxx:124
 TGLEmbeddedViewer.cxx:125
 TGLEmbeddedViewer.cxx:126
 TGLEmbeddedViewer.cxx:127
 TGLEmbeddedViewer.cxx:128
 TGLEmbeddedViewer.cxx:129
 TGLEmbeddedViewer.cxx:130
 TGLEmbeddedViewer.cxx:131
 TGLEmbeddedViewer.cxx:132
 TGLEmbeddedViewer.cxx:133
 TGLEmbeddedViewer.cxx:134
 TGLEmbeddedViewer.cxx:135
 TGLEmbeddedViewer.cxx:136
 TGLEmbeddedViewer.cxx:137
 TGLEmbeddedViewer.cxx:138
 TGLEmbeddedViewer.cxx:139
 TGLEmbeddedViewer.cxx:140
 TGLEmbeddedViewer.cxx:141
 TGLEmbeddedViewer.cxx:142