22 ClassImp(TStructViewer);
69 TStructViewer::TStructViewer(
void* ptr,
const char * clname)
76 fColors.Add(
new TStructNodeProperty(
"+", 17));
79 fGUI =
new TStructViewerGUI(
this, NULL, &fColors);
81 SetPointer(ptr, clname);
87 TStructViewer::~TStructViewer()
97 void TStructViewer::AddNode(TStructNode* node, ULong_t size)
99 TList* list = (TList*)fLevelArray[node->GetLevel()];
102 fLevelArray[node->GetLevel()] = list =
new TList();
107 fLevelMembersCount(node->GetLevel())++;
109 fLevelSize(node->GetLevel()) += size;
115 void TStructViewer::CountMembers(TClass* cl, TStructNode* parent,
void* pointer)
121 if (cl->InheritsFrom(TClass::Class())) {
129 cl->BuildRealData(parent->GetPointer());
130 TIter it(cl->GetListOfDataMembers());
132 while ((dm = (TDataMember*) it() ))
135 parent->SetAllMembersCount(parent->GetAllMembersCount() + 1);
136 parent->SetMembersCount(parent->GetMembersCount() + 1);
138 if (dm->Property() & kIsStatic) {
145 if(dm->IsaPointer()) {
146 TString trueTypeName = dm->GetTrueTypeName();
149 if(trueTypeName.EndsWith(
"**")) {
157 void** pptr = (
void**)((ULong_t)pointer + dm->GetOffset());
164 if(fPointers.GetValue((ULong_t)ptr)) {
167 fPointers.Add((ULong_t)ptr, (ULong_t)ptr);
171 if (TClass* cl2 = TClass::GetClass(dm->GetTypeName())) {
176 size = dm->GetUnitSize();
180 if(dm->GetDataType()) {
187 TStructNode* node =
new TStructNode(dm->GetName(), dm->GetTypeName(), ptr, parent, size, type);
190 CountMembers(TClass::GetClass(dm->GetTypeName()), node, ptr);
193 parent->SetTotalSize(parent->GetTotalSize() + node->GetTotalSize() - size);
195 parent->SetAllMembersCount(parent->GetAllMembersCount() + node->GetAllMembersCount() - 1);
197 ptr = (
void*)((ULong_t)pointer + dm->GetOffset());
202 CountMembers(TClass::GetClass(dm->GetTypeName()), parent, ptr);
208 if (dm->IsSTLContainer()) {
209 parent->SetNodeType(kSTLCollection);
212 TClass* stlClass = TClass::GetClass(dm->GetTypeName());
217 TVirtualCollectionProxy* proxy = stlClass->GetCollectionProxy();
221 TVirtualCollectionProxy::TPushPop helper(proxy, ptr);
223 UInt_t count = proxy->Size();
224 parent->SetMembersCount(parent->GetMembersCount() + count);
226 if (!proxy->HasPointers() || proxy->GetType() != kNoType_t) {
227 parent->SetTotalSize(parent->GetTotalSize() + count * proxy->Sizeof());
228 parent->SetAllMembersCount(parent->GetAllMembersCount() + count);
230 TClass* clProxy = proxy->GetValueClass();
236 name = clProxy->GetName();
237 typeName = clProxy->GetName();
238 size = clProxy->Size();
245 size = proxy->Sizeof();
250 std::vector<std::string> parts;
252 TClassEdit::GetSplit(dm->GetTypeName(), parts, loc);
253 std::vector<std::string>::const_iterator iPart = parts.begin();
254 while (iPart != parts.end() && *iPart ==
"")
256 if (iPart != parts.end() && *iPart != dm->GetTypeName()) {
257 for (std::vector<std::string>::const_iterator iP = iPart,
258 iPE = parts.end(); iP != iPE; ++iP) {
259 if (TString(TClassEdit::ResolveTypedef(iP->c_str(),
true).c_str()).EndsWith(
"**")){
271 for (UInt_t i = 0; i < count ; i++) {
272 element = *(
void**)proxy->At(i);
277 if (clProxy->IsTObject()) {
278 name = ((TObject*) element)->GetName();
282 TStructNode* node =
new TStructNode(name, typeName, element, parent, size, kClass);
286 parent->SetMembersCount(parent->GetMembersCount() + 1);
288 CountMembers(clProxy, node, element);
289 parent->SetTotalSize(parent->GetTotalSize() + node->GetTotalSize());
290 parent->SetAllMembersCount(parent->GetAllMembersCount() + node->GetAllMembersCount());
300 if(cl->InheritsFrom(TCollection::Class())) {
302 parent->SetNodeType(kCollection);
309 TIter it2((TCollection*)pointer);
312 while((item = it2())) {
315 if (TClass* cl3 = item->IsA()){
325 TStructNode* node =
new TStructNode(item->GetName(), item->ClassName(), item, parent, size, kClass);
329 parent->SetMembersCount(parent->GetMembersCount() + 1);
331 CountMembers(item->IsA(), node, item);
333 parent->SetTotalSize(parent->GetTotalSize() + node->GetTotalSize());
334 parent->SetAllMembersCount(parent->GetAllMembersCount() + node->GetAllMembersCount());
342 void TStructViewer::Draw(Option_t *option)
347 }
else if (opt ==
"size") {
353 fGUI->SetNodePtr(fTopNode);
362 TCanvas* TStructViewer::GetCanvas()
364 return fGUI->GetCanvas();
370 TGMainFrame* TStructViewer::GetFrame()
377 void* TStructViewer::GetPointer()
const
385 TExMap TStructViewer::GetLevelMembersCount()
const
387 return fLevelMembersCount;
393 TExMap TStructViewer::GetLevelSize()
const
401 Bool_t TStructViewer::GetLinksVisibility()
const
403 return fGUI->GetLinksVisibility();
409 void TStructViewer::Prepare()
415 ULong_t size = fPointerClass->Size();
417 TString name =
"Main pointer";
418 if (fPointerClass->IsTObject()) {
419 name = ((TObject*) fPointer)->GetName();
421 fTopNode =
new TStructNode(name, fPointerClass->GetName(), fPointer, NULL, size, kClass);
422 AddNode(fTopNode, size);
423 CountMembers(fPointerClass, fTopNode, fPointer);
429 void TStructViewer::Reset()
432 TIter it(&fLevelArray);
433 while ((lst = (TList*) it() )) {
439 fLevelMembersCount.Clear();
450 void TStructViewer::SetColor(TString name, Int_t color)
453 TStructNodeProperty* prop;
454 while ((prop = (TStructNodeProperty*) it() )) {
455 if (name == prop->GetName()) {
456 prop->SetColor(TColor::GetColor(color));
464 prop =
new TStructNodeProperty(name.Data(), color);
472 void TStructViewer::SetLinksVisibility(Bool_t val)
474 fGUI->SetLinksVisibility(val);
480 void TStructViewer::SetPointer(
void* ptr,
const char* clname)
485 fPointerClass = TClass::GetClass(clname);
487 fPointerClass = TClass::GetClass(
typeid(*a));
490 if (!fPointerClass) {
496 fGUI->SetNodePtr(fTopNode);
503 TColor TStructViewer::GetColor(
const char* typeName)
506 TStructNodeProperty* prop;
507 while((prop = (TStructNodeProperty*) it())) {
508 if (!strcmp(prop->GetName(), typeName)) {
509 return prop->GetColor();