// @(#)root/treeviewer:$Id$
//Author : Andrei Gheata   16/08/00

 * 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.             *

#ifndef ROOT_TTVLVContainer
#define ROOT_TTVLVContainer

//                                                                      //
// TTVLVEntry                                                           //
//                                                                      //
// This class represent entries that goes into the TreeViewer           //
// listview container. It subclasses TGLVEntry and adds 2               //
// data members: the item true name and the alias                       //
//                                                                      //

#ifndef ROOT_TGListView
#include "TGListView.h"

class TGLabel;
class TGTextEntry;
class TTreeViewer;
class TGToolTip;
class TTVLVEntry;
class TTVLVContainer;

class TGItemContext : public TObject {

   TTVLVEntry *fItem;       // pointer to associated item
   virtual     ~TGItemContext() { }
   void         Associate(TTVLVEntry *item) { fItem = item; }
   virtual void Delete(Option_t *) { }           // *MENU*
   void         Draw(Option_t *option="");       // *MENU*
   void         EditExpression();                // *MENU*
   void         Empty();                         // *MENU*
   void         RemoveItem();                    // *MENU*
   void         Scan();                          // *MENU*
   void         SetExpression(const char *name="", const char *alias="-empty-", Bool_t cut=kFALSE); // *MENU*

   ClassDef(TGItemContext, 0)  // Context menu for TTVLVEntry

class TTVLVEntry : public TGLVEntry {

   TTVLVContainer *fContainer;  // container to whom this item belongs
   TString         fTrueName;   // name for this entry
   TString         fAlias;      // alias for this entry
   TString         fConvName;   // name converted into true expressions
   TGToolTip      *fTip;        // tool tip associated with item
   Bool_t          fIsCut;      // flag for cut type items
   TGItemContext  *fContext;    // associated context menu

   Bool_t         FullConverted();

   TTVLVEntry(const TGWindow *p,
              const TGPicture *bigpic, const TGPicture *smallpic,
              TGString *name, TGString **subnames, EListViewMode ViewMode);
   virtual ~TTVLVEntry();
   const char     *ConvertAliases();
   void            CopyItem(TTVLVEntry *dest);
   const char     *GetAlias() {return fAlias.Data();}
   TTVLVContainer *GetContainer() {return fContainer;}
   TGItemContext  *GetContext() {return fContext;}
   const char     *GetConvName() {return fConvName;}
   const char     *GetTrueName() {return fTrueName.Data();}
   TGToolTip      *GetTip() {return fTip;}
   virtual Bool_t  HandleCrossing(Event_t *event);
   Bool_t          HasAlias();
   Bool_t          IsCut() {return fIsCut;}
   void            PrependTilde();
   void            SetCutType(Bool_t type=kFALSE);
   void            SetItemName(const char* name);
   void            SetAlias(const char* alias) {fAlias = alias;}
   void            SetExpression(const char* name, const char* alias, Bool_t cutType=kFALSE);
   void            SetTrueName(const char* name) {fTrueName = name;}
   void            SetToolTipText(const char *text, Long_t delayms = 1000);
   void            SetSmallPic(const TGPicture *spic);
   void            Empty();

   ClassDef(TTVLVEntry,0)  // Item that goes into the tree list view widget

//                                                                      //
//   TTVLVContainer                                                     //
//                                                                      //
// This class represent the list view container for the                 //
// TreeView class. It is a TGLVContainer with item dragging             //
// capabilities for the TTVLVEntry objects inside                       //
//                                                                      //

class TTVLVContainer : public TGLVContainer {

friend class TGClient;

   Cursor_t     fCursor;             // current cursor
   Cursor_t     fDefaultCursor;      // default cursor
   TGListView  *fListView;           // associated list view
   TTreeViewer *fViewer;             // pointer to tree viewer
   TList       *fExpressionList;     // list of user defined expression widgets
   TTVLVContainer(const TGWindow *p, UInt_t w, UInt_t h, UInt_t options=kSunkenFrame);
   virtual ~TTVLVContainer();
   virtual void AddThisItem(TTVLVEntry *item)
                  { AddFrame(item, fItemLayout); item->SetColumns(fCpos, fJmode); }
   const char    *Cut();
   void           EmptyAll();     // empty all items of expression type
   TTVLVEntry    *ExpressionItem(Int_t index);
   TList         *ExpressionList();
   const char    *Ex();
   const char    *Ey();
   const char    *Ez();
   TTreeViewer   *GetViewer() {return fViewer;}
   void           SetListView(TGListView *lv) {fListView = lv;}
   void           SetViewer(TTreeViewer *viewer) {fViewer = viewer;}
   void           RemoveNonStatic();
   const char    *ScanList();
   void           SelectItem(const char* name);
   virtual Bool_t HandleButton(Event_t *event);
   virtual Bool_t HandleMotion(Event_t *event);

   ClassDef(TTVLVContainer,0)  // A dragging-capable LVContainer

//                                                                      //
// TGSelectBox                                                          //
//                                                                      //
// This class represent a specialized expression editor for             //
// TTVLVEntry 'true name' and 'alias' data members.                     //
// It is a singleton in order to be able to use it for several          //
// expressions.                                                         //
//                                                                      //

class TGSelectBox : public TGTransientFrame {

   TTreeViewer       *fViewer;        // pointer to tree viewer
   TGLabel           *fLabel;         // label
   TTVLVEntry        *fEntry;         // edited expression entry
   TGTextEntry       *fTe;            // text entry box
   TGLabel           *fLabelAlias;    // alias label
   TGTextEntry       *fTeAlias;       // alias text entry
   TString            fOldAlias;      // old alias for edited entry
   TGLayoutHints     *fLayout;        // layout hints for widgets inside
   TGLayoutHints     *fBLayout;       // layout for cancel button
   TGLayoutHints     *fBLayout1;      // layout for close button
   TGHorizontalFrame *fBf;            // buttons frame
   TGTextButton      *fDONE;          // close button
   TGTextButton      *fCANCEL;        // cancel button

   static TGSelectBox *fgInstance;// pointer to this select box

   TGSelectBox(const TGWindow *p, const TGWindow *main, UInt_t w = 10, UInt_t h = 10);
   virtual ~TGSelectBox();
   virtual void   CloseWindow();
   TTVLVEntry    *EditedEntry() {return fEntry;}
   void           GrabPointer();
   void           SetLabel(const char* title);
   void           SetEntry(TTVLVEntry *entry);
   void           SaveText();
   void           InsertText(const char* text);
   virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
   Bool_t         ValidateAlias();

   static TGSelectBox *GetInstance();

   ClassDef(TGSelectBox,0)  // TreeView dialog widget