//*CMZ :  1.03/08 13/06/98  23.03.41  by  Rene Brun
//*-- Author :    Nenad Buncic   08/02/96

//*KEEP,CopyRight,T=C.
/*************************************************************************
 * Copyright(c) 1995-1998, The ROOT System, All rights reserved.         *
 * Authors: Rene Brun, Nenad Buncic, Valery Fine, Fons Rademakers.       *
 *                                                                       *
 * Permission to use, copy, modify and distribute this software and its  *
 * documentation for non-commercial purposes is hereby granted without   *
 * fee, provided that the above copyright notice appears in all copies   *
 * and that both the copyright notice and this permission notice appear  *
 * in the supporting documentation. The authors make no claims about the *
 * suitability of this software for any purpose.                         *
 * It is provided "as is" without express or implied warranty.           *
 *************************************************************************/
//*KEND.

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
// TContextMenu                                                               //
//                                                                            //
// This class provides an interface to  context sensitive popup menus.        //
// These menus pop up when the user hits  the right mouse button,  and        //
// are destroyed when the menu pops downs.                                    //
//                                                                            //
// Context Menus are automatically generated by ROOT using the following      //
// convention:                                                                //
// If the string // *MENU* is found in the comment field of a member function //
// This function will be added to the list of items in the menu.              //
//
// The picture below shows a canvas with a pop-up menu.                       //
//                                                                            //
//                              //
//                                                                            //
// The picture below shows a canvas with a pop-up menu and a dialog box.      //
//                                                                            //
//                            //
////////////////////////////////////////////////////////////////////////////////

//*KEEP,TROOT.
#include "TROOT.h"
//*KEEP,TInterpreter, T=C++.
#include "TInterpreter.h"
//*KEEP,TContextMenu,T=C++.
#include "TContextMenu.h"
//*KEEP,TVirtualPad.
#include "TVirtualPad.h"
//*KEEP,TGuiFactory.
#include "TGuiFactory.h"
//*KEEP,TMethod.
#include "TMethod.h"
//*KEEP,TMethodArg.
#include "TMethodArg.h"
//*KEEP,TGlobal.
#include "TGlobal.h"
//*KEEP,TObjArray.
#include "TObjArray.h"
//*KEEP,TObjString.
#include "TObjString.h"
//*KEND.


ClassImp(TContextMenu)


//______________________________________________________________________________
 TContextMenu::TContextMenu( const Char_t *name, const Char_t *title )
             : TNamed( name, title )
{
    fSelectedObject = 0;
    fSelectedMethod = 0;

    fContextMenuImp = gGuiFactory->CreateContextMenuImp( this, name, title );
}


//______________________________________________________________________________
 TContextMenu::~TContextMenu()
{

    delete fContextMenuImp;

    fSelectedMethod = 0;
    fSelectedObject = 0;
    fContextMenuImp = 0;
}


//______________________________________________________________________________
 void TContextMenu::Action( TObject *object, TMethod *method )
{
    if ( method ) {
        SetMethod( method );

        if ( method->GetListOfMethodArgs()->First() )
            fContextMenuImp->Dialog( object, method );
        else {
#ifndef WIN32
            Execute( object, method, "" );
#else
//*-* It is a workaround of the "Dead lock under Windows
            char cmd[]= "((TContextMenu *)0x1234567890123456)->Execute((TObject *)0x1234567890123456,(TMethod *)0x1234567890123456,(TObjArray *)NULL );";
            sprintf(cmd,"((TContextMenu *)0x%x)->Execute((TObject *)0x%x,(TMethod *)0x%x,(TObjArray *)0 );",
                          this,object,method);
            Printf("%s n", cmd);
            gInterpreter->ProcessLine(cmd);

//            Execute( object, method, (TObjArray *)NULL );
#endif
       }
    }
}


