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"
52 ClassImp(TContextMenu);
58 TContextMenu::TContextMenu(
const char *name,
const char *title)
67 fSelectedMenuItem = 0;
69 fContextMenuImp = gGuiFactory->CreateContextMenuImp(
this, name, title);
75 TContextMenu::~TContextMenu()
77 delete fContextMenuImp;
82 fSelectedMenuItem = 0;
92 void TContextMenu::Action(TObject *
object, TMethod *method)
96 SetSelectedMenuItem(0);
97 SetCalledObject(
object);
99 if (method->GetListOfMethodArgs()->First())
100 fContextMenuImp->Dialog(
object, method);
102 Execute(
object, method,
"");
106 if (fBrowser) fBrowser->Refresh();
115 void TContextMenu::Action(TClassMenuItem *menuitem)
120 SetSelectedMenuItem( menuitem );
123 if (menuitem->IsCallSelf())
object=fSelectedObject;
124 else object=menuitem->GetCalledObject();
128 if (!(object->TestBit(kNotDeleted))) {
129 menuitem->SetType(TClassMenuItem::kPopupSeparator);
130 menuitem->SetCall(0,
"");
134 method =
object->IsA()->GetMethodWithPrototype(menuitem->GetFunctionName(),menuitem->GetArgs());
142 SetCalledObject(
object);
144 if ((method->GetListOfMethodArgs()->First()
145 && menuitem->GetSelfObjectPos() < 0 ) ||
146 method->GetListOfMethodArgs()->GetSize() > 1)
147 fContextMenuImp->Dialog(
object, method);
149 if (menuitem->GetSelfObjectPos() < 0) {
151 Execute(
object, method,
"");
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);
158 gROOT->ProcessLine(cmd);
163 Execute(
object, method, Form(
"(TObject*)0x%lx",(Long_t)fSelectedObject));
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,
169 (Long_t)fSelectedObject);
171 gROOT->ProcessLine(cmd);
180 TFunction*
function = gROOT->GetGlobalFunctionWithPrototype(
181 menuitem->GetFunctionName());
186 if ( (function->GetNargs() && menuitem->GetSelfObjectPos() < 0) ||
187 function->GetNargs() > 1) {
188 fContextMenuImp->Dialog(0,
function);
191 if (menuitem->GetSelfObjectPos() < 0) {
192 cmd = Form(
"%s();", menuitem->GetFunctionName());
194 cmd = Form(
"%s((TObject*)0x%lx);",
195 menuitem->GetFunctionName(), (Long_t)fSelectedObject);
197 gROOT->ProcessLine(cmd);
202 if (fBrowser) fBrowser->Refresh();
208 void TContextMenu::Action(TObject *
object, TToggle *toggle)
210 if (
object && toggle) {
213 gROOT->SetSelectedPrimitive(
object);
214 if (fSelectedPad && gPad) {
215 savePad.SetObject(gPad);
218 TObjectRefSpy fsp((TObject*&) fSelectedPad);
219 TObjectRefSpy fsc((TObject*&) fSelectedCanvas);
221 gROOT->SetFromPopUp(kTRUE);
223 if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
224 fSelectedCanvas->GetPadSave()->Modified();
226 fSelectedPad->Modified();
227 gROOT->SetFromPopUp(kFALSE);
229 if (savePad.GetObject())
230 ((TVirtualPad*)savePad.GetObject())->cd();
232 if (fSelectedCanvas) {
233 fSelectedCanvas->Update();
234 if (fSelectedCanvas->GetPadSave())
235 fSelectedCanvas->GetPadSave()->Update();
239 if (fBrowser) fBrowser->Refresh();
245 const char *TContextMenu::CreateArgumentTitle(TMethodArg *argument)
247 static TString argTitle;
250 argTitle.Form(
"(%s) %s", argument->GetTitle(), argument->GetName());
251 if (argument->GetDefault() && *(argument->GetDefault())) {
252 argTitle +=
" [default: ";
253 argTitle += argument->GetDefault();
259 return argTitle.Data();
265 const char *TContextMenu::CreateDialogTitle(TObject *
object, TFunction *method)
267 static TString methodTitle;
269 if (
object && method)
270 methodTitle.Form(
"%s::%s", object->ClassName(), method->GetName());
271 else if (!
object && method)
272 methodTitle.Form(
"%s", method->GetName());
276 return methodTitle.Data();
282 const char *TContextMenu::CreatePopupTitle(TObject *
object)
284 static TString popupTitle;
287 const char* clname =
object->IsA()->GetContextMenuTitle();
289 clname =
object->ClassName();
291 if (!*(object->GetName()) || !strcmp(object->GetName(),
object->ClassName())) {
292 popupTitle.Form(
" %s ", clname);
294 popupTitle.Form(
" %s::%s ", clname, object->GetName());
296 if (popupTitle.Length() > 60) {
297 popupTitle.Remove(60);
303 return popupTitle.Data();
309 void TContextMenu::Execute(TObject *
object, TFunction *method,
const char *params)
314 gROOT->SetSelectedPrimitive(
object);
315 if (fSelectedPad && gPad) {
316 savePad.SetObject(gPad);
319 TObjectRefSpy fsp((TObject*&) fSelectedPad);
320 TObjectRefSpy fsc((TObject*&) fSelectedCanvas);
322 gROOT->SetFromPopUp(kTRUE);
324 object->Execute((
char *) method->GetName(), params);
326 char *cmd = Form(
"%s(%s);", method->GetName(),params);
327 gROOT->ProcessLine(cmd);
329 if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
330 fSelectedCanvas->GetPadSave()->Modified();
332 fSelectedPad->Modified();
333 gROOT->SetFromPopUp(kFALSE);
335 if (savePad.GetObject())
336 ((TVirtualPad*)savePad.GetObject())->cd();
338 if (fSelectedCanvas) {
339 fSelectedCanvas->Update();
340 if (fSelectedCanvas->GetPadSave())
341 fSelectedCanvas->GetPadSave()->Update();
345 if (fBrowser) fBrowser->Refresh();
351 void TContextMenu::Execute(TObject *
object, TFunction *method, TObjArray *params)
356 gROOT->SetSelectedPrimitive(
object);
357 if (fSelectedPad && gPad) {
358 savePad.SetObject(gPad);
361 TObjectRefSpy fsp((TObject*&) fSelectedPad);
362 TObjectRefSpy fsc((TObject*&) fSelectedCanvas);
364 gROOT->SetFromPopUp(kTRUE);
366 object->Execute((TMethod*)method, params);
371 while ((s = (TObjString*) next())) {
372 if (!args.IsNull()) args +=
",";
375 char *cmd = Form(
"%s(%s);", method->GetName(), args.Data());
376 gROOT->ProcessLine(cmd);
378 if (fSelectedCanvas && fSelectedCanvas->GetPadSave())
379 fSelectedCanvas->GetPadSave()->Modified();
381 fSelectedPad->Modified();
382 gROOT->SetFromPopUp(kFALSE);
384 if (savePad.GetObject())
385 ((TVirtualPad*)savePad.GetObject())->cd();
387 if (fSelectedCanvas) {
388 fSelectedCanvas->Update();
389 if (fSelectedCanvas->GetPadSave())
390 fSelectedCanvas->GetPadSave()->Update();
393 if (fBrowser) fBrowser->Refresh();
400 void TContextMenu::Popup(Int_t x, Int_t y, TObject *obj, TVirtualPad *c, TVirtualPad *p)
413 void TContextMenu::Popup(Int_t x, Int_t y, TObject *obj, TBrowser *b)