Implemented dtor for RenderElement removing all instances from browsers.
[u/mrichter/AliRoot.git] / EVE / Reve / RenderElement.cxx
1 // $Header$
2
3 #include "RenderElement.h"
4 #include "RGTopFrame.h"
5
6 #include <TColor.h>
7 #include <TCanvas.h>
8 #include <TGListTree.h>
9 #include <THashList.h>
10
11 using namespace Reve;
12 using namespace Reve;
13
14 //______________________________________________________________________
15 // Reve
16 //
17
18 ClassImp(RenderElement)
19
20 RenderElement::RenderElement()
21 {
22   fRnrElement    = kTRUE;
23   fMainColorPtr  = 0;
24 }
25
26 RenderElement::RenderElement(Color_t& main_color) : fMainColorPtr(&main_color)
27 {
28   fRnrElement    = kTRUE;
29 }
30
31 RenderElement::~RenderElement()
32 {
33   for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
34     i->fTree->DeleteItem(i->fItem);
35     gClient->NeedRedraw(i->fTree);
36   }
37 }
38
39 /**************************************************************************/
40
41 TObject* RenderElement::GetObject(Exc_t eh)
42 {
43   TObject* obj = dynamic_cast<TObject*>(this);
44   if(obj == 0)
45     throw(eh + "not a TObject.");
46   return obj;
47 }
48
49 /**************************************************************************/
50
51 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
52                                                TGListTreeItem* parent)
53 {
54   static const Exc_t eH("RenderElement::AddIntoListTree ");
55
56   TObject* tobj = GetObject(eH);
57   TGListTreeItem* item = ltree->AddItem(parent, tobj->GetName(), this,
58                                         0, 0, kTRUE);
59   item->CheckItem(GetRnrElement());
60   if(fMainColorPtr != 0) item->SetColor(GetMainColor());
61   item->SetTipText(tobj->GetTitle());
62
63   fItems.insert(ListTreeInfo(ltree, item));
64
65   return item;
66 }
67
68 /**************************************************************************/
69
70 void RenderElement::FullUpdate()
71 {
72   for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
73     // Setup name and title/tooltip? Need update calls from setname/title as well.
74     i->fItem->CheckItem(fRnrElement);
75     if(fMainColorPtr != 0) i->fItem->SetColor(GetMainColor());
76   }
77   gReve->Redraw3D();
78   gReve->NotifyBrowser();
79 }
80
81 /**************************************************************************/
82
83 void RenderElement::SpawnEditor()
84 {
85   // Here spawn a sub-class of TGedFrame with special UpdateMethod.
86   gReve->EditRenderElement(this);
87 }
88
89 void RenderElement::ExportToCINT(Text_t* var_name)
90 {
91   static const Exc_t eH("RenderElement::ExportToCINT ");
92
93   TObject* obj = GetObject(eH);
94   const char* cname = obj->IsA()->GetName();
95   gROOT->ProcessLine(Form("%s* %s = (%s*) %p;", cname, var_name, cname, obj));
96 }
97
98 /**************************************************************************/
99 /*
100 void RenderElement::DumpSourceObject()
101 {
102   TObject* o = GetSourceObject();
103   if(o == 0) {
104     printf("Source object not set.\n");
105   } else {
106     o->Dump();
107   }
108 }
109
110 void RenderElement::InspectSourceObject()
111 {
112   TObject* o = GetSourceObject();
113   if(o == 0) {
114     printf("Source object not set.\n");
115   } else {
116     o->Inspect();
117   }
118 }
119 */
120 /**************************************************************************/
121
122 void RenderElement::SetRnrElement(Bool_t rnr)
123 {
124   if(rnr != fRnrElement) {
125     fRnrElement = rnr;
126     FullUpdate();
127   }
128 }
129
130 /**************************************************************************/
131
132 void RenderElement::SetMainColor(Color_t color)
133 {
134   if (fMainColorPtr) {
135     *fMainColorPtr = color;
136     FullUpdate();
137   }
138 }
139
140 void RenderElement::SetMainColorByPixel(Pixel_t pixel)
141 {
142   SetMainColor(Color_t(TColor::GetColor(pixel)));
143 }
144
145 /**************************************************************************/
146 /**************************************************************************/
147
148 ClassImp(RenderElementObjPtr)
149
150 RenderElementObjPtr::RenderElementObjPtr(TObject* obj) :
151   RenderElement(),
152   fObject(obj)  
153 {}
154
155 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor) :
156   RenderElement(mainColor),
157   fObject(obj)  
158 {}
159
160 RenderElementObjPtr::~RenderElementObjPtr()
161 {
162   delete fObject;
163 }
164
165 /**************************************************************************/
166
167 TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
168 {
169   if(fObject == 0)
170     throw(eh + "fObject not set.");
171   return fObject;
172 }
173
174 void RenderElementObjPtr::SetRnrElement(Bool_t rnr)
175 {
176   if(rnr != fRnrElement) {
177     fRnrElement = rnr;
178     if(rnr) {
179       gReve->GetCC()->GetListOfPrimitives()->Add(fObject);
180     } else {
181       gReve->GetCC()->GetListOfPrimitives()->Remove(fObject);
182     }
183     FullUpdate();
184   }
185 }
186
187 /**************************************************************************/
188 /**************************************************************************/
189
190 ClassImp(RenderElementListBase)
191
192 Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
193                                                 TGListTreeItem* parent)
194 {
195   // Populates parent with elements.
196   // parent must be an already existing representation of *this*.
197   // Returns number of inserted elements.
198   // If parent already has children, it does nothing.
199   //
200   // RnrEl can be inserted in a list-tree several times, thus we can not
201   // search through fItems to get parent here.
202   // Anyhow, it is probably known as it must have been selected by the user.
203
204   if(parent->GetFirstChild() != 0)
205     return 0;
206   Int_t n = 0;
207   for(lpRE_i i=fList.begin(); i!=fList.end(); ++i) {
208     (*i)->AddIntoListTree(ltree, parent);
209     ++n;
210   }
211   return n;
212 }
213
214 /**************************************************************************/
215
216 void RenderElementListBase::EnableListElements()
217 {
218   for(lpRE_i i=fList.begin(); i!=fList.end(); ++i)
219     (*i)->SetRnrElement(kTRUE);
220 }
221
222 void RenderElementListBase::DisableListElements()
223 {
224   for(lpRE_i i=fList.begin(); i!=fList.end(); ++i)
225     (*i)->SetRnrElement(kFALSE);
226 }
227
228 /**************************************************************************/
229
230 void RenderElementListBase::SetMainColor(Color_t col)
231 {
232   Color_t oldcol = GetMainColor();
233   for(lpRE_i i=fList.begin(); i!=fList.end(); ++i) {
234     if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
235   }
236   RenderElement::SetMainColor(col);
237 }
238
239 void RenderElementListBase::SetMainColor(Pixel_t pixel)
240 {
241   // This one needed for proper calling via CINT (signals).
242
243   SetMainColor(Color_t(TColor::GetColor(pixel)));
244 }
245
246 /**************************************************************************/
247
248 void RenderElementListBase::PaintElements(Option_t* option)
249 {
250   if(fRnrElement) {
251     for(lpRE_i i=fList.begin(); i!=fList.end(); ++i) {
252       if((*i)->GetRnrElement())
253         (*i)->GetObject()->Paint(option);
254     }
255   }
256 }
257
258 /**************************************************************************/
259 /**************************************************************************/
260
261 ClassImp(RenderElementList)