]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Reve/RenderElement.cxx
Changed inheritance to include Reve::RenderElement; use ZTrans to store transformatio...
[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
13 //______________________________________________________________________
14 // RenderElement
15 //
16 //
17
18 ClassImp(RenderElement)
19
20 RenderElement::RenderElement() :
21   fRnrElement          (kTRUE),
22   fMainColorPtr        (0),
23   fItems               (),
24   fParents             (),
25   fDestroyOnZeroRefCnt (kTRUE),
26   fDenyDestroy         (kFALSE)
27 {}
28
29 RenderElement::RenderElement(Color_t& main_color) :
30   fRnrElement          (kTRUE),
31   fMainColorPtr        (&main_color),
32   fItems               (),
33   fParents             (),
34   fDestroyOnZeroRefCnt (kTRUE),
35   fDenyDestroy         (kFALSE)
36 {}
37
38 RenderElement::~RenderElement()
39 {
40   static const Exc_t _eh("RenderElement::RenderElement ");
41
42   for(lpRE_i p=fParents.begin(); p!=fParents.end(); ++p) {
43     RenderElementListBase* l = dynamic_cast<RenderElementListBase*>(*p);
44     if(l)
45       l->RemoveElementLocal(this);
46   }
47   fParents.clear();
48
49   for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
50     i->fTree->DeleteItem(i->fItem);
51     gClient->NeedRedraw(i->fTree);
52   }
53 }
54
55 void RenderElement::Destroy()
56 {
57   static const Exc_t eH("RenderElement::Destroy ");
58
59   if(fDenyDestroy)
60     throw(eH + "this object is protected against destruction.");
61
62   gReve->PreDeleteRenderElement(this);
63   delete this;
64   gReve->Redraw3D();
65 }
66
67 /**************************************************************************/
68
69 void RenderElement::AddParent(RenderElement* re)
70 {
71   fParents.push_back(re);
72 }
73
74 void RenderElement::RemoveParent(RenderElement* re)
75 {
76   static const Exc_t eH("RenderElement::RemoveParent ");
77
78   fParents.remove(re);
79   if(fParents.empty() && fDestroyOnZeroRefCnt) {
80     // TObject* tobj = GetObject(eH);
81     // Warning(eH.Data(), Form("auto-destructing '%s' on zero reference count.", tobj->GetName()));
82     gReve->PreDeleteRenderElement(this);
83     delete this;
84   }
85 }
86
87 /**************************************************************************/
88
89 TObject* RenderElement::GetObject(Exc_t eh)
90 {
91   TObject* obj = dynamic_cast<TObject*>(this);
92   if(obj == 0)
93     throw(eh + "not a TObject.");
94   return obj;
95 }
96
97 /**************************************************************************/
98
99 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
100                                                TGListTreeItem* parent_lti)
101 {
102   static const Exc_t eH("RenderElement::AddIntoListTree ");
103
104   TObject* tobj = GetObject(eH);
105   TGListTreeItem* item = ltree->AddItem(parent_lti, tobj->GetName(), this,
106                                         0, 0, kTRUE);
107   gClient->NeedRedraw(ltree);
108   item->CheckItem(GetRnrElement());
109   
110   if(fMainColorPtr != 0) item->SetColor(GetMainColor());
111   item->SetTipText(tobj->GetTitle());
112
113   fItems.insert(ListTreeInfo(ltree, item));
114
115   return item;
116 }
117
118 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
119                                                RenderElement* parent)
120 {
121   TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(ltree) : 0;
122   return AddIntoListTree(ltree, parent_lti);
123 }
124
125 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree)
126 {
127   sLTI_i i = FindItem(ltree);
128   if(i != fItems.end()) {
129     ltree->DeleteItem(i->fItem);
130     fItems.erase(i);
131     gClient->NeedRedraw(ltree);
132     return kTRUE;
133   } else {
134     return kFALSE;
135   }
136 }
137
138 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree,
139                                          TGListTreeItem* parent_lti)
140 {
141   sLTI_i i = FindItem(ltree, parent_lti);
142   if(i != fItems.end()) {
143     ltree->DeleteItem(i->fItem);
144     fItems.erase(i);
145     gClient->NeedRedraw(ltree);
146     return kTRUE;
147   } else {
148     return kFALSE;
149   }
150 }
151
152 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree)
153 {
154   for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
155     if(i->fTree == ltree)
156       return i;
157   return fItems.end();
158 }
159
160 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree,
161                                               TGListTreeItem* parent_lti)
162 {
163   for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
164     if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
165       return i;
166   return fItems.end();
167 }
168
169 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree)
170 {
171   for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
172     if(i->fTree == ltree)
173       return i->fItem;
174   return 0;
175 }
176
177 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree,
178                                                 TGListTreeItem* parent_lti)
179 {
180   for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
181     if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
182       return i->fItem;
183   return 0;
184 }
185
186 /**************************************************************************/
187
188 void RenderElement::UpdateItems()
189 {
190   static const Exc_t eH("RenderElement::UpdateItems ");
191
192   TObject* tobj = GetObject(eH);
193   for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
194     i->fItem->Rename(tobj->GetName());
195     i->fItem->SetTipText(tobj->GetTitle());
196     i->fItem->CheckItem(fRnrElement);
197     if(fMainColorPtr != 0) i->fItem->SetColor(GetMainColor());
198     gClient->NeedRedraw(i->fTree);
199   }
200 }
201
202 /**************************************************************************/
203
204 void RenderElement::SpawnEditor()
205 {
206   gReve->EditRenderElement(this);
207 }
208
209 void RenderElement::ExportToCINT(Text_t* var_name)
210 {
211   static const Exc_t eH("RenderElement::ExportToCINT ");
212
213   const char* cname = IsA()->GetName();
214   gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, this));
215 }
216
217 /**************************************************************************/
218 /*
219 void RenderElement::DumpSourceObject()
220 {
221   TObject* o = GetSourceObject();
222   if(o == 0) {
223     printf("Source object not set.\n");
224   } else {
225     o->Dump();
226   }
227 }
228
229 void RenderElement::InspectSourceObject()
230 {
231   TObject* o = GetSourceObject();
232   if(o == 0) {
233     printf("Source object not set.\n");
234   } else {
235     o->Inspect();
236   }
237 }
238 */
239 /**************************************************************************/
240
241 void RenderElement::SetRnrElement(Bool_t rnr)
242 {
243   if(rnr != fRnrElement) {
244     fRnrElement = rnr;
245     for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
246       if (i->fItem->IsChecked() != rnr) {
247         i->fItem->CheckItem(fRnrElement);
248         gClient->NeedRedraw(i->fTree);
249       }
250     }
251   }
252 }
253
254 /**************************************************************************/
255
256 void RenderElement::SetMainColor(Color_t color)
257 {
258   if (fMainColorPtr) {
259     *fMainColorPtr = color;
260     for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
261       if(i->fItem->GetColor() != color) {
262         i->fItem->SetColor(GetMainColor());
263         gClient->NeedRedraw(i->fTree);
264       }
265     }
266   }
267 }
268
269 void RenderElement::SetMainColor(Pixel_t pixel)
270 {
271   SetMainColor(Color_t(TColor::GetColor(pixel)));
272 }
273
274 /**************************************************************************/
275 /**************************************************************************/
276
277 ClassImp(RenderElementObjPtr)
278
279 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
280   RenderElement(),
281   fObject(obj),
282   fOwnObject(own)
283 {}
284
285 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
286   RenderElement(mainColor),
287   fObject(obj),
288   fOwnObject(own)
289 {}
290
291 RenderElementObjPtr::~RenderElementObjPtr()
292 {
293   if(fOwnObject)
294     delete fObject;
295 }
296
297 /**************************************************************************/
298
299 TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
300 {
301   if(fObject == 0)
302     throw(eh + "fObject not set.");
303   return fObject;
304 }
305
306 void RenderElementObjPtr::ExportToCINT(Text_t* var_name)
307 {
308   static const Exc_t eH("RenderElementObjPtr::ExportToCINT ");
309
310   TObject* obj = GetObject(eH);
311   const char* cname = obj->IsA()->GetName();
312   gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, obj));
313 }
314
315 /**************************************************************************/
316 /**************************************************************************/
317
318 ClassImp(RenderElementListBase)
319
320 RenderElementListBase::~RenderElementListBase()
321 {
322   // Collapse all sub-trees
323   for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
324     DestroyListSubTree(i->fTree, i->fItem);
325     // My own items removed in ~RenderElement
326   }
327   RemoveElements();
328 }
329
330 /**************************************************************************/
331
332 void RenderElementListBase::AddElement(RenderElement* el)
333 {
334   fChildren.push_back(el);
335   el->AddParent(this);
336 }
337
338 void RenderElementListBase::RemoveElement(RenderElement* el)
339 {
340   el->RemoveParent(this);
341   RemoveElementLocal(el);
342 }
343
344 void RenderElementListBase::RemoveElementLocal(RenderElement* el)
345 {
346   fChildren.remove(el);
347 }
348
349 void RenderElementListBase::RemoveElements()
350 {
351   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
352     (*i)->RemoveParent(this);
353   }
354   fChildren.clear();
355 }
356
357 /**************************************************************************/
358
359 void RenderElementListBase::DestroyElements()
360 {
361   static const Exc_t eH("RenderElementListBase::DestroyElements ");
362
363   while( ! fChildren.empty()) {
364     RenderElement* c = fChildren.front();
365     try {
366       c->Destroy();
367     }
368     catch(Exc_t exc) {
369       Warning(eH.Data(), Form("element destruction failed: '%s'.", exc.Data()));
370       RemoveElement(c);
371     }
372   }
373 }
374
375 /**************************************************************************/
376
377 Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
378                                                 TGListTreeItem* parent)
379 {
380   // Populates parent with elements.
381   // parent must be an already existing representation of *this*.
382   // Returns number of inserted elements.
383   // If parent already has children, it does nothing.
384   //
385   // RnrEl can be inserted in a list-tree several times, thus we can not
386   // search through fItems to get parent here.
387   // Anyhow, it is probably known as it must have been selected by the user.
388
389   if(parent->GetFirstChild() != 0)
390     return 0;
391   Int_t n = 0;
392   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
393     (*i)->AddIntoListTree(ltree, parent);
394     ++n;
395   }
396   return n;
397 }
398
399 Int_t RenderElementListBase::DestroyListSubTree(TGListTree* ltree,
400                                                 TGListTreeItem* parent)
401 {
402   Int_t n = 0;
403   TGListTreeItem* i = parent->GetFirstChild();
404   while(i != 0) {
405     n += DestroyListSubTree(ltree, i);
406     RenderElement* re = (RenderElement*) i->GetUserData();
407     i = i->GetNextSibling();
408     re->RemoveFromListTree(ltree, parent);
409   }
410   return n;
411 }
412
413 /**************************************************************************/
414
415 void RenderElementListBase::EnableListElements()
416 {
417   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
418     (*i)->SetRnrElement(kTRUE);
419 }
420
421 void RenderElementListBase::DisableListElements()
422 {
423   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
424     (*i)->SetRnrElement(kFALSE);
425 }
426
427 /**************************************************************************/
428
429 void RenderElementListBase::SetMainColor(Color_t col)
430 {
431   Color_t oldcol = GetMainColor();
432   for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
433     if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
434   }
435   RenderElement::SetMainColor(col);
436 }
437
438 void RenderElementListBase::SetMainColor(Pixel_t pixel)
439 {
440   // This one needed for proper calling via CINT (signals).
441
442   SetMainColor(Color_t(TColor::GetColor(pixel)));
443 }
444
445 /**************************************************************************/
446
447 void RenderElementListBase::PaintElements(Option_t* option)
448 {
449   if(fRnrElement) {
450     for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
451       if((*i)->GetRnrElement())
452         (*i)->GetObject()->Paint(option);
453     }
454   }
455 }
456
457 /**************************************************************************/
458 /**************************************************************************/
459
460 ClassImp(RenderElementList)
461
462 RenderElementList::RenderElementList(const Text_t* n, const Text_t* t, Bool_t doColor) :
463   RenderElementListBase(),
464   TNamed(n, t),
465   fColor(0),
466   fDoColor(doColor)
467 {
468   if(fDoColor) {
469     SetMainColorPtr(&fColor);
470   }
471 }