Logo ROOT   6.16/01
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 "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
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{
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,
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%lx);",
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/// Execute method with specified arguments for specified object.
309
310void 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 }
332 if (fSelectedPad)
334 gROOT->SetFromPopUp(kFALSE);
335
336 if (savePad.GetObject())
337 ((TVirtualPad*)savePad.GetObject())->cd();
338
339 if (fSelectedCanvas) {
343 }
344 }
345
346 if (fBrowser) fBrowser->Refresh();
347}
348
349////////////////////////////////////////////////////////////////////////////////
350/// Execute method with specified arguments for specified object.
351
352void 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 }
381 if (fSelectedPad)
383 gROOT->SetFromPopUp(kFALSE);
384
385 if (savePad.GetObject())
386 ((TVirtualPad*)savePad.GetObject())->cd();
387
388 if (fSelectedCanvas) {
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
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
422}
#define b(i)
Definition: RSha256.hxx:100
#define c(i)
Definition: RSha256.hxx:101
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
long Long_t
Definition: RtypesCore.h:50
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassImp(name)
Definition: Rtypes.h:363
R__EXTERN TGuiFactory * gGuiFactory
Definition: TGuiFactory.h:66
#define gROOT
Definition: TROOT.h:410
char * Form(const char *fmt,...)
#define gPad
Definition: TVirtualPad.h:286
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.
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 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 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.
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
TObject * fCalledObject
Definition: TContextMenu.h:52
virtual const char * CreatePopupTitle(TObject *object)
Create title for popup menu.
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:655
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:1151
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:2264
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:50
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