3 #include "RenderElement.h"
4 #include "RGTopFrame.h"
8 #include <TGListTree.h>
15 //______________________________________________________________________
20 ClassImp(RenderElement)
22 RenderElement::RenderElement() :
27 fDestroyOnZeroRefCnt (kTRUE),
31 RenderElement::RenderElement(Color_t& main_color) :
33 fMainColorPtr (&main_color),
36 fDestroyOnZeroRefCnt (kTRUE),
40 RenderElement::~RenderElement()
42 static const Exc_t _eh("RenderElement::RenderElement ");
44 for(lpRE_i p=fParents.begin(); p!=fParents.end(); ++p) {
45 RenderElementListBase* l = dynamic_cast<RenderElementListBase*>(*p);
47 l->RemoveElementLocal(this);
51 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
52 i->fTree->DeleteItem(i->fItem);
53 gClient->NeedRedraw(i->fTree);
57 void RenderElement::Destroy()
59 static const Exc_t eH("RenderElement::Destroy ");
62 throw(eH + "this object is protected against destruction.");
64 gReve->PreDeleteRenderElement(this);
69 /**************************************************************************/
71 void RenderElement::AddParent(RenderElement* re)
73 fParents.push_back(re);
76 void RenderElement::RemoveParent(RenderElement* re)
78 static const Exc_t eH("RenderElement::RemoveParent ");
81 if(fParents.empty() && fDestroyOnZeroRefCnt) {
82 // TObject* tobj = GetObject(eH);
83 // Warning(eH.Data(), Form("auto-destructing '%s' on zero reference count.", tobj->GetName()));
84 gReve->PreDeleteRenderElement(this);
89 /**************************************************************************/
91 TObject* RenderElement::GetObject(Exc_t eh)
93 TObject* obj = dynamic_cast<TObject*>(this);
95 throw(eh + "not a TObject.");
99 /**************************************************************************/
101 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
102 TGListTreeItem* parent_lti)
104 static const Exc_t eH("RenderElement::AddIntoListTree ");
106 TObject* tobj = GetObject(eH);
107 TGListTreeItem* item = ltree->AddItem(parent_lti, tobj->GetName(), this,
109 gClient->NeedRedraw(ltree);
110 item->CheckItem(GetRnrElement());
112 if(fMainColorPtr != 0) item->SetColor(GetMainColor());
113 item->SetTipText(tobj->GetTitle());
115 fItems.insert(ListTreeInfo(ltree, item));
120 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
121 RenderElement* parent)
123 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(ltree) : 0;
124 return AddIntoListTree(ltree, parent_lti);
127 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree)
129 sLTI_i i = FindItem(ltree);
130 if(i != fItems.end()) {
131 ltree->DeleteItem(i->fItem);
133 gClient->NeedRedraw(ltree);
140 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree,
141 TGListTreeItem* parent_lti)
143 sLTI_i i = FindItem(ltree, parent_lti);
144 if(i != fItems.end()) {
145 ltree->DeleteItem(i->fItem);
147 gClient->NeedRedraw(ltree);
154 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree)
156 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
157 if(i->fTree == ltree)
162 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree,
163 TGListTreeItem* parent_lti)
165 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
166 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
171 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree)
173 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
174 if(i->fTree == ltree)
179 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree,
180 TGListTreeItem* parent_lti)
182 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
183 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
188 /**************************************************************************/
190 void RenderElement::UpdateItems()
192 static const Exc_t eH("RenderElement::UpdateItems ");
194 TObject* tobj = GetObject(eH);
195 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
196 i->fItem->Rename(tobj->GetName());
197 i->fItem->SetTipText(tobj->GetTitle());
198 i->fItem->CheckItem(fRnrElement);
199 if(fMainColorPtr != 0) i->fItem->SetColor(GetMainColor());
200 gClient->NeedRedraw(i->fTree);
204 /**************************************************************************/
206 void RenderElement::SpawnEditor()
208 gReve->EditRenderElement(this);
211 void RenderElement::ExportToCINT(Text_t* var_name)
213 static const Exc_t eH("RenderElement::ExportToCINT ");
215 const char* cname = IsA()->GetName();
216 gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, this));
219 /**************************************************************************/
221 void RenderElement::DumpSourceObject()
223 TObject* o = GetSourceObject();
225 printf("Source object not set.\n");
231 void RenderElement::InspectSourceObject()
233 TObject* o = GetSourceObject();
235 printf("Source object not set.\n");
241 /**************************************************************************/
243 void RenderElement::SetRnrElement(Bool_t rnr)
245 if(rnr != fRnrElement) {
247 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
248 if (i->fItem->IsChecked() != rnr) {
249 i->fItem->CheckItem(fRnrElement);
250 gClient->NeedRedraw(i->fTree);
256 /**************************************************************************/
258 void RenderElement::SetMainColor(Color_t color)
261 *fMainColorPtr = color;
262 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
263 if(i->fItem->GetColor() != color) {
264 i->fItem->SetColor(GetMainColor());
265 gClient->NeedRedraw(i->fTree);
271 void RenderElement::SetMainColor(Pixel_t pixel)
273 SetMainColor(Color_t(TColor::GetColor(pixel)));
276 /**************************************************************************/
277 /**************************************************************************/
279 ClassImp(RenderElementObjPtr)
281 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
287 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
288 RenderElement(mainColor),
293 RenderElementObjPtr::~RenderElementObjPtr()
299 /**************************************************************************/
301 TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
304 throw(eh + "fObject not set.");
308 void RenderElementObjPtr::ExportToCINT(Text_t* var_name)
310 static const Exc_t eH("RenderElementObjPtr::ExportToCINT ");
312 TObject* obj = GetObject(eH);
313 const char* cname = obj->IsA()->GetName();
314 gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, obj));
317 /**************************************************************************/
318 /**************************************************************************/
320 ClassImp(RenderElementListBase)
322 RenderElementListBase::~RenderElementListBase()
324 // Collapse all sub-trees
325 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
326 DestroyListSubTree(i->fTree, i->fItem);
327 // My own items removed in ~RenderElement
332 /**************************************************************************/
334 void RenderElementListBase::AddElement(RenderElement* el)
336 fChildren.push_back(el);
340 void RenderElementListBase::RemoveElement(RenderElement* el)
342 el->RemoveParent(this);
343 RemoveElementLocal(el);
346 void RenderElementListBase::RemoveElementLocal(RenderElement* el)
348 fChildren.remove(el);
351 void RenderElementListBase::RemoveElements()
353 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
354 (*i)->RemoveParent(this);
359 /**************************************************************************/
361 void RenderElementListBase::DestroyElements()
363 static const Exc_t eH("RenderElementListBase::DestroyElements ");
365 while( ! fChildren.empty()) {
366 RenderElement* c = fChildren.front();
371 Warning(eH.Data(), Form("element destruction failed: '%s'.", exc.Data()));
377 /**************************************************************************/
379 Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
380 TGListTreeItem* parent)
382 // Populates parent with elements.
383 // parent must be an already existing representation of *this*.
384 // Returns number of inserted elements.
385 // If parent already has children, it does nothing.
387 // RnrEl can be inserted in a list-tree several times, thus we can not
388 // search through fItems to get parent here.
389 // Anyhow, it is probably known as it must have been selected by the user.
391 if(parent->GetFirstChild() != 0)
394 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
395 (*i)->AddIntoListTree(ltree, parent);
401 Int_t RenderElementListBase::DestroyListSubTree(TGListTree* ltree,
402 TGListTreeItem* parent)
405 TGListTreeItem* i = parent->GetFirstChild();
407 n += DestroyListSubTree(ltree, i);
408 RenderElement* re = (RenderElement*) i->GetUserData();
409 i = i->GetNextSibling();
410 re->RemoveFromListTree(ltree, parent);
415 /**************************************************************************/
417 void RenderElementListBase::EnableListElements()
419 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
420 (*i)->SetRnrElement(kTRUE);
423 void RenderElementListBase::DisableListElements()
425 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
426 (*i)->SetRnrElement(kFALSE);
429 /**************************************************************************/
431 void RenderElementListBase::SetMainColor(Color_t col)
433 Color_t oldcol = GetMainColor();
434 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
435 if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
437 RenderElement::SetMainColor(col);
440 void RenderElementListBase::SetMainColor(Pixel_t pixel)
442 // This one needed for proper calling via CINT (signals).
444 SetMainColor(Color_t(TColor::GetColor(pixel)));
447 /**************************************************************************/
449 void RenderElementListBase::PaintElements(Option_t* option)
452 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
453 if((*i)->GetRnrElement())
454 (*i)->GetObject()->Paint(option);
459 /**************************************************************************/
460 /**************************************************************************/
462 ClassImp(RenderElementList)
464 RenderElementList::RenderElementList(const Text_t* n, const Text_t* t, Bool_t doColor) :
465 RenderElementListBase(),
471 SetMainColorPtr(&fColor);
475 /**************************************************************************/
476 /**************************************************************************/
477 /**************************************************************************/
479 ClassImp(ReferenceBackPtr)
481 ReferenceBackPtr::ReferenceBackPtr() :
486 ReferenceBackPtr::~ReferenceBackPtr()
488 // !!!! Complain if list not empty.
491 ReferenceBackPtr::ReferenceBackPtr(const ReferenceBackPtr&) :
496 ReferenceBackPtr& ReferenceBackPtr::operator=(const ReferenceBackPtr&)
501 /**************************************************************************/
503 void ReferenceBackPtr::IncRefCount(RenderElement* re)
505 ReferenceCount::IncRefCount();
506 fBackRefs.push_back(re);
509 void ReferenceBackPtr::DecRefCount(RenderElement* re)
511 static const Exc_t eH("ReferenceBackPtr::DecRefCount ");
513 std::list<RenderElement*>::iterator i =
514 std::find(fBackRefs.begin(), fBackRefs.end(), re);
515 if (i != fBackRefs.end()) {
517 ReferenceCount::DecRefCount();
519 Warning(eH, Form("render element '%s' not found in back-refs.",
520 re->GetObject()->GetName()));