3 #include "RenderElement.h"
4 #include "RGTopFrame.h"
8 #include <TGListTree.h>
13 //______________________________________________________________________
18 ClassImp(RenderElement)
20 RenderElement::RenderElement() :
25 fDestroyOnZeroRefCnt (kTRUE),
29 RenderElement::RenderElement(Color_t& main_color) :
31 fMainColorPtr (&main_color),
34 fDestroyOnZeroRefCnt (kTRUE),
38 RenderElement::~RenderElement()
40 static const Exc_t _eh("RenderElement::RenderElement ");
42 for(lpRE_i p=fParents.begin(); p!=fParents.end(); ++p) {
43 RenderElementListBase* l = dynamic_cast<RenderElementListBase*>(*p);
45 l->RemoveElementLocal(this);
49 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
50 i->fTree->DeleteItem(i->fItem);
51 gClient->NeedRedraw(i->fTree);
55 void RenderElement::Destroy()
57 static const Exc_t eH("RenderElement::Destroy ");
60 throw(eH + "this object is protected against destruction.");
62 gReve->PreDeleteRenderElement(this);
67 /**************************************************************************/
69 void RenderElement::AddParent(RenderElement* re)
71 fParents.push_back(re);
74 void RenderElement::RemoveParent(RenderElement* re)
76 static const Exc_t eH("RenderElement::RemoveParent ");
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);
87 /**************************************************************************/
89 TObject* RenderElement::GetObject(Exc_t eh)
91 TObject* obj = dynamic_cast<TObject*>(this);
93 throw(eh + "not a TObject.");
97 /**************************************************************************/
99 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
100 TGListTreeItem* parent_lti)
102 static const Exc_t eH("RenderElement::AddIntoListTree ");
104 TObject* tobj = GetObject(eH);
105 TGListTreeItem* item = ltree->AddItem(parent_lti, tobj->GetName(), this,
107 gClient->NeedRedraw(ltree);
108 item->CheckItem(GetRnrElement());
110 if(fMainColorPtr != 0) item->SetColor(GetMainColor());
111 item->SetTipText(tobj->GetTitle());
113 fItems.insert(ListTreeInfo(ltree, item));
118 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
119 RenderElement* parent)
121 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(ltree) : 0;
122 return AddIntoListTree(ltree, parent_lti);
125 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree)
127 sLTI_i i = FindItem(ltree);
128 if(i != fItems.end()) {
129 ltree->DeleteItem(i->fItem);
131 gClient->NeedRedraw(ltree);
138 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree,
139 TGListTreeItem* parent_lti)
141 sLTI_i i = FindItem(ltree, parent_lti);
142 if(i != fItems.end()) {
143 ltree->DeleteItem(i->fItem);
145 gClient->NeedRedraw(ltree);
152 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree)
154 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
155 if(i->fTree == ltree)
160 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree,
161 TGListTreeItem* parent_lti)
163 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
164 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
169 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree)
171 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
172 if(i->fTree == ltree)
177 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree,
178 TGListTreeItem* parent_lti)
180 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
181 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
186 /**************************************************************************/
188 void RenderElement::UpdateItems()
190 static const Exc_t eH("RenderElement::UpdateItems ");
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);
202 /**************************************************************************/
204 void RenderElement::SpawnEditor()
206 gReve->EditRenderElement(this);
209 void RenderElement::ExportToCINT(Text_t* var_name)
211 static const Exc_t eH("RenderElement::ExportToCINT ");
213 const char* cname = IsA()->GetName();
214 gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, this));
217 /**************************************************************************/
219 void RenderElement::DumpSourceObject()
221 TObject* o = GetSourceObject();
223 printf("Source object not set.\n");
229 void RenderElement::InspectSourceObject()
231 TObject* o = GetSourceObject();
233 printf("Source object not set.\n");
239 /**************************************************************************/
241 void RenderElement::SetRnrElement(Bool_t rnr)
243 if(rnr != fRnrElement) {
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);
254 /**************************************************************************/
256 void RenderElement::SetMainColor(Color_t color)
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);
269 void RenderElement::SetMainColor(Pixel_t pixel)
271 SetMainColor(Color_t(TColor::GetColor(pixel)));
274 /**************************************************************************/
275 /**************************************************************************/
277 ClassImp(RenderElementObjPtr)
279 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
285 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
286 RenderElement(mainColor),
291 RenderElementObjPtr::~RenderElementObjPtr()
297 /**************************************************************************/
299 TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
302 throw(eh + "fObject not set.");
306 void RenderElementObjPtr::ExportToCINT(Text_t* var_name)
308 static const Exc_t eH("RenderElementObjPtr::ExportToCINT ");
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));
315 /**************************************************************************/
316 /**************************************************************************/
318 ClassImp(RenderElementListBase)
320 RenderElementListBase::~RenderElementListBase()
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
330 /**************************************************************************/
332 void RenderElementListBase::AddElement(RenderElement* el)
334 fChildren.push_back(el);
338 void RenderElementListBase::RemoveElement(RenderElement* el)
340 el->RemoveParent(this);
341 RemoveElementLocal(el);
344 void RenderElementListBase::RemoveElementLocal(RenderElement* el)
346 fChildren.remove(el);
349 void RenderElementListBase::RemoveElements()
351 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
352 (*i)->RemoveParent(this);
357 /**************************************************************************/
359 void RenderElementListBase::DestroyElements()
361 static const Exc_t eH("RenderElementListBase::DestroyElements ");
363 while( ! fChildren.empty()) {
364 RenderElement* c = fChildren.front();
369 Warning(eH.Data(), Form("element destruction failed: '%s'.", exc.Data()));
375 /**************************************************************************/
377 Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
378 TGListTreeItem* parent)
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.
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.
389 if(parent->GetFirstChild() != 0)
392 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
393 (*i)->AddIntoListTree(ltree, parent);
399 Int_t RenderElementListBase::DestroyListSubTree(TGListTree* ltree,
400 TGListTreeItem* parent)
403 TGListTreeItem* i = parent->GetFirstChild();
405 n += DestroyListSubTree(ltree, i);
406 RenderElement* re = (RenderElement*) i->GetUserData();
407 i = i->GetNextSibling();
408 re->RemoveFromListTree(ltree, parent);
413 /**************************************************************************/
415 void RenderElementListBase::EnableListElements()
417 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
418 (*i)->SetRnrElement(kTRUE);
421 void RenderElementListBase::DisableListElements()
423 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
424 (*i)->SetRnrElement(kFALSE);
427 /**************************************************************************/
429 void RenderElementListBase::SetMainColor(Color_t col)
431 Color_t oldcol = GetMainColor();
432 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
433 if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
435 RenderElement::SetMainColor(col);
438 void RenderElementListBase::SetMainColor(Pixel_t pixel)
440 // This one needed for proper calling via CINT (signals).
442 SetMainColor(Color_t(TColor::GetColor(pixel)));
445 /**************************************************************************/
447 void RenderElementListBase::PaintElements(Option_t* option)
450 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
451 if((*i)->GetRnrElement())
452 (*i)->GetObject()->Paint(option);
457 /**************************************************************************/
458 /**************************************************************************/
460 ClassImp(RenderElementList)
462 RenderElementList::RenderElementList(const Text_t* n, const Text_t* t, Bool_t doColor) :
463 RenderElementListBase(),
469 SetMainColorPtr(&fColor);