// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

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

#ifndef ROOT_TEveGeoNode
#define ROOT_TEveGeoNode

#include "TEveElement.h"

class TGeoVolume;
class TGeoNode;
class TGeoHMatrix;
class TGeoManager;

// Added here to ease transition - forward declaration should be used.
// This include will be removed for 5.24.
#include <TEveGeoShape.h>
// class TGeoShape;

class TEveGeoShapeExtract;

//----------------------------------------------------------------

class TEveGeoNode : public TEveElement,
                    public TObject
{
   friend class TEveGeoNodeEditor;

   TEveGeoNode(const TEveGeoNode&);            // Not implemented
   TEveGeoNode& operator=(const TEveGeoNode&); // Not implemented

protected:
   TGeoNode *fNode;
   TEveGeoShapeExtract* DumpShapeTree(TEveGeoNode* geon, TEveGeoShapeExtract* parent=0, Bool_t leafs_only=kFALSE);

   static Int_t                  fgCSGExportNSeg;  //!
   static std::list<TGeoShape*>  fgTemporaryStore; //!

public:
   TEveGeoNode(TGeoNode* node);

   virtual TObject* GetObject(const TEveException&) const
   { const TObject* obj = this; return const_cast<TObject*>(obj); }

   virtual const char* GetName()  const;
   virtual const char* GetTitle() const;
   virtual const char* GetElementName()  const;
   virtual const char* GetElementTitle() const;

   TGeoNode* GetNode() const { return fNode; }

   virtual void   ExpandIntoListTree(TGListTree* ltree, TGListTreeItem* parent);

   virtual void   ExpandIntoListTrees();
   virtual void   ExpandIntoListTreesRecursively();

   virtual Bool_t CanEditElement() const { return kFALSE; }

   virtual void   AddStamp(UChar_t bits);

   virtual Bool_t CanEditMainColor() const;
   virtual void   SetMainColor(Color_t color);

   virtual Bool_t  CanEditMainTransparency() const;
   virtual Char_t  GetMainTransparency() const;
   virtual void    SetMainTransparency(Char_t t);

   void UpdateNode(TGeoNode* node);
   void UpdateVolume(TGeoVolume* volume);

   void Save(const char* file, const char* name="Extract", Bool_t leafs_only=kFALSE);
   void SaveExtract(const char* file, const char* name, Bool_t leafs_only);
   void WriteExtract(const char* name, Bool_t leafs_only);

   virtual void Draw(Option_t* option="");

   static Int_t GetCSGExportNSeg();
   static void  SetCSGExportNSeg(Int_t nseg);

   ClassDef(TEveGeoNode, 1); // Wrapper for TGeoNode that allows it to be shown in GUI and controlled as a TEveElement.
};

//----------------------------------------------------------------

class TEveGeoTopNode : public TEveGeoNode
{
   TEveGeoTopNode(const TEveGeoTopNode&);            // Not implemented
   TEveGeoTopNode& operator=(const TEveGeoTopNode&); // Not implemented

protected:
   TGeoManager* fManager;
   Int_t        fVisOption;
   Int_t        fVisLevel;
   Int_t        fMaxVisNodes;

public:
   TEveGeoTopNode(TGeoManager* manager, TGeoNode* node, Int_t visopt=1,
                  Int_t vislvl=3, Int_t maxvisnds=10000);
   virtual ~TEveGeoTopNode() {}

   void         UseNodeTrans();

   TGeoManager* GetGeoManager() const { return fManager; }

   Int_t GetVisOption()      const { return fVisOption; }
   void  SetVisOption(Int_t vo)    { fVisOption = vo;   }
   Int_t GetVisLevel()       const { return fVisLevel;  }
   void  SetVisLevel(Int_t vl)     { fVisLevel = vl;    }
   Int_t GetMaxVisNodes()    const { return fMaxVisNodes; }
   void  SetMaxVisNodes(Int_t mvn) { fMaxVisNodes = mvn;  }

   virtual Bool_t CanEditElement() const { return kTRUE; }
   virtual Bool_t SingleRnrState() const { return kTRUE; }

   virtual void   AddStamp(UChar_t bits);

   virtual void Draw(Option_t* option="");
   virtual void Paint(Option_t* option="");

   // Signals from GeoManager.
   // These are not available any more ... colors in list-tree not refreshed
   // properly.
   void VolumeVisChanged(TGeoVolume* volume);
   void VolumeColChanged(TGeoVolume* volume);
   void NodeVisChanged(TGeoNode* node);

   ClassDef(TEveGeoTopNode, 1); // Top-level TEveGeoNode with a pointer to TGeoManager and controls for steering of TGeoPainter.
};

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