3 #include "RenderElement.h"
4 #include "RGTopFrame.h"
8 #include <TGListTree.h>
13 //______________________________________________________________________
18 ClassImp(RenderElement)
20 RenderElement::RenderElement() :
23 fDestroyOnZeroRefCnt (kTRUE),
27 RenderElement::RenderElement(Color_t& main_color) :
29 fMainColorPtr (&main_color),
30 fDestroyOnZeroRefCnt (kTRUE),
34 RenderElement::~RenderElement()
36 static const Exc_t _eh("RenderElement::RenderElement ");
38 for(lpRE_i p=fParents.begin(); p!=fParents.end(); ++p) {
39 RenderElementListBase* l = dynamic_cast<RenderElementListBase*>(*p);
41 l->RemoveElementLocal(this);
45 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
46 i->fTree->DeleteItem(i->fItem);
47 gClient->NeedRedraw(i->fTree);
51 void RenderElement::Destroy()
53 static const Exc_t eH("RenderElement::Destroy ");
56 throw(eH + "this object is protected against destruction.");
62 /**************************************************************************/
64 void RenderElement::AddParent(RenderElement* re)
66 fParents.push_back(re);
69 void RenderElement::RemoveParent(RenderElement* re)
71 static const Exc_t eH("RenderElement::RemoveParent ");
74 if(fParents.empty() && fDestroyOnZeroRefCnt) {
75 // TObject* tobj = GetObject(eH);
76 // Warning(eH.Data(), Form("auto-destructing '%s' on zero reference count.", tobj->GetName()));
81 /**************************************************************************/
83 TObject* RenderElement::GetObject(Exc_t eh)
85 TObject* obj = dynamic_cast<TObject*>(this);
87 throw(eh + "not a TObject.");
91 /**************************************************************************/
93 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
94 TGListTreeItem* parent_lti)
96 static const Exc_t eH("RenderElement::AddIntoListTree ");
98 TObject* tobj = GetObject(eH);
99 TGListTreeItem* item = ltree->AddItem(parent_lti, tobj->GetName(), this,
101 gClient->NeedRedraw(ltree);
102 item->CheckItem(GetRnrElement());
104 if(fMainColorPtr != 0) item->SetColor(GetMainColor());
105 item->SetTipText(tobj->GetTitle());
107 fItems.insert(ListTreeInfo(ltree, item));
112 TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
113 RenderElement* parent)
115 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(ltree) : 0;
116 return AddIntoListTree(ltree, parent_lti);
119 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree)
121 sLTI_i i = FindItem(ltree);
122 if(i != fItems.end()) {
123 ltree->DeleteItem(i->fItem);
125 gClient->NeedRedraw(ltree);
132 Bool_t RenderElement::RemoveFromListTree(TGListTree* ltree,
133 TGListTreeItem* parent_lti)
135 sLTI_i i = FindItem(ltree, parent_lti);
136 if(i != fItems.end()) {
137 ltree->DeleteItem(i->fItem);
139 gClient->NeedRedraw(ltree);
146 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree)
148 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
149 if(i->fTree == ltree)
154 RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree,
155 TGListTreeItem* parent_lti)
157 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
158 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
163 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree)
165 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
166 if(i->fTree == ltree)
171 TGListTreeItem* RenderElement::FindListTreeItem(TGListTree* ltree,
172 TGListTreeItem* parent_lti)
174 for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
175 if(i->fTree == ltree && i->fItem->GetParent() == parent_lti)
180 /**************************************************************************/
182 void RenderElement::UpdateItems()
184 static const Exc_t eH("RenderElement::UpdateItems ");
186 TObject* tobj = GetObject(eH);
187 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
188 i->fItem->Rename(tobj->GetName());
189 i->fItem->SetTipText(tobj->GetTitle());
190 i->fItem->CheckItem(fRnrElement);
191 if(fMainColorPtr != 0) i->fItem->SetColor(GetMainColor());
192 gClient->NeedRedraw(i->fTree);
194 gReve->Redraw3D(); // This will go away once editor can notify ALL changes.
197 /**************************************************************************/
199 void RenderElement::SpawnEditor()
201 // Here spawn a sub-class of TGedFrame with special UpdateMethod.
202 gReve->EditRenderElement(this);
205 void RenderElement::ExportToCINT(Text_t* var_name)
207 static const Exc_t eH("RenderElement::ExportToCINT ");
209 TObject* obj = GetObject(eH);
210 const char* cname = obj->IsA()->GetName();
211 gROOT->ProcessLine(Form("%s* %s = (%s*) %p;", cname, var_name, cname, obj));
214 /**************************************************************************/
216 void RenderElement::DumpSourceObject()
218 TObject* o = GetSourceObject();
220 printf("Source object not set.\n");
226 void RenderElement::InspectSourceObject()
228 TObject* o = GetSourceObject();
230 printf("Source object not set.\n");
236 /**************************************************************************/
238 void RenderElement::SetRnrElement(Bool_t rnr)
240 if(rnr != fRnrElement) {
246 /**************************************************************************/
248 void RenderElement::SetMainColor(Color_t color)
251 *fMainColorPtr = color;
256 void RenderElement::SetMainColor(Pixel_t pixel)
258 SetMainColor(Color_t(TColor::GetColor(pixel)));
261 /**************************************************************************/
262 /**************************************************************************/
264 ClassImp(RenderElementObjPtr)
266 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
272 RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
273 RenderElement(mainColor),
278 RenderElementObjPtr::~RenderElementObjPtr()
284 /**************************************************************************/
286 TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
289 throw(eh + "fObject not set.");
293 /**************************************************************************/
294 /**************************************************************************/
296 ClassImp(RenderElementListBase)
298 RenderElementListBase::~RenderElementListBase()
300 // Collapse all sub-trees
301 for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
302 DestroyListSubTree(i->fTree, i->fItem);
303 // My own items removed in ~RenderElement
308 /**************************************************************************/
310 void RenderElementListBase::AddElement(RenderElement* el)
312 fChildren.push_back(el);
316 void RenderElementListBase::RemoveElement(RenderElement* el)
318 el->RemoveParent(this);
319 RemoveElementLocal(el);
322 void RenderElementListBase::RemoveElementLocal(RenderElement* el)
324 fChildren.remove(el);
327 void RenderElementListBase::RemoveElements()
329 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
330 (*i)->RemoveParent(this);
335 /**************************************************************************/
337 Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
338 TGListTreeItem* parent)
340 // Populates parent with elements.
341 // parent must be an already existing representation of *this*.
342 // Returns number of inserted elements.
343 // If parent already has children, it does nothing.
345 // RnrEl can be inserted in a list-tree several times, thus we can not
346 // search through fItems to get parent here.
347 // Anyhow, it is probably known as it must have been selected by the user.
349 if(parent->GetFirstChild() != 0)
352 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
353 (*i)->AddIntoListTree(ltree, parent);
359 Int_t RenderElementListBase::DestroyListSubTree(TGListTree* ltree,
360 TGListTreeItem* parent)
363 TGListTreeItem* i = parent->GetFirstChild();
365 n += DestroyListSubTree(ltree, i);
366 RenderElement* re = (RenderElement*) i->GetUserData();
367 i = i->GetNextSibling();
368 re->RemoveFromListTree(ltree, parent);
373 /**************************************************************************/
375 void RenderElementListBase::EnableListElements()
377 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
378 (*i)->SetRnrElement(kTRUE);
381 void RenderElementListBase::DisableListElements()
383 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i)
384 (*i)->SetRnrElement(kFALSE);
387 /**************************************************************************/
389 void RenderElementListBase::SetMainColor(Color_t col)
391 Color_t oldcol = GetMainColor();
392 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
393 if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
395 RenderElement::SetMainColor(col);
398 void RenderElementListBase::SetMainColor(Pixel_t pixel)
400 // This one needed for proper calling via CINT (signals).
402 SetMainColor(Color_t(TColor::GetColor(pixel)));
405 /**************************************************************************/
407 void RenderElementListBase::PaintElements(Option_t* option)
410 for(lpRE_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
411 if((*i)->GetRnrElement())
412 (*i)->GetObject()->Paint(option);
417 /**************************************************************************/
418 /**************************************************************************/
420 ClassImp(RenderElementList)
422 RenderElementList::RenderElementList(const Text_t* n, const Text_t* t, Bool_t doColor) :
423 RenderElementListBase(),
429 SetMainColorPtr(&fColor);