Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
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%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) {
185 SetMethod(function);
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);",
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
const Bool_t kFALSE
Definition RtypesCore.h:92
long Long_t
Definition RtypesCore.h:54
const Bool_t kTRUE
Definition RtypesCore.h:91
#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:406
char * Form(const char *fmt,...)
#define gPad
Using a TBrowser one can browse all ROOT objects.
Definition TBrowser.h:37
void Refresh()
Refresh browser contents.
Definition TBrowser.cxx:388
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.
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.
virtual void SetCanvas(TVirtualPad *c)
TContextMenuImp * fContextMenuImp
virtual void SetCalledObject(TObject *o)
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
virtual void SetPad(TVirtualPad *p)
TFunction * fSelectedMethod
Context menu system specific implementation.
virtual void SetMethod(TFunction *m)
virtual void SetObject(TObject *o)
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
TObject * fSelectedObject
TVirtualPad * fSelectedCanvas
virtual const char * CreateDialogTitle(TObject *object, TFunction *method)
Create title for dialog box retrieving argument values.
TObject * fCalledObject
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.
virtual void SetSelectedMenuItem(TClassMenuItem *mi)
virtual void SetBrowser(TBrowser *b)
TClassMenuItem * fSelectedMenuItem
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.
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.
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:308
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
TString & String()
Definition TObjString.h:48
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.
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:1196
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:2309
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