ROOT logo
// @(#)root/qtgsi:$Id: TQCanvasMenu.cxx 27157 2009-01-15 14:05:12Z brun $
// Author: Denis Bertini, M. Al-Turany  01/11/2000

/*************************************************************************
 * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "Riostream.h"
#include "snprintf.h"
#include "qevent.h"
#include "qdialog.h"
#include "qpushbutton.h"
#include "qlabel.h"
#include "qpainter.h"
#if  (QT_VERSION > 0x039999) // Added by cholm@nbi.dk - for Qt 4
# include "qmenu.h"
# include "q3popupmenu.h"
typedef Q3PopupMenu QPopupMenu;
#else
# include "qpopupmenu.h"
#endif


#include "TQCanvasMenu.h"
#include "TClass.h"
#include "TROOT.h"
#include "TMethod.h"
#include "TMethodCall.h"
#include "TMethodArg.h"
#include "TCanvas.h"
#include "TDataType.h"
#include "TQRootDialog.h"

ClassImp(TQCanvasMenu)

//______________________________________________________________________________
TQCanvasMenu::TQCanvasMenu(QWidget* parent, TCanvas *canvas)
{
   // ctor, create the popup menu

   fc=canvas;
   fPopup = new QPopupMenu;
   fCurrObj=0;
   fParent= parent;
   fTabWin=0;
}

//______________________________________________________________________________
TQCanvasMenu::TQCanvasMenu(QWidget* parent, QWidget *tabWin, TCanvas *canvas)
{
   // ctor, create the popup menu

   fc=canvas;
   fPopup = new QPopupMenu;
   fParent = parent;
   fTabWin = tabWin;
   fCurrObj=0;
}

//______________________________________________________________________________
TQCanvasMenu::~TQCanvasMenu()
{
   // dtor

   if (fPopup) delete fPopup;
}

//______________________________________________________________________________
char *TQCanvasMenu::CreateDialogTitle( TObject *object, TMethod *method )
{
   // Create title for dialog box retrieving argument values.

   static char methodTitle[128];

   if (object && method)
      snprintf(methodTitle, 127, "%s::%s", object->ClassName(), method->GetName());
   else
      *methodTitle = 0;
   return methodTitle;

}

//______________________________________________________________________________
char *TQCanvasMenu::CreateArgumentTitle(TMethodArg *argument)
{
   // Create string describing argument (for use in dialog box).

   static Char_t argTitle[128];
   if (argument) {
      snprintf(argTitle, 127, "(%s)  %s", argument->GetTitle(), argument->GetName());
      if (argument->GetDefault() && *(argument->GetDefault())) {
         strcat(argTitle, "  [default: ");
         strcat(argTitle, argument->GetDefault());
         strcat(argTitle, "]");
      }
   }
   else
      *argTitle = 0;

   return argTitle;
}

//______________________________________________________________________________
void TQCanvasMenu::Popup(TObject *obj, double x, double y, QMouseEvent *e)
{
   // Perform the corresponding selected TObject  popup
   // in the position defined
   // by x, y coordinates (in user coordinate system).
   // @param obj (TObject*)
   // @param p (QPoint&)

   TClass *klass=obj->IsA();
   Int_t curId=-1;

   fCurrObj=obj;
   fPopup->clear();
   fMethods.Clear();

   QString buffer=klass->GetName();
   buffer+="::";
   buffer+=obj->GetName();
   fPopup->insertItem(buffer, this, SLOT( Execute(int) ), 0,curId); curId++;
   klass->GetMenuItems(&fMethods);
   fPopup->insertSeparator();
   TIter iter(&fMethods);
   TMethod *method=0;
   while ( (method = dynamic_cast<TMethod*>(iter())) != 0) {
      buffer=method->GetName();
      fPopup->insertItem(buffer, this, SLOT( Execute(int) ), 0,curId);
      curId++;
   }
   // hold the position where the mouse was clicked
   fMousePosX= x;
   fMousePosY= y;

   // let Qt decide how to draw the popup Menu otherwise we have a problem that
   // the visible rectangle can get outside the screen (M.T. 03.06.02)
   fPopup->popup(e->globalPos(), 0);

}

//______________________________________________________________________________
void TQCanvasMenu::Execute(int id)
{
   // Slot defined to execute a method from a selected TObject
   // using TObject::Execute() function.

   QString text="";

   TVirtualPad  *psave = gROOT->GetSelectedPad();
   TMethod *method=(TMethod *)fMethods.At(id);
   fc->HandleInput(kButton3Up,gPad->XtoAbsPixel(fMousePosX), gPad->YtoAbsPixel(fMousePosY) );
   if (  method->GetListOfMethodArgs()->First() ) {
      Dialog(fCurrObj,method);
   }
   else {
      gROOT->SetFromPopUp(kTRUE);
      fCurrObj->Execute((char *) method->GetName(), "");
   }
   fc->GetPadSave()->Update();
   fc->GetPadSave()->Modified();
   gROOT->SetSelectedPad(psave);
   gROOT->GetSelectedPad()->Update();
   gROOT->GetSelectedPad()->Modified();
   fc->Modified();
   fc->ForceUpdate();
   gROOT->SetFromPopUp( kFALSE );
}

//______________________________________________________________________________
void TQCanvasMenu::Dialog(TObject* object, TMethod* method)
{
   // Create dialog object with OK and Cancel buttons. This dialog
   // prompts for the arguments of "method".

   if (!(object && method)) return;
   fDialog = new TQRootDialog(fParent,CreateDialogTitle(object, method),0,object ,method);
   fDialog->SetTCanvas(fc);
   // iterate through all arguments and create apropriate input-data objects:
   // inputlines, option menus...
   TMethodArg *argument = 0;
   TIter next(method->GetListOfMethodArgs());
   while ((argument = (TMethodArg *) next())) {
      char       *argname    = CreateArgumentTitle(argument);
      const char *type       = argument->GetTypeName();
      TDataType    *datatype   = gROOT->GetType(type);
      const char *charstar   = "char*";
      char        basictype [32];

      if (datatype) {
         strncpy(basictype, datatype->GetTypeName(),31);
      }
      else {
         if (strncmp(type, "enum", 4) != 0)
         cout << "*** Warning in Dialog(): data type is not basic type, assuming (int)\n";
         strcpy(basictype, "int");
      }

      if (strchr(argname, '*')) {
         strcat(basictype, "*");
         type = charstar;
      }

      TDataMember *m = argument->GetDataMember();
      if (m && m->GetterMethod()) {
         char gettername[256] = "";
         strncpy(gettername, m->GetterMethod()->GetMethodName(),255);
         m->GetterMethod()->Init(object->IsA(), gettername, "");
         // Get the current value and form it as a text:
         char val[256];
         if (!strncmp(basictype, "char*", 5)) {
            char *tdefval;
            m->GetterMethod()->Execute(object, "", &tdefval);
            strncpy(val, tdefval, 255);
         }
         else if (!strncmp(basictype, "float", 5) ||
            !strncmp(basictype, "double", 6)) {
            Double_t ddefval;
            m->GetterMethod()->Execute(object, "", ddefval);
            snprintf(val, 255, "%g", ddefval);
         }
         else if (!strncmp(basictype, "char", 4) ||
             !strncmp(basictype, "int", 3)  ||
             !strncmp(basictype, "long", 4) ||
             !strncmp(basictype, "short", 5)) {
            Long_t ldefval;
            m->GetterMethod()->Execute(object, "", ldefval);
            snprintf(val, 255, "%li", ldefval);
         }
         // Find out whether we have options ...
         TList *opt;
         if ((opt = m->GetOptions())) {
            cout << "*** Warning in Dialog(): option menu not yet implemented " << opt << endl;
            // should stop dialog
            return;
         }
         else {
            // we haven't got options - textfield ...
            fDialog->Add(argname, val, type);
         }
      }
      else {    // if m not found ...
         char val[256] = "";
         const char *tval = argument->GetDefault();
         if (tval) strncpy(val, tval, 255);
         fDialog->Add(argname, val, type);
      }
   } //end while

   fDialog->Popup();
}
 TQCanvasMenu.cxx:1
 TQCanvasMenu.cxx:2
 TQCanvasMenu.cxx:3
 TQCanvasMenu.cxx:4
 TQCanvasMenu.cxx:5
 TQCanvasMenu.cxx:6
 TQCanvasMenu.cxx:7
 TQCanvasMenu.cxx:8
 TQCanvasMenu.cxx:9
 TQCanvasMenu.cxx:10
 TQCanvasMenu.cxx:11
 TQCanvasMenu.cxx:12
 TQCanvasMenu.cxx:13
 TQCanvasMenu.cxx:14
 TQCanvasMenu.cxx:15
 TQCanvasMenu.cxx:16
 TQCanvasMenu.cxx:17
 TQCanvasMenu.cxx:18
 TQCanvasMenu.cxx:19
 TQCanvasMenu.cxx:20
 TQCanvasMenu.cxx:21
 TQCanvasMenu.cxx:22
 TQCanvasMenu.cxx:23
 TQCanvasMenu.cxx:24
 TQCanvasMenu.cxx:25
 TQCanvasMenu.cxx:26
 TQCanvasMenu.cxx:27
 TQCanvasMenu.cxx:28
 TQCanvasMenu.cxx:29
 TQCanvasMenu.cxx:30
 TQCanvasMenu.cxx:31
 TQCanvasMenu.cxx:32
 TQCanvasMenu.cxx:33
 TQCanvasMenu.cxx:34
 TQCanvasMenu.cxx:35
 TQCanvasMenu.cxx:36
 TQCanvasMenu.cxx:37
 TQCanvasMenu.cxx:38
 TQCanvasMenu.cxx:39
 TQCanvasMenu.cxx:40
 TQCanvasMenu.cxx:41
 TQCanvasMenu.cxx:42
 TQCanvasMenu.cxx:43
 TQCanvasMenu.cxx:44
 TQCanvasMenu.cxx:45
 TQCanvasMenu.cxx:46
 TQCanvasMenu.cxx:47
 TQCanvasMenu.cxx:48
 TQCanvasMenu.cxx:49
 TQCanvasMenu.cxx:50
 TQCanvasMenu.cxx:51
 TQCanvasMenu.cxx:52
 TQCanvasMenu.cxx:53
 TQCanvasMenu.cxx:54
 TQCanvasMenu.cxx:55
 TQCanvasMenu.cxx:56
 TQCanvasMenu.cxx:57
 TQCanvasMenu.cxx:58
 TQCanvasMenu.cxx:59
 TQCanvasMenu.cxx:60
 TQCanvasMenu.cxx:61
 TQCanvasMenu.cxx:62
 TQCanvasMenu.cxx:63
 TQCanvasMenu.cxx:64
 TQCanvasMenu.cxx:65
 TQCanvasMenu.cxx:66
 TQCanvasMenu.cxx:67
 TQCanvasMenu.cxx:68
 TQCanvasMenu.cxx:69
 TQCanvasMenu.cxx:70
 TQCanvasMenu.cxx:71
 TQCanvasMenu.cxx:72
 TQCanvasMenu.cxx:73
 TQCanvasMenu.cxx:74
 TQCanvasMenu.cxx:75
 TQCanvasMenu.cxx:76
 TQCanvasMenu.cxx:77
 TQCanvasMenu.cxx:78
 TQCanvasMenu.cxx:79
 TQCanvasMenu.cxx:80
 TQCanvasMenu.cxx:81
 TQCanvasMenu.cxx:82
 TQCanvasMenu.cxx:83
 TQCanvasMenu.cxx:84
 TQCanvasMenu.cxx:85
 TQCanvasMenu.cxx:86
 TQCanvasMenu.cxx:87
 TQCanvasMenu.cxx:88
 TQCanvasMenu.cxx:89
 TQCanvasMenu.cxx:90
 TQCanvasMenu.cxx:91
 TQCanvasMenu.cxx:92
 TQCanvasMenu.cxx:93
 TQCanvasMenu.cxx:94
 TQCanvasMenu.cxx:95
 TQCanvasMenu.cxx:96
 TQCanvasMenu.cxx:97
 TQCanvasMenu.cxx:98
 TQCanvasMenu.cxx:99
 TQCanvasMenu.cxx:100
 TQCanvasMenu.cxx:101
 TQCanvasMenu.cxx:102
 TQCanvasMenu.cxx:103
 TQCanvasMenu.cxx:104
 TQCanvasMenu.cxx:105
 TQCanvasMenu.cxx:106
 TQCanvasMenu.cxx:107
 TQCanvasMenu.cxx:108
 TQCanvasMenu.cxx:109
 TQCanvasMenu.cxx:110
 TQCanvasMenu.cxx:111
 TQCanvasMenu.cxx:112
 TQCanvasMenu.cxx:113
 TQCanvasMenu.cxx:114
 TQCanvasMenu.cxx:115
 TQCanvasMenu.cxx:116
 TQCanvasMenu.cxx:117
 TQCanvasMenu.cxx:118
 TQCanvasMenu.cxx:119
 TQCanvasMenu.cxx:120
 TQCanvasMenu.cxx:121
 TQCanvasMenu.cxx:122
 TQCanvasMenu.cxx:123
 TQCanvasMenu.cxx:124
 TQCanvasMenu.cxx:125
 TQCanvasMenu.cxx:126
 TQCanvasMenu.cxx:127
 TQCanvasMenu.cxx:128
 TQCanvasMenu.cxx:129
 TQCanvasMenu.cxx:130
 TQCanvasMenu.cxx:131
 TQCanvasMenu.cxx:132
 TQCanvasMenu.cxx:133
 TQCanvasMenu.cxx:134
 TQCanvasMenu.cxx:135
 TQCanvasMenu.cxx:136
 TQCanvasMenu.cxx:137
 TQCanvasMenu.cxx:138
 TQCanvasMenu.cxx:139
 TQCanvasMenu.cxx:140
 TQCanvasMenu.cxx:141
 TQCanvasMenu.cxx:142
 TQCanvasMenu.cxx:143
 TQCanvasMenu.cxx:144
 TQCanvasMenu.cxx:145
 TQCanvasMenu.cxx:146
 TQCanvasMenu.cxx:147
 TQCanvasMenu.cxx:148
 TQCanvasMenu.cxx:149
 TQCanvasMenu.cxx:150
 TQCanvasMenu.cxx:151
 TQCanvasMenu.cxx:152
 TQCanvasMenu.cxx:153
 TQCanvasMenu.cxx:154
 TQCanvasMenu.cxx:155
 TQCanvasMenu.cxx:156
 TQCanvasMenu.cxx:157
 TQCanvasMenu.cxx:158
 TQCanvasMenu.cxx:159
 TQCanvasMenu.cxx:160
 TQCanvasMenu.cxx:161
 TQCanvasMenu.cxx:162
 TQCanvasMenu.cxx:163
 TQCanvasMenu.cxx:164
 TQCanvasMenu.cxx:165
 TQCanvasMenu.cxx:166
 TQCanvasMenu.cxx:167
 TQCanvasMenu.cxx:168
 TQCanvasMenu.cxx:169
 TQCanvasMenu.cxx:170
 TQCanvasMenu.cxx:171
 TQCanvasMenu.cxx:172
 TQCanvasMenu.cxx:173
 TQCanvasMenu.cxx:174
 TQCanvasMenu.cxx:175
 TQCanvasMenu.cxx:176
 TQCanvasMenu.cxx:177
 TQCanvasMenu.cxx:178
 TQCanvasMenu.cxx:179
 TQCanvasMenu.cxx:180
 TQCanvasMenu.cxx:181
 TQCanvasMenu.cxx:182
 TQCanvasMenu.cxx:183
 TQCanvasMenu.cxx:184
 TQCanvasMenu.cxx:185
 TQCanvasMenu.cxx:186
 TQCanvasMenu.cxx:187
 TQCanvasMenu.cxx:188
 TQCanvasMenu.cxx:189
 TQCanvasMenu.cxx:190
 TQCanvasMenu.cxx:191
 TQCanvasMenu.cxx:192
 TQCanvasMenu.cxx:193
 TQCanvasMenu.cxx:194
 TQCanvasMenu.cxx:195
 TQCanvasMenu.cxx:196
 TQCanvasMenu.cxx:197
 TQCanvasMenu.cxx:198
 TQCanvasMenu.cxx:199
 TQCanvasMenu.cxx:200
 TQCanvasMenu.cxx:201
 TQCanvasMenu.cxx:202
 TQCanvasMenu.cxx:203
 TQCanvasMenu.cxx:204
 TQCanvasMenu.cxx:205
 TQCanvasMenu.cxx:206
 TQCanvasMenu.cxx:207
 TQCanvasMenu.cxx:208
 TQCanvasMenu.cxx:209
 TQCanvasMenu.cxx:210
 TQCanvasMenu.cxx:211
 TQCanvasMenu.cxx:212
 TQCanvasMenu.cxx:213
 TQCanvasMenu.cxx:214
 TQCanvasMenu.cxx:215
 TQCanvasMenu.cxx:216
 TQCanvasMenu.cxx:217
 TQCanvasMenu.cxx:218
 TQCanvasMenu.cxx:219
 TQCanvasMenu.cxx:220
 TQCanvasMenu.cxx:221
 TQCanvasMenu.cxx:222
 TQCanvasMenu.cxx:223
 TQCanvasMenu.cxx:224
 TQCanvasMenu.cxx:225
 TQCanvasMenu.cxx:226
 TQCanvasMenu.cxx:227
 TQCanvasMenu.cxx:228
 TQCanvasMenu.cxx:229
 TQCanvasMenu.cxx:230
 TQCanvasMenu.cxx:231
 TQCanvasMenu.cxx:232
 TQCanvasMenu.cxx:233
 TQCanvasMenu.cxx:234
 TQCanvasMenu.cxx:235
 TQCanvasMenu.cxx:236
 TQCanvasMenu.cxx:237
 TQCanvasMenu.cxx:238
 TQCanvasMenu.cxx:239
 TQCanvasMenu.cxx:240
 TQCanvasMenu.cxx:241
 TQCanvasMenu.cxx:242
 TQCanvasMenu.cxx:243
 TQCanvasMenu.cxx:244
 TQCanvasMenu.cxx:245
 TQCanvasMenu.cxx:246
 TQCanvasMenu.cxx:247
 TQCanvasMenu.cxx:248
 TQCanvasMenu.cxx:249
 TQCanvasMenu.cxx:250
 TQCanvasMenu.cxx:251
 TQCanvasMenu.cxx:252
 TQCanvasMenu.cxx:253
 TQCanvasMenu.cxx:254
 TQCanvasMenu.cxx:255