71 ClassImp(TGTripleVSlider);
72 ClassImp(TGTripleHSlider);
77 TGTripleVSlider::TGTripleVSlider(
const TGWindow *p, UInt_t h, UInt_t type, Int_t
id,
78 UInt_t options, ULong_t back,
79 Bool_t reversed, Bool_t mark_ends,
80 Bool_t constrained, Bool_t relative)
81 : TGDoubleVSlider(p, h, type, id, options, back, reversed, mark_ends)
83 fPointerPic = fClient->GetPicture(
"slider1h.xpm");
85 Error(
"TGTripleVSlider",
"slider1h.xpm not found");
86 fConstrained = constrained;
90 AddInput(kStructureNotifyMask);
97 TGTripleVSlider::~TGTripleVSlider()
99 if (fPointerPic) fClient->FreePicture(fPointerPic);
105 void TGTripleVSlider::DoRedraw()
107 TGDoubleVSlider::DoRedraw();
115 void TGTripleVSlider::DrawPointer()
117 if (fPointerPic) fPointerPic->Draw(fId, GetBckgndGC()(), fWidth/2-7, fCz-5);
123 Bool_t TGTripleVSlider::HandleButton(Event_t *event)
125 if (event->fType == kButtonPress && event->fCode == kButton1) {
127 if (event->fX < (Int_t)fWidth/2-7 || event->fX > (Int_t)fWidth/2+7) {
130 fPressPoint =
event->fY;
134 int relMin = (int)((fHeight-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
135 int relMax = (int)((fHeight-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
136 if (fPressPoint > (fCz - 5) && fPressPoint < (fCz + 5) &&
137 event->fX > ((Int_t)fWidth / 2) - 7 && event->fX < ((Int_t)fWidth / 2) + 5)
140 else if (fPressPoint < (relMax - relMin) / 4 + relMin)
143 else if (fPressPoint > (relMax - relMin) / 4 * 3 + relMin)
150 SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_PRESS), fWidgetId, 0);
151 fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_PRESS), fWidgetId, 0);
155 gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
156 kPointerMotionMask, kNone, kNone,
158 }
else if (event->fType == kButtonRelease && event->fCode == kButton1) {
159 SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_RELEASE), fWidgetId, 0);
160 fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_RELEASE), fWidgetId, 0);
163 gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
173 Bool_t TGTripleVSlider::HandleConfigureNotify(Event_t* event)
175 TGFrame::HandleConfigureNotify(event);
176 SetPointerPosition(fSCz);
183 Bool_t TGTripleVSlider::HandleMotion(Event_t *event)
189 if (event->fY > (fCz - 5) && event->fY < (fCz + 5) &&
190 event->fX > ((Int_t)fWidth / 2) - 7 &&
191 event->fX < ((Int_t)fWidth / 2) + 5 &&
193 gVirtualX->SetCursor(fId, kNone);
197 static int oldDiff = 0;
198 static Long64_t was = gSystem->Now();
199 Long64_t now = gSystem->Now();
201 if (fMove == 0)
return kTRUE;
202 if ((now-was) < 50)
return kTRUE;
206 Float_t oldMin, oldMax;
208 diff =
event->fY - fPressPoint;
215 fSmin = fPressSmin + diff * (fVmax - fVmin) / (fHeight-16);
216 if (fSmin < fVmin) fSmin = fVmin;
217 if (fSmin > fSmax) fSmin = fSmax;
218 }
else if (fMove == 2) {
221 fSmax = fPressSmax + diff * (fVmax - fVmin) / (fHeight-16);
222 if (fSmax > fVmax) fSmax = fVmax;
223 if (fSmax < fSmin) fSmax = fSmin;
224 }
else if (fMove == 3) {
227 logicalDiff = diff * (fVmax - fVmin) / (fHeight-16);
228 if (fPressSmax + logicalDiff > fVmax)
229 logicalDiff = fVmax - fPressSmax;
230 if (fPressSmin + logicalDiff < fVmin)
231 logicalDiff = fVmin - fPressSmin;
232 fSmax = fPressSmax + logicalDiff;
233 fSmin = fPressSmin + logicalDiff;
235 if (abs(diff) < 3) oldDiff = diff;
236 SetPointerPos(diff - oldDiff, 3);
240 else if (fMove == 4) {
243 SetPointerPos(event->fY, 1);
249 if (fMove != 0 && (fSmax != oldMax || fSmin != oldMin)) {
250 fClient->NeedRedraw(
this);
251 SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_POS), fWidgetId, 0);
252 fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_POS), fWidgetId, 0);
261 void TGTripleVSlider::SetConstrained(Bool_t on)
266 if (GetPointerPosition() <= GetMinPosition())
267 SetPointerPos((Int_t)GetMinPosition(), 3);
268 else if (GetPointerPosition() >= GetMaxPosition())
269 SetPointerPos((Int_t)GetMaxPosition(), 3);
276 void TGTripleVSlider::SetPointerPos(Int_t z, Int_t opt)
278 static Long64_t was = gSystem->Now();
279 Bool_t lcheck = (opt == 1);
287 else if (fCz >= (Int_t)fHeight - 7)
288 fCz = (Int_t)fHeight - 7;
295 else if (fCz >= (Int_t)fHeight-7)
296 fCz = (Int_t)fHeight - 7;
299 int relMin = (int)((fHeight-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
300 int relMax = (int)((fHeight-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
311 fSCz = fVmin + ((Float_t)(fCz-8) * (fVmax - fVmin) / (Float_t)(fHeight-16));
312 if(fSCz < fVmin) fSCz = fVmin;
313 if(fSCz > fVmax) fSCz = fVmax;
315 if(fSCz < fSmin) fSCz = fSmin;
316 if(fSCz > fSmax) fSCz = fSmax;
320 fClient->NeedRedraw(
this);
322 Long64_t now = gSystem->Now();
323 if ((fMove != 4) && ((now-was) < 150))
return;
325 SendMessage(fMsgWindow, MK_MSG(kC_VSLIDER, kSL_POINTER), fWidgetId, 0);
326 fClient->ProcessLine(fCommand, MK_MSG(kC_VSLIDER, kSL_POINTER), fWidgetId, 0);
327 PointerPositionChanged();
328 fClient->NeedRedraw(
this);
335 void TGTripleVSlider::SetPointerPosition(Float_t pos)
337 if (fReversedScale) {
338 fSCz = fVmin + fVmax - pos;
343 Float_t absPos = (fSCz - fVmin) * (fHeight-16) / (fVmax - fVmin);
344 SetPointerPos((
int)(absPos+5.0), 0);
350 TGTripleHSlider::TGTripleHSlider(
const TGWindow *p, UInt_t w, UInt_t type, Int_t
id,
351 UInt_t options, ULong_t back,
352 Bool_t reversed, Bool_t mark_ends,
353 Bool_t constrained, Bool_t relative)
354 : TGDoubleHSlider(p, w, type, id, options, back, reversed, mark_ends)
356 fPointerPic = fClient->GetPicture(
"slider1v.xpm");
358 Error(
"TGTripleVSlider",
"slider1v.xpm not found");
359 fConstrained = constrained;
360 fRelative = relative;
363 AddInput(kStructureNotifyMask);
370 TGTripleHSlider::~TGTripleHSlider()
372 if (fPointerPic) fClient->FreePicture(fPointerPic);
378 void TGTripleHSlider::DoRedraw()
380 TGDoubleHSlider::DoRedraw();
388 void TGTripleHSlider::DrawPointer()
390 if (fPointerPic) fPointerPic->Draw(fId, GetBckgndGC()(), fCz-5, fHeight/2-7);
396 Bool_t TGTripleHSlider::HandleButton(Event_t *event)
398 if (event->fType == kButtonPress && event->fCode == kButton1) {
400 if (event->fY < (Int_t)fHeight/2-7 || event->fY > (Int_t)fHeight/2+7) {
403 fPressPoint =
event->fX;
407 int relMin = (int)((fWidth-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
408 int relMax = (int)((fWidth-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
409 if (fPressPoint > (fCz - 5) && fPressPoint < (fCz + 5) &&
410 event->fY > ((Int_t)fHeight / 2) - 7 && event->fY < ((Int_t)fHeight / 2) + 5)
413 else if (fPressPoint < (relMax - relMin) / 4 + relMin)
416 else if (fPressPoint > (relMax - relMin) / 4 * 3 + relMin)
423 SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_PRESS), fWidgetId, 0);
424 fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_PRESS), fWidgetId, 0);
428 gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
429 kPointerMotionMask, kNone, kNone,
431 }
else if (event->fType == kButtonRelease && event->fCode == kButton1) {
432 SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_RELEASE), fWidgetId, 0);
433 fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_RELEASE), fWidgetId, 0);
436 gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
446 Bool_t TGTripleHSlider::HandleConfigureNotify(Event_t* event)
448 TGFrame::HandleConfigureNotify(event);
449 SetPointerPosition(fSCz);
456 Bool_t TGTripleHSlider::HandleMotion(Event_t *event)
462 if (event->fX > (fCz - 5) && event->fX < (fCz + 5) &&
463 event->fY > ((Int_t)fHeight / 2) - 7 &&
464 event->fY < ((Int_t)fHeight / 2) + 5 &&
466 gVirtualX->SetCursor(fId, kNone);
470 static int oldDiff = 0;
471 static Long64_t was = gSystem->Now();
472 Long64_t now = gSystem->Now();
474 if (fMove == 0)
return kTRUE;
475 if ((now-was) < 50)
return kTRUE;
479 Float_t oldMin, oldMax;
481 diff =
event->fX - fPressPoint;
488 fSmin = fPressSmin + diff * (fVmax - fVmin) / (fWidth-16);
489 if (fSmin < fVmin) fSmin = fVmin;
490 if (fSmin > fSmax) fSmin = fSmax;
491 }
else if (fMove == 2) {
494 fSmax = fPressSmax + diff * (fVmax - fVmin) / (fWidth-16);
495 if (fSmax > fVmax) fSmax = fVmax;
496 if (fSmax < fSmin) fSmax = fSmin;
497 }
else if (fMove == 3) {
500 logicalDiff = diff * (fVmax - fVmin) / (fWidth-16);
501 if (fPressSmax + logicalDiff > fVmax)
502 logicalDiff = fVmax - fPressSmax;
503 if (fPressSmin + logicalDiff < fVmin)
504 logicalDiff = fVmin - fPressSmin;
505 fSmax = fPressSmax + logicalDiff;
506 fSmin = fPressSmin + logicalDiff;
508 if (abs(diff) < 3) oldDiff = diff;
509 SetPointerPos(diff - oldDiff, 3);
513 else if (fMove == 4) {
516 SetPointerPos(event->fX, 1);
522 if (fMove != 0 && (fSmax != oldMax || fSmin != oldMin)) {
523 fClient->NeedRedraw(
this);
524 SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_POS), fWidgetId, 0);
525 fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_POS), fWidgetId, 0);
534 void TGTripleHSlider::SetConstrained(Bool_t on)
539 if (GetPointerPosition() <= GetMinPosition())
540 SetPointerPos((Int_t)GetMinPosition(), 3);
541 else if (GetPointerPosition() >= GetMaxPosition())
542 SetPointerPos((Int_t)GetMaxPosition(), 3);
549 void TGTripleHSlider::SetPointerPos(Int_t z, Int_t opt)
551 static Long64_t was = gSystem->Now();
552 Bool_t lcheck = (opt == 1);
560 else if (fCz >= (Int_t)fWidth-7)
561 fCz = (Int_t)fWidth-7;
568 else if (fCz >= (Int_t)fWidth-7)
569 fCz = (Int_t)fWidth-7;
572 int relMin = (int)((fWidth-16) * (fSmin - fVmin) / (fVmax - fVmin)) + 1;
573 int relMax = (int)((fWidth-16) * (fSmax - fVmin) / (fVmax - fVmin) + 15);
584 fSCz = fVmin + ((Float_t)(fCz-8) * (fVmax - fVmin) / (Float_t)(fWidth-16));
585 if(fSCz < fVmin) fSCz = fVmin;
586 if(fSCz > fVmax) fSCz = fVmax;
588 if(fSCz < fSmin) fSCz = fSmin;
589 if(fSCz > fSmax) fSCz = fSmax;
593 fClient->NeedRedraw(
this);
595 Long64_t now = gSystem->Now();
596 if ((fMove != 4) && ((now-was) < 150))
return;
598 SendMessage(fMsgWindow, MK_MSG(kC_HSLIDER, kSL_POINTER), fWidgetId, 0);
599 fClient->ProcessLine(fCommand, MK_MSG(kC_HSLIDER, kSL_POINTER), fWidgetId, 0);
600 PointerPositionChanged();
601 fClient->NeedRedraw(
this);
608 void TGTripleHSlider::SetPointerPosition(Float_t pos)
610 if (fReversedScale) {
611 fSCz = fVmin + fVmax - pos;
616 Float_t absPos = (fSCz - fVmin) * (fWidth-16) / (fVmax - fVmin);
617 SetPointerPos((
int)(absPos+5.0), 0);
623 void TGTripleHSlider::SavePrimitive(std::ostream &out, Option_t *option )
625 SaveUserColor(out, option);
627 out <<
" TGTripleHSlider *";
628 out << GetName() <<
" = new TGTripleHSlider(" << fParent->GetName()
629 <<
"," << GetWidth() <<
",";
630 out << GetSString() <<
"," << WidgetId() <<
",";
631 out << GetOptionString() <<
",ucolor";
634 out <<
",kTRUE,kTRUE";
636 out <<
",kFALSE,kTRUE";
637 }
else if (fReversedScale) {
638 out <<
",kTRUE,kFALSE";
640 out <<
",kFALSE,kFALSE";
644 out <<
",kFALSE,kTRUE);" << std::endl;
646 out <<
",kFALSE,kFALSE);" << std::endl;
648 else if (fRelative) {
649 out <<
",kTRUE);" << std::endl;
652 out <<
");" << std::endl;
654 if (option && strstr(option,
"keep_names"))
655 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
657 if (fVmin != 0 || fVmax != (Int_t)fWidth)
658 out <<
" " << GetName() <<
"->SetRange(" << fVmin <<
"," << fVmax
659 <<
");" << std::endl;
661 if (fSmin != fWidth/8*3 || fSmax != fWidth/8*5)
662 out <<
" " << GetName() <<
"->SetPosition(" << GetMinPosition()
663 <<
"," << GetMaxPosition() <<
");" << std::endl;
666 out <<
" " << GetName() <<
"->SetScale(" << fScale <<
");" << std::endl;
668 out <<
" " << GetName() <<
"->SetPointerPosition(" << fSCz <<
");" << std::endl;
674 void TGTripleVSlider::SavePrimitive(std::ostream &out, Option_t *option )
676 SaveUserColor(out, option);
678 out<<
" TGTripleVSlider *";
679 out << GetName() <<
" = new TGTripleVSlider("<< fParent->GetName()
680 <<
"," << GetHeight() <<
",";
681 out << GetSString() <<
"," << WidgetId() <<
",";
682 out << GetOptionString() <<
",ucolor";
685 out <<
",kTRUE,kTRUE";
687 out <<
",kFALSE,kTRUE";
688 }
else if (fReversedScale) {
689 out <<
",kTRUE,kFALSE";
691 out <<
",kFALSE,kFALSE";
695 out <<
",kFALSE,kTRUE);" << std::endl;
697 out <<
",kFALSE,kFALSE);" << std::endl;
699 else if (fRelative) {
700 out <<
",kTRUE);" << std::endl;
703 out <<
");" << std::endl;
705 if (option && strstr(option,
"keep_names"))
706 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
708 if (fVmin != 0 || fVmax != (Int_t)fHeight)
709 out <<
" " << GetName() <<
"->SetRange(" << fVmin <<
"," << fVmax
710 <<
");" << std::endl;
712 if (fSmin != fHeight/8*3 || fSmax != fHeight/8*5)
713 out <<
" " << GetName() <<
"->SetPosition(" << GetMinPosition()
714 <<
"," << GetMaxPosition() <<
");" << std::endl;
717 out <<
" " << GetName() <<
"->SetScale(" << fScale <<
");" << std::endl;
719 out <<
" " << GetName() <<
"->SetPointerPosition(" << fSCz <<
");" << std::endl;