24 ClassImp(TInspectCanvas);
34 class TInspectorObject :
public TObject
38 TInspectorObject(
void *obj, TClass *cl) : fObj(obj),fClass(cl) {};
39 ~TInspectorObject(){;}
41 void *GetObject()
const {
return fObj; };
42 void Inspect()
const {
43 gGuiFactory->CreateInspectorImp(
this, 400, 200);
45 TClass *IsA()
const {
return fClass; }
63 TInspectCanvas::TInspectCanvas() : TCanvas()
77 TInspectCanvas::TInspectCanvas(UInt_t ww, UInt_t wh)
78 : TCanvas(
"inspect",
"ROOT Object Inspector",ww,wh)
92 TInspectCanvas::~TInspectCanvas()
95 fObjects->Clear(
"nodelete");
108 void TInspectCanvas::InspectObject(TObject *obj)
113 Bool_t isdate = kFALSE;
114 Bool_t isbits = kFALSE;
115 const Int_t kname = 1;
116 const Int_t kvalue = 25;
117 const Int_t ktitle = 37;
118 const Int_t kline = 1024;
122 TClass *cl = obj->IsA();
124 TInspectorObject *proxy=0;
125 if (!cl->IsTObject()) {
128 proxy = (TInspectorObject*)obj;
129 obj = (TObject*)proxy->GetObject();
132 if (!cl->GetListOfRealData()) cl->BuildRealData(obj);
136 TIter next(cl->GetListOfRealData());
137 Int_t nreal = cl->GetListOfRealData()->GetSize();
138 if (nreal == 0)
return;
141 if (nreal+7 > nrows) nrows = nreal+7;
144 TVirtualPad *canvas = GetVirtCanvas();
147 canvas->SetCanvasSize(nw, nh);
148 canvas->Range(0,-3,20,nreal+4);
154 Float_t ytext = Float_t(nreal) - 1.5;
155 Float_t tsize = 0.99/ytext;
156 if (tsize < 0.02) tsize = 0.02;
157 if (tsize > 0.03) tsize = 0.03;
160 TText tname, tvalue, ttitle;
162 tname.SetTextFont(61);
163 tname.SetTextAngle(0);
164 tname.SetTextAlign(12);
165 tname.SetTextColor(1);
166 tname.SetTextSize(tsize);
167 tvalue.SetTextFont(61);
168 tvalue.SetTextAngle(0);
169 tvalue.SetTextAlign(12);
170 tvalue.SetTextColor(1);
171 tvalue.SetTextSize(tsize);
172 ttitle.SetTextFont(62);
173 ttitle.SetTextAngle(0);
174 ttitle.SetTextAlign(12);
175 ttitle.SetTextColor(1);
176 ttitle.SetTextSize(tsize);
181 Float_t y2 = Float_t(nreal) - 0.5;
183 Float_t y4 = y3 + 1.5;
184 Float_t db = 25./GetWh();
185 Float_t btop = 0.999;
188 fBackward =
new TButton(
"backward",
"TInspectCanvas::GoBackward();",.01,btop-db,.15,btop);
190 fBackward->SetToolTipText(
"Inspect previous object");
191 fForward =
new TButton(
"forward",
"TInspectCanvas::GoForward();", .21,btop-db,.35,btop);
193 fForward->SetToolTipText(
"Inspect next object");
197 frame.SetLineColor(1);
198 frame.SetLineStyle(1);
199 frame.SetLineWidth(1);
200 frame.DrawLine(x1, y1, x2, y1);
201 frame.DrawLine(x2, y1, x2, y4);
202 frame.DrawLine(x2, y4, x1, y4);
203 frame.DrawLine(x1, y4, x1, y1);
204 frame.DrawLine(x1, y2, x2, y2);
205 frame.DrawLine(x1, y3, x2, y3);
206 frame.DrawLine(xvalue, y1, xvalue, y3);
207 frame.DrawLine(xtitle, y1, xtitle, y3);
208 ttitle.SetTextSize(0.8*tsize);
209 ttitle.SetTextAlign(21);
210 ttitle.DrawText(0.5*(x1+xvalue), y2+0.1,
"Member Name");
211 ttitle.DrawText(0.5*(xvalue+xtitle), y2+0.1,
"Value");
212 ttitle.DrawText(0.5*(xtitle+x2), y2+0.1,
"Title");
213 ttitle.SetTextSize(1.2*tsize);
214 ttitle.SetTextColor(2);
215 ttitle.SetTextAlign(11);
216 ttitle.DrawText(x1+0.2, y3+0.1, cl->GetName());
218 ttitle.SetTextColor(4);
219 strlcpy(line,obj->GetName(),kline);
220 ttitle.DrawText(xvalue+0.2, y3+0.1, line);
221 ttitle.SetTextColor(6);
222 ttitle.DrawText(xtitle+2, y3+0.1, obj->GetTitle());
224 ttitle.SetTextColor(4);
225 snprintf(line,1023,
"%s:%d",
"Foreign object",0);
226 ttitle.DrawText(xvalue+0.2, y3+0.1, line);
227 ttitle.SetTextColor(6);
228 ttitle.DrawText(xtitle+2, y3+0.1,
"no title given");
230 ttitle.SetTextSize(tsize);
231 ttitle.SetTextColor(1);
232 ttitle.SetTextFont(11);
233 ttitle.SetTextAlign(12);
238 for (Int_t pass = 0; pass < 3; pass++) {
241 while ((rd = (TRealData*) next())) {
242 TDataMember *member = rd->GetDataMember();
243 if (!member)
continue;
244 TDataType *membertype = member->GetDataType();
246 if (strcmp(member->GetName(),
"fDatime") == 0 && membertype && membertype->GetType() == kUInt_t) {
250 if (strcmp(member->GetName(),
"fBits") == 0 && membertype && membertype->GetType() == kUInt_t) {
255 pname = &line[kname];
256 for (Int_t i=0;i<kline;i++) line[i] =
' ';
258 strlcpy(pname,rd->GetName(),kline-kname);
259 if (strstr(member->GetFullTypeName(),
"**")) strlcat(pname,
"**",kline-kname);
263 Int_t offset = rd->GetThisOffset();
264 char *pointer = (
char*)obj + offset;
265 char **ppointer = (
char**)(pointer);
270 clm = member->GetClass();
273 if (member->IsaPointer()) {
274 char **p3pointer = (
char**)(*ppointer);
275 if (clm && !clm->IsStartingWithTObject() ) {
277 p3pointer = (
char**)
new TInspectorObject(p3pointer,clm);
281 snprintf(&line[kvalue],kline-kvalue,
"->0");
282 }
else if (!member->IsBasic()) {
284 tlink =
new TLink(xvalue+0.1, ytext, p3pointer);
286 }
else if (membertype) {
287 if (!strcmp(membertype->GetTypeName(),
"char"))
288 strlcpy(&line[kvalue], *ppointer,kline-kvalue);
290 strlcpy(&line[kvalue], membertype->AsString(p3pointer),kline-kvalue);
291 }
else if (!strcmp(member->GetFullTypeName(),
"char*") ||
292 !strcmp(member->GetFullTypeName(),
"const char*")) {
293 strlcpy(&line[kvalue], *ppointer,kline-kvalue);
295 if (pass == 1) tlink =
new TLink(xvalue+0.1, ytext, p3pointer);
297 }
else if (membertype)
299 cdatime = (UInt_t*)pointer;
300 TDatime::GetDateTime(cdatime[0],cdate,ctime);
301 snprintf(&line[kvalue],kline-kvalue,
"%d/%d",cdate,ctime);
303 snprintf(&line[kvalue],kline-kvalue,
"0x%08x", *(UInt_t*)pointer);
305 strlcpy(&line[kvalue], membertype->AsString(pointer),kline-kvalue);
308 snprintf(&line[kvalue],kline-kvalue,
"->%lx ", (Long_t)pointer);
312 if (isdate == kFALSE && strcmp(member->GetFullTypeName(),
"char*") &&
313 strcmp(member->GetFullTypeName(),
"const char*")) {
314 Int_t lentit = strlen(member->GetTitle());
315 if (lentit >= kline-ktitle) lentit = kline-ktitle-1;
316 strlcpy(&line[ktitle],member->GetTitle(),kline-ktitle);
317 line[ktitle+lentit] = 0;
322 if (pass == 0)tname.DrawText( x1+0.1, ytext, &line[kname]);
325 tlink->SetTextFont(61);
326 tlink->SetTextAngle(0);
327 tlink->SetTextAlign(12);
328 tlink->SetTextColor(2);
329 tlink->SetTextSize(tsize);
330 tlink->SetBit(kCanDelete);
332 if (strstr(member->GetFullTypeName(),
"**")) tlink->SetBit(TLink::kIsStarStar);
333 tlink->SetName(member->GetTypeName());
335 tval->DrawText(xvalue+0.1, ytext, &line[kvalue]);
338 if (pass == 2 && ltit) ttitle.DrawText(xtitle+0.3, ytext, &line[ltit]);
349 void TInspectCanvas::GoBackward()
351 TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject(
"inspect");
352 if (!inspect)
return;
353 TObject *cur = inspect->GetCurObject();
354 TObject *obj = inspect->GetObjects()->Before(cur);
355 if (obj) inspect->InspectObject(obj);
361 void TInspectCanvas::GoForward()
363 TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject(
"inspect");
364 if (!inspect)
return;
365 TObject *cur = inspect->GetCurObject();
366 TObject *obj = inspect->GetObjects()->After(cur);
367 if (obj) inspect->InspectObject(obj);
374 void TInspectCanvas::Inspector(TObject *obj)
376 TVirtualPad *padsav = gPad;
377 TInspectCanvas *inspect = (TInspectCanvas*)(gROOT->GetListOfCanvases())->FindObject(
"inspect");
378 if (!inspect) inspect =
new TInspectCanvas(700,600);
381 inspect->InspectObject(obj);
382 inspect->GetObjects()->Add(obj);
385 if (padsav) padsav->cd();
391 void TInspectCanvas::RecursiveRemove(TObject *obj)
393 fObjects->Remove(obj);
394 TPad::RecursiveRemove(obj);