GSI Object Oriented Online Offline (Go4) GO4-6.4.0
Loading...
Searching...
No Matches
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:
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
127
128TGo4CanvasProxy::TGo4CanvasProxy(TCanvas *c, Bool_t owner) :
129 TGo4Proxy(),
130 fCanvas(c),
131 fOwner(owner)
132{
133}
134
139
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
171void 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
187void 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
197Bool_t TGo4CanvasProxy::IsAcceptObject(TClass *cl) const
198{
199 return cl && cl->InheritsFrom(TCanvas::Class());
200}
201
202Bool_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
224std::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}
const char * GetClassName() override
TGo4LevelIter * subiterator() override
Bool_t next() override
const char * name() override
Int_t GetKind() override
const char * info() override
Bool_t isfolder() override
static std::unique_ptr< TGo4Access > CreateAccess(TCanvas *canv, const char *name)
Bool_t IsAcceptObject(TClass *cl) const override
const char * GetContainedClassName() const override
Bool_t AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner) override
void Finalize(TGo4Slot *slot) override
TObject * GetAssignedObject() override
static TGo4LevelIter * ProduceIter(TCanvas *canv)
Bool_t RemoveRegisteredObject(TObject *obj) override
Int_t GetObjectKind() const override
void Initialize(TGo4Slot *slot) override
void ReadData(TGo4Slot *slot, TDirectory *dir) override
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override
static TGo4LevelIter * ProduceIter(THStack *hs)
static std::unique_ptr< TGo4Access > CreateAccess(THStack *hs, const char *name)
void RegisterObjectWith(TObject *obj, TGo4Slot *slot)
void UnregisterObject(TObject *obj, TGo4Slot *slot)
virtual TGo4ObjectManager * GetOM() const
Definition TGo4Slot.cxx:282
@ evObjAssigned
Definition TGo4Slot.h:47
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=nullptr)
Definition TGo4Slot.cxx:565
void SetPar(const char *name, const char *value)
Definition TGo4Slot.cxx:586
const char * GetPar(const char *name) const
Definition TGo4Slot.cxx:598