GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4CanvasProxy.cxx
Go to the documentation of this file.
1 // $Id$
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4CanvasProxy.h"
15 
16 #include "TObjArray.h"
17 #include "TClass.h"
18 #include "TDirectory.h"
19 #include "TFrame.h"
20 #include "TPaveText.h"
21 #include "TObjString.h"
22 #include "THStack.h"
23 #include "TH1.h"
24 #include "TCanvas.h"
25 
26 #include "TGo4ObjectProxy.h"
27 #include "TGo4HStackProxy.h"
28 #include "TGo4ObjectManager.h"
29 
31  protected:
32  TIterator *fIter{nullptr};
33  TObject *fCurrent{nullptr};
34  TObjArray fStacks;
35  public:
36  TGo4CanvasLevelIter(TPad *pad) :
37  TGo4LevelIter(),
38  fIter(nullptr),
39  fCurrent(nullptr),
40  fStacks()
41  {
42  fIter = pad->GetListOfPrimitives()->MakeIterator();
43  fStacks.SetOwner(kTRUE);
44  }
45 
47  {
48  delete fIter;
49  }
50 
51  Bool_t next() override
52  {
53  bool skip = false;
54  do {
55  skip = false;
56  fCurrent = fIter->Next();
57 
58  if (!fCurrent) break;
59 
60  TFrame* fr = dynamic_cast<TFrame*>(fCurrent);
61  if (fr) { skip = true; continue; }
62 
63  TPaveText* ptxt = dynamic_cast<TPaveText*> (fCurrent);
64  if (ptxt && (strcmp(ptxt->GetName(),"title") == 0)) { skip = true; continue; }
65 
66  if (dynamic_cast<TPave*>(fCurrent)) { skip = true; continue; }
67 
68  if (!fCurrent->GetName()) { skip = true; continue; }
69 
70  if (strlen(fCurrent->GetName()) == 0) { skip = true; continue; }
71 
72  if (strcmp(fCurrent->GetName(), fCurrent->ClassName()) == 0) { skip = true; continue; }
73 
74  // this is axis object for drawing THStack in the canvas
75  if (fStacks.FindObject(fCurrent->GetName()) && fCurrent->InheritsFrom(TH1F::Class())) { skip = true; continue; }
76 
77  } while(skip);
78 
79  if (fCurrent && fCurrent->InheritsFrom(THStack::Class()))
80  fStacks.Add(new TObjString(fCurrent->GetName()));
81 
82  return fCurrent != nullptr;
83  }
84 
85  Bool_t isfolder() override
86  {
87  return dynamic_cast<TPad *>(fCurrent) ||
88  dynamic_cast<THStack *>(fCurrent);
89  }
90 
92  {
93  TPad *subpad = dynamic_cast<TPad *>(fCurrent);
94  if (subpad) return new TGo4CanvasLevelIter(subpad);
95  THStack *hs = dynamic_cast<THStack *>(fCurrent);
96  if (hs) return TGo4HStackProxy::ProduceIter(hs);
97  return nullptr;
98  }
99 
100  const char *name() override
101  {
102  return fCurrent->GetName();
103  }
104 
105  const char *info() override
106  {
107  return fCurrent->ClassName();
108  }
109 
110  Int_t GetKind() override
111  {
113  }
114 
115  const char *GetClassName() override
116  {
117  return fCurrent->ClassName();
118  }
119 };
120 
121 // ****************************************************************
122 
124  TGo4Proxy()
125 {
126 }
127 
128 TGo4CanvasProxy::TGo4CanvasProxy(TCanvas *c, Bool_t owner) :
129  TGo4Proxy(),
130  fCanvas(c),
131  fOwner(owner)
132 {
133 }
134 
136 {
137  if (fOwner) delete fCanvas;
138 }
139 
141 {
143 }
144 
146 {
147  return fCanvas ? fCanvas->ClassName() : nullptr;
148 }
149 
151 {
152  auto om = slot->GetOM();
153  if (om) om->RegisterObjectWith(fCanvas, slot);
154 }
155 
157 {
158  auto om = slot->GetOM();
159  if (om) om->UnregisterObject(fCanvas, slot);
160 }
161 
163 {
164  if (obj==fCanvas) {
165  fCanvas = nullptr;
166  fOwner = kFALSE;
167  }
168  return kFALSE;
169 }
170 
171 void TGo4CanvasProxy::WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs)
172 {
173  const char *objname = nullptr;
174  if (fCanvas)
175  objname = fCanvas->GetName();
176 
177  if (!onlyobjs)
178  slot->SetPar("CanvasProxy::CanvasName", objname);
179 
180  if (!dir || !fCanvas) return;
181 
182  dir->cd();
183 
184  fCanvas->Write(objname);
185 }
186 
187 void TGo4CanvasProxy::ReadData(TGo4Slot *slot, TDirectory *dir)
188 {
189  const char *objname = slot->GetPar("CanvasProxy::CanvasName");
190  if (!objname || !dir) return;
191 
192  dir->cd();
193 
194  AssignObject(slot, dir->Get(objname), kTRUE);
195 }
196 
197 Bool_t TGo4CanvasProxy::IsAcceptObject(TClass *cl) const
198 {
199  return cl && cl->InheritsFrom(TCanvas::Class());
200 }
201 
202 Bool_t TGo4CanvasProxy::AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner)
203 {
204  Finalize(slot);
205  if (fCanvas && fOwner) delete fCanvas;
206 
207  fCanvas = dynamic_cast<TCanvas *>(obj);
208  fOwner = owner && fCanvas;
209 
210  if (!fCanvas && obj && owner) delete obj;
211 
212  Initialize(slot);
213 
215 
216  return fCanvas;
217 }
218 
220 {
221  return fCanvas;
222 }
223 
224 std::unique_ptr<TGo4Access> TGo4CanvasProxy::CreateAccess(TCanvas *canv, const char *name)
225 {
226  if (!canv) return nullptr;
227  if (!name || !*name)
228  return std::make_unique<TGo4ObjectAccess>(canv);
229 
230  TPad *curpad = canv;
231  const char *curname = name;
232 
233  while (curpad) {
234  const char *slash = strchr(curname, '/');
235  UInt_t len = slash ? slash - curname : strlen(curname);
236  TIter iter(curpad->GetListOfPrimitives());
237  TObject *obj = nullptr;
238  while ((obj = iter()) != nullptr)
239  if ((strlen(obj->GetName()) == len) &&
240  (strncmp(obj->GetName(), curname, len) == 0)) break;
241  if (!obj) return nullptr;
242 
243  if (!slash)
244  return std::make_unique<TGo4ObjectAccess>(obj);
245 
246  curname = slash+1;
247 
248  curpad = dynamic_cast<TPad *>(obj);
249 
250  if (!curpad) {
251  THStack *hs = dynamic_cast<THStack*> (obj);
252  if (hs)
253  return TGo4HStackProxy::CreateAccess(hs, curname);
254  }
255  }
256 
257  return nullptr;
258 }
259 
261 {
262  return new TGo4CanvasLevelIter(canv);
263 }
void UnregisterObject(TObject *obj, TGo4Slot *slot)
Bool_t IsAcceptObject(TClass *cl) const override
static TGo4LevelIter * ProduceIter(THStack *hs)
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override
const char * info() override
virtual ~TGo4CanvasLevelIter()
void Initialize(TGo4Slot *slot) override
Int_t GetKind() override
Bool_t AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner) override
void RegisterObjectWith(TObject *obj, TGo4Slot *slot)
static TGo4LevelIter * ProduceIter(TCanvas *canv)
const char * name() override
const char * GetContainedClassName() const override
virtual ~TGo4CanvasProxy()
void Finalize(TGo4Slot *slot) override
TGo4LevelIter * subiterator() override
Bool_t isfolder() override
Int_t GetObjectKind() const override
Bool_t RemoveRegisteredObject(TObject *obj) override
static std::unique_ptr< TGo4Access > CreateAccess(TCanvas *canv, const char *name)
const char * GetClassName() override
void ReadData(TGo4Slot *slot, TDirectory *dir) override
const char * GetPar(const char *name) const
Definition: TGo4Slot.cxx:598
TObject * GetAssignedObject() override
Bool_t next() override
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=nullptr)
Definition: TGo4Slot.cxx:565
virtual TGo4ObjectManager * GetOM() const
Definition: TGo4Slot.cxx:282
void SetPar(const char *name, const char *value)
Definition: TGo4Slot.cxx:586
static std::unique_ptr< TGo4Access > CreateAccess(THStack *hs, const char *name)
TGo4CanvasLevelIter(TPad *pad)