// @(#)root/gui:$Id$
// Author: Fons Rademakers   13/01/98

/*************************************************************************
 * 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_TGTab
#define ROOT_TGTab


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGTab, TGTabElement, TGTabLayout                                     //
//                                                                      //
// A tab widget contains a set of composite frames each with a little   //
// tab with a name (like a set of folders with tabs).                   //
//                                                                      //
// The TGTab is user callable. The TGTabElement and TGTabLayout are     //
// is a service classes of the tab widget.                              //
//                                                                      //
// Clicking on a tab will bring the associated composite frame to the   //
// front and generate the following event:                              //
// kC_COMMAND, kCM_TAB, tab id, 0.                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TGFrame
#include "TGFrame.h"
#endif
#ifndef ROOT_TGWidget
#include "TGWidget.h"
#endif

class TList;
class TGTabElement;
class TGTab;
class TGPicture;

class TGTabLayout : public TGLayoutManager {

protected:
   TGTab    *fMain;      // container frame
   TList    *fList;      // list of frames to arrange

private:
   TGTabLayout(const TGTabLayout&);             // not implemented
   TGTabLayout& operator=(const TGTabLayout&);  // not implemented

public:
   TGTabLayout(TGTab *main);

   virtual void Layout();
   virtual TGDimension GetDefaultSize() const;
   virtual void SavePrimitive(std::ostream &out, Option_t *option = "");

   ClassDef(TGTabLayout,0)  // Layout manager for TGTab widget
};



class TGTab : public TGCompositeFrame, public TGWidget {

protected:
   Int_t               fCurrent;        // index of current tab
   UInt_t              fTabh;           // tab height
   TGCompositeFrame   *fContainer;      // main container
   TList              *fRemoved;        // list of removed tabs
   FontStruct_t        fFontStruct;     // font
   GContext_t          fNormGC;         // drawing context

   void ChangeTab(Int_t tabIndex, Bool_t emit=kTRUE);

   static const TGFont *fgDefaultFont;
   static const TGGC   *fgDefaultGC;

private:
   TGTab(const TGTab&);             // not implemented
   TGTab& operator=(const TGTab&);  // not implemented

public:
   static FontStruct_t  GetDefaultFontStruct();
   static const TGGC   &GetDefaultGC();

   TGTab(const TGWindow *p = 0, UInt_t w = 1, UInt_t h = 1,
         GContext_t norm = GetDefaultGC()(),
         FontStruct_t font = GetDefaultFontStruct(),
         UInt_t options = kChildFrame,
         Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGTab();

   virtual TGCompositeFrame *AddTab(TGString *text);
   virtual TGCompositeFrame *AddTab(const char *text);
   virtual void              AddTab(const char *text, TGCompositeFrame *cf);
   virtual void              AddTab(TGString *text, TGCompositeFrame *cf);

   virtual void              NewTab(const char *text = "tab");   // *MENU*icon=bld_newtab.png*
   virtual void              RemoveTab(Int_t tabIndex = -1,
                                       Bool_t storeRemoved = kTRUE); // *MENU*icon=bld_removetab.png*
   virtual Bool_t            SetTab(Int_t tabIndex, Bool_t emit = kTRUE);
   virtual Bool_t            SetTab(const char *name, Bool_t emit = kTRUE);
   virtual void              DrawBorder() { }

   TGCompositeFrame *GetContainer() const { return fContainer; }
   Int_t             GetCurrent() const { return fCurrent; }
   TGCompositeFrame *GetTabContainer(Int_t tabIndex) const;
   TGCompositeFrame *GetTabContainer(const char *name) const;
   TGTabElement     *GetTabTab(Int_t tabIndex) const;
   TGTabElement     *GetTabTab(const char *name) const;
   TGCompositeFrame *GetCurrentContainer() const { return GetTabContainer(fCurrent); }
   TGTabElement     *GetCurrentTab() const { return GetTabTab(fCurrent); }
   UInt_t            GetTabHeight() const { return fTabh; }
   Int_t             GetNumberOfTabs() const;
   virtual void      SetEnabled(Int_t tabIndex, Bool_t on = kTRUE);  //*MENU*
   virtual void      SetText(const char *text = "tab");              //*MENU*icon=bld_rename.png*
   Bool_t            IsEnabled(Int_t tabIndex) const;

   virtual void      SavePrimitive(std::ostream &out, Option_t *option = "");

   virtual void CloseTab(Int_t id) { Emit("CloseTab(Int_t)", id); }  //*SIGNAL*
   virtual void Removed(Int_t id) { Emit("Removed(Int_t)", id); }    //*SIGNAL*
   virtual void Selected(Int_t id) { Emit("Selected(Int_t)", id); }  //*SIGNAL*
   virtual TGLayoutManager *GetLayoutManager() const;

   ClassDef(TGTab,0)  // Tab widget
};



class TGTabElement : public TGFrame {

protected:
   TGString        *fText;            // text on tab
   const TGPicture *fClosePic;        // "close tab" icon
   const TGPicture *fClosePicD;       // "close tab" icon (disabled)
   GContext_t       fNormGC;          // graphics context for drawing tab
   FontStruct_t     fFontStruct;      // font used for tab
   UInt_t           fTWidth;          // width of tab text
   UInt_t           fTHeight;         // height of tab text
   Bool_t           fEnabled;         // enabled or disabled
   Bool_t           fShowClose;       // show or hide close icon
   Bool_t           fActive;          // true if active (in front)

private:
   TGTabElement(const TGTabElement&);             // not implemented
   TGTabElement& operator=(const TGTabElement&);  // not implemented

public:
   TGTabElement(const TGWindow *p = 0, TGString *text = 0, UInt_t w = 1, UInt_t h = 1,
                GContext_t norm = TGTab::GetDefaultGC()(),
                FontStruct_t font = TGTab::GetDefaultFontStruct(),
                UInt_t options = kRaisedFrame,
                Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGTabElement();

   virtual void        DrawBorder();
   virtual TGDimension GetDefaultSize() const;
   const TGString     *GetText() const { return fText; }
   const char         *GetString() const { return fText->GetString(); }
   virtual Bool_t      HandleButton(Event_t *event);
   void                SetText(TGString *text);
   virtual void        SetEnabled(Bool_t on = kTRUE) { fEnabled = on; }
   Bool_t              IsEnabled() const { return fEnabled; }
   virtual void        SetEditDisabled(UInt_t) {}
   virtual void        ShowClose(Bool_t on = kTRUE);
   Bool_t              IsCloseShown() const { return fShowClose; }
   virtual void        SetActive(Bool_t on = kTRUE) { fActive = on; }
   Bool_t              IsActive() const { return fActive; }

   ClassDef(TGTabElement,0)  // Little tab on tab widget
};

#endif
 TGTab.h:1
 TGTab.h:2
 TGTab.h:3
 TGTab.h:4
 TGTab.h:5
 TGTab.h:6
 TGTab.h:7
 TGTab.h:8
 TGTab.h:9
 TGTab.h:10
 TGTab.h:11
 TGTab.h:12
 TGTab.h:13
 TGTab.h:14
 TGTab.h:15
 TGTab.h:16
 TGTab.h:17
 TGTab.h:18
 TGTab.h:19
 TGTab.h:20
 TGTab.h:21
 TGTab.h:22
 TGTab.h:23
 TGTab.h:24
 TGTab.h:25
 TGTab.h:26
 TGTab.h:27
 TGTab.h:28
 TGTab.h:29
 TGTab.h:30
 TGTab.h:31
 TGTab.h:32
 TGTab.h:33
 TGTab.h:34
 TGTab.h:35
 TGTab.h:36
 TGTab.h:37
 TGTab.h:38
 TGTab.h:39
 TGTab.h:40
 TGTab.h:41
 TGTab.h:42
 TGTab.h:43
 TGTab.h:44
 TGTab.h:45
 TGTab.h:46
 TGTab.h:47
 TGTab.h:48
 TGTab.h:49
 TGTab.h:50
 TGTab.h:51
 TGTab.h:52
 TGTab.h:53
 TGTab.h:54
 TGTab.h:55
 TGTab.h:56
 TGTab.h:57
 TGTab.h:58
 TGTab.h:59
 TGTab.h:60
 TGTab.h:61
 TGTab.h:62
 TGTab.h:63
 TGTab.h:64
 TGTab.h:65
 TGTab.h:66
 TGTab.h:67
 TGTab.h:68
 TGTab.h:69
 TGTab.h:70
 TGTab.h:71
 TGTab.h:72
 TGTab.h:73
 TGTab.h:74
 TGTab.h:75
 TGTab.h:76
 TGTab.h:77
 TGTab.h:78
 TGTab.h:79
 TGTab.h:80
 TGTab.h:81
 TGTab.h:82
 TGTab.h:83
 TGTab.h:84
 TGTab.h:85
 TGTab.h:86
 TGTab.h:87
 TGTab.h:88
 TGTab.h:89
 TGTab.h:90
 TGTab.h:91
 TGTab.h:92
 TGTab.h:93
 TGTab.h:94
 TGTab.h:95
 TGTab.h:96
 TGTab.h:97
 TGTab.h:98
 TGTab.h:99
 TGTab.h:100
 TGTab.h:101
 TGTab.h:102
 TGTab.h:103
 TGTab.h:104
 TGTab.h:105
 TGTab.h:106
 TGTab.h:107
 TGTab.h:108
 TGTab.h:109
 TGTab.h:110
 TGTab.h:111
 TGTab.h:112
 TGTab.h:113
 TGTab.h:114
 TGTab.h:115
 TGTab.h:116
 TGTab.h:117
 TGTab.h:118
 TGTab.h:119
 TGTab.h:120
 TGTab.h:121
 TGTab.h:122
 TGTab.h:123
 TGTab.h:124
 TGTab.h:125
 TGTab.h:126
 TGTab.h:127
 TGTab.h:128
 TGTab.h:129
 TGTab.h:130
 TGTab.h:131
 TGTab.h:132
 TGTab.h:133
 TGTab.h:134
 TGTab.h:135
 TGTab.h:136
 TGTab.h:137
 TGTab.h:138
 TGTab.h:139
 TGTab.h:140
 TGTab.h:141
 TGTab.h:142
 TGTab.h:143
 TGTab.h:144
 TGTab.h:145
 TGTab.h:146
 TGTab.h:147
 TGTab.h:148
 TGTab.h:149
 TGTab.h:150
 TGTab.h:151
 TGTab.h:152
 TGTab.h:153
 TGTab.h:154
 TGTab.h:155
 TGTab.h:156
 TGTab.h:157
 TGTab.h:158
 TGTab.h:159
 TGTab.h:160
 TGTab.h:161
 TGTab.h:162
 TGTab.h:163
 TGTab.h:164
 TGTab.h:165
 TGTab.h:166
 TGTab.h:167
 TGTab.h:168
 TGTab.h:169
 TGTab.h:170
 TGTab.h:171
 TGTab.h:172
 TGTab.h:173
 TGTab.h:174
 TGTab.h:175
 TGTab.h:176
 TGTab.h:177