52 Pixmap_t TGScrollBar::fgBckgndPixmap = 0;
53 Int_t TGScrollBar::fgScrollBarWidth = kDefaultScrollBarWidth;
55 ClassImp(TGScrollBarElement);
56 ClassImp(TGScrollBar);
57 ClassImp(TGHScrollBar);
58 ClassImp(TGVScrollBar);
63 class TSBRepeatTimer :
public TTimer {
65 TGScrollBar *fScrollBar;
68 TSBRepeatTimer(TGScrollBar *s, Long_t ms, Int_t inc) : TTimer(ms, kTRUE)
69 { fScrollBar = s; fSmallInc = inc; }
72 Int_t GetSmallInc()
const {
return fSmallInc; }
78 Bool_t TSBRepeatTimer::Notify()
80 fScrollBar->HandleTimer(
this);
88 TGScrollBarElement::TGScrollBarElement(
const TGWindow *p,
const TGPicture *pic,
89 UInt_t w, UInt_t h, UInt_t options, Pixel_t back) :
90 TGFrame(p, w, h, options | kOwnBackground, back)
96 if ((gClient->GetStyle() > 1) || (p && p->InheritsFrom(
"TGScrollBar")))
97 fStyle = gClient->GetStyle();
99 fBgndColor = fBackground;
100 fHighColor = gClient->GetResourcePool()->GetHighLightColor();
101 AddInput(kEnterWindowMask | kLeaveWindowMask);
107 TGScrollBarElement::~TGScrollBarElement()
110 fClient->FreePicture(fPicD);
117 void TGScrollBarElement::SetState(Int_t state)
119 if (state != fState) {
122 fOptions &= ~kRaisedFrame;
123 fOptions |= kSunkenFrame;
126 case kButtonDisabled:
127 fOptions &= ~kSunkenFrame;
128 fOptions |= kRaisedFrame;
132 fClient->NeedRedraw(
this);
139 void TGScrollBarElement::SetEnabled(Bool_t on)
142 if (fState == kButtonUp) {
148 if (fState == kButtonDisabled) {
151 SetState(kButtonDisabled);
154 TImage *img = TImage::Create();
156 TImage *img2 = TImage::Create();
161 TString back = gEnv->GetValue(
"Gui.BackgroundColor",
"#c0c0c0");
162 img2->FillRectangle(back.Data(), 0, 0, fPic->GetWidth(), fPic->GetHeight());
163 img->SetImage(fPicN->GetPicture(), fPicN->GetMask());
164 Pixmap_t mask = img->GetMask();
165 img2->Merge(img,
"overlay");
167 TString name =
"disbl_";
168 name += fPic->GetName();
169 fPicD = fClient->GetPicturePool()->GetPicture(name.Data(), img2->GetPixmap(),
176 fClient->NeedRedraw(
this);
182 void TGScrollBarElement::DrawBorder()
184 switch (fOptions & (kSunkenFrame | kRaisedFrame)) {
186 gVirtualX->DrawLine(fId, GetBlackGC()(), 0, 0, fWidth-2, 0);
187 gVirtualX->DrawLine(fId, GetBlackGC()(), 0, 0, 0, fHeight-2);
188 gVirtualX->DrawLine(fId, GetShadowGC()(), 1, 1, fWidth-3, 1);
189 gVirtualX->DrawLine(fId, GetShadowGC()(), 1, 1, 1, fHeight-3);
191 gVirtualX->DrawLine(fId, GetWhiteGC()(), 0, fHeight-1, fWidth-1, fHeight-1);
192 gVirtualX->DrawLine(fId, GetWhiteGC()(), fWidth-1, fHeight-1, fWidth-1, 1);
193 gVirtualX->DrawLine(fId, GetBckgndGC()(), 1, fHeight-2, fWidth-2, fHeight-2);
194 gVirtualX->DrawLine(fId, GetBckgndGC()(), fWidth-2, fHeight-2, fWidth-2, 2);
197 int x = (fWidth - fPic->GetWidth()) >> 1;
198 int y = (fHeight - fPic->GetHeight()) >> 1;
199 fPic->Draw(fId, GetBckgndGC()(), x+1, y+1);
204 case kButtonDisabled:
207 if (fBackground == fHighColor) {
208 gVirtualX->DrawRectangle(fId, GetShadowGC()(), 0, 0, fWidth-1, fHeight-1);
212 gVirtualX->DrawRectangle(fId, GetShadowGC()(), 0, 0, fWidth-1, fHeight-1);
214 gVirtualX->DrawRectangle(fId, GetBckgndGC()(), 0, 0, fWidth-1, fHeight-1);
216 if (fParent && fParent->InheritsFrom(
"TGHScrollBar")) {
218 gVirtualX->DrawLine(fId, GetShadowGC()(), (fWidth/2)-3, 4, (fWidth/2)-3, fHeight-5);
219 gVirtualX->DrawLine(fId, GetShadowGC()(), (fWidth/2), 4, (fWidth/2), fHeight-5);
220 gVirtualX->DrawLine(fId, GetShadowGC()(), (fWidth/2)+3, 4, (fWidth/2)+3, fHeight-5);
223 else if (fParent && fParent->InheritsFrom(
"TGVScrollBar")) {
225 gVirtualX->DrawLine(fId, GetShadowGC()(), 4, (fHeight/2)-3, fWidth-5, (fHeight/2)-3);
226 gVirtualX->DrawLine(fId, GetShadowGC()(), 4, (fHeight/2) , fWidth-5, (fHeight/2));
227 gVirtualX->DrawLine(fId, GetShadowGC()(), 4, (fHeight/2)+3, fWidth-5, (fHeight/2)+3);
231 gVirtualX->DrawRectangle(fId, GetShadowGC()(), 0, 0, fWidth-1, fHeight-1);
235 gVirtualX->DrawLine(fId, GetBckgndGC()(), 0, 0, fWidth-2, 0);
236 gVirtualX->DrawLine(fId, GetBckgndGC()(), 0, 0, 0, fHeight-2);
237 gVirtualX->DrawLine(fId, GetHilightGC()(), 1, 1, fWidth-3, 1);
238 gVirtualX->DrawLine(fId, GetHilightGC()(), 1, 1, 1, fHeight-3);
240 gVirtualX->DrawLine(fId, GetShadowGC()(), 1, fHeight-2, fWidth-2, fHeight-2);
241 gVirtualX->DrawLine(fId, GetShadowGC()(), fWidth-2, fHeight-2, fWidth-2, 1);
242 gVirtualX->DrawLine(fId, GetBlackGC()(), 0, fHeight-1, fWidth-1, fHeight-1);
243 gVirtualX->DrawLine(fId, GetBlackGC()(), fWidth-1, fHeight-1, fWidth-1, 0);
246 int x = (fWidth - fPic->GetWidth()) >> 1;
247 int y = (fHeight - fPic->GetHeight()) >> 1;
248 fPic->Draw(fId, GetBckgndGC()(), x, y);
260 Bool_t TGScrollBarElement::HandleCrossing(Event_t *event)
263 TGScrollBarElement *el = 0;
264 TGScrollBar *bar = 0;
265 if ((event->fType == kEnterNotify) && (fState != kButtonDisabled)) {
266 fBgndColor = fHighColor;
268 fBgndColor = fBackground;
270 if (event->fType == kLeaveNotify) {
271 fBgndColor = fBackground;
273 gVirtualX->SetWindowBackground(fId, fBgndColor);
276 if (fParent && fParent->InheritsFrom(
"TGScrollBar")) {
277 bar = (TGScrollBar *)fParent;
278 if ((el = bar->GetHead()) !=
this) {
279 el->ChangeBackground(fBgndColor);
282 if ((el = bar->GetTail()) !=
this) {
283 el->ChangeBackground(fBgndColor);
286 if ((el = bar->GetSlider()) !=
this) {
287 el->ChangeBackground(fBgndColor);
298 TGScrollBar::TGScrollBar(
const TGWindow *p, UInt_t w, UInt_t h,
299 UInt_t options, Pixel_t back) :
300 TGFrame(p, w, h, options | kOwnBackground, back),
301 fX0(0), fY0(0), fXp(0), fYp(0), fDragging(kFALSE), fGrabPointer(kTRUE),
302 fRange(0), fPsize(0), fPos(0), fSliderSize(0), fSliderRange(0),
303 fSmallInc(1), fHead(0), fTail(0), fSlider(0), fHeadPic(0),
304 fTailPic(0), fRepeat(0), fSubw()
306 fAccelerated = kFALSE;
308 fBgndColor = fBackground;
309 fHighColor = gClient->GetResourcePool()->GetHighLightColor();
312 if (gClient->GetStyle() == 0)
313 SetBackgroundPixmap(GetBckgndPixmap());
315 AddInput(kEnterWindowMask | kLeaveWindowMask);
321 TGScrollBar::~TGScrollBar()
326 if (fHeadPic) fClient->FreePicture(fHeadPic);
327 if (fTailPic) fClient->FreePicture(fTailPic);
328 if (fRepeat) {
delete fRepeat; fRepeat = 0; }
334 Bool_t TGScrollBar::HandleCrossing(Event_t *event)
336 if (gClient->GetStyle() > 0) {
337 if (event->fType == kEnterNotify) {
338 fBgndColor = fHighColor;
340 fBgndColor = fBackground;
342 if (event->fType == kLeaveNotify) {
343 fBgndColor = fBackground;
345 fHead->ChangeBackground(fBgndColor);
346 fTail->ChangeBackground(fBgndColor);
347 fSlider->ChangeBackground(fBgndColor);
350 fSlider->DrawBorder();
359 Bool_t TGScrollBar::HandleTimer(TTimer *t)
368 ev.fType = kButtonPress;
371 if (IsAccelerated()) {
373 if (fSmallInc > 100) fSmallInc = 100;
376 gVirtualX->QueryPointer(fId, dum1, dum2, ev.fXRoot, ev.fYRoot, ev.fX, ev.fY,
387 Pixmap_t TGScrollBar::GetBckgndPixmap()
389 static Bool_t init = kFALSE;
391 fgBckgndPixmap = gClient->GetResourcePool()->GetCheckeredPixmap();
394 return fgBckgndPixmap;
400 Int_t TGScrollBar::GetScrollBarWidth()
402 return fgScrollBarWidth;
408 void TGScrollBar::ChangeBackground(Pixel_t back)
410 TGFrame::ChangeBackground(back);
411 fHead->ChangeBackground(back);
412 fTail->ChangeBackground(back);
413 fSlider->ChangeBackground(back);
419 TGHScrollBar::TGHScrollBar(
const TGWindow *p, UInt_t w, UInt_t h,
420 UInt_t options, ULong_t back) :
421 TGScrollBar(p, w, h, options, back)
423 fHeadPic = fClient->GetPicture(
"arrow_left.xpm");
424 fTailPic = fClient->GetPicture(
"arrow_right.xpm");
426 if (!fHeadPic || !fTailPic) {
427 Error(
"TGHScrollBar",
"arrow_*.xpm not found");
430 fHead =
new TGScrollBarElement(
this, fHeadPic, fgScrollBarWidth, fgScrollBarWidth,
432 fTail =
new TGScrollBarElement(
this, fTailPic, fgScrollBarWidth, fgScrollBarWidth,
434 fSlider =
new TGScrollBarElement(
this, 0, fgScrollBarWidth, 50,
437 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier, kButtonPressMask |
438 kButtonReleaseMask | kPointerMotionMask, kNone, kNone);
441 fX0 = fY0 = (fgScrollBarWidth = TMath::Max(fgScrollBarWidth, 5));
444 fRange = TMath::Max((Int_t) w - (fgScrollBarWidth << 1), 1);
445 fPsize = fRange >> 1;
450 fHead->SetEditDisabled(kEditDisable | kEditDisableGrab);
451 fTail->SetEditDisabled(kEditDisable | kEditDisableGrab);
452 fSlider->SetEditDisabled(kEditDisable | kEditDisableGrab);
453 fEditDisabled = kEditDisableLayout | kEditDisableHeight | kEditDisableBtnEnable;
459 void TGHScrollBar::Layout()
463 fHead->Resize(fgScrollBarWidth, fgScrollBarWidth);
464 fTail->Move(fWidth-fgScrollBarWidth, 0);
465 fTail->Resize(fgScrollBarWidth, fgScrollBarWidth);
467 if (fSlider->GetX() != fX0) {
468 fSlider->Move(fX0, 0);
469 fSlider->Resize(50, fgScrollBarWidth);
470 fClient->NeedRedraw(fSlider);
477 Bool_t TGHScrollBar::HandleButton(Event_t *event)
481 if (event->fCode == kButton4) {
482 if (!fHead->IsEnabled()) {
486 newpos = fPos - fPsize;
487 if (newpos<0) newpos = 0;
491 if (event->fCode == kButton5) {
492 if (!fTail->IsEnabled()) {
496 newpos = fPos + fPsize;
501 if (event->fType == kButtonPress) {
502 if (event->fCode == kButton3) {
503 fX0 =
event->fX - fSliderSize/2;
504 fX0 = TMath::Max(fX0, fgScrollBarWidth);
505 fX0 = TMath::Min(fX0, fgScrollBarWidth + fSliderRange);
506 ULong_t pos = (ULong_t)(fX0 - fgScrollBarWidth) * (ULong_t)(fRange-fPsize) / (ULong_t)fSliderRange;
509 fPos = TMath::Max(fPos, 0);
510 fPos = TMath::Min(fPos, fRange-fPsize);
511 fSlider->Move(fX0, 0);
513 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERTRACK), fPos, 0);
514 PositionChanged(fPos);
520 Window_t subw = (Window_t)event->fUser[0];
522 if (subw == fSlider->GetId()) {
523 fXp =
event->fX - fX0;
524 fYp =
event->fY - fY0;
530 fRepeat =
new TSBRepeatTimer(
this, 400, fSmallInc);
532 gSystem->AddTimer(fRepeat);
535 if (subw == fHead->GetId()) {
539 fHead->SetState(kButtonDown);
541 }
else if (subw == fTail->GetId()) {
545 fTail->SetState(kButtonDown);
547 }
else if (event->fX > fgScrollBarWidth && event->fX < fX0)
549 else if (event->fX > fX0+fSliderSize && event->fX < (Int_t)fWidth-fgScrollBarWidth)
552 fPos = TMath::Max(fPos, 0);
553 fPos = TMath::Min(fPos, fRange-fPsize);
555 fX0 = fgScrollBarWidth + fPos * fSliderRange / TMath::Max(fRange-fPsize, 1);
557 fX0 = TMath::Max(fX0, fgScrollBarWidth);
558 fX0 = TMath::Min(fX0, fgScrollBarWidth + fSliderRange);
560 fSlider->Move(fX0, 0);
562 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERTRACK), fPos, 0);
563 PositionChanged(fPos);
567 if (fGrabPointer && !fClient->IsEditable())
568 gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
569 kPointerMotionMask, kNone, kNone,
572 fHead->SetState(kButtonUp);
573 fTail->SetState(kButtonUp);
577 fRepeat->SetTime(400);
578 fSmallInc = ((TSBRepeatTimer*)fRepeat)->GetSmallInc();
583 fPos = TMath::Max(fPos, 0);
584 fPos = TMath::Min(fPos, fRange-fPsize);
586 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERPOS), fPos, 0);
587 PositionChanged(fPos);
590 gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
598 Bool_t TGHScrollBar::HandleMotion(Event_t *event)
601 fX0 =
event->fX - fXp;
602 fY0 =
event->fY - fYp;
604 fX0 = TMath::Max(fX0, fgScrollBarWidth);
605 fX0 = TMath::Min(fX0, fgScrollBarWidth + fSliderRange);
606 fSlider->Move(fX0, 0);
607 ULong_t pos = (ULong_t)(fX0 - fgScrollBarWidth) * (ULong_t)(fRange-fPsize) / (ULong_t)fSliderRange;
610 fPos = TMath::Max(fPos, 0);
611 fPos = TMath::Min(fPos, fRange-fPsize);
613 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERTRACK), fPos, 0);
614 PositionChanged(fPos);
622 void TGHScrollBar::SetRange(Int_t range, Int_t page_size)
624 fRange = TMath::Max(range, 1);
625 fPsize = TMath::Max(page_size, 0);
626 fPos = TMath::Max(fPos, 0);
627 fPos = TMath::Min(fPos, fRange-fPsize);
629 fSliderSize = TMath::Max(fPsize * (fWidth - (fgScrollBarWidth << 1)) /
631 fSliderSize = TMath::Min((UInt_t)fSliderSize, fWidth - (fgScrollBarWidth << 1));
633 fSliderRange = TMath::Max(fWidth - (fgScrollBarWidth << 1) - fSliderSize,
636 fX0 = fgScrollBarWidth + fPos * fSliderRange / TMath::Max(fRange-fPsize, 1);
637 fX0 = TMath::Max(fX0, fgScrollBarWidth);
638 fX0 = TMath::Min(fX0, fgScrollBarWidth + fSliderRange);
640 fSlider->Move(fX0, 0);
641 fSlider->Resize(fSliderSize, fgScrollBarWidth);
642 fClient->NeedRedraw(fSlider);
646 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERPOS), fPos, 0);
647 PositionChanged(fPos);
648 RangeChanged(fRange);
649 PageSizeChanged(fPsize);
655 void TGHScrollBar::SetPosition(Int_t pos)
657 fPos = TMath::Max(pos, 0);
658 fPos = TMath::Min(pos, fRange-fPsize);
660 fX0 = fgScrollBarWidth + fPos * fSliderRange / TMath::Max(fRange-fPsize, 1);
661 fX0 = TMath::Max(fX0, fgScrollBarWidth);
662 fX0 = TMath::Min(fX0, fgScrollBarWidth + fSliderRange);
664 fSlider->Move(fX0, 0);
665 fSlider->Resize(fSliderSize, fgScrollBarWidth);
666 fClient->NeedRedraw(fSlider);
668 SendMessage(fMsgWindow, MK_MSG(kC_HSCROLL, kSB_SLIDERPOS), fPos, 0);
669 PositionChanged(fPos);
676 TGVScrollBar::TGVScrollBar(
const TGWindow *p, UInt_t w, UInt_t h,
677 UInt_t options, ULong_t back) :
678 TGScrollBar(p, w, h, options, back)
680 fHeadPic = fClient->GetPicture(
"arrow_up.xpm");
681 fTailPic = fClient->GetPicture(
"arrow_down.xpm");
683 if (!fHeadPic || !fTailPic) {
684 Error(
"TGVScrollBar",
"arrow_*.xpm not found");
687 fHead =
new TGScrollBarElement(
this, fHeadPic, fgScrollBarWidth, fgScrollBarWidth,
689 fTail =
new TGScrollBarElement(
this, fTailPic, fgScrollBarWidth, fgScrollBarWidth,
691 fSlider =
new TGScrollBarElement(
this, 0, fgScrollBarWidth, 50,
694 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier, kButtonPressMask |
695 kButtonReleaseMask | kPointerMotionMask, kNone, kNone);
698 fX0 = fY0 = (fgScrollBarWidth = TMath::Max(fgScrollBarWidth, 5));
701 fRange = TMath::Max((Int_t) h - (fgScrollBarWidth << 1), 1);
702 fPsize = fRange >> 1;
707 fHead->SetEditDisabled(kEditDisable | kEditDisableGrab);
708 fTail->SetEditDisabled(kEditDisable | kEditDisableGrab);
709 fSlider->SetEditDisabled(kEditDisable | kEditDisableGrab);
710 fEditDisabled = kEditDisableLayout | kEditDisableWidth | kEditDisableBtnEnable;
716 void TGVScrollBar::Layout()
720 fHead->Resize(fgScrollBarWidth, fgScrollBarWidth);
721 fTail->Move(0, fHeight-fgScrollBarWidth);
722 fTail->Resize(fgScrollBarWidth, fgScrollBarWidth);
724 if (fSlider->GetY() != fY0) {
725 fSlider->Move(0, fY0);
726 fSlider->Resize(fgScrollBarWidth, 50);
727 fClient->NeedRedraw(fSlider);
734 Bool_t TGVScrollBar::HandleButton(Event_t *event)
738 if (event->fCode == kButton4) {
739 if (!fHead->IsEnabled()) {
743 newpos = fPos - fPsize;
744 if (newpos<0) newpos = 0;
748 if (event->fCode == kButton5) {
749 if (!fTail->IsEnabled()) {
754 newpos = fPos + fPsize;
759 if (event->fType == kButtonPress) {
760 if (event->fCode == kButton3) {
761 fY0 =
event->fY - fSliderSize/2;
762 fY0 = TMath::Max(fY0, fgScrollBarWidth);
763 fY0 = TMath::Min(fY0, fgScrollBarWidth + fSliderRange);
764 ULong_t pos = (ULong_t)(fY0 - fgScrollBarWidth) * (ULong_t)(fRange-fPsize) / (ULong_t)fSliderRange;
767 fPos = TMath::Max(fPos, 0);
768 fPos = TMath::Min(fPos, fRange-fPsize);
769 fSlider->Move(0, fY0);
771 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERTRACK), fPos, 0);
772 PositionChanged(fPos);
778 Window_t subw = (Window_t)event->fUser[0];
780 if (subw == fSlider->GetId()) {
781 fXp =
event->fX - fX0;
782 fYp =
event->fY - fY0;
788 fRepeat =
new TSBRepeatTimer(
this, 400, fSmallInc);
790 gSystem->AddTimer(fRepeat);
793 if (subw == fHead->GetId()) {
797 fHead->SetState(kButtonDown);
799 }
else if (subw == fTail->GetId()) {
803 fTail->SetState(kButtonDown);
805 }
else if (event->fY > fgScrollBarWidth && event->fY < fY0)
807 else if (event->fY > fY0+fSliderSize && event->fY < (Int_t)fHeight-fgScrollBarWidth)
810 fPos = TMath::Max(fPos, 0);
811 fPos = TMath::Min(fPos, fRange-fPsize);
813 ULong_t y0 = (ULong_t)fgScrollBarWidth + (ULong_t)fPos * (ULong_t)fSliderRange / (ULong_t)TMath::Max(fRange-fPsize, 1);
816 fY0 = TMath::Max(fY0, fgScrollBarWidth);
817 fY0 = TMath::Min(fY0, fgScrollBarWidth + fSliderRange);
819 fSlider->Move(0, fY0);
821 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERTRACK), fPos, 0);
822 PositionChanged(fPos);
826 if (fGrabPointer && !fClient->IsEditable())
827 gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
828 kPointerMotionMask, kNone, kNone,
831 fHead->SetState(kButtonUp);
832 fTail->SetState(kButtonUp);
836 fRepeat->SetTime(400);
837 fSmallInc = ((TSBRepeatTimer*)fRepeat)->GetSmallInc();
842 fPos = TMath::Max(fPos, 0);
843 fPos = TMath::Min(fPos, fRange-fPsize);
845 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERPOS), fPos, 0);
846 PositionChanged(fPos);
849 gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
858 Bool_t TGVScrollBar::HandleMotion(Event_t *event)
861 fX0 =
event->fX - fXp;
862 fY0 =
event->fY - fYp;
864 fY0 = TMath::Max(fY0, fgScrollBarWidth);
865 fY0 = TMath::Min(fY0, fgScrollBarWidth + fSliderRange);
866 fSlider->Move(0, fY0);
867 ULong_t pos = (ULong_t)(fY0 - fgScrollBarWidth) * (ULong_t)(fRange-fPsize) / fSliderRange;
870 fPos = TMath::Max(fPos, 0);
871 fPos = TMath::Min(fPos, fRange-fPsize);
873 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERTRACK), fPos, 0);
874 PositionChanged(fPos);
882 void TGVScrollBar::SetRange(Int_t range, Int_t page_size)
884 fRange = TMath::Max(range, 1);
885 fPsize = TMath::Max(page_size, 0);
886 fPos = TMath::Max(fPos, 0);
887 fPos = TMath::Min(fPos, fRange-fPsize);
889 fSliderSize = TMath::Max(fPsize * (fHeight - (fgScrollBarWidth << 1)) /
891 fSliderSize = TMath::Min((UInt_t)fSliderSize, fHeight - (fgScrollBarWidth << 1));
893 fSliderRange = TMath::Max(fHeight - (fgScrollBarWidth << 1) - fSliderSize,
896 ULong_t y0 = (ULong_t)fgScrollBarWidth + (ULong_t)fPos * (ULong_t)fSliderRange / (ULong_t)TMath::Max(fRange-fPsize, 1);
898 fY0 = TMath::Max(fY0, fgScrollBarWidth);
899 fY0 = TMath::Min(fY0, fgScrollBarWidth + fSliderRange);
901 fSlider->Move(0, fY0);
902 fSlider->Resize(fgScrollBarWidth, fSliderSize);
903 fClient->NeedRedraw(fSlider);
908 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERPOS), fPos, 0);
909 PositionChanged(fPos);
910 RangeChanged(fRange);
911 PageSizeChanged(fPsize);
917 void TGVScrollBar::SetPosition(Int_t pos)
919 fPos = TMath::Max(pos, 0);
920 fPos = TMath::Min(pos, fRange-fPsize);
922 ULong_t y0 = (ULong_t)fgScrollBarWidth + (ULong_t)fPos * (ULong_t)fSliderRange / (ULong_t)TMath::Max(fRange-fPsize, 1);
924 fY0 = TMath::Max(fY0, fgScrollBarWidth);
925 fY0 = TMath::Min(fY0, fgScrollBarWidth + fSliderRange);
927 fSlider->Move(0, fY0);
928 fSlider->Resize(fgScrollBarWidth, fSliderSize);
929 fClient->NeedRedraw(fSlider);
931 SendMessage(fMsgWindow, MK_MSG(kC_VSCROLL, kSB_SLIDERPOS), fPos, 0);
932 PositionChanged(fPos);
938 void TGHScrollBar::SavePrimitive(std::ostream &out, Option_t *option )
940 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
942 out <<
" TGHScrollBar *";
943 out << GetName() <<
" = new TGHScrollBar(" << fParent->GetName()
944 <<
"," << GetWidth() <<
"," << GetHeight();
946 if (fBackground == GetDefaultFrameBackground()) {
948 out <<
");" << std::endl;
950 out <<
"," << GetOptionString() <<
");" << std::endl;
953 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
955 if (option && strstr(option,
"keep_names"))
956 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
958 out <<
" " << GetName() <<
"->SetRange(" << GetRange() <<
"," << GetPageSize() <<
");" << std::endl;
959 out <<
" " << GetName() <<
"->SetPosition(" << GetPosition() <<
");" << std::endl;
965 void TGVScrollBar::SavePrimitive(std::ostream &out, Option_t *option )
967 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
969 out<<
" TGVScrollBar *";
970 out << GetName() <<
" = new TGVScrollBar("<< fParent->GetName()
971 <<
"," << GetWidth() <<
"," << GetHeight();
973 if (fBackground == GetDefaultFrameBackground()) {
976 out <<
");" << std::endl;
978 out <<
"," << GetOptionString() <<
");" << std::endl;
981 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
983 if (option && strstr(option,
"keep_names"))
984 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
986 out <<
" " << GetName() <<
"->SetRange(" << GetRange() <<
"," << GetPageSize() <<
");" << std::endl;
987 out <<
" " << GetName() <<
"->SetPosition(" << GetPosition() <<
");" << std::endl;