// @(#)root/gui:$Id$
// Author: Fons Rademakers   10/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_TGScrollBar
#define ROOT_TGScrollBar


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGScrollBar and TGScrollBarElement                                   //
//                                                                      //
// The classes in this file implement scrollbars. Scrollbars can be     //
// either placed horizontal or vertical. A scrollbar contains three     //
// TGScrollBarElements: The "head", "tail" and "slider". The head and   //
// tail are fixed at either end and have the typical arrows in them.    //
//                                                                      //
// The TGHScrollBar will generate the following event messages:         //
// kC_HSCROLL, kSB_SLIDERPOS, position, 0                               //
// kC_HSCROLL, kSB_SLIDERTRACK, position, 0                             //
//                                                                      //
// The TGVScrollBar will generate the following event messages:         //
// kC_VSCROLL, kSB_SLIDERPOS, position, 0                               //
// kC_VSCROLL, kSB_SLIDERTRACK, position, 0                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TGButton
#include "TGButton.h"
#endif


//--- scrollbar types

enum EScrollBarMode {
   kSBHorizontal,
   kSBVertical
};

class TTimer;


class TGScrollBarElement : public TGFrame {

private:
   TGScrollBarElement(const TGScrollBarElement&); // Not implemented
   TGScrollBarElement& operator=(const TGScrollBarElement&); // Not implemented

protected:
   Int_t            fState;      // state of scrollbar element (button up or down)
   const TGPicture *fPic;        // picture in scrollbar element
   const TGPicture *fPicN;       // picture for normal state of scrollbar element
   const TGPicture *fPicD;       // picture for disabled state of scrollbar element
   Pixel_t          fBgndColor;  // background color
   Pixel_t          fHighColor;  // highlight color
   Int_t            fStyle;      // modern or classic style

public:
   TGScrollBarElement(const TGWindow *p = 0, const TGPicture *pic = 0,
                      UInt_t w = 1, UInt_t h = 1,
                      UInt_t options = kRaisedFrame | kDoubleBorder,
                      Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGScrollBarElement();

   virtual void SetState(Int_t state);
   virtual void DrawBorder();
   virtual void SetEnabled(Bool_t on = kTRUE);
   virtual Bool_t IsEnabled() const { return !(fState & kButtonDisabled); }
   virtual Bool_t HandleCrossing(Event_t *event);

   ClassDef(TGScrollBarElement,0)  // Scrollbar element (head, tail, slider)
};


class TGScrollBar : public TGFrame, public TGWidget {

private:
   TGScrollBar(const TGScrollBar&); // Not implemented
   TGScrollBar& operator=(const TGScrollBar&); // Not implemented

protected:
   Int_t                fX0, fY0;      // current slider position in pixels
   Int_t                fXp, fYp;      // previous slider position in pixels
   Bool_t               fDragging;     // in dragging mode?
   Bool_t               fGrabPointer;  // grab pointer when dragging
   Int_t                fRange;        // logical upper range of scrollbar
   Int_t                fPsize;        // logical page size of scrollbar
   Int_t                fPos;          // logical current position
   Int_t                fSliderSize;   // logical slider size
   Int_t                fSliderRange;  // logical slider range
   Int_t                fSmallInc;     // Small Increment in the sliding algorithm
   TGScrollBarElement  *fHead;         // head button of scrollbar
   TGScrollBarElement  *fTail;         // tail button of scrollbar
   TGScrollBarElement  *fSlider;       // slider
   const TGPicture     *fHeadPic;      // picture in head (up or left arrow)
   const TGPicture     *fTailPic;      // picture in tail (down or right arrow)
   TTimer              *fRepeat;       // repeat rate timer (when mouse stays pressed)
   Window_t             fSubw;         // sub window in which mouse is pressed
   Bool_t               fAccelerated;  // kFALSE - normal, kTRUE - accelerated
   Pixel_t              fBgndColor;    // background color
   Pixel_t              fHighColor;    // highlight color

   static Pixmap_t    fgBckgndPixmap;
   static Int_t       fgScrollBarWidth;

public:
   static Pixmap_t  GetBckgndPixmap();
   static Int_t     GetScrollBarWidth();