//______________________________________________________________________________
 Char_t *TContextMenu::CreateArgumentTitle( TMethodArg *argument )
{
    static Char_t argTitle[128];

    if ( argument ) {
        sprintf( argTitle, "(%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 );
}


//______________________________________________________________________________
 Char_t *TContextMenu::CreateDialogTitle( TObject *object, TMethod *method )
{
    static Char_t methodTitle[128];

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

    return( methodTitle );
}


//______________________________________________________________________________
 Char_t *TContextMenu::CreatePopupTitle( TObject *object )
{
    static Char_t popupTitle[128];

    if ( object ) {
        if ( !*( object->GetName() ) || !strcmp( object->GetName(), object->ClassName() ) ) {
            TGlobal *global = (TGlobal *) gROOT->GetGlobal( object );
            if ( global && *( global->GetName() ) )
                sprintf( popupTitle, "  %s::%s  ", object->ClassName(), global->GetName() );
            else
                sprintf( popupTitle, "  %s  ", object->ClassName() );
        }
        else sprintf( popupTitle, "  %s::%s  ", object->ClassName(), object->GetName() );
    }
    else *popupTitle = 0;

    return( popupTitle );
}


//______________________________________________________________________________
 void TContextMenu::Execute( TObject *object, TMethod *method, Char_t *params )
{
    if ( object && method ) {
        TVirtualPad *savedPad = 0;

        gROOT->SetSelectedPrimitive(object);
        if( fSelectedPad ) {
            savedPad = (TVirtualPad *) gPad;
            if( savedPad ) fSelectedPad->cd();
        }

        gROOT->SetFromPopUp( kTRUE );
//        if (fSelectedCanvas) fSelectedCanvas->GetPadSave()->cd();
        object->Execute( (char *) method->GetName(), params );
        if (fSelectedCanvas) fSelectedCanvas->GetPadSave()->Modified();
        if (fSelectedPad) fSelectedPad->Modified();
        gROOT->SetFromPopUp( kFALSE );

        if( fSelectedPad && savedPad ) {
//            fSelectedPad->Modified();
            if (savedPad->TestBit(kNotDeleted)) savedPad->cd();
        }

        if (fSelectedCanvas) fSelectedCanvas->Update();
        if (fSelectedCanvas) fSelectedCanvas->GetPadSave()->Update();
    }
}

//______________________________________________________________________________
 void TContextMenu::Execute( TObject *object, TMethod *method, TObjArray *params )
{
    if ( object && method ) {
        TVirtualPad *savedPad = 0;

        gROOT->SetSelectedPrimitive(object);
        if( fSelectedPad ) {
            savedPad = (TVirtualPad *) gPad;
            if( savedPad ) fSelectedPad->cd();
        }

        gROOT->SetFromPopUp( kTRUE );
        if (fSelectedCanvas) fSelectedCanvas->GetPadSave()->cd();
        object->Execute( method, params );
        if (fSelectedCanvas) fSelectedCanvas->GetPadSave()->Modified();
        gROOT->SetFromPopUp( kFALSE );

        if( fSelectedPad && savedPad ) {
//            fSelectedPad->Modified();
            if (savedPad->TestBit(kNotDeleted)) savedPad->cd();
        }

        if( fSelectedCanvas ) fSelectedCanvas->Update();
    }
}

//______________________________________________________________________________
 void TContextMenu::Popup( Int_t x, Int_t y, TObject *obj, TVirtualPad *c, TVirtualPad *p )
{
    SetBrowser(0);
    SetObject( obj );
    SetCanvas( c );
    SetPad( p );

    DisplayPopUp(x,y);
}

//______________________________________________________________________________
 void TContextMenu::Popup( Int_t x, Int_t y, TObject *obj, TBrowser *b)
{
    SetBrowser(b);
    SetObject( obj );
    SetCanvas( 0 );
    SetPad( 0 );

    DisplayPopUp(x,y);
}


ROOT page - Class index - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.