//*CMZ : 2.00/12 02/10/98 16.02.19 by Fons Rademakers
//*CMZ : 2.00/11 03/08/98 11.58.16 by Fons Rademakers
//*CMZ : 2.00/04 30/03/98 15.37.56 by Fons Rademakers
//*CMZ : 2.00/00 16/02/98 02.36.03 by Fons Rademakers
//*-- Author : Fons Rademakers 14/01/98
//*KEEP,CopyRight,T=C.
/*************************************************************************
* Copyright(c) 1995-1999, The ROOT System, All rights reserved. *
* Authors: Rene Brun, Fons Rademakers. *
* For list of contributors see $ROOTSYS/AA_CREDITS. *
* *
* Permission to use, copy, modify and distribute this software and its *
* documentation for non-commercial purposes is hereby granted without *
* fee, provided that the above copyright notice appears in all copies *
* and that both the copyright notice and this permission notice appear *
* in the supporting documentation. The authors make no claims about the *
* suitability of this software for any purpose. It is provided "as is" *
* without express or implied warranty. *
*************************************************************************/
//*KEEP,CopyLeft.
/**************************************************************************
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.
**************************************************************************/
//*KEND.
//////////////////////////////////////////////////////////////////////////
// //
// TGSlider, TGVSlider and TGHSlider //
// //
// Slider widgets allow easy selection out of a range. //
// Sliders can be either horizontal or vertical oriented and there is //
// a choice of two different slider types and three different types //
// of tick marks. //
// //
// TGSlider is an abstract base class. Use the concrete TGVSlider and //
// TGHSlider. //
// //
// Dragging the slider will generate the event: //
// kC_VSLIDER, kSL_POS, slider id, position (for vertical slider) //
// kC_HSLIDER, kSL_POS, slider id, position (for horizontal slider) //
// //
//////////////////////////////////////////////////////////////////////////
//*KEEP,TGSlider.
#include "TGSlider.h"
//*KEEP,TGPicture.
#include "TGPicture.h"
//*KEND.
ClassImp(TGSlider)
ClassImp(TGVSlider)
ClassImp(TGHSlider)
//______________________________________________________________________________
TGSlider::TGSlider(const TGWindow *p, UInt_t w, UInt_t h, UInt_t type, Int_t id,
UInt_t options, ULong_t back)
: TGFrame(p, w, h, options, back)
{
// Slider constructor.
fWidgetId = id;
fWidgetFlags = kWidgetWantFocus;
fMsgWindow = p;
fType = type;
fScale = 10;
}
//______________________________________________________________________________
TGVSlider::TGVSlider(const TGWindow *p, UInt_t h, UInt_t type, Int_t id,
UInt_t options, ULong_t back) :
TGSlider(p, kSliderWidth, h, type, id, options, back)
{
// Create a vertical slider widget.
if ((fType & kSlider1))
fSliderPic = fClient->GetPicture("slider1h.xpm");
else
fSliderPic = fClient->GetPicture("slider2h.xpm");
if (!fSliderPic)
Error("TGVSlider", "slider?h.xpm not found");
gGXW->GrabButton(fId, kAnyButton, kAnyModifier,
kButtonPressMask | kButtonReleaseMask |
kPointerMotionMask, kNone, kNone);
// set initial values
fPos = h/2; fVmin = 0; fVmax = h;
}
//______________________________________________________________________________
TGVSlider::~TGVSlider()
{
// Delete vertical slider widget.
if (fSliderPic) fClient->FreePicture(fSliderPic);
}
//______________________________________________________________________________
void TGVSlider::DoRedraw()
{
// Redraw vertical slider widget.
// cleanup the drawable
gGXW->ClearWindow(fId);
gGXW->DrawLine(fId, fgShadowGC, fWidth/2, 8, fWidth/2-1, 8);
gGXW->DrawLine(fId, fgShadowGC, fWidth/2-1, 8, fWidth/2-1, fHeight-9);
gGXW->DrawLine(fId, fgHilightGC, fWidth/2+1, 8, fWidth/2+1, fHeight-8);
gGXW->DrawLine(fId, fgHilightGC, fWidth/2+1, fHeight-8, fWidth/2, fHeight-8);
gGXW->DrawLine(fId, fgBlackGC, fWidth/2, 9, fWidth/2, fHeight-9);
// check scale
if (fScale == 1) fScale++;
if (fScale * 2 > (int)fHeight) fScale = 0;
if (fScale > 0 && !(fType & kScaleNo)) {
int lines = ((int)fHeight-16) / fScale;
int remain = ((int)fHeight-16) % fScale;
for (int i = 0; i <= lines; i++) {
int y = i * fScale + (i * remain) / lines;
gGXW->DrawLine(fId, fgBlackGC, fWidth/2+8, y+7, fWidth/2+10, y+7);
if ((fType & kSlider2) && (fType && kScaleBoth))
gGXW->DrawLine(fId, fgBlackGC, fWidth/2-9, y+7, fWidth/2-11, y+7);
}
}
if (fPos < fVmin) fPos = fVmin;
if (fPos > fVmax) fPos = fVmax;
// calc slider-picture position
fRelPos = (((int)fHeight-16) * (fPos - fVmin)) / (fVmax - fVmin) + 8;
if (fSliderPic) fSliderPic->Draw(fId, fgBckgndGC, fWidth/2-7, fRelPos-6);
}
//______________________________________________________________________________
Bool_t TGVSlider::HandleButton(Event_t *event)
{
// Handle mouse button event in vertical slider.
if (event->fType == kButtonPress) {
if (event->fY >= fRelPos - 7 && event->fY <= fRelPos + 7) {
// slider selected
fDragging = kTRUE;
fYp = event->fY - (fRelPos-7);
} else {
if (event->fCode == kButton1) {
// scroll up or down
int m = (fVmax - fVmin) / (fHeight-16);
if (event->fY < fRelPos) {
fPos -= ((m) ? m : 1);
}
if (event->fY > fRelPos) {
fPos += ((m) ? m : 1);
}
} else if (event->fCode == kButton2) {
// set absolute position
fPos = ((fVmax - fVmin) * event->fY) / (fHeight-16) + fVmin;
}
SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_POS),
fWidgetId, fPos);
}
fClient->NeedRedraw(this);
} else {
// ButtonRelease
fDragging = kFALSE;
}
return kTRUE;
}
//______________________________________________________________________________
Bool_t TGVSlider::HandleMotion(Event_t *event)
{
// Handle mouse motion event in vertical slider.
if (fDragging) {
int old = fPos;
fPos = ((fVmax - fVmin) * (event->fY - fYp)) / ((int)fHeight-16) + fVmin;
if (fPos > fVmax) fPos = fVmax;
if (fPos < fVmin) fPos = fVmin;
// check if position changed
if (old != fPos) {
fClient->NeedRedraw(this);
SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_POS),
fWidgetId, fPos);
}
}
return kTRUE;
}
//______________________________________________________________________________
TGHSlider::TGHSlider(const TGWindow *p, UInt_t w, UInt_t type, Int_t id,
UInt_t options, ULong_t back) :
TGSlider(p, w, kSliderHeight, type, id, options, back)
{
// Create horizontal slider widget.
if ((fType & kSlider1))
fSliderPic = fClient->GetPicture("slider1v.xpm");
else
fSliderPic = fClient->GetPicture("slider2v.xpm");
if (!fSliderPic)
Error("TGHSlider", "slider?v.xpm not found");
gGXW->GrabButton(fId, kAnyButton, kAnyModifier,
kButtonPressMask | kButtonReleaseMask |
kPointerMotionMask, kNone, kNone);
// set initial values
fPos = w/2; fVmin = 0; fVmax = w;
}
//______________________________________________________________________________
TGHSlider::~TGHSlider()
{
// Delete a horizontal slider widget.
if (fSliderPic) fClient->FreePicture(fSliderPic);
}
//______________________________________________________________________________
void TGHSlider::DoRedraw()
{
// Redraw horizontal slider widget.
// cleanup drawable
gGXW->ClearWindow(fId);
gGXW->DrawLine(fId, fgShadowGC, 8, fHeight/2, 8, fHeight/2-1);
gGXW->DrawLine(fId, fgShadowGC, 8, fHeight/2-1, fWidth-9, fHeight/2-1);
gGXW->DrawLine(fId, fgHilightGC, 8, fHeight/2+1, fWidth-8, fHeight/2+1);
gGXW->DrawLine(fId, fgHilightGC, fWidth-8, fHeight/2+1, fWidth-8, fHeight/2);
gGXW->DrawLine(fId, fgBlackGC, 9, fHeight/2, fWidth-9, fHeight/2);
if (fScale == 1) fScale++;
if (fScale * 2 > (int)fWidth) fScale = 0;
if (fScale > 0 && !(fType & kScaleNo)) {
int lines = ((int)fWidth-16) / fScale;
int remain = ((int)fWidth-16) % fScale;
for (int i = 0; i <= lines; i++) {
int x = i * fScale + (i * remain) / lines;
gGXW->DrawLine(fId, fgBlackGC, x+7, fHeight/2+8, x+7, fHeight/2+10);
if ((fType & kSlider2) && (fType && kScaleBoth))
gGXW->DrawLine(fId, fgBlackGC, x+7, fHeight/2-9, x+7, fHeight/2-11);
}
}
if (fPos < fVmin) fPos = fVmin;
if (fPos > fVmax) fPos = fVmax;
// calc slider-picture position
fRelPos = (((int)fWidth-16) * (fPos - fVmin)) / (fVmax - fVmin) + 8;
if (fSliderPic) fSliderPic->Draw(fId, fgBckgndGC, fRelPos-6, fHeight/2-7);
}
//______________________________________________________________________________
Bool_t TGHSlider::HandleButton(Event_t *event)
{
// Handle mouse button event in horizontal slider widget.
if (event->fType == kButtonPress) {
if (event->fX >= fRelPos - 7 && event->fX <= fRelPos + 7) {
// slider selected
fDragging = kTRUE;
fXp = event->fX - (fRelPos-7);
} else {
if (event->fCode == kButton1) {
int m = (fVmax - fVmin) / (fWidth-16);
if (event->fX < fRelPos) {
fPos -= ((m) ? m : 1);
}
if (event->fX > fRelPos) {
fPos += ((m) ? m : 1);
}
} else if (event->fCode == kButton2) {
fPos = ((fVmax - fVmin) * event->fX) / (fWidth-16) + fVmin;
}
SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_POS),
fWidgetId, fPos);
}
fClient->NeedRedraw(this);
} else {
// ButtonRelease
fDragging = kFALSE;
}
return kTRUE;
}
//______________________________________________________________________________
Bool_t TGHSlider::HandleMotion(Event_t *event)
{
// Handle mouse motion event in horizontal slide widget.
if (fDragging) {
int old = fPos;
fPos = ((fVmax - fVmin) * (event->fX - fXp)) / ((int)fWidth-16) + fVmin;
if (fPos > fVmax) fPos = fVmax;
if (fPos < fVmin) fPos = fVmin;
// check if position changed
if (old != fPos) {
fClient->NeedRedraw(this);
SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_POS),
fWidgetId, fPos);
}
}
return kTRUE;
}
ROOT page - Class index - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.