Logo ROOT  
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
15This class provides an interface to context sensitive popup menus.
16These menus pop up when the user hits the right mouse button, and
17are destroyed when the menu pops downs.
18
19Context Menus are automatically generated by ROOT using the
20following convention: if the string `// *MENU*` is found in the
21comment field of a member function. This function will be added to
22the list of items in the menu.
23
24The picture below shows a canvas with a pop-up menu.
25
26\image html base_hsummenu.png
27
28The 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 "TContextMenuImp.h"
41#include "TVirtualPad.h"
42#include "TGuiFactory.h"
43#include "TMethod.h"
44#include "TMethodArg.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
59TContextMenu::TContextMenu(const char *name, const char *title)
60 : TNamed(name, title)
61{
63 fCalledObject = 0;
65 fBrowser = 0;
66 fSelectedPad = 0;
69
71}
72
73////////////////////////////////////////////////////////////////////////////////
74/// Destroy a context menu.
75
77{
78 delete fContextMenuImp;
79
81 fCalledObject = 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
93void 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{
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%zx)->Execute((TObject *)0x%zx,"
156 "(TMethod *)0x%zx,\"\");",
157 (size_t)this,(size_t)object,(size_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%zx",(size_t)fSelectedObject));
165#else
166 // It is a workaround of the "Dead lock under Windows
167 char *cmd = Form("((TContextMenu *)0x%zx)->Execute((TObject *)0x%zx,"
168 "(TMethod *)0x%zx,(TObject*)0x%zx);",
169 (size_t)this,(size_t)object,(size_t)method,
170 (size_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) {
187 if ( (function->GetNargs() && menuitem->GetSelfObjectPos() < 0) ||
188 function->GetNargs() > 1) {
190 } else {
191 char* cmd;
192 if (menuitem->GetSelfObjectPos() < 0) {
193 cmd = Form("%s();", menuitem->GetFunctionName());
194 } else {
195 cmd = Form("%s((TObject*)0x%zx);",
196 menuitem->GetFunctionName(), (size_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
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();
226 if (fSelectedPad)
228 gROOT->SetFromPopUp(kFALSE);
229
230 if (savePad.GetObject())
231 ((TVirtualPad*)savePad.GetObject())->cd();
232
233 if (fSelectedCanvas) {
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
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/// Display popup.
309
311{
312 if (fContextMenuImp)
314}
315
316
317////////////////////////////////////////////////////////////////////////////////
318/// Execute method with specified arguments for specified object.
319
320void TContextMenu::Execute(TObject *object, TFunction *method, const char *params)
321{
322 if (method) {
323 TObjectSpy savePad;
324
325 gROOT->SetSelectedPrimitive(object);
326 if (fSelectedPad && gPad) {
327 savePad.SetObject(gPad);
328 fSelectedPad->cd();
329 }
332
333 gROOT->SetFromPopUp(kTRUE);
334 if (object) {
335 object->Execute((char *) method->GetName(), params);
336 } else {
337 char *cmd = Form("%s(%s);", method->GetName(),params);
338 gROOT->ProcessLine(cmd);
339 }
342 if (fSelectedPad)
344 gROOT->SetFromPopUp(kFALSE);
345
346 if (savePad.GetObject())
347 ((TVirtualPad*)savePad.GetObject())->cd();
348
349 if (fSelectedCanvas) {
353 }
354 }
355
356 if (fBrowser) fBrowser->Refresh();
357}
358
359////////////////////////////////////////////////////////////////////////////////
360/// Execute method with specified arguments for specified object.
361
362void TContextMenu::Execute(TObject *object, TFunction *method, TObjArray *params)
363{
364 if (method) {
365 TObjectSpy savePad;
366
367 gROOT->SetSelectedPrimitive(object);
368 if (fSelectedPad && gPad) {
369 savePad.SetObject(gPad);
370 fSelectedPad->cd();
371 }
374
375 gROOT->SetFromPopUp(kTRUE);
376 if (object) {
377 object->Execute((TMethod*)method, params);
378 } else {
379 TString args;
380 TIter next(params);
381 TObjString *s;
382 while ((s = (TObjString*) next())) {
383 if (!args.IsNull()) args += ",";
384 args += s->String();
385 }
386 char *cmd = Form("%s(%s);", method->GetName(), args.Data());
387 gROOT->ProcessLine(cmd);
388 }
391 if (fSelectedPad)
393 gROOT->SetFromPopUp(kFALSE);
394
395 if (savePad.GetObject())
396 ((TVirtualPad*)savePad.GetObject())->cd();
397
398 if (fSelectedCanvas) {
402 }
403 }
404 if (fBrowser) fBrowser->Refresh();
405}
406
407////////////////////////////////////////////////////////////////////////////////
408/// Popup context menu at given location in canvas c and pad p for selected
409/// object.
410
412{
413 SetBrowser(0);
414 SetObject(obj);
415 SetCanvas(c);
416 SetPad(p);
417
419}
420
421////////////////////////////////////////////////////////////////////////////////
422/// Popup context menu at given location in browser b for selected object.
423
425{
426 SetBrowser(b);
427 SetObject(obj);
428 SetCanvas(0);
429 SetPad(0);
430
432}
#define b(i)
Definition: RSha256.hxx:100
#define c(i)
Definition: RSha256.hxx:101
int Int_t
Definition: RtypesCore.h:45
const Bool_t kFALSE
Definition: RtypesCore.h:101
const Bool_t kTRUE
Definition: RtypesCore.h:100
#define ClassImp(name)
Definition: Rtypes.h:364
char name[80]
Definition: TGX11.cxx:110
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
#define gROOT
Definition: TROOT.h:404
char * Form(const char *fmt,...)
#define gPad
Definition: TVirtualPad.h:287
Using a TBrowser one can browse all ROOT objects.
Definition: TBrowser.h:37
void Refresh()
Refresh browser contents.
Definition: TBrowser.cxx:397
Describes one element of the context menu associated to a class The menu item may describe.
virtual const char * GetArgs() const
virtual void SetType(Int_t type)
virtual Bool_t IsCallSelf() const
virtual TObject * GetCalledObject() const
virtual void SetCall(TObject *obj, const char *method, const char *args="", Int_t selfobjposition=0)
virtual const char * GetFunctionName() const
virtual Int_t GetSelfObjectPos() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Definition: TCollection.h:184
virtual void Dialog(TObject *object, TFunction *function)
virtual void DisplayPopup(Int_t x, Int_t y)
This class provides an interface to context sensitive popup menus.
Definition: TContextMenu.h:44
virtual void SetCanvas(TVirtualPad *c)
Definition: TContextMenu.h:95
TContextMenuImp * fContextMenuImp
Definition: TContextMenu.h:53
virtual void SetCalledObject(TObject *o)
Definition: TContextMenu.h:98
virtual ~TContextMenu()
Destroy a context menu.
virtual void Action(TObject *object, TMethod *method)
Action to be performed when this menu item is selected.
virtual void Popup(Int_t x, Int_t y, TObject *obj, TVirtualPad *c=nullptr, TVirtualPad *p=nullptr)
Popup context menu at given location in canvas c and pad p for selected object.
TBrowser * fBrowser
Definition: TContextMenu.h:60
virtual void SetPad(TVirtualPad *p)
Definition: TContextMenu.h:102
TFunction * fSelectedMethod
Context menu system specific implementation.
Definition: TContextMenu.h:54
virtual void SetMethod(TFunction *m)
Definition: TContextMenu.h:97
virtual void SetObject(TObject *o)
Definition: TContextMenu.h:101
virtual const char * CreateArgumentTitle(TMethodArg *argument)
Create string describing argument (for use in dialog box).
virtual void DisplayPopUp(Int_t x, Int_t y)
Display popup.
TVirtualPad * fSelectedPad
Definition: TContextMenu.h:59
TObject * fSelectedObject
Definition: TContextMenu.h:55
TVirtualPad * fSelectedCanvas
Definition: TContextMenu.h:58
virtual const char * CreateDialogTitle(TObject *object, TFunction *method)
Create title for dialog box retrieving argument values.
TObject * fCalledObject
Definition: TContextMenu.h:56
virtual const char * CreatePopupTitle(TObject *object)
Create title for popup menu.
virtual void Execute(const char *method, const char *params, Int_t *error=nullptr)
Execute method on this object with the given parameter string, e.g.
Definition: TContextMenu.h:79
virtual void SetSelectedMenuItem(TClassMenuItem *mi)
Definition: TContextMenu.h:99
virtual void SetBrowser(TBrowser *b)
Definition: TContextMenu.h:96
TClassMenuItem * fSelectedMenuItem
Definition: TContextMenu.h:57
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:30
virtual TContextMenuImp * CreateContextMenuImp(TContextMenu *c, const char *name, const char *title)
Create a batch version of TContextMenuImp.
Definition: TGuiFactory.cxx:88
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
Definition: TList.cxx:659
Each ROOT method (see TMethod) has a linked list of its arguments.
Definition: TMethodArg.h:36
const char * GetDefault() const
Get default value of method argument.
Definition: TMethodArg.cxx:57
Each ROOT class (see TClass) has a linked list of methods.
Definition: TMethod.h:38
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
Definition: TMethod.cxx:307
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
virtual const char * GetTitle() const
Returns title of object.
Definition: TNamed.h:48
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
An array of TObjects.
Definition: TObjArray.h:37
Collectable string class.
Definition: TObjString.h:28
Monitors objects for deletion and reflects the deletion by reverting the internal pointer to zero.
Definition: TObjectSpy.h:30
TObject * GetObject() const
Definition: TObjectSpy.h:45
void SetObject(TObject *obj, Bool_t fixMustCleanupBit=kTRUE)
Set obj as the spy target.
Definition: TObjectSpy.cxx:79
Mother of all ROOT objects.
Definition: TObject.h:37
@ kNotDeleted
object has not been deleted
Definition: TObject.h:78
Basic string class.
Definition: TString.h:136
Ssiz_t Length() const
Definition: TString.h:410
void Clear()
Clear string without changing its capacity.
Definition: TString.cxx:1201
const char * Data() const
Definition: TString.h:369
Bool_t IsNull() const
Definition: TString.h:407
TString & Remove(Ssiz_t pos)
Definition: TString.h:673
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2314
This class defines toggling facility for both - object's method or variables.
Definition: TToggle.h:47
virtual void Toggle()
Toggles the Values and State of this object and connected data!
Definition: TToggle.cxx:112
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition: TVirtualPad.h:51
virtual void Modified(Bool_t flag=1)=0
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
virtual void Update()=0
virtual TVirtualPad * GetPadSave() const =0
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
Definition: RExports.h:152
static constexpr double s