   TGScrollBar(const TGWindow *p = 0, UInt_t w = 1, UInt_t h = 1,
               UInt_t options = kChildFrame,
               Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGScrollBar();

   void           GrabPointer(Bool_t grab) { fGrabPointer = grab; }

   virtual void   DrawBorder() { }
   virtual Bool_t HandleButton(Event_t *event) = 0;
   virtual Bool_t HandleCrossing(Event_t *event);
   virtual Bool_t HandleMotion(Event_t *event) = 0;
   virtual Bool_t HandleTimer(TTimer *t);
   virtual void   Layout() = 0;

   virtual void  SetDragging(Bool_t drag) { fDragging = drag; }
   virtual void  SetRange(Int_t range, Int_t page_size) = 0;
   virtual void  SetPosition(Int_t pos) = 0;
   virtual Int_t GetPosition() const { return fPos; }
   virtual Int_t GetPageSize() const { return fPsize; }
   virtual Int_t GetRange() const { return fRange; }
   virtual void  Resize(UInt_t w = 0, UInt_t h = 0) { TGFrame::Resize(w, h); SetRange(fRange, fPsize); }
   virtual void  MoveResize(Int_t x, Int_t y, UInt_t w = 0, UInt_t h = 0)
                  { TGFrame::MoveResize(x, y, w, h); SetRange(fRange, fPsize); }
   virtual void  Resize(TGDimension size) { Resize(size.fWidth, size.fHeight); }
   virtual void  ChangeBackground(Pixel_t back);
   virtual void  SetAccelerated(Bool_t m = kTRUE) { fAccelerated = m; }
         Bool_t  IsAccelerated() const { return fAccelerated; }

   virtual void MapSubwindows() { TGWindow::MapSubwindows(); }
   TGScrollBarElement *GetHead() const { return fHead; }
   TGScrollBarElement *GetTail() const { return fTail; }
   TGScrollBarElement *GetSlider() const { return fSlider; }

   virtual void  PositionChanged(Int_t pos) { Emit("PositionChanged(Int_t)", pos); } //*SIGNAL*
   virtual void  RangeChanged(Int_t range) { Emit("RangeChanged(Int_t)", range); } //*SIGNAL*
   virtual void  PageSizeChanged(Int_t range) { Emit("PageSizeChanged(Int_t)", range); } //*SIGNAL*

   virtual Int_t GetSmallIncrement() { return fSmallInc; }
   virtual void  SetSmallIncrement(Int_t increment) { fSmallInc = increment; }

   ClassDef(TGScrollBar,0)  // Scrollbar widget
};



class TGHScrollBar : public TGScrollBar {

public:
   TGHScrollBar(const TGWindow *p = 0, UInt_t w = 4, UInt_t h = 2,
                UInt_t options = kHorizontalFrame,
                Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGHScrollBar() { }

   virtual Bool_t HandleButton(Event_t *event);
   virtual Bool_t HandleMotion(Event_t *event);
   virtual TGDimension GetDefaultSize() const
                        { return TGDimension(fWidth, GetScrollBarWidth()); }
   virtual void Layout();

   virtual void SetRange(Int_t range, Int_t page_size);  //*MENU*
   virtual void SetPosition(Int_t pos);                  //*MENU* *GETTER=GetPosition
   virtual void SavePrimitive(std::ostream &out, Option_t *option = "");

   ClassDef(TGHScrollBar,0)  // Horizontal scrollbar widget
};



class TGVScrollBar : public TGScrollBar {

public:
   TGVScrollBar(const TGWindow *p = 0, UInt_t w = 2, UInt_t h = 4,
                UInt_t options = kVerticalFrame,
                Pixel_t back = GetDefaultFrameBackground());
   virtual ~TGVScrollBar() { }

   virtual Bool_t HandleButton(Event_t *event);
   virtual Bool_t HandleMotion(Event_t *event);
   virtual TGDimension GetDefaultSize() const
                        { return TGDimension(GetScrollBarWidth(), fHeight); }
   virtual void Layout();

   virtual void SetRange(Int_t range, Int_t page_size);  //*MENU*
   virtual void SetPosition(Int_t pos);                  //*MENU*  *GETTER=GetPosition
   virtual void SavePrimitive(std::ostream &out, Option_t *option = "");

   ClassDef(TGVScrollBar,0)  // Vertical scrollbar widget
};

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