ROOT logo
// @(#)root/gui:$Id: TGDoubleSlider.cxx 35582 2010-09-22 13:38:27Z bellenot $
// Author: Reiner Rohlfs   30/09/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.             *
 *************************************************************************/
/**************************************************************************

    This source is based on Xclass95, a Win95-looking GUI toolkit.
    Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.

    Xclass95 is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

**************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGDoubleSlider, TGDoubleVSlider and TGDoubleHSlider                  //
//                                                                      //
// DoubleSlider widgets allow easy selection of a min and a max value   //
// out of a range.                                                      //
// DoubleSliders can be either horizontal or vertical oriented and      //
// there is a choice of three different types of tick marks.            //
//                                                                      //
// To change the min value press the mouse near to the left / bottom    //
// edge of the slider.                                                  //
// To change the max value press the mouse near to the right / top      //
// edge of the slider.                                                  //
// To change both values simultaneously press the mouse near to the     //
// center of the slider.                                                //
//                                                                      //
// TGDoubleSlider is an abstract base class. Use the concrete           //
// TGDoubleVSlider and TGDoubleHSlider.                                 //
//                                                                      //
// Dragging the slider will generate the event:                         //
// kC_VSLIDER, kSL_POS, slider id, 0  (for vertical slider)             //
// kC_HSLIDER, kSL_POS, slider id, 0  (for horizontal slider)           //
//                                                                      //
// Pressing the mouse will generate the event:                          //
// kC_VSLIDER, kSL_PRESS, slider id, 0  (for vertical slider)           //
// kC_HSLIDER, kSL_PRESS, slider id, 0  (for horizontal slider)         //
//                                                                      //
// Releasing the mouse will generate the event:                         //
// kC_VSLIDER, kSL_RELEASE, slider id, 0  (for vertical slider)         //
// kC_HSLIDER, kSL_RELEASE, slider id, 0  (for horizontal slider)       //
//                                                                      //
// Use the functions GetMinPosition(), GetMaxPosition() and             //
// GetPosition() to retrieve the position of the slider.                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGDoubleSlider.h"
#include "TGPicture.h"
#include "Riostream.h"
#include "TSystem.h"


ClassImp(TGDoubleSlider)
ClassImp(TGDoubleVSlider)
ClassImp(TGDoubleHSlider)

//______________________________________________________________________________
TGDoubleSlider::TGDoubleSlider(const TGWindow *p, UInt_t w, UInt_t h, UInt_t type, Int_t id,
                               UInt_t options, ULong_t back,
                               Bool_t reversed, Bool_t mark_ends)
   : TGFrame(p, w, h, options, back)
{
   // Slider constructor.

   fSliderPic = 0;

   fWidgetId    = id;
   fWidgetFlags = kWidgetWantFocus;
   fMsgWindow   = p;

   fScaleType = type;
   fScale = 10;
   fMove = 0;

   fReversedScale = reversed;
   fMarkEnds = mark_ends;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);
   AddInput(kPointerMotionMask);
   SetWindowName();
}

//______________________________________________________________________________
void TGDoubleSlider::FixBounds(Float_t &min, Float_t &max)
{
   // Avoid boundaries to be equal.

   if (min > max) min = max;

   Float_t eps = 1e-6;
   if (max - min < eps) {
      if (max == 0)
         max += eps;
      else
         max += max*eps;
      if (min == 0)
         min -= eps;
      else
         min -= min*eps;
   }
}

//______________________________________________________________________________
TString TGDoubleSlider::GetSString() const
{
   // Returns the slider type as a string - used in SavePrimitive()

   TString stype;

   if (fScaleType) {
      if (fScaleType & kDoubleScaleNo)  {
         if (stype.Length() == 0)
            stype  = "kDoubleScaleNo";
         else
            stype += " | kDoubleScaleNo";
      }
      if (fScaleType & kDoubleScaleDownRight) {
         if (stype.Length() == 0)
            stype  = "kDoubleScaleDownRight";
         else
            stype += " | kDoubleScaleDownRight";
      }
      if (fScaleType & kDoubleScaleBoth) {
         if (stype.Length() == 0)
            stype  = "kDoubleScaleBoth";
         else
            stype += " | kDoubleScaleBoth";
      }
   }
   return stype;
}

//______________________________________________________________________________
void TGDoubleSlider::ChangeCursor(Event_t *event)
{
   // Change the cursor shape depending on the slider area.

   static Cursor_t topCur = kNone, leftCur = kNone;
   static Cursor_t botCur = kNone, rightCur = kNone;
   Int_t hw = 0, wh = 0, xy = 0, yx = 0;
   Cursor_t minCur = kNone, maxCur = kNone;

   if (topCur == kNone)
      topCur    = gVirtualX->CreateCursor(kTopSide);
   if (leftCur == kNone)
      leftCur   = gVirtualX->CreateCursor(kLeftSide);
   if (botCur == kNone)
      botCur    = gVirtualX->CreateCursor(kBottomSide);
   if (rightCur == kNone)
      rightCur  = gVirtualX->CreateCursor(kRightSide);
   if (GetOptions() & kVerticalFrame) {
      hw = (Int_t)fWidth;
      wh = (Int_t)fHeight;
      xy = (Int_t)event->fX;
      yx = (Int_t)event->fY;
      minCur = topCur;
      maxCur = botCur;
   }
   else if (GetOptions() & kHorizontalFrame) {
      hw  = (Int_t)fHeight;
      wh  = (Int_t)fWidth;
      xy  = (Int_t)event->fY;
      yx  = (Int_t)event->fX;
      minCur = leftCur;
      maxCur = rightCur;
   }
   else return;

   Int_t relMin = (Int_t)((wh-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
   Int_t relMax = (Int_t)((wh-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
   // constrain to the slider width
   if (xy > hw/2-7 && xy < hw/2+7 && fMove != 3) {
      // if the mouse pointer is in the top resizing zone,
      // and we are not already moving the the bottom side,
      // set the cursor shape as TopSide
      if ((yx <= (relMax - relMin) / 4 + relMin) &&
          (yx >= relMin) && (fMove != 2))
         gVirtualX->SetCursor(fId, minCur);
      // if the mouse pointer is in the bottom resizing zone,
      // and we are not already moving the the top side,
      // set the cursor shape as BottomSide
      else if ((yx >= (relMax - relMin) / 4 * 3 + relMin) &&
               (yx <= relMax) && (fMove != 1))
         gVirtualX->SetCursor(fId, maxCur);
      // if we are not moving any side, restore the cursor
      else if ((fMove < 1) || (fMove > 2))
         gVirtualX->SetCursor(fId, kNone);
   }
   // if we are not inside the slider, and not moving any side,
   // restore the cursor
   else if ((fMove < 1) || (fMove > 2))
      gVirtualX->SetCursor(fId, kNone);
}

//______________________________________________________________________________
TGDoubleVSlider::TGDoubleVSlider(const TGWindow *p, UInt_t h, UInt_t type, Int_t id,
                                 UInt_t options, ULong_t back,
                                 Bool_t reversed, Bool_t mark_ends)
    : TGDoubleSlider(p, kDoubleSliderWidth, h, type, id, options, back,
                     reversed, mark_ends)
{
   // Create a vertical slider widget.

   fSliderPic = fClient->GetPicture("sliderv.xpm");

   if (!fSliderPic)
      Error("TGDoubleVSlider", "sliderv.xpm not found");
   // set initial values
   fSmin = h/8*3; fSmax = h/8*5; fVmin = 0; fVmax = h;
   FixBounds(fVmin, fVmax);
   SetWindowName();
}

//______________________________________________________________________________
TGDoubleVSlider::~TGDoubleVSlider()
{
   // Delete vertical slider widget.

   if (fSliderPic) fClient->FreePicture(fSliderPic);
}

//______________________________________________________________________________
void TGDoubleVSlider::DoRedraw()
{
   // Redraw vertical slider widget.

   FixBounds(fVmin, fVmax);

   // cleanup the drawable
   gVirtualX->ClearWindow(fId);

   if (fSmin < fVmin) fSmin = fVmin;
   if (fSmax < fVmin) fSmax = fVmin;
   if (fSmin > fVmax) fSmin = fVmax;
   if (fSmax > fVmax) fSmax = fVmax;
   if (fSmin > fSmax) fSmin = fSmax = (fSmin + fSmax) / 2;

   int relMin = (int)((fHeight-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
   int relMax = (int)((fHeight-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);

   gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth/2-6, relMin, fWidth/2+5, relMin);
   gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth/2-6, relMin, fWidth/2-6, relMax);
   gVirtualX->DrawLine(fId, GetBlackGC()(),   fWidth/2+5, relMax, fWidth/2-6, relMax);
   gVirtualX->DrawLine(fId, GetBlackGC()(),   fWidth/2+5, relMax, fWidth/2+5, relMin);

   if (relMin-1 > 8) {
      gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth/2-1, 8, fWidth/2-1, relMin-1);
      gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth/2+1, 8, fWidth/2+1, relMin-1);
      gVirtualX->DrawLine(fId, GetBlackGC()(),   fWidth/2,   8, fWidth/2,   relMin-1);
   }
   if (relMax+1 < (int)fHeight-8) {
      gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth/2-1, relMax+1, fWidth/2-1, fHeight-8);
      gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth/2+1, relMax+1, fWidth/2+1, fHeight-8);
      gVirtualX->DrawLine(fId, GetBlackGC()(),   fWidth/2,   relMax+1, fWidth/2,   fHeight-8);
   }

   // check scale
   if (fScale == 1) fScale++;
   if (fScale * 2 > (int)fHeight) fScale = 0;
   if (fScale > 0 && !(fScaleType & kDoubleScaleNo)) {
      int lines = ((int)fHeight-16) / fScale;
      int remain = ((int)fHeight-16) % fScale;
      if (lines < 1) lines = 1;
      for (int i = 0; i <= lines; i++) {
         int y = i * fScale + (i * remain) / lines;
         gVirtualX->DrawLine(fId, GetBlackGC()(), fWidth/2+8, y+7, fWidth/2+10, y+7);
         if ((fScaleType & kDoubleScaleBoth))
            gVirtualX->DrawLine(fId, GetBlackGC()(), fWidth/2-9, y+7, fWidth/2-11, y+7);
      }
   }

   if (fSliderPic) {
      Int_t xpos = (fWidth/2) - (fSliderPic->GetWidth()/2);
      Int_t ypos = relMin + 2;
      fSliderPic->Draw(fId, GetBckgndGC()(), xpos, ypos);
      ypos = relMax - fSliderPic->GetHeight() - 2;
      fSliderPic->Draw(fId, GetBckgndGC()(), xpos, ypos);
   }
   if (fMarkEnds) {
      // Draw scaling zones.
      int y1 = (relMax - relMin) / 4 + relMin;
      int y2 = (relMax - relMin) / 4 * 3 + relMin;
      gVirtualX->DrawLine(fId, GetBlackGC()(), fWidth/2-6, y1, fWidth/2+5, y1);
      gVirtualX->DrawLine(fId, GetBlackGC()(), fWidth/2-6, y2, fWidth/2+5, y2);
   }
}

//______________________________________________________________________________
Bool_t TGDoubleVSlider::HandleButton(Event_t *event)
{
   // Handle mouse button event in vertical slider.

   if (event->fType == kButtonPress && event->fCode == kButton1) {
      // constrain to the slider width
      if (event->fX < (Int_t)fWidth/2-7 || event->fX > (Int_t)fWidth/2+7) {
         return kTRUE;
      }
      fPressPoint = event->fY;
      fPressSmin  = fSmin;
      fPressSmax  = fSmax;

      int relMin = (int)((fHeight-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
      int relMax = (int)((fHeight-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
      if (fPressPoint < (relMax - relMin) / 4 + relMin)
         // move only min value
         fMove = 1;
      else if (fPressPoint > (relMax - relMin) / 4 * 3 + relMin)
         // move only max value
         fMove = 2;
      else
         // move min and max value
         fMove = 3;

      SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_PRESS), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_PRESS), fWidgetId, 0);
      Pressed();

      // last argument kFALSE forces all specified events to this window
      gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
                             kPointerMotionMask, kNone, kNone,
                             kTRUE, kFALSE);
   } else if (event->fType == kButtonRelease && event->fCode == kButton1) {
      SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_RELEASE), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_RELEASE), fWidgetId, 0);
      Released();
      fMove = 0;

      gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);  // ungrab pointer
   } else
      fMove = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGDoubleVSlider::HandleMotion(Event_t *event)
{
   // Handle mouse motion event in vertical slider.

   ChangeCursor(event);
   if (fMove == 0) return kTRUE;

   static Long64_t was = gSystem->Now();
   Long64_t now = gSystem->Now();

   if ((now-was) < 50) return kTRUE;
   was = now;

   int       diff;
   Float_t   oldMin, oldMax;

   diff    = event->fY - fPressPoint;
   oldMin  = fSmin;
   oldMax  = fSmax;

   if (fMove == 1) {
      // change of min value
      fSmin = fPressSmin + diff * (fVmax - fVmin) / (fHeight-16);
      if (fSmin < fVmin) fSmin = fVmin;
      if (fSmin > fSmax) fSmin = fSmax;
   } else if (fMove == 2) {
      // change of max value
      fSmax = fPressSmax + diff * (fVmax - fVmin) / (fHeight-16);
      if (fSmax > fVmax) fSmax = fVmax;
      if (fSmax < fSmin) fSmax = fSmin;
   } else if (fMove == 3) {
      // change of min and of max value
      Float_t logicalDiff;
      logicalDiff = diff * (fVmax - fVmin) / (fHeight-16);
      if (fPressSmax + logicalDiff > fVmax)
         logicalDiff = fVmax - fPressSmax;
      if (fPressSmin + logicalDiff < fVmin)
         logicalDiff = fVmin - fPressSmin;
      fSmax = fPressSmax + logicalDiff;
      fSmin = fPressSmin + logicalDiff;
   }

   // check if position has changed
   if (fMove != 0 && (fSmax != oldMax || fSmin != oldMin)) {
      fClient->NeedRedraw(this);
      SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_POS), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_POS), fWidgetId, 0);
      PositionChanged();
   }
   return kTRUE;
}

//______________________________________________________________________________
TGDoubleHSlider::TGDoubleHSlider(const TGWindow *p, UInt_t w, UInt_t type, Int_t id,
                                 UInt_t options, ULong_t back,
                                 Bool_t reversed, Bool_t mark_ends)
    : TGDoubleSlider(p, w, kDoubleSliderHeight, type, id, options, back,
                     reversed, mark_ends)
{
   // Create horizontal slider widget.

   fSliderPic = fClient->GetPicture("sliderh.xpm");

   if (!fSliderPic)
      Error("TGDoubleHSlider", "sliderh.xpm not found");
   // set initial values
   fSmin = w/8*3; fSmax = w/8*5; fVmin = 0; fVmax = w;
   FixBounds(fVmin, fVmax);
   SetWindowName();
}

//______________________________________________________________________________
TGDoubleHSlider::~TGDoubleHSlider()
{
   // Delete a horizontal slider widget.

   if (fSliderPic) fClient->FreePicture(fSliderPic);
}

//______________________________________________________________________________
void TGDoubleHSlider::DoRedraw()
{
   // Redraw horizontal slider widget.

   FixBounds(fVmin, fVmax);

   // cleanup drawable
   gVirtualX->ClearWindow(fId);

   if (fSmin < fVmin) fSmin = fVmin;
   if (fSmax > fVmax) fSmax = fVmax;
   if (fSmin > fSmax) fSmin = fSmax = (fSmin + fSmax) / 2;

   int relMin = (int)((fWidth-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
   int relMax = (int)((fWidth-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);

   gVirtualX->DrawLine(fId, GetHilightGC()(), relMin, fHeight/2-6, relMin, fHeight/2+5);
   gVirtualX->DrawLine(fId, GetHilightGC()(), relMax, fHeight/2-6, relMin, fHeight/2-6);
   gVirtualX->DrawLine(fId, GetBlackGC()(),   relMax, fHeight/2+5, relMax, fHeight/2-6);
   gVirtualX->DrawLine(fId, GetBlackGC()(),   relMin, fHeight/2+5, relMax, fHeight/2+5);

   if (relMin-1 > 8) {
      gVirtualX->DrawLine(fId, GetShadowGC()(),  8, fHeight/2-1, relMin-1, fHeight/2-1);
      gVirtualX->DrawLine(fId, GetHilightGC()(), 8, fHeight/2+1, relMin-1, fHeight/2+1);
      gVirtualX->DrawLine(fId, GetBlackGC()(),   8, fHeight/2,   relMin-1, fHeight/2);
   }
   if (relMax+1 < (int)fWidth-8) {
      gVirtualX->DrawLine(fId, GetShadowGC()(),  relMax+1, fHeight/2-1, fWidth-8, fHeight/2-1);
      gVirtualX->DrawLine(fId, GetHilightGC()(), relMax+1, fHeight/2+1, fWidth-8, fHeight/2+1);
      gVirtualX->DrawLine(fId, GetBlackGC()(),   relMax+1, fHeight/2,   fWidth-8, fHeight/2);
   }

   if (fScale == 1) fScale++;
   if (fScale * 2 > (int)fWidth) fScale = 0;
   if (fScale > 0 && !(fScaleType & kDoubleScaleNo)) {
      int lines = ((int)fWidth-16) / fScale;
      int remain = ((int)fWidth-16) % fScale;
      if (lines < 1) lines = 1;
      for (int i = 0; i <= lines; i++) {
         int x = i * fScale + (i * remain) / lines;
         gVirtualX->DrawLine(fId, GetBlackGC()(), x+7, fHeight/2+8, x+7, fHeight/2+10);
         if ((fScaleType & kDoubleScaleBoth))
            gVirtualX->DrawLine(fId, GetBlackGC()(), x+7, fHeight/2-9, x+7, fHeight/2-11);
      }
   }

   if (fSliderPic) {
      Int_t ypos = (fHeight/2) - (fSliderPic->GetHeight()/2);
      Int_t xpos = relMin + 2;
      fSliderPic->Draw(fId, GetBckgndGC()(), xpos, ypos);
      xpos = relMax - fSliderPic->GetWidth() - 2;
      fSliderPic->Draw(fId, GetBckgndGC()(), xpos, ypos);
   }
   if (fMarkEnds) {
      // Draw scaling zones.
      int x1 = (relMax - relMin) / 4 + relMin;
      int x2 = (relMax - relMin) / 4 * 3 + relMin;
      gVirtualX->DrawLine(fId, GetBlackGC()(), x1, fHeight/2-6, x1, fHeight/2+5);
      gVirtualX->DrawLine(fId, GetBlackGC()(), x2, fHeight/2-6, x2, fHeight/2+5);
   }
}

//______________________________________________________________________________
Bool_t TGDoubleHSlider::HandleButton(Event_t *event)
{
   // Handle mouse button event in horizontal slider widget.

   if (event->fType == kButtonPress && event->fCode == kButton1) {
      // constrain to the slider height
      if (event->fY < (Int_t)fHeight/2-7 || event->fY > (Int_t)fHeight/2+7) {
         return kTRUE;
      }
      fPressPoint = event->fX;
      fPressSmin  = fSmin;
      fPressSmax  = fSmax;

      int relMin = (int)((fWidth-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
      int relMax = (int)((fWidth-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
      if (fPressPoint < (relMax - relMin) / 4 + relMin)
         // move only min value
         fMove = 1;
      else if (fPressPoint > (relMax - relMin) / 4 * 3 + relMin)
         // move only max value
         fMove = 2;
      else
         // move min and max value
         fMove = 3;

      SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_PRESS), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_PRESS), fWidgetId, 0);
      Pressed();

      // last argument kFALSE forces all specified events to this window
      gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
                             kPointerMotionMask, kNone, kNone,
                             kTRUE, kFALSE);
   } else if (event->fType == kButtonRelease && event->fCode == kButton1) {
      SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_RELEASE), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_RELEASE), fWidgetId, 0);
      Released();
      fMove = 0;

      gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);  // ungrab pointer
   } else
      fMove = 0;

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGDoubleHSlider::HandleMotion(Event_t *event)
{
   // Handle mouse motion event in horizontal slide widget.

   ChangeCursor(event);
   if (fMove == 0) return kTRUE;

   static Long64_t was = gSystem->Now();
   Long64_t now = gSystem->Now();

   if ((now-was) < 50) return kTRUE;
   was = now;

   int     diff;
   Float_t oldMin, oldMax;

   diff    = event->fX - fPressPoint;
   oldMin  = fSmin;
   oldMax  = fSmax;

   if (fMove == 1) {
      // change of min value
      fSmin = fPressSmin + diff * (fVmax - fVmin) / (fWidth-16);
      if (fSmin < fVmin) fSmin = fVmin;
      if (fSmin > fSmax) fSmin = fSmax;
   } else if (fMove == 2) {
      // change of max value
      fSmax = fPressSmax + diff * (fVmax - fVmin) / (fWidth-16);
      if (fSmax > fVmax) fSmax = fVmax;
      if (fSmax < fSmin) fSmax = fSmin;
   } else if (fMove == 3) {
      // change of min and of max value
      Float_t logicalDiff;
      logicalDiff = diff * (fVmax - fVmin) / (fWidth-16);
      if (fPressSmax + logicalDiff > fVmax)
         logicalDiff = fVmax - fPressSmax;
      if (fPressSmin + logicalDiff < fVmin)
         logicalDiff = fVmin - fPressSmin;
      fSmax = fPressSmax + logicalDiff;
      fSmin = fPressSmin + logicalDiff;
   }

   // check if position has changed
   if (fMove != 0 && (fSmax != oldMax || fSmin != oldMin)) {
      fClient->NeedRedraw(this);
      SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_POS), fWidgetId, 0);
      fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_POS), fWidgetId, 0);
      PositionChanged();
   }
   return kTRUE;
}

//______________________________________________________________________________
void TGDoubleHSlider::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
    // Save an horizontal slider as a C++ statement(s) on output stream out.

   SaveUserColor(out, option);

   out <<"   TGDoubleHSlider *";
   out << GetName() << " = new TGDoubleHSlider(" << fParent->GetName()
       << "," << GetWidth() << ",";
   out << GetSString() << "," << WidgetId() << ",";
   out << GetOptionString() << ",ucolor";
   if (fMarkEnds) {
      if (fReversedScale)
         out << ",kTRUE,kTRUE);" << endl;
      else
         out << ",kFALSE,kTRUE);" << endl;
   } else if (fReversedScale) {
      out << ",kTRUE);" << endl;
   } else {
      out << ");" << endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << endl;

   if (fVmin != 0 || fVmax != (Int_t)fWidth)
      out << "   " << GetName() << "->SetRange(" << fVmin << "," << fVmax
          << ");" << endl;

   if (fSmin != fWidth/8*3 || fSmax != fWidth/8*5)
      out << "   " << GetName() << "->SetPosition(" << GetMinPosition()
          << "," << GetMaxPosition() << ");" << endl;

   if (fScale != 10)
      out << "   " << GetName() << "->SetScale(" << fScale << ");" << endl;

}

//______________________________________________________________________________
void TGDoubleVSlider::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
    // Save an horizontal slider as a C++ statement(s) on output stream out.

   SaveUserColor(out, option);

   out<<"   TGDoubleVSlider *";
   out << GetName() << " = new TGDoubleVSlider("<< fParent->GetName()
       << "," << GetHeight() << ",";
   out << GetSString() << "," << WidgetId() << ",";
   out << GetOptionString() << ",ucolor";
   if (fMarkEnds) {
      if (fReversedScale)
         out << ",kTRUE,kTRUE);" << endl;
      else
         out << ",kFALSE,kTRUE);" << endl;
   } else if (fReversedScale) {
      out << ",kTRUE);" << endl;
   } else {
      out << ");" << endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << endl;

   if (fVmin != 0 || fVmax != (Int_t)fHeight)
      out << "   " << GetName() <<"->SetRange(" << fVmin << "," << fVmax
          << ");" << endl;


   if (fSmin != fHeight/8*3 || fSmax != fHeight/8*5)
      out << "   " << GetName() << "->SetPosition(" << GetMinPosition()
          << "," << GetMaxPosition() << ");" << endl;


   if (fScale != 10)
      out << "   " << GetName() << "->SetScale(" << fScale << ");" << endl;

}
 TGDoubleSlider.cxx:1
 TGDoubleSlider.cxx:2
 TGDoubleSlider.cxx:3
 TGDoubleSlider.cxx:4
 TGDoubleSlider.cxx:5
 TGDoubleSlider.cxx:6
 TGDoubleSlider.cxx:7
 TGDoubleSlider.cxx:8
 TGDoubleSlider.cxx:9
 TGDoubleSlider.cxx:10
 TGDoubleSlider.cxx:11
 TGDoubleSlider.cxx:12
 TGDoubleSlider.cxx:13
 TGDoubleSlider.cxx:14
 TGDoubleSlider.cxx:15
 TGDoubleSlider.cxx:16
 TGDoubleSlider.cxx:17
 TGDoubleSlider.cxx:18
 TGDoubleSlider.cxx:19
 TGDoubleSlider.cxx:20
 TGDoubleSlider.cxx:21
 TGDoubleSlider.cxx:22
 TGDoubleSlider.cxx:23
 TGDoubleSlider.cxx:24
 TGDoubleSlider.cxx:25
 TGDoubleSlider.cxx:26
 TGDoubleSlider.cxx:27
 TGDoubleSlider.cxx:28
 TGDoubleSlider.cxx:29
 TGDoubleSlider.cxx:30
 TGDoubleSlider.cxx:31
 TGDoubleSlider.cxx:32
 TGDoubleSlider.cxx:33
 TGDoubleSlider.cxx:34
 TGDoubleSlider.cxx:35
 TGDoubleSlider.cxx:36
 TGDoubleSlider.cxx:37
 TGDoubleSlider.cxx:38
 TGDoubleSlider.cxx:39
 TGDoubleSlider.cxx:40
 TGDoubleSlider.cxx:41
 TGDoubleSlider.cxx:42
 TGDoubleSlider.cxx:43
 TGDoubleSlider.cxx:44
 TGDoubleSlider.cxx:45
 TGDoubleSlider.cxx:46
 TGDoubleSlider.cxx:47
 TGDoubleSlider.cxx:48
 TGDoubleSlider.cxx:49
 TGDoubleSlider.cxx:50
 TGDoubleSlider.cxx:51
 TGDoubleSlider.cxx:52
 TGDoubleSlider.cxx:53
 TGDoubleSlider.cxx:54
 TGDoubleSlider.cxx:55
 TGDoubleSlider.cxx:56
 TGDoubleSlider.cxx:57
 TGDoubleSlider.cxx:58
 TGDoubleSlider.cxx:59
 TGDoubleSlider.cxx:60
 TGDoubleSlider.cxx:61
 TGDoubleSlider.cxx:62
 TGDoubleSlider.cxx:63
 TGDoubleSlider.cxx:64
 TGDoubleSlider.cxx:65
 TGDoubleSlider.cxx:66
 TGDoubleSlider.cxx:67
 TGDoubleSlider.cxx:68
 TGDoubleSlider.cxx:69
 TGDoubleSlider.cxx:70
 TGDoubleSlider.cxx:71
 TGDoubleSlider.cxx:72
 TGDoubleSlider.cxx:73
 TGDoubleSlider.cxx:74
 TGDoubleSlider.cxx:75
 TGDoubleSlider.cxx:76
 TGDoubleSlider.cxx:77
 TGDoubleSlider.cxx:78
 TGDoubleSlider.cxx:79
 TGDoubleSlider.cxx:80
 TGDoubleSlider.cxx:81
 TGDoubleSlider.cxx:82
 TGDoubleSlider.cxx:83
 TGDoubleSlider.cxx:84
 TGDoubleSlider.cxx:85
 TGDoubleSlider.cxx:86
 TGDoubleSlider.cxx:87
 TGDoubleSlider.cxx:88
 TGDoubleSlider.cxx:89
 TGDoubleSlider.cxx:90
 TGDoubleSlider.cxx:91
 TGDoubleSlider.cxx:92
 TGDoubleSlider.cxx:93
 TGDoubleSlider.cxx:94
 TGDoubleSlider.cxx:95
 TGDoubleSlider.cxx:96
 TGDoubleSlider.cxx:97
 TGDoubleSlider.cxx:98
 TGDoubleSlider.cxx:99
 TGDoubleSlider.cxx:100
 TGDoubleSlider.cxx:101
 TGDoubleSlider.cxx:102
 TGDoubleSlider.cxx:103
 TGDoubleSlider.cxx:104
 TGDoubleSlider.cxx:105
 TGDoubleSlider.cxx:106
 TGDoubleSlider.cxx:107
 TGDoubleSlider.cxx:108
 TGDoubleSlider.cxx:109
 TGDoubleSlider.cxx:110
 TGDoubleSlider.cxx:111
 TGDoubleSlider.cxx:112
 TGDoubleSlider.cxx:113
 TGDoubleSlider.cxx:114
 TGDoubleSlider.cxx:115
 TGDoubleSlider.cxx:116
 TGDoubleSlider.cxx:117
 TGDoubleSlider.cxx:118
 TGDoubleSlider.cxx:119
 TGDoubleSlider.cxx:120
 TGDoubleSlider.cxx:121
 TGDoubleSlider.cxx:122
 TGDoubleSlider.cxx:123
 TGDoubleSlider.cxx:124
 TGDoubleSlider.cxx:125
 TGDoubleSlider.cxx:126
 TGDoubleSlider.cxx:127
 TGDoubleSlider.cxx:128
 TGDoubleSlider.cxx:129
 TGDoubleSlider.cxx:130
 TGDoubleSlider.cxx:131
 TGDoubleSlider.cxx:132
 TGDoubleSlider.cxx:133
 TGDoubleSlider.cxx:134
 TGDoubleSlider.cxx:135
 TGDoubleSlider.cxx:136
 TGDoubleSlider.cxx:137
 TGDoubleSlider.cxx:138
 TGDoubleSlider.cxx:139
 TGDoubleSlider.cxx:140
 TGDoubleSlider.cxx:141
 TGDoubleSlider.cxx:142
 TGDoubleSlider.cxx:143
 TGDoubleSlider.cxx:144
 TGDoubleSlider.cxx:145
 TGDoubleSlider.cxx:146
 TGDoubleSlider.cxx:147
 TGDoubleSlider.cxx:148
 TGDoubleSlider.cxx:149
 TGDoubleSlider.cxx:150
 TGDoubleSlider.cxx:151
 TGDoubleSlider.cxx:152
 TGDoubleSlider.cxx:153
 TGDoubleSlider.cxx:154
 TGDoubleSlider.cxx:155
 TGDoubleSlider.cxx:156
 TGDoubleSlider.cxx:157
 TGDoubleSlider.cxx:158
 TGDoubleSlider.cxx:159
 TGDoubleSlider.cxx:160
 TGDoubleSlider.cxx:161
 TGDoubleSlider.cxx:162
 TGDoubleSlider.cxx:163
 TGDoubleSlider.cxx:164
 TGDoubleSlider.cxx:165
 TGDoubleSlider.cxx:166
 TGDoubleSlider.cxx:167
 TGDoubleSlider.cxx:168
 TGDoubleSlider.cxx:169
 TGDoubleSlider.cxx:170
 TGDoubleSlider.cxx:171
 TGDoubleSlider.cxx:172
 TGDoubleSlider.cxx:173
 TGDoubleSlider.cxx:174
 TGDoubleSlider.cxx:175
 TGDoubleSlider.cxx:176
 TGDoubleSlider.cxx:177
 TGDoubleSlider.cxx:178
 TGDoubleSlider.cxx:179
 TGDoubleSlider.cxx:180
 TGDoubleSlider.cxx:181
 TGDoubleSlider.cxx:182
 TGDoubleSlider.cxx:183
 TGDoubleSlider.cxx:184
 TGDoubleSlider.cxx:185
 TGDoubleSlider.cxx:186
 TGDoubleSlider.cxx:187
 TGDoubleSlider.cxx:188
 TGDoubleSlider.cxx:189
 TGDoubleSlider.cxx:190
 TGDoubleSlider.cxx:191
 TGDoubleSlider.cxx:192
 TGDoubleSlider.cxx:193
 TGDoubleSlider.cxx:194
 TGDoubleSlider.cxx:195
 TGDoubleSlider.cxx:196
 TGDoubleSlider.cxx:197
 TGDoubleSlider.cxx:198
 TGDoubleSlider.cxx:199
 TGDoubleSlider.cxx:200
 TGDoubleSlider.cxx:201
 TGDoubleSlider.cxx:202
 TGDoubleSlider.cxx:203
 TGDoubleSlider.cxx:204
 TGDoubleSlider.cxx:205
 TGDoubleSlider.cxx:206
 TGDoubleSlider.cxx:207
 TGDoubleSlider.cxx:208
 TGDoubleSlider.cxx:209
 TGDoubleSlider.cxx:210
 TGDoubleSlider.cxx:211
 TGDoubleSlider.cxx:212
 TGDoubleSlider.cxx:213
 TGDoubleSlider.cxx:214
 TGDoubleSlider.cxx:215
 TGDoubleSlider.cxx:216
 TGDoubleSlider.cxx:217
 TGDoubleSlider.cxx:218
 TGDoubleSlider.cxx:219
 TGDoubleSlider.cxx:220
 TGDoubleSlider.cxx:221
 TGDoubleSlider.cxx:222
 TGDoubleSlider.cxx:223
 TGDoubleSlider.cxx:224
 TGDoubleSlider.cxx:225
 TGDoubleSlider.cxx:226
 TGDoubleSlider.cxx:227
 TGDoubleSlider.cxx:228
 TGDoubleSlider.cxx:229
 TGDoubleSlider.cxx:230
 TGDoubleSlider.cxx:231
 TGDoubleSlider.cxx:232
 TGDoubleSlider.cxx:233
 TGDoubleSlider.cxx:234
 TGDoubleSlider.cxx:235
 TGDoubleSlider.cxx:236
 TGDoubleSlider.cxx:237
 TGDoubleSlider.cxx:238
 TGDoubleSlider.cxx:239
 TGDoubleSlider.cxx:240
 TGDoubleSlider.cxx:241
 TGDoubleSlider.cxx:242
 TGDoubleSlider.cxx:243
 TGDoubleSlider.cxx:244
 TGDoubleSlider.cxx:245
 TGDoubleSlider.cxx:246
 TGDoubleSlider.cxx:247
 TGDoubleSlider.cxx:248
 TGDoubleSlider.cxx:249
 TGDoubleSlider.cxx:250
 TGDoubleSlider.cxx:251
 TGDoubleSlider.cxx:252
 TGDoubleSlider.cxx:253
 TGDoubleSlider.cxx:254
 TGDoubleSlider.cxx:255
 TGDoubleSlider.cxx:256
 TGDoubleSlider.cxx:257
 TGDoubleSlider.cxx:258
 TGDoubleSlider.cxx:259
 TGDoubleSlider.cxx:260
 TGDoubleSlider.cxx:261
 TGDoubleSlider.cxx:262
 TGDoubleSlider.cxx:263
 TGDoubleSlider.cxx:264
 TGDoubleSlider.cxx:265
 TGDoubleSlider.cxx:266
 TGDoubleSlider.cxx:267
 TGDoubleSlider.cxx:268
 TGDoubleSlider.cxx:269
 TGDoubleSlider.cxx:270
 TGDoubleSlider.cxx:271
 TGDoubleSlider.cxx:272
 TGDoubleSlider.cxx:273
 TGDoubleSlider.cxx:274
 TGDoubleSlider.cxx:275
 TGDoubleSlider.cxx:276
 TGDoubleSlider.cxx:277
 TGDoubleSlider.cxx:278
 TGDoubleSlider.cxx:279
 TGDoubleSlider.cxx:280
 TGDoubleSlider.cxx:281
 TGDoubleSlider.cxx:282
 TGDoubleSlider.cxx:283
 TGDoubleSlider.cxx:284
 TGDoubleSlider.cxx:285
 TGDoubleSlider.cxx:286
 TGDoubleSlider.cxx:287
 TGDoubleSlider.cxx:288
 TGDoubleSlider.cxx:289
 TGDoubleSlider.cxx:290
 TGDoubleSlider.cxx:291
 TGDoubleSlider.cxx:292
 TGDoubleSlider.cxx:293
 TGDoubleSlider.cxx:294
 TGDoubleSlider.cxx:295
 TGDoubleSlider.cxx:296
 TGDoubleSlider.cxx:297
 TGDoubleSlider.cxx:298
 TGDoubleSlider.cxx:299
 TGDoubleSlider.cxx:300
 TGDoubleSlider.cxx:301
 TGDoubleSlider.cxx:302
 TGDoubleSlider.cxx:303
 TGDoubleSlider.cxx:304
 TGDoubleSlider.cxx:305
 TGDoubleSlider.cxx:306
 TGDoubleSlider.cxx:307
 TGDoubleSlider.cxx:308
 TGDoubleSlider.cxx:309
 TGDoubleSlider.cxx:310
 TGDoubleSlider.cxx:311
 TGDoubleSlider.cxx:312
 TGDoubleSlider.cxx:313
 TGDoubleSlider.cxx:314
 TGDoubleSlider.cxx:315
 TGDoubleSlider.cxx:316
 TGDoubleSlider.cxx:317
 TGDoubleSlider.cxx:318
 TGDoubleSlider.cxx:319
 TGDoubleSlider.cxx:320
 TGDoubleSlider.cxx:321
 TGDoubleSlider.cxx:322
 TGDoubleSlider.cxx:323
 TGDoubleSlider.cxx:324
 TGDoubleSlider.cxx:325
 TGDoubleSlider.cxx:326
 TGDoubleSlider.cxx:327
 TGDoubleSlider.cxx:328
 TGDoubleSlider.cxx:329
 TGDoubleSlider.cxx:330
 TGDoubleSlider.cxx:331
 TGDoubleSlider.cxx:332
 TGDoubleSlider.cxx:333
 TGDoubleSlider.cxx:334
 TGDoubleSlider.cxx:335
 TGDoubleSlider.cxx:336
 TGDoubleSlider.cxx:337
 TGDoubleSlider.cxx:338
 TGDoubleSlider.cxx:339
 TGDoubleSlider.cxx:340
 TGDoubleSlider.cxx:341
 TGDoubleSlider.cxx:342
 TGDoubleSlider.cxx:343
 TGDoubleSlider.cxx:344
 TGDoubleSlider.cxx:345
 TGDoubleSlider.cxx:346
 TGDoubleSlider.cxx:347
 TGDoubleSlider.cxx:348
 TGDoubleSlider.cxx:349
 TGDoubleSlider.cxx:350
 TGDoubleSlider.cxx:351
 TGDoubleSlider.cxx:352
 TGDoubleSlider.cxx:353
 TGDoubleSlider.cxx:354
 TGDoubleSlider.cxx:355
 TGDoubleSlider.cxx:356
 TGDoubleSlider.cxx:357
 TGDoubleSlider.cxx:358
 TGDoubleSlider.cxx:359
 TGDoubleSlider.cxx:360
 TGDoubleSlider.cxx:361
 TGDoubleSlider.cxx:362
 TGDoubleSlider.cxx:363
 TGDoubleSlider.cxx:364
 TGDoubleSlider.cxx:365
 TGDoubleSlider.cxx:366
 TGDoubleSlider.cxx:367
 TGDoubleSlider.cxx:368
 TGDoubleSlider.cxx:369
 TGDoubleSlider.cxx:370
 TGDoubleSlider.cxx:371
 TGDoubleSlider.cxx:372
 TGDoubleSlider.cxx:373
 TGDoubleSlider.cxx:374
 TGDoubleSlider.cxx:375
 TGDoubleSlider.cxx:376
 TGDoubleSlider.cxx:377
 TGDoubleSlider.cxx:378
 TGDoubleSlider.cxx:379
 TGDoubleSlider.cxx:380
 TGDoubleSlider.cxx:381
 TGDoubleSlider.cxx:382
 TGDoubleSlider.cxx:383
 TGDoubleSlider.cxx:384
 TGDoubleSlider.cxx:385
 TGDoubleSlider.cxx:386
 TGDoubleSlider.cxx:387
 TGDoubleSlider.cxx:388
 TGDoubleSlider.cxx:389
 TGDoubleSlider.cxx:390
 TGDoubleSlider.cxx:391
 TGDoubleSlider.cxx:392
 TGDoubleSlider.cxx:393
 TGDoubleSlider.cxx:394
 TGDoubleSlider.cxx:395
 TGDoubleSlider.cxx:396
 TGDoubleSlider.cxx:397
 TGDoubleSlider.cxx:398
 TGDoubleSlider.cxx:399
 TGDoubleSlider.cxx:400
 TGDoubleSlider.cxx:401
 TGDoubleSlider.cxx:402
 TGDoubleSlider.cxx:403
 TGDoubleSlider.cxx:404
 TGDoubleSlider.cxx:405
 TGDoubleSlider.cxx:406
 TGDoubleSlider.cxx:407
 TGDoubleSlider.cxx:408
 TGDoubleSlider.cxx:409
 TGDoubleSlider.cxx:410
 TGDoubleSlider.cxx:411
 TGDoubleSlider.cxx:412
 TGDoubleSlider.cxx:413
 TGDoubleSlider.cxx:414
 TGDoubleSlider.cxx:415
 TGDoubleSlider.cxx:416
 TGDoubleSlider.cxx:417
 TGDoubleSlider.cxx:418
 TGDoubleSlider.cxx:419
 TGDoubleSlider.cxx:420
 TGDoubleSlider.cxx:421
 TGDoubleSlider.cxx:422
 TGDoubleSlider.cxx:423
 TGDoubleSlider.cxx:424
 TGDoubleSlider.cxx:425
 TGDoubleSlider.cxx:426
 TGDoubleSlider.cxx:427
 TGDoubleSlider.cxx:428
 TGDoubleSlider.cxx:429
 TGDoubleSlider.cxx:430
 TGDoubleSlider.cxx:431
 TGDoubleSlider.cxx:432
 TGDoubleSlider.cxx:433
 TGDoubleSlider.cxx:434
 TGDoubleSlider.cxx:435
 TGDoubleSlider.cxx:436
 TGDoubleSlider.cxx:437
 TGDoubleSlider.cxx:438
 TGDoubleSlider.cxx:439
 TGDoubleSlider.cxx:440
 TGDoubleSlider.cxx:441
 TGDoubleSlider.cxx:442
 TGDoubleSlider.cxx:443
 TGDoubleSlider.cxx:444
 TGDoubleSlider.cxx:445
 TGDoubleSlider.cxx:446
 TGDoubleSlider.cxx:447
 TGDoubleSlider.cxx:448
 TGDoubleSlider.cxx:449
 TGDoubleSlider.cxx:450
 TGDoubleSlider.cxx:451
 TGDoubleSlider.cxx:452
 TGDoubleSlider.cxx:453
 TGDoubleSlider.cxx:454
 TGDoubleSlider.cxx:455
 TGDoubleSlider.cxx:456
 TGDoubleSlider.cxx:457
 TGDoubleSlider.cxx:458
 TGDoubleSlider.cxx:459
 TGDoubleSlider.cxx:460
 TGDoubleSlider.cxx:461
 TGDoubleSlider.cxx:462
 TGDoubleSlider.cxx:463
 TGDoubleSlider.cxx:464
 TGDoubleSlider.cxx:465
 TGDoubleSlider.cxx:466
 TGDoubleSlider.cxx:467
 TGDoubleSlider.cxx:468
 TGDoubleSlider.cxx:469
 TGDoubleSlider.cxx:470
 TGDoubleSlider.cxx:471
 TGDoubleSlider.cxx:472
 TGDoubleSlider.cxx:473
 TGDoubleSlider.cxx:474
 TGDoubleSlider.cxx:475
 TGDoubleSlider.cxx:476
 TGDoubleSlider.cxx:477
 TGDoubleSlider.cxx:478
 TGDoubleSlider.cxx:479
 TGDoubleSlider.cxx:480
 TGDoubleSlider.cxx:481
 TGDoubleSlider.cxx:482
 TGDoubleSlider.cxx:483
 TGDoubleSlider.cxx:484
 TGDoubleSlider.cxx:485
 TGDoubleSlider.cxx:486
 TGDoubleSlider.cxx:487
 TGDoubleSlider.cxx:488
 TGDoubleSlider.cxx:489
 TGDoubleSlider.cxx:490
 TGDoubleSlider.cxx:491
 TGDoubleSlider.cxx:492
 TGDoubleSlider.cxx:493
 TGDoubleSlider.cxx:494
 TGDoubleSlider.cxx:495
 TGDoubleSlider.cxx:496
 TGDoubleSlider.cxx:497
 TGDoubleSlider.cxx:498
 TGDoubleSlider.cxx:499
 TGDoubleSlider.cxx:500
 TGDoubleSlider.cxx:501
 TGDoubleSlider.cxx:502
 TGDoubleSlider.cxx:503
 TGDoubleSlider.cxx:504
 TGDoubleSlider.cxx:505
 TGDoubleSlider.cxx:506
 TGDoubleSlider.cxx:507
 TGDoubleSlider.cxx:508
 TGDoubleSlider.cxx:509
 TGDoubleSlider.cxx:510
 TGDoubleSlider.cxx:511
 TGDoubleSlider.cxx:512
 TGDoubleSlider.cxx:513
 TGDoubleSlider.cxx:514
 TGDoubleSlider.cxx:515
 TGDoubleSlider.cxx:516
 TGDoubleSlider.cxx:517
 TGDoubleSlider.cxx:518
 TGDoubleSlider.cxx:519
 TGDoubleSlider.cxx:520
 TGDoubleSlider.cxx:521
 TGDoubleSlider.cxx:522
 TGDoubleSlider.cxx:523
 TGDoubleSlider.cxx:524
 TGDoubleSlider.cxx:525
 TGDoubleSlider.cxx:526
 TGDoubleSlider.cxx:527
 TGDoubleSlider.cxx:528
 TGDoubleSlider.cxx:529
 TGDoubleSlider.cxx:530
 TGDoubleSlider.cxx:531
 TGDoubleSlider.cxx:532
 TGDoubleSlider.cxx:533
 TGDoubleSlider.cxx:534
 TGDoubleSlider.cxx:535
 TGDoubleSlider.cxx:536
 TGDoubleSlider.cxx:537
 TGDoubleSlider.cxx:538
 TGDoubleSlider.cxx:539
 TGDoubleSlider.cxx:540
 TGDoubleSlider.cxx:541
 TGDoubleSlider.cxx:542
 TGDoubleSlider.cxx:543
 TGDoubleSlider.cxx:544
 TGDoubleSlider.cxx:545
 TGDoubleSlider.cxx:546
 TGDoubleSlider.cxx:547
 TGDoubleSlider.cxx:548
 TGDoubleSlider.cxx:549
 TGDoubleSlider.cxx:550
 TGDoubleSlider.cxx:551
 TGDoubleSlider.cxx:552
 TGDoubleSlider.cxx:553
 TGDoubleSlider.cxx:554
 TGDoubleSlider.cxx:555
 TGDoubleSlider.cxx:556
 TGDoubleSlider.cxx:557
 TGDoubleSlider.cxx:558
 TGDoubleSlider.cxx:559
 TGDoubleSlider.cxx:560
 TGDoubleSlider.cxx:561
 TGDoubleSlider.cxx:562
 TGDoubleSlider.cxx:563
 TGDoubleSlider.cxx:564
 TGDoubleSlider.cxx:565
 TGDoubleSlider.cxx:566
 TGDoubleSlider.cxx:567
 TGDoubleSlider.cxx:568
 TGDoubleSlider.cxx:569
 TGDoubleSlider.cxx:570
 TGDoubleSlider.cxx:571
 TGDoubleSlider.cxx:572
 TGDoubleSlider.cxx:573
 TGDoubleSlider.cxx:574
 TGDoubleSlider.cxx:575
 TGDoubleSlider.cxx:576
 TGDoubleSlider.cxx:577
 TGDoubleSlider.cxx:578
 TGDoubleSlider.cxx:579
 TGDoubleSlider.cxx:580
 TGDoubleSlider.cxx:581
 TGDoubleSlider.cxx:582
 TGDoubleSlider.cxx:583
 TGDoubleSlider.cxx:584
 TGDoubleSlider.cxx:585
 TGDoubleSlider.cxx:586
 TGDoubleSlider.cxx:587
 TGDoubleSlider.cxx:588
 TGDoubleSlider.cxx:589
 TGDoubleSlider.cxx:590
 TGDoubleSlider.cxx:591
 TGDoubleSlider.cxx:592
 TGDoubleSlider.cxx:593
 TGDoubleSlider.cxx:594
 TGDoubleSlider.cxx:595
 TGDoubleSlider.cxx:596
 TGDoubleSlider.cxx:597
 TGDoubleSlider.cxx:598
 TGDoubleSlider.cxx:599
 TGDoubleSlider.cxx:600
 TGDoubleSlider.cxx:601
 TGDoubleSlider.cxx:602
 TGDoubleSlider.cxx:603
 TGDoubleSlider.cxx:604
 TGDoubleSlider.cxx:605
 TGDoubleSlider.cxx:606
 TGDoubleSlider.cxx:607
 TGDoubleSlider.cxx:608
 TGDoubleSlider.cxx:609
 TGDoubleSlider.cxx:610
 TGDoubleSlider.cxx:611
 TGDoubleSlider.cxx:612
 TGDoubleSlider.cxx:613
 TGDoubleSlider.cxx:614
 TGDoubleSlider.cxx:615
 TGDoubleSlider.cxx:616
 TGDoubleSlider.cxx:617
 TGDoubleSlider.cxx:618
 TGDoubleSlider.cxx:619
 TGDoubleSlider.cxx:620
 TGDoubleSlider.cxx:621
 TGDoubleSlider.cxx:622
 TGDoubleSlider.cxx:623
 TGDoubleSlider.cxx:624
 TGDoubleSlider.cxx:625
 TGDoubleSlider.cxx:626
 TGDoubleSlider.cxx:627
 TGDoubleSlider.cxx:628
 TGDoubleSlider.cxx:629
 TGDoubleSlider.cxx:630
 TGDoubleSlider.cxx:631
 TGDoubleSlider.cxx:632
 TGDoubleSlider.cxx:633
 TGDoubleSlider.cxx:634
 TGDoubleSlider.cxx:635
 TGDoubleSlider.cxx:636
 TGDoubleSlider.cxx:637
 TGDoubleSlider.cxx:638
 TGDoubleSlider.cxx:639
 TGDoubleSlider.cxx:640
 TGDoubleSlider.cxx:641
 TGDoubleSlider.cxx:642
 TGDoubleSlider.cxx:643
 TGDoubleSlider.cxx:644
 TGDoubleSlider.cxx:645
 TGDoubleSlider.cxx:646
 TGDoubleSlider.cxx:647
 TGDoubleSlider.cxx:648
 TGDoubleSlider.cxx:649
 TGDoubleSlider.cxx:650
 TGDoubleSlider.cxx:651
 TGDoubleSlider.cxx:652
 TGDoubleSlider.cxx:653
 TGDoubleSlider.cxx:654
 TGDoubleSlider.cxx:655
 TGDoubleSlider.cxx:656
 TGDoubleSlider.cxx:657
 TGDoubleSlider.cxx:658
 TGDoubleSlider.cxx:659
 TGDoubleSlider.cxx:660
 TGDoubleSlider.cxx:661
 TGDoubleSlider.cxx:662
 TGDoubleSlider.cxx:663
 TGDoubleSlider.cxx:664
 TGDoubleSlider.cxx:665
 TGDoubleSlider.cxx:666
 TGDoubleSlider.cxx:667
 TGDoubleSlider.cxx:668