Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TBranchBrowsable.h
Go to the documentation of this file.
1 // @(#)root/tree:$Id$
2 // Author: Axel Naumann 14/10/2004
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TBranchBrowsable
13 #define ROOT_TBranchBrowsable
14 
15 #include "TNamed.h"
16 
17 #include "TList.h"
18 
19 #include <list>
20 
21 class TMethod;
22 class TBowser;
23 class TClass;
24 class TBranch;
25 class TBranchElement;
26 class TString;
27 class TStreamerElement;
28 
29 class TVirtualBranchBrowsable: public TNamed {
30 public:
31 
32  // these methods are registered in RegisterGenerator, and
33  // called to create the list of browsables. See e.g.
34  // TMethodBrowsable::Register
35  typedef Int_t (*MethodCreateListOfBrowsables_t)
36  (TList&, const TBranch* branch, const TVirtualBranchBrowsable* parent);
37 
38  ~TVirtualBranchBrowsable();
39 
40  void Browse(TBrowser *b);
41  const char *GetIconName() const {
42  // return icon shown when browsing a TVirtualBranchBrowsable
43  if (IsFolder()) return "TBranchElement-folder";
44  else return "TBranchElement-leaf";
45  }
46  void GetScope(TString & scope) const;
47  Bool_t IsFolder() const {
48  // check whether we have sub-elements
49  return (GetLeaves() && GetLeaves()->GetSize()); }
50 
51  static Int_t FillListOfBrowsables(TList& list, const TBranch* branch,
52  const TVirtualBranchBrowsable* parent=0);
53 
54  const TBranch* GetBranch() const {
55  // return the parent branch (might be many levels up)
56  return fBranch; }
57  const TVirtualBranchBrowsable* GetParent() const {
58  // return the parent TVirtualBranchBrowsable
59  return fParent; }
60  TClass* GetClassType() const {
61  // return the type of this browsable object
62  return fClass; }
63  Bool_t TypeIsPointer() const {
64  // return whether the type of this browsable object is a pointer
65  return fTypeIsPointer; }
66  TList* GetLeaves() const;
67 
68  // static void Register() has to be implemented for all derived classes!
69  // static void Unregister() has to be implemented for all derived classes!
70 
71 protected:
72  TVirtualBranchBrowsable(const TBranch* b, TClass* type, Bool_t typeIsPointer,
73  const TVirtualBranchBrowsable* parent=0);
74  static TClass* GetCollectionContainedType(const TBranch* b,
75  const TVirtualBranchBrowsable* parent, TClass* &contained);
76  static std::list<MethodCreateListOfBrowsables_t>& GetRegisteredGenerators();
77  static void RegisterGenerator(MethodCreateListOfBrowsables_t generator);
78  static void UnregisterGenerator(MethodCreateListOfBrowsables_t generator);
79  void SetType(TClass* type) {
80  // sets the type of this browsable object
81  fClass=type; }
82  void SetTypeIsPointer(Bool_t set=kTRUE) {
83  // sets whether the type of this browsable object is a pointer
84  fTypeIsPointer=set; }
85 
86 private:
87  static void RegisterDefaultGenerators();
88  const TBranch *fBranch; ///< pointer to the branch element representing the top object
89  const TVirtualBranchBrowsable *fParent; ///< parent method if this method is member of a returned class
90  TList *fLeaves; ///< pointer to leaves
91  TClass *fClass; ///< pointer to TClass representing our type (i.e. return type for methods), 0 if basic type
92  Bool_t fTypeIsPointer; ///< return type is pointer to class
93  static std::list<MethodCreateListOfBrowsables_t> fgGenerators; ///< list of MethodCreateListOfBrowsables_t called by CreateListOfBrowsables
94  static Bool_t fgGeneratorsSet; ///< have we set the generators yet? empty is not good enough - user might have removed them
95  ClassDef(TVirtualBranchBrowsable, 0); ///< Base class for helper objects used for browsing
96 };
97 
98 
99 class TMethodBrowsable: public TVirtualBranchBrowsable {
100 public:
101  ~TMethodBrowsable() {};
102 
103  static Int_t GetBrowsables(TList& list, const TBranch* branch,
104  const TVirtualBranchBrowsable* parent=0);
105  const char *GetIconName() const {
106  // return our special icons
107  if (IsFolder()) return "TMethodBrowsable-branch";
108  return "TMethodBrowsable-leaf";}
109  static Bool_t IsMethodBrowsable(const TMethod* m);
110  static void Register();
111  static void Unregister();
112 
113 protected:
114  static void GetBrowsableMethodsForClass(TClass* cl, TList& list);
115  TMethodBrowsable(const TBranch* branch, TMethod* m,
116  const TVirtualBranchBrowsable* parent=0);
117 
118 private:
119  TMethod *fMethod; // pointer to a method
120  ClassDef(TMethodBrowsable,0); // Helper object to browse methods
121 };
122 
123 
124 class TNonSplitBrowsable: public TVirtualBranchBrowsable {
125 public:
126  ~TNonSplitBrowsable() {}
127 
128  static Int_t GetBrowsables(TList& list, const TBranch* branch,
129  const TVirtualBranchBrowsable* parent=0);
130  static void Register();
131  static void Unregister();
132 
133 protected:
134  TNonSplitBrowsable(const TStreamerElement* element, const TBranch* branch,
135  const TVirtualBranchBrowsable* parent=0);
136 
137 private:
138  ClassDef(TNonSplitBrowsable, 0); // Helper object to browse unsplit objects
139 };
140 
141 
142 class TCollectionPropertyBrowsable: public TVirtualBranchBrowsable {
143 public:
144  ~TCollectionPropertyBrowsable() {}
145 
146  void Browse(TBrowser *b);
147  static Int_t GetBrowsables(TList& list, const TBranch* branch,
148  const TVirtualBranchBrowsable* parent=0);
149  const char* GetDraw() const {
150  // return the string passed to TTree::Draw
151  return fDraw.Data(); }
152  static void Register();
153  static void Unregister();
154 
155 protected:
156  TCollectionPropertyBrowsable(const char* name, const char* title,
157  const char* draw, const TBranch* branch, const TVirtualBranchBrowsable* parent=0):
158  TVirtualBranchBrowsable(branch, 0, kFALSE, parent), fDraw(draw) {
159  // constructor, which sets the name and title according to the parameters
160  // (and thus differently than our base class TVirtualBranchBrowsable)
161  SetNameTitle(name, title);
162  }
163 
164 private:
165  TString fDraw; // string to send to TTree::Draw(), NOT by GetScope()!
166  ClassDef(TCollectionPropertyBrowsable, 0); // Helper object to add browsable collection properties
167 };
168 
169 class TCollectionMethodBrowsable: public TMethodBrowsable {
170 public:
171  ~TCollectionMethodBrowsable() {};
172 
173  static Int_t GetBrowsables(TList& list, const TBranch* branch,
174  const TVirtualBranchBrowsable* parent=0);
175  static void Register();
176  static void Unregister();
177 
178 protected:
179  TCollectionMethodBrowsable(const TBranch* branch, TMethod* m,
180  const TVirtualBranchBrowsable* parent=0);
181 
182  ClassDef(TCollectionMethodBrowsable,0); // Helper object to browse a collection's methods
183 };
184 
185 #endif // defined ROOT_TBranchBrowsable