#include "RenderElement.h"
#include "RGTopFrame.h"
+#include "RGEditor.h"
#include <TColor.h>
#include <TCanvas.h>
#include <TGListTree.h>
+#include <TGPicture.h>
#include <THashList.h>
#include <algorithm>
ClassImp(RenderElement)
+const TGPicture* RenderElement::fgRnrIcons[4] = { 0 };
+
RenderElement::RenderElement() :
- fRnrElement (kTRUE),
+ fRnrSelf (kTRUE),
+ fRnrChildren (kTRUE),
fMainColorPtr (0),
fItems (),
fParents (),
fDestroyOnZeroRefCnt (kTRUE),
- fDenyDestroy (kFALSE)
+ fDenyDestroy (kFALSE),
+ fChildren(0)
{}
RenderElement::RenderElement(Color_t& main_color) :
- fRnrElement (kTRUE),
+ fRnrSelf (kTRUE),
+ fRnrChildren (kTRUE),
fMainColorPtr (&main_color),
fItems (),
fParents (),
fDestroyOnZeroRefCnt (kTRUE),
- fDenyDestroy (kFALSE)
+ fDenyDestroy (kFALSE),
+ fChildren(0)
{}
RenderElement::~RenderElement()
{
static const Exc_t _eh("RenderElement::RenderElement ");
+ for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
+ DestroyListSubTree(i->fTree, i->fItem);
+ }
+ RemoveElements();
+
for(List_i p=fParents.begin(); p!=fParents.end(); ++p) {
- RenderElementListBase* l = dynamic_cast<RenderElementListBase*>(*p);
- if(l)
- l->RemoveElementLocal(this);
+ (*p)->RemoveElementLocal(this);
}
fParents.clear();
}
}
-void RenderElement::Destroy()
-{
- static const Exc_t eH("RenderElement::Destroy ");
-
- if(fDenyDestroy)
- throw(eH + "this object is protected against destruction.");
-
- gReve->PreDeleteRenderElement(this);
- delete this;
- gReve->Redraw3D();
-}
-
/**************************************************************************/
void RenderElement::AddParent(RenderElement* re)
/**************************************************************************/
-TObject* RenderElement::GetObject(Exc_t eh)
-{
- TObject* obj = dynamic_cast<TObject*>(this);
- if(obj == 0)
- throw(eh + "not a TObject.");
- return obj;
-}
-
-/**************************************************************************/
-
TGListTreeItem* RenderElement::AddIntoListTree(TGListTree* ltree,
TGListTreeItem* parent_lti)
{
TObject* tobj = GetObject(eH);
TGListTreeItem* item = ltree->AddItem(parent_lti, tobj->GetName(), this,
0, 0, kTRUE);
- gClient->NeedRedraw(ltree);
- item->CheckItem(GetRnrElement());
-
+ item->SetCheckBoxPictures(GetCheckBoxPicture(1, fRnrChildren),
+ GetCheckBoxPicture(0, fRnrChildren));
+ item->CheckItem(fRnrSelf);
+
if(fMainColorPtr != 0) item->SetColor(GetMainColor());
item->SetTipText(tobj->GetTitle());
fItems.insert(ListTreeInfo(ltree, item));
+ gClient->NeedRedraw(ltree);
+
return item;
}
}
}
+/**************************************************************************/
+
RenderElement::sLTI_i RenderElement::FindItem(TGListTree* ltree)
{
for(sLTI_i i = fItems.begin(); i != fItems.end(); ++i)
for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
i->fItem->Rename(tobj->GetName());
i->fItem->SetTipText(tobj->GetTitle());
- i->fItem->CheckItem(fRnrElement);
+ i->fItem->CheckItem(fRnrSelf);
if(fMainColorPtr != 0) i->fItem->SetColor(GetMainColor());
gClient->NeedRedraw(i->fTree);
}
/**************************************************************************/
+TObject* RenderElement::GetObject(Exc_t eh)
+{
+ TObject* obj = dynamic_cast<TObject*>(this);
+ if(obj == 0)
+ throw(eh + "not a TObject.");
+ return obj;
+}
+
void RenderElement::SpawnEditor()
{
gReve->EditRenderElement(this);
}
/**************************************************************************/
-/*
-void RenderElement::DumpSourceObject()
+
+void RenderElement::PadPaint(Option_t* option)
{
- TObject* o = GetSourceObject();
- if(o == 0) {
- printf("Source object not set.\n");
- } else {
- o->Dump();
+ if (GetRnrSelf() && GetObject())
+ GetObject()->Paint(option);
+
+
+ if (GetRnrChildren()) {
+ for(List_i i=BeginChildren(); i!=EndChildren(); ++i) {
+ (*i)->PadPaint(option);
+ }
+ }
+}
+
+/**************************************************************************/
+
+void RenderElement::SetRnrSelf(Bool_t rnr)
+{
+ if(rnr != fRnrSelf)
+ {
+ fRnrSelf = rnr;
+
+ for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i)
+ {
+ if(i->fItem->IsChecked() != rnr) {
+ i->fItem->SetCheckBoxPictures(GetCheckBoxPicture(1, fRnrChildren),
+ GetCheckBoxPicture(0, fRnrChildren));
+#if ROOT_VERSION_CODE <= ROOT_VERSION(5,14,0)
+ // cover undesired behavior TGListTree::UpdateChecked
+ if(i->fItem->GetParent()) {
+ RenderElement* p = (RenderElement*) i->fItem->GetParent()->GetUserData();
+ if(p)
+ i->fItem->GetParent()->SetCheckBoxPictures(GetCheckBoxPicture(1, p->GetRnrChildren()),
+ GetCheckBoxPicture(0, p->GetRnrChildren()));
+ }
+#endif
+ i->fItem->CheckItem(fRnrSelf);
+ gClient->NeedRedraw(i->fTree);
+ }
+ }
}
}
-void RenderElement::InspectSourceObject()
+void RenderElement::SetRnrChildren(Bool_t rnr)
{
- TObject* o = GetSourceObject();
- if(o == 0) {
- printf("Source object not set.\n");
- } else {
- o->Inspect();
+ if(rnr != fRnrChildren)
+ {
+ fRnrChildren = rnr;
+
+ for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i)
+ {
+ i->fItem->SetCheckBoxPictures(GetCheckBoxPicture(fRnrSelf, fRnrChildren),
+ GetCheckBoxPicture(fRnrSelf, fRnrChildren));
+ gClient->NeedRedraw(i->fTree);
+ }
}
}
-*/
-/**************************************************************************/
-void RenderElement::SetRnrElement(Bool_t rnr)
+void RenderElement::ToggleRnrState()
{
- if(rnr != fRnrElement) {
- fRnrElement = rnr;
- for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
- if (i->fItem->IsChecked() != rnr) {
- i->fItem->CheckItem(fRnrElement);
- gClient->NeedRedraw(i->fTree);
- }
+ if (fRnrSelf || fRnrChildren)
+ fRnrSelf = fRnrChildren = kFALSE;
+ else
+ fRnrSelf = fRnrChildren = kTRUE;
+
+ for (sLTI_i i=fItems.begin(); i!=fItems.end(); ++i)
+ {
+ i->fItem->SetCheckBoxPictures(GetCheckBoxPicture(1,1), GetCheckBoxPicture(0,0));
+ i->fItem->CheckItem(fRnrSelf);
+
+#if ROOT_VERSION_CODE <= ROOT_VERSION(5,14,0)
+ // cover undesired behavior TGListTree::UpdateChecked
+ if(i->fItem->GetParent()) {
+ RenderElement* p = (RenderElement*) i->fItem->GetParent()->GetUserData();
+ if(p)
+ i->fItem->GetParent()->SetCheckBoxPictures(GetCheckBoxPicture(1, p->GetRnrChildren()),
+ GetCheckBoxPicture(0, p->GetRnrChildren()));
}
+#endif
+ gClient->NeedRedraw(i->fTree);
}
}
void RenderElement::SetMainColor(Color_t color)
{
+ Color_t oldcol = GetMainColor();
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
+ if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(color);
+ }
+
if (fMainColorPtr) {
*fMainColorPtr = color;
for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
}
/**************************************************************************/
-/**************************************************************************/
-
-ClassImp(RenderElementObjPtr)
-
-RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
- RenderElement(),
- fObject(obj),
- fOwnObject(own)
-{}
-RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
- RenderElement(mainColor),
- fObject(obj),
- fOwnObject(own)
-{}
-
-RenderElementObjPtr::~RenderElementObjPtr()
-{
- if(fOwnObject)
- delete fObject;
-}
-
-/**************************************************************************/
-
-TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
-{
- if(fObject == 0)
- throw(eh + "fObject not set.");
- return fObject;
-}
-
-void RenderElementObjPtr::ExportToCINT(Text_t* var_name)
-{
- static const Exc_t eH("RenderElementObjPtr::ExportToCINT ");
-
- TObject* obj = GetObject(eH);
- const char* cname = obj->IsA()->GetName();
- gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, obj));
-}
-
-/**************************************************************************/
-/**************************************************************************/
-
-ClassImp(RenderElementListBase)
-
-RenderElementListBase::~RenderElementListBase()
-{
- // Collapse all sub-trees
- for(sLTI_i i=fItems.begin(); i!=fItems.end(); ++i) {
- DestroyListSubTree(i->fTree, i->fItem);
- // My own items removed in ~RenderElement
- }
- RemoveElements();
-}
-
-/**************************************************************************/
-
-void RenderElementListBase::AddElement(RenderElement* el)
+void RenderElement::AddElement(RenderElement* el)
{
fChildren.push_back(el);
el->AddParent(this);
}
-void RenderElementListBase::RemoveElement(RenderElement* el)
+void RenderElement::RemoveElement(RenderElement* el)
{
- el->RemoveParent(this);
- RemoveElementLocal(el);
+ el->RemoveParent(this);
+ RemoveElementLocal(el);
}
-void RenderElementListBase::RemoveElementLocal(RenderElement* el)
+void RenderElement::RemoveElementLocal(RenderElement* el)
{
fChildren.remove(el);
}
-void RenderElementListBase::RemoveElements()
+void RenderElement::RemoveElements()
{
for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
(*i)->RemoveParent(this);
/**************************************************************************/
-void RenderElementListBase::DestroyElements()
-{
- static const Exc_t eH("RenderElementListBase::DestroyElements ");
-
- while( ! fChildren.empty()) {
- RenderElement* c = fChildren.front();
- try {
- c->Destroy();
- }
- catch(Exc_t exc) {
- Warning(eH.Data(), Form("element destruction failed: '%s'.", exc.Data()));
- RemoveElement(c);
- }
- }
-}
-
-/**************************************************************************/
-
-Int_t RenderElementListBase::ExpandIntoListTree(TGListTree* ltree,
+Int_t RenderElement::ExpandIntoListTree(TGListTree* ltree,
TGListTreeItem* parent)
{
// Populates parent with elements.
return n;
}
-Int_t RenderElementListBase::DestroyListSubTree(TGListTree* ltree,
+/**************************************************************************/
+
+void RenderElement::EnableListElements()
+{
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
+ (*i)->SetRnrSelf(kTRUE);
+
+ gReve->Redraw3D();
+}
+
+void RenderElement::DisableListElements()
+{
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
+ (*i)->SetRnrSelf(kFALSE);
+
+ gReve->Redraw3D();
+}
+
+/**************************************************************************/
+
+Int_t RenderElement::DestroyListSubTree(TGListTree* ltree,
TGListTreeItem* parent)
{
Int_t n = 0;
return n;
}
-/**************************************************************************/
+void RenderElement::Destroy()
+{
+ static const Exc_t eH("RenderElement::Destroy ");
-void RenderElementListBase::EnableListElements()
+ if(fDenyDestroy)
+ throw(eH + "this object is protected against destruction.");
+
+ gReve->PreDeleteRenderElement(this);
+ delete this;
+ gReve->Redraw3D();
+}
+
+void RenderElement::DestroyElements()
{
- for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
- (*i)->SetRnrElement(kTRUE);
+ static const Exc_t eH("RenderElement::DestroyElements ");
+
+ while( ! fChildren.empty()) {
+ RenderElement* c = fChildren.front();
+ try {
+ c->Destroy();
+ }
+ catch(Exc_t exc) {
+ Warning(eH.Data(), Form("element destruction failed: '%s'.", exc.Data()));
+ RemoveElement(c);
+ }
+ }
}
-void RenderElementListBase::DisableListElements()
+const TGPicture* RenderElement::GetCheckBoxPicture(Bool_t rnrSelf, Bool_t rnrDaughters)
{
- for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
- (*i)->SetRnrElement(kFALSE);
+ Int_t idx = 0;
+ if(rnrSelf) idx = 2;
+ if(rnrDaughters ) idx++;
+
+ return fgRnrIcons[idx];
}
/**************************************************************************/
-void RenderElementListBase::SetMainColor(Color_t col)
+ClassImp(RenderElementObjPtr)
+
+RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Bool_t own) :
+ RenderElement(),
+ fObject(obj),
+ fOwnObject(own)
+{}
+
+RenderElementObjPtr::RenderElementObjPtr(TObject* obj, Color_t& mainColor, Bool_t own) :
+ RenderElement(mainColor),
+ fObject(obj),
+ fOwnObject(own)
+{}
+
+TObject* RenderElementObjPtr::GetObject(Reve::Exc_t eh)
{
- Color_t oldcol = GetMainColor();
- for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
- if((*i)->GetMainColor() == oldcol) (*i)->SetMainColor(col);
- }
- RenderElement::SetMainColor(col);
+ if(fObject == 0)
+ throw(eh + "fObject not set.");
+ return fObject;
}
-void RenderElementListBase::SetMainColor(Pixel_t pixel)
+void RenderElementObjPtr::ExportToCINT(Text_t* var_name)
{
- // This one needed for proper calling via CINT (signals).
+ static const Exc_t eH("RenderElementObjPtr::ExportToCINT ");
- SetMainColor(Color_t(TColor::GetColor(pixel)));
+ TObject* obj = GetObject(eH);
+ const char* cname = obj->IsA()->GetName();
+ gROOT->ProcessLine(Form("%s* %s = (%s*)0x%lx;", cname, var_name, cname, obj));
}
-/**************************************************************************/
-
-void RenderElementListBase::PaintElements(Option_t* option)
+RenderElementObjPtr::~RenderElementObjPtr()
{
- if(fRnrElement) {
- for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
- if((*i)->GetRnrElement())
- (*i)->GetObject()->Paint(option);
- }
- }
+ if(fOwnObject)
+ delete fObject;
}
-/**************************************************************************/
/**************************************************************************/
ClassImp(RenderElementList)
RenderElementList::RenderElementList(const Text_t* n, const Text_t* t, Bool_t doColor) :
- RenderElementListBase(),
+ RenderElement(),
TNamed(n, t),
fColor(0),
fDoColor(doColor)
}
}
-/**************************************************************************/
-/**************************************************************************/
/**************************************************************************/
-ClassImp(ReferenceBackPtr)
+ClassImp(PadPrimitive)
-ReferenceBackPtr::ReferenceBackPtr() :
- ReferenceCount(),
- fBackRefs()
-{}
-
-ReferenceBackPtr::~ReferenceBackPtr()
-{
- // !!!! Complain if list not empty.
-}
-
-ReferenceBackPtr::ReferenceBackPtr(const ReferenceBackPtr&) :
- ReferenceCount(),
- fBackRefs()
+PadPrimitive::PadPrimitive(const Text_t* n, const Text_t* t) :
+ RenderElement(),
+ TNamed(n, t)
{}
-ReferenceBackPtr& ReferenceBackPtr::operator=(const ReferenceBackPtr&)
-{
- return *this;
-}
-
-/**************************************************************************/
-
-void ReferenceBackPtr::IncRefCount(RenderElement* re)
-{
- ReferenceCount::IncRefCount();
- fBackRefs.push_back(re);
-}
-
-void ReferenceBackPtr::DecRefCount(RenderElement* re)
+void PadPrimitive::Paint(Option_t* option)
{
- static const Exc_t eH("ReferenceBackPtr::DecRefCount ");
-
- std::list<RenderElement*>::iterator i =
- std::find(fBackRefs.begin(), fBackRefs.end(), re);
- if (i != fBackRefs.end()) {
- fBackRefs.erase(i);
- ReferenceCount::DecRefCount();
- } else {
- Warning(eH, Form("render element '%s' not found in back-refs.",
- re->GetObject()->GetName()));
+ if (fRnrChildren)
+ {
+ for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
+ (*i)->PadPaint(option);
}
}
+