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;