// @(#)root/meta:$Id$
// Author: Damir Buskulic   23/11/2001

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// Describes one element of the context menu associated to a class      //
// The menu item may describe                                           //
//    - a separator,                                                    //
//    - standard list of methods i.e. the methods defined in            //
//      the described class by a *MENU* in the comment field            //
//      of the header,                                                  //
//    - a method of an external class or a global function              //
//  All the standard methods of the class are described by only         //
//  one item. Since a complete context menu is described by a TList of  //
//  TClassMenuItem elements, it is possible to customize the context    //
//  menu of a class by removing the element "standard methods" and      //
//  replacing it by whatever one wants.                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TClassMenuItem.h"
#include "TList.h"
#include "TClass.h"


ClassImp(TClassMenuItem)

//______________________________________________________________________________
TClassMenuItem::TClassMenuItem() : TObject()
{
   // Default TClassMenuItem ctor. TClassMenuItems are constructed in TClass
   // with a standard content but may be customized later
   // fType = 0 : external method/function
   // fType = 1 : separator
   // fType = 2 : standard methods list

   fType          = kPopupUserFunction;
   fSelf          = 0;
   fToggle        = 0;
   fCalledObject  = 0;
   fSubMenu       = 0;
   fParent        = 0;
   fSelfObjectPos = -1;
}

//______________________________________________________________________________
TClassMenuItem::TClassMenuItem(Int_t type, TClass *parentcl,
    const char *title, const char *functionname, TObject *obj,
    const char *args, Int_t selfobjposition, Bool_t self) : TObject()
{
   // TClassMenuItem ctor. TClassMenuItems are constructed in TClass
   // with a standard content but may be customized later
   // type = 0 : external method/function
   // type = 1 : separator
   // type = 2 : standard methods list
   // self indicates if the object to be called is the one selected
   // by the popup menu
   // selfobjposition, if non zero, indicates the position in the arguments
   // list of the argument corresponding to the selected (clicked) object.
   // This argument in the calling method should be a TObject*
   // Note: It is the responsability of the caller/creator to add to the
   // menu list.

   fType          = (EClassMenuItemType) type;
   fSelf          = self;
   fToggle        = 0;
   fTitle         = title;
   fCalledObject  = obj;
   fFunctionName  = functionname;
   fArgs          = args;
   fSubMenu       = 0;
   fParent        = parentcl;
   fSelfObjectPos = selfobjposition;
}

//______________________________________________________________________________
TClassMenuItem::TClassMenuItem(const TClassMenuItem& cmi) :
  TObject(cmi),
  fType(cmi.fType),
  fSelfObjectPos(cmi.fSelfObjectPos),
  fSelf(cmi.fSelf),
  fToggle(cmi.fToggle),
  fTitle(cmi.fTitle),
  fCalledObject(cmi.fCalledObject),
  fFunctionName(cmi.fFunctionName),
  fArgs(cmi.fArgs),
  fSubMenu(cmi.fSubMenu),
  fParent(cmi.fParent)
{ 
   //copy constructor
   // Note: It is the responsability of the caller/creator to add to the
   // menu list.
}

//______________________________________________________________________________
TClassMenuItem& TClassMenuItem::operator=(const TClassMenuItem& cmi) 
{
   //assignement operator
   // Note: It is the responsability of the caller/creator to add to the
   // menu list.
   if(this!=&cmi) {
      TObject::operator=(cmi);
      fType=cmi.fType;
      fSelfObjectPos=cmi.fSelfObjectPos;
      fSelf=cmi.fSelf;
      fToggle=cmi.fToggle;
      fTitle=cmi.fTitle;
      fCalledObject=cmi.fCalledObject;
      fFunctionName=cmi.fFunctionName;
      fArgs=cmi.fArgs;
      fSubMenu=cmi.fSubMenu;
      fParent=cmi.fParent;
   } 
   return *this;
}

//______________________________________________________________________________
TClassMenuItem::~TClassMenuItem()
{
   // TClassMenuItem dtor.

   if (fParent) fParent->GetMenuList()->Remove(this);
}
