Logo ROOT   6.12/07
Reference Guide
TContextMenu.cxx
Go to the documentation of this file.
1 // @(#)root/base:$Id$
2 // Author: Nenad Buncic 08/02/96
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, 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 /** \class TContextMenu
13 \ingroup Base
14 
15 This class provides an interface to context sensitive popup menus.
16 These menus pop up when the user hits the right mouse button, and
17 are destroyed when the menu pops downs.
18 
19 Context Menus are automatically generated by ROOT using the
20 following convention: if the string `// *MENU*` is found in the
21 comment field of a member function. This function will be added to
22 the list of items in the menu.
23 
24 The picture below shows a canvas with a pop-up menu.
25 
26 \image html base_hsummenu.png
27 
28 The picture below shows a canvas with a pop-up menu and a dialog box.
29 
30 \image html base_hsumdialog.png
31 */
32 
33 // silence warning about some cast operations
34 #if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || (__GNUC_MINOR__ >= 3)))) && !__INTEL_COMPILER
35 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
36 #endif
37 
38 #include "TROOT.h"
39 #include "TContextMenu.h"
40 #include "TVirtualPad.h"
41 #include "TGuiFactory.h"
42 #include "TMethod.h"
43 #include "TMethodArg.h"
44 #include "TGlobal.h"
45 #include "TObjArray.h"
46 #include "TObjString.h"
47 #include "TToggle.h"
48 #include "TClassMenuItem.h"
49 #include "TBrowser.h"
50 #include "TClass.h"
51 #include "TObjectSpy.h"
52 
54 
55 
56 ////////////////////////////////////////////////////////////////////////////////
57 /// Create a context menu.
58 
59 TContextMenu::TContextMenu(const char *name, const char *title)
60  : TNamed(name, title)
61 {
62  fSelectedObject = 0;
63  fCalledObject = 0;
64  fSelectedMethod = 0;
65  fBrowser = 0;
66  fSelectedPad = 0;
67  fSelectedCanvas = 0;
69 
70  fContextMenuImp = gGuiFactory->CreateContextMenuImp(this, name, title);
71 }
72 
73 ////////////////////////////////////////////////////////////////////////////////
74 /// Destroy a context menu.
75 
77 {
78  delete fContextMenuImp;
79 
80  fSelectedMethod = 0;
81  fCalledObject = 0;
82  fSelectedObject = 0;
84  fContextMenuImp = 0;
85 }
86 
87 ////////////////////////////////////////////////////////////////////////////////
88 /// Action to be performed when this menu item is selected.
89 /// If the selected method requires arguments we popup an
90 /// automatically generated dialog, otherwise the method is
91 /// directly executed.
92 
93 void TContextMenu::Action(TObject *object, TMethod *method)
94 {
95  if (method) {
96  SetMethod( method );
98  SetCalledObject(object);
99 
100  if (method->GetListOfMethodArgs()->First())
101  fContextMenuImp->Dialog(object, method);
102  else {
103  Execute(object, method, "");
104  }
105  }
106 
107  if (fBrowser) fBrowser->Refresh();
108 }
109 
110 ////////////////////////////////////////////////////////////////////////////////
111 /// Action to be performed when this menu item is selected.
112 /// If the selected method requires arguments we popup an
113 /// automatically generated dialog, otherwise the method is
114 /// directly executed.
115 
117 {
118  TObject* object;
119  TMethod* method = 0;
120 
121  SetSelectedMenuItem( menuitem );
122 
123  // Get the object to be called
124  if (menuitem->IsCallSelf()) object=fSelectedObject;
125  else object=menuitem->GetCalledObject();
126 
127  if (object) {
128  // If object deleted, remove from popup and return
129  if (!(object->TestBit(kNotDeleted))) {
131  menuitem->SetCall(0,"");
132  return;
133  }
134 
135  method = object->IsA()->GetMethodWithPrototype(menuitem->GetFunctionName(),menuitem->GetArgs());
136 
137  }
138 
139  // calling object, call the method directly
140  if (object) {
141  if (method) {
142  SetMethod(method);
143  SetCalledObject(object);
144 
145  if ((method->GetListOfMethodArgs()->First()
146  && menuitem->GetSelfObjectPos() < 0 ) ||
147  method->GetListOfMethodArgs()->GetSize() > 1)
148  fContextMenuImp->Dialog(object, method);
149  else {
150  if (menuitem->GetSelfObjectPos() < 0) {
151 #ifndef WIN32
152  Execute(object, method, "");
153 #else
154  // It is a workaround of the "Dead lock under Windows
155  char *cmd = Form("((TContextMenu *)0x%lx)->Execute((TObject *)0x%lx,"
156  "(TMethod *)0x%lx,\"\");",
157  (Long_t)this,(Long_t)object,(Long_t)method);
158  //Printf("%s", cmd);
159  gROOT->ProcessLine(cmd);
160  //Execute( object, method, (TObjArray *)NULL );
161 #endif
162  } else {
163 #ifndef WIN32
164  Execute(object, method, Form("(TObject*)0x%lx",(Long_t)fSelectedObject));
165 #else
166  // It is a workaround of the "Dead lock under Windows
167  char *cmd = Form("((TContextMenu *)0x%lx)->Execute((TObject *)0x%lx,"
168  "(TMethod *)0x%lx,(TObject*)0x%lx);",
169  (Long_t)this,(Long_t)object,(Long_t)method,
170  (Long_t)fSelectedObject);
171  //Printf("%s", cmd);
172  gROOT->ProcessLine(cmd);
173  //Execute( object, method, (TObjArray *)NULL );
174 #endif
175  }
176  }
177  }
178 
179  } else {
180  // Calling a standalone global function
181  TFunction* function = gROOT->GetGlobalFunctionWithPrototype(
182  menuitem->GetFunctionName());
183  //menuitem->GetArgs());
184  if (function) {
185  SetMethod(function);
186  SetCalledObject(0);
187  if ( (function->GetNargs() && menuitem->GetSelfObjectPos() < 0) ||
188  function->GetNargs() > 1) {
189  fContextMenuImp->Dialog(0,function);
190  } else {
191  char* cmd;
192  if (menuitem->GetSelfObjectPos() < 0) {
193  cmd = Form("%s();", menuitem->GetFunctionName());
194  } else {
195  cmd = Form("%s((TObject*)0x%lx);",
196  menuitem->GetFunctionName(), (Long_t)fSelectedObject);
197  }
198  gROOT->ProcessLine(cmd);
199  }
200  }
201  }
202 
203  if (fBrowser) fBrowser->Refresh();
204 }
205 
206 ////////////////////////////////////////////////////////////////////////////////
207 /// Action to be performed when this toggle menu item is selected.
208 
209 void TContextMenu::Action(TObject *object, TToggle *toggle)
210 {
211  if (object && toggle) {
212  TObjectSpy savePad;
213 
214  gROOT->SetSelectedPrimitive(object);
215  if (fSelectedPad && gPad) {
216  savePad.SetObject(gPad);
217  fSelectedPad->cd();
218  }
221 
222  gROOT->SetFromPopUp(kTRUE);
223  toggle->Toggle();
224  if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
225  fSelectedCanvas->GetPadSave()->Modified();
226  if (fSelectedPad)
227  fSelectedPad->Modified();
228  gROOT->SetFromPopUp(kFALSE);
229 
230  if (savePad.GetObject())
231  ((TVirtualPad*)savePad.GetObject())->cd();
232 
233  if (fSelectedCanvas) {
234  fSelectedCanvas->Update();
235  if (fSelectedCanvas->GetPadSave())
236  fSelectedCanvas->GetPadSave()->Update();
237  }
238  }
239 
240  if (fBrowser) fBrowser->Refresh();
241 }
242 
243 ////////////////////////////////////////////////////////////////////////////////
244 /// Create string describing argument (for use in dialog box).
245 
247 {
248  static TString argTitle;
249 
250  if (argument) {
251  argTitle.Form("(%s) %s", argument->GetTitle(), argument->GetName());
252  if (argument->GetDefault() && *(argument->GetDefault())) {
253  argTitle += " [default: ";
254  argTitle += argument->GetDefault();
255  argTitle += "]";
256  }
257  } else
258  argTitle.Clear();
259 
260  return argTitle.Data();
261 }
262 
263 ////////////////////////////////////////////////////////////////////////////////
264 /// Create title for dialog box retrieving argument values.
265 
266 const char *TContextMenu::CreateDialogTitle(TObject *object, TFunction *method)
267 {
268  static TString methodTitle;
269 
270  if (object && method)
271  methodTitle.Form("%s::%s", object->ClassName(), method->GetName());
272  else if (!object && method)
273  methodTitle.Form("%s", method->GetName());
274  else
275  methodTitle.Clear();
276 
277  return methodTitle.Data();
278 }
279 
280 ////////////////////////////////////////////////////////////////////////////////
281 /// Create title for popup menu.
282 
284 {
285  static TString popupTitle;
286 
287  if (object) {
288  const char* clname = object->IsA()->GetContextMenuTitle();
289  if (!clname[0])
290  clname = object->ClassName();
291 
292  if (!*(object->GetName()) || !strcmp(object->GetName(), object->ClassName())) {
293  popupTitle.Form(" %s ", clname);
294  } else {
295  popupTitle.Form(" %s::%s ", clname, object->GetName());
296  }
297  if (popupTitle.Length() > 60) {
298  popupTitle.Remove(60);
299  popupTitle += "...";
300  }
301  } else
302  popupTitle.Clear();
303 
304  return popupTitle.Data();
305 }
306 
307 ////////////////////////////////////////////////////////////////////////////////
308 /// Execute method with specified arguments for specified object.
309 
310 void TContextMenu::Execute(TObject *object, TFunction *method, const char *params)
311 {
312  if (method) {
313  TObjectSpy savePad;
314 
315  gROOT->SetSelectedPrimitive(object);
316  if (fSelectedPad && gPad) {
317  savePad.SetObject(gPad);
318  fSelectedPad->cd();
319  }
322 
323  gROOT->SetFromPopUp(kTRUE);
324  if (object) {
325  object->Execute((char *) method->GetName(), params);
326  } else {
327  char *cmd = Form("%s(%s);", method->GetName(),params);
328  gROOT->ProcessLine(cmd);
329  }
330  if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
331  fSelectedCanvas->GetPadSave()->Modified();
332  if (fSelectedPad)
333  fSelectedPad->Modified();
334  gROOT->SetFromPopUp(kFALSE);
335 
336  if (savePad.GetObject())
337  ((TVirtualPad*)savePad.GetObject())->cd();
338 
339  if (fSelectedCanvas) {
340  fSelectedCanvas->Update();
341  if (fSelectedCanvas->GetPadSave())
342  fSelectedCanvas->GetPadSave()->Update();
343  }
344  }
345 
346  if (fBrowser) fBrowser->Refresh();
347 }
348 
349 ////////////////////////////////////////////////////////////////////////////////
350 /// Execute method with specified arguments for specified object.
351 
352 void TContextMenu::Execute(TObject *object, TFunction *method, TObjArray *params)
353 {
354  if (method) {
355  TObjectSpy savePad;
356 
357  gROOT->SetSelectedPrimitive(object);
358  if (fSelectedPad && gPad) {
359  savePad.SetObject(gPad);
360  fSelectedPad->cd();
361  }
364 
365  gROOT->SetFromPopUp(kTRUE);
366  if (object) {
367  object->Execute((TMethod*)method, params);
368  } else {
369  TString args;
370  TIter next(params);
371  TObjString *s;
372  while ((s = (TObjString*) next())) {
373  if (!args.IsNull()) args += ",";
374  args += s->String();
375  }
376  char *cmd = Form("%s(%s);", method->GetName(), args.Data());
377  gROOT->ProcessLine(cmd);
378  }
379  if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
380  fSelectedCanvas->GetPadSave()->Modified();
381  if (fSelectedPad)
382  fSelectedPad->Modified();
383  gROOT->SetFromPopUp(kFALSE);
384 
385  if (savePad.GetObject())
386  ((TVirtualPad*)savePad.GetObject())->cd();
387 
388  if (fSelectedCanvas) {
389  fSelectedCanvas->Update();
390  if (fSelectedCanvas->GetPadSave())
391  fSelectedCanvas->GetPadSave()->Update();
392  }
393  }
394  if (fBrowser) fBrowser->Refresh();
395 }
396 
397 ////////////////////////////////////////////////////////////////////////////////
398 /// Popup context menu at given location in canvas c and pad p for selected
399 /// object.
400 
402 {
403  SetBrowser(0);
404  SetObject(obj);
405  SetCanvas(c);
406  SetPad(p);
407 
408  DisplayPopUp(x,y);
409 }
410 
411 ////////////////////////////////////////////////////////////////////////////////
412 /// Popup context menu at given location in browser b for selected object.
413 
415 {
416  SetBrowser(b);
417  SetObject(obj);
418  SetCanvas(0);
419  SetPad(0);
420 
421  DisplayPopUp(x,y);
422 }
Describes one element of the context menu associated to a class The menu item may describe...
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
An array of TObjects.
Definition: TObjArray.h:37
This class defines toggling facility for both - object&#39;s method or variables.
Definition: TToggle.h:43
Collectable string class.
Definition: TObjString.h:28
#define gROOT
Definition: TROOT.h:402
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
Basic string class.
Definition: TString.h:125
int Int_t
Definition: RtypesCore.h:41
TVirtualPad * fSelectedPad
Definition: TContextMenu.h:55
virtual TContextMenuImp * CreateContextMenuImp(TContextMenu *c, const char *name, const char *title)
Create a batch version of TContextMenuImp.
Definition: TGuiFactory.cxx:88
TClassMenuItem * fSelectedMenuItem
Definition: TContextMenu.h:53
Each ROOT method (see TMethod) has a linked list of its arguments.
Definition: TMethodArg.h:31
virtual void Execute(const char *method, const char *params, Int_t *error=0)
Execute method on this object with the given parameter string, e.g.
Definition: TContextMenu.h:76
TFunction * fSelectedMethod
Context menu system specific implementation.
Definition: TContextMenu.h:50
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
virtual const char * CreateDialogTitle(TObject *object, TFunction *method)
Create title for dialog box retrieving argument values.
virtual void Toggle()
Toggles the Values and State of this object and connected data!
Definition: TToggle.cxx:111
virtual void SetType(Int_t type)
virtual void Action(TObject *object, TMethod *method)
Action to be performed when this menu item is selected.
TObject * fSelectedObject
Definition: TContextMenu.h:51
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
Double_t x[n]
Definition: legend1.C:17
virtual void SetCanvas(TVirtualPad *c)
Definition: TContextMenu.h:92
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
virtual void SetCalledObject(TObject *o)
Definition: TContextMenu.h:95
void SetObject(TObject *obj, Bool_t fixMustCleanupBit=kTRUE)
Set obj as the spy target.
Definition: TObjectSpy.cxx:78
TObject * fCalledObject
Definition: TContextMenu.h:52
void Clear()
Clear string without changing its capacity.
Definition: TString.cxx:1150
TContextMenuImp * fContextMenuImp
Definition: TContextMenu.h:49
virtual void Popup(Int_t x, Int_t y, TObject *obj, TVirtualPad *c=0, TVirtualPad *p=0)
Popup context menu at given location in canvas c and pad p for selected object.
virtual void SetBrowser(TBrowser *b)
Definition: TContextMenu.h:93
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
Definition: RExports.h:146
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition: TVirtualPad.h:49
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
virtual const char * CreateArgumentTitle(TMethodArg *argument)
Create string describing argument (for use in dialog box).
object has not been deleted
Definition: TObject.h:78
TBrowser * fBrowser
Definition: TContextMenu.h:56
virtual void SetObject(TObject *o)
Definition: TContextMenu.h:98
virtual void SetSelectedMenuItem(TClassMenuItem *mi)
Definition: TContextMenu.h:96
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:37
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();...
Definition: TMethod.cxx:305
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
Definition: TList.cxx:655
virtual const char * CreatePopupTitle(TObject *object)
Create title for popup menu.
virtual void Dialog(TObject *object, TFunction *function)
This class provides an interface to context sensitive popup menus.
Definition: TContextMenu.h:40
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2343
char * Form(const char *fmt,...)
Ssiz_t Length() const
Definition: TString.h:386
virtual ~TContextMenu()
Destroy a context menu.
TString & String()
Definition: TObjString.h:49
virtual void SetCall(TObject *obj, const char *method, const char *args="", Int_t selfobjposition=0)
const Bool_t kFALSE
Definition: RtypesCore.h:88
TString & Remove(Ssiz_t pos)
Definition: TString.h:619
long Long_t
Definition: RtypesCore.h:50
#define ClassImp(name)
Definition: Rtypes.h:359
virtual const char * GetArgs() const
Double_t y[n]
Definition: legend1.C:17
virtual void SetPad(TVirtualPad *p)
Definition: TContextMenu.h:99
virtual TObject * GetCalledObject() const
static constexpr double s
virtual Int_t GetSelfObjectPos() const
TVirtualPad * fSelectedCanvas
Definition: TContextMenu.h:54
virtual const char * GetFunctionName() const
Bool_t IsNull() const
Definition: TString.h:383
Mother of all ROOT objects.
Definition: TObject.h:37
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:28
const char * GetDefault() const
Get default value of method argument.
Definition: TMethodArg.cxx:58
virtual void DisplayPopUp(Int_t x, Int_t y)
Definition: TContextMenu.h:58
Each ROOT class (see TClass) has a linked list of methods.
Definition: TMethod.h:38
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Definition: TRolke.cxx:630
#define gPad
Definition: TVirtualPad.h:285
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
virtual Int_t GetSize() const
Definition: TCollection.h:180
Monitors objects for deletion and reflects the deletion by reverting the internal pointer to zero...
Definition: TObjectSpy.h:30
const Bool_t kTRUE
Definition: RtypesCore.h:87
TObject * GetObject() const
Definition: TObjectSpy.h:45
void Refresh()
Refresh browser contents.
Definition: TBrowser.cxx:377
char name[80]
Definition: TGX11.cxx:109
virtual Bool_t IsCallSelf() const
virtual void SetMethod(TFunction *m)
Definition: TContextMenu.h:94
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:48
const char * Data() const
Definition: TString.h:345