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 "TVirtualPad.h"
41#include "TGuiFactory.h"
42#include "TMethod.h"
43#include "TMethodArg.h"
44#include "TObjArray.h"
45#include "TObjString.h"
46#include "TToggle.h"
47#include "TClassMenuItem.h"
48#include "TBrowser.h"
49#include "TClass.h"
50#include "TObjectSpy.h"
51
53
54
55////////////////////////////////////////////////////////////////////////////////
56/// Create a context menu.
57
58TContextMenu::TContextMenu(const char *name, const char *title)
59 : TNamed(name, title)
60{
62 fCalledObject = 0;
64 fBrowser = 0;
65 fSelectedPad = 0;
68
70}
71
72////////////////////////////////////////////////////////////////////////////////
73/// Destroy a context menu.
74
76{
77 delete fContextMenuImp;
78
80 fCalledObject = 0;
84}
85
86////////////////////////////////////////////////////////////////////////////////
87/// Action to be performed when this menu item is selected.
88/// If the selected method requires arguments we popup an
89/// automatically generated dialog, otherwise the method is
90/// directly executed.
91
92void TContextMenu::Action(TObject *object, TMethod *method)
93{
94 if (method) {
95 SetMethod( method );
97 SetCalledObject(object);
98
99 if (method->GetListOfMethodArgs()->First())
100 fContextMenuImp->Dialog(object, method);
101 else {
102 Execute(object, method, "");
103 }
104 }
105
106 if (fBrowser) fBrowser->Refresh();
107}
108
109////////////////////////////////////////////////////////////////////////////////
110/// Action to be performed when this menu item is selected.
111/// If the selected method requires arguments we popup an
112/// automatically generated dialog, otherwise the method is
113/// directly executed.
114
116{
118 TMethod* method = 0;
119
120 SetSelectedMenuItem( menuitem );
121
122 // Get the object to be called
123 if (menuitem->IsCallSelf()) object=fSelectedObject;
124 else object=menuitem->GetCalledObject();
125
126 if (object) {
127 // If object deleted, remove from popup and return
128 if (!(object->TestBit(kNotDeleted))) {
130 menuitem->SetCall(0,"");
131 return;
132 }
133
134 method = object->IsA()->GetMethodWithPrototype(menuitem->GetFunctionName(),menuitem->GetArgs());
135
136 }
137
138 // calling object, call the method directly
139 if (object) {
140 if (method) {
141 SetMethod(method);
142 SetCalledObject(object);
143
144 if ((method->GetListOfMethodArgs()->First()
145 && menuitem->GetSelfObjectPos() < 0 ) ||
146 method->GetListOfMethodArgs()->GetSize() > 1)
147 fContextMenuImp->Dialog(object, method);
148 else {
149 if (menuitem->GetSelfObjectPos() < 0) {
150#ifndef WIN32
151 Execute(object, method, "");
152#else
153 // It is a workaround of the "Dead lock under Windows
154 char *cmd = Form("((TContextMenu *)0x%lx)->Execute((TObject *)0x%lx,"
155 "(TMethod *)0x%lx,\"\");",
156 (Long_t)this,(Long_t)object,(Long_t)method);
157 //Printf("%s", cmd);
158 gROOT->ProcessLine(cmd);
159 //Execute( object, method, (TObjArray *)NULL );
160#endif
161 } else {
162#ifndef WIN32
163 Execute(object, method, Form("(TObject*)0x%lx",(Long_t)fSelectedObject));
164#else
165 // It is a workaround of the "Dead lock under Windows
166 char *cmd = Form("((TContextMenu *)0x%lx)->Execute((TObject *)0x%lx,"
167 "(TMethod *)0x%lx,(TObject*)0x%lx);",
168 (Long_t)this,(Long_t)object,(Long_t)method,
170 //Printf("%s", cmd);
171 gROOT->ProcessLine(cmd);
172 //Execute( object, method, (TObjArray *)NULL );
173#endif
174 }
175 }
176 }
177
178 } else {
179 // Calling a standalone global function
180 TFunction* function = gROOT->GetGlobalFunctionWithPrototype(
181 menuitem->GetFunctionName());
182 //menuitem->GetArgs());
183 if (function) {
186 if ( (function->GetNargs() && menuitem->GetSelfObjectPos() < 0) ||
187 function->GetNargs() > 1) {
189 } else {
190 char* cmd;
191 if (menuitem->GetSelfObjectPos() < 0) {
192 cmd = Form("%s();", menuitem->GetFunctionName());
193 } else {
194 cmd = Form("%s((TObject*)0x%lx);",
196 }
197 gROOT->ProcessLine(cmd);
198 }
199 }
200 }
201
202 if (fBrowser) fBrowser->Refresh();
203}
204
205////////////////////////////////////////////////////////////////////////////////
206/// Action to be performed when this toggle menu item is selected.
207
209{
210 if (object && toggle) {
211 TObjectSpy savePad;
212
213 gROOT->SetSelectedPrimitive(object);
214 if (fSelectedPad && gPad) {
215 savePad.SetObject(gPad);
216 fSelectedPad->cd();
217 }
220
221 gROOT->SetFromPopUp(kTRUE);
222 toggle->Toggle();
225 if (fSelectedPad)
227 gROOT->SetFromPopUp(kFALSE);
228
229 if (savePad.GetObject())
230 ((TVirtualPad*)savePad.GetObject())->cd();
231
232 if (fSelectedCanvas) {
236 }
237 }
238
239 if (fBrowser) fBrowser->Refresh();
240}
241
242////////////////////////////////////////////////////////////////////////////////
243/// Create string describing argument (for use in dialog box).
244
246{
247 static TString argTitle;
248
249 if (argument) {
250 argTitle.Form("(%s) %s", argument->GetTitle(), argument->GetName());
251 if (argument->GetDefault() && *(argument->GetDefault())) {
252 argTitle += " [default: ";
253 argTitle += argument->GetDefault();
254 argTitle += "]";
255 }
256 } else
257 argTitle.Clear();
258
259 return argTitle.Data();
260}
261
262////////////////////////////////////////////////////////////////////////////////
263/// Create title for dialog box retrieving argument values.
264
266{
267 static TString methodTitle;
268
269 if (object && method)
270 methodTitle.Form("%s::%s", object->ClassName(), method->GetName());
271 else if (!object && method)
272 methodTitle.Form("%s", method->GetName());
273 else
274 methodTitle.Clear();
275
276 return methodTitle.Data();
277}
278
279////////////////////////////////////////////////////////////////////////////////
280/// Create title for popup menu.
281
283{
284 static TString popupTitle;
285
286 if (object) {
287 const char* clname = object->IsA()->GetContextMenuTitle();
288 if (!clname[0])
289 clname = object->ClassName();
290
291 if (!*(object->GetName()) || !strcmp(object->GetName(), object->ClassName())) {
292 popupTitle.Form(" %s ", clname);
293 } else {
294 popupTitle.Form(" %s::%s ", clname, object->GetName());
295 }
296 if (popupTitle.Length() > 60) {
297 popupTitle.Remove(60);
298 popupTitle += "...";
299 }
300 } else
301 popupTitle.Clear();
302
303 return popupTitle.Data();
304}
305
306////////////////////////////////////////////////////////////////////////////////
307/// Execute method with specified arguments for specified object.
308
309void TContextMenu::Execute(TObject *object, TFunction *method, const char *params)
310{
311 if (method) {
312 TObjectSpy savePad;
313
314 gROOT->SetSelectedPrimitive(object);
315 if (fSelectedPad && gPad) {
316 savePad.SetObject(gPad);
317 fSelectedPad->cd();
318 }
321
322 gROOT->SetFromPopUp(kTRUE);
323 if (object) {
324 object->Execute((char *) method->GetName(), params);
325 } else {
326 char *cmd = Form("%s(%s);", method->GetName(),params);
327 gROOT->ProcessLine(cmd);
328 }
331 if (fSelectedPad)
333 gROOT->SetFromPopUp(kFALSE);
334
335 if (savePad.GetObject())
336 ((TVirtualPad*)savePad.GetObject())->cd();
337
338 if (fSelectedCanvas) {
342 }
343 }
344
345 if (fBrowser) fBrowser->Refresh();
346}
347
348////////////////////////////////////////////////////////////////////////////////
349/// Execute method with specified arguments for specified object.
350
351void TContextMenu::Execute(TObject *object, TFunction *method, TObjArray *params)
352{
353 if (method) {
354 TObjectSpy savePad;
355
356 gROOT->SetSelectedPrimitive(object);
357 if (fSelectedPad && gPad) {
358 savePad.SetObject(gPad);
359 fSelectedPad->cd();
360 }
363
364 gROOT->SetFromPopUp(kTRUE);
365 if (object) {
366 object->Execute((TMethod*)method, params);
367 } else {
368 TString args;
369 TIter next(params);
370 TObjString *s;
371 while ((s = (TObjString*) next())) {
372 if (!args.IsNull()) args += ",";
373 args += s->String();
374 }
375 char *cmd = Form("%s(%s);", method->GetName(), args.Data());
376 gROOT->ProcessLine(cmd);
377 }
380 if (fSelectedPad)
382 gROOT->SetFromPopUp(kFALSE);
383
384 if (savePad.GetObject())
385 ((TVirtualPad*)savePad.GetObject())->cd();
386
387 if (fSelectedCanvas) {
391 }
392 }
393 if (fBrowser) fBrowser->Refresh();
394}
395
396////////////////////////////////////////////////////////////////////////////////
397/// Popup context menu at given location in canvas c and pad p for selected
398/// object.
399
401{
402 SetBrowser(0);
403 SetObject(obj);
404 SetCanvas(c);
405 SetPad(p);
406
408}
409
410////////////////////////////////////////////////////////////////////////////////
411/// Popup context menu at given location in browser b for selected object.
412
414{
415 SetBrowser(b);
416 SetObject(obj);
417 SetCanvas(0);
418 SetPad(0);
419
421}
#define b(i)
Definition: RSha256.hxx:100
#define c(i)
Definition: RSha256.hxx:101
const Bool_t kFALSE
Definition: RtypesCore.h:90
long Long_t
Definition: RtypesCore.h:52
const Bool_t kTRUE
Definition: RtypesCore.h:89
#define ClassImp(name)
Definition: Rtypes.h:361
char name[80]
Definition: TGX11.cxx:109
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
#define gROOT
Definition: TROOT.h:406
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:377
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:182
virtual void Dialog(TObject *object, TFunction *function)
This class provides an interface to context sensitive popup menus.
Definition: TContextMenu.h:40
virtual void SetCanvas(TVirtualPad *c)
Definition: TContextMenu.h:92
TContextMenuImp * fContextMenuImp
Definition: TContextMenu.h:49
virtual void DisplayPopUp(Int_t x, Int_t y)
Definition: TContextMenu.h:58
virtual void SetCalledObject(TObject *o)
Definition: TContextMenu.h:95
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:56
virtual void SetPad(TVirtualPad *p)
Definition: TContextMenu.h:99
TFunction * fSelectedMethod
Context menu system specific implementation.
Definition: TContextMenu.h:50
virtual void SetMethod(TFunction *m)
Definition: TContextMenu.h:94
virtual void SetObject(TObject *o)
Definition: TContextMenu.h:98
virtual const char * CreateArgumentTitle(TMethodArg *argument)
Create string describing argument (for use in dialog box).
TVirtualPad * fSelectedPad
Definition: TContextMenu.h:55
TObject * fSelectedObject
Definition: TContextMenu.h:51
TVirtualPad * fSelectedCanvas
Definition: TContextMenu.h:54
virtual const char * CreateDialogTitle(TObject *object, TFunction *method)
Create title for dialog box retrieving argument values.
TObject * fCalledObject
Definition: TContextMenu.h:52
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:76
virtual void SetSelectedMenuItem(TClassMenuItem *mi)
Definition: TContextMenu.h:96
virtual void SetBrowser(TBrowser *b)
Definition: TContextMenu.h:93
TClassMenuItem * fSelectedMenuItem
Definition: TContextMenu.h:53
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:28
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:658
Each ROOT method (see TMethod) has a linked list of its arguments.
Definition: TMethodArg.h:31
const char * GetDefault() const
Get default value of method argument.
Definition: TMethodArg.cxx:58
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:306
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:78
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:131
Ssiz_t Length() const
Definition: TString.h:405
void Clear()
Clear string without changing its capacity.
Definition: TString.cxx:1176
const char * Data() const
Definition: TString.h:364
Bool_t IsNull() const
Definition: TString.h:402
TString & Remove(Ssiz_t pos)
Definition: TString.h:668
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2289
This class defines toggling facility for both - object's method or variables.
Definition: TToggle.h:43
virtual void Toggle()
Toggles the Values and State of this object and connected data!
Definition: TToggle.cxx:111
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:151
static constexpr double s