31 TSliderBox::TSliderBox(): TWbox()
39 TSliderBox::TSliderBox(Double_t x1, Double_t y1,Double_t x2, Double_t y2, Color_t color, Short_t bordersize, Short_t bordermode)
40 :TWbox(x1,y1,x2,y2,color,bordersize,bordermode)
48 TSliderBox::~TSliderBox()
55 void TSliderBox::ExecuteEvent(Int_t event, Int_t px, Int_t py)
59 const Int_t kMaxDiff = 5;
60 const Int_t kMinSize = 20;
62 static Int_t px1, px2, py1, py2, pxl, pyl, pxt, pyt, pxold, pyold;
63 static Int_t px1p, px2p, py1p, py2p;
64 static Bool_t pL, pR, pTop, pBot, pINSIDE;
66 Bool_t doing_again = kFALSE;
67 Bool_t opaque = gPad->OpaqueMoving();
68 Bool_t ropaque = gPad->OpaqueResizing();
70 TVirtualPad *parent = gPad;
72 Int_t border = parent->GetBorderSize();
73 Int_t pxpadmin = parent->XtoAbsPixel(parent->GetX1()) + border;
74 Int_t pxpadmax = parent->XtoAbsPixel(parent->GetX2()) - border;
75 Int_t pypadmin = parent->YtoAbsPixel(parent->GetY1()) - border;
76 Int_t pypadmax = parent->YtoAbsPixel(parent->GetY2()) + border;
78 Bool_t vertical = kTRUE;
79 if (pxpadmax-pxpadmin > pypadmin-pypadmax) vertical = kFALSE;
87 gVirtualX->SetLineColor(-1);
90 gVirtualX->SetLineColor(GetFillColor());
92 gVirtualX->SetLineColor(1);
93 gVirtualX->SetLineWidth(2);
99 px1 = gPad->XtoAbsPixel(GetX1());
100 py1 = gPad->YtoAbsPixel(GetY1());
101 px2 = gPad->XtoAbsPixel(GetX2());
102 py2 = gPad->YtoAbsPixel(GetY2());
124 pL = pR = pTop = pBot = pINSIDE = kFALSE;
126 if (vertical && (px > pxl+kMaxDiff && px < pxt-kMaxDiff) &&
127 TMath::Abs(py - pyl) < kMaxDiff) {
128 pxold = pxl; pyold = pyl; pTop = kTRUE;
129 gPad->SetCursor(kTopSide);
132 if (vertical && (px > pxl+kMaxDiff && px < pxt-kMaxDiff) &&
133 TMath::Abs(py - pyt) < kMaxDiff) {
134 pxold = pxt; pyold = pyt; pBot = kTRUE;
135 gPad->SetCursor(kBottomSide);
138 if (!vertical && (py > pyl+kMaxDiff && py < pyt-kMaxDiff) &&
139 TMath::Abs(px - pxl) < kMaxDiff) {
140 pxold = pxl; pyold = pyl; pL = kTRUE;
141 gPad->SetCursor(kLeftSide);
144 if (!vertical && (py > pyl+kMaxDiff && py < pyt-kMaxDiff) &&
145 TMath::Abs(px - pxt) < kMaxDiff) {
146 pxold = pxt; pyold = pyt; pR = kTRUE;
147 gPad->SetCursor(kRightSide);
150 if ((px > pxl+kMaxDiff && px < pxt-kMaxDiff) &&
151 (py > pyl+kMaxDiff && py < pyt-kMaxDiff)) {
152 pxold = px; pyold = py; pINSIDE = kTRUE;
153 if (event == kButton1Down)
154 gPad->SetCursor(kMove);
156 gPad->SetCursor(kCross);
160 if ( pL || pR || pTop || pBot)
163 if ( !pL && !pR && !pTop && !pBot && !pINSIDE)
164 gPad->SetCursor(kCross);
173 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
175 if (py2 > py1-kMinSize) { py2 = py1-kMinSize; wy = py2; }
176 if (py2 < py2p) { py2 = py2p; wy = py2; }
177 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
180 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
182 if (py1 < py2+kMinSize) { py1 = py2+kMinSize; wy = py1; }
183 if (py1 > py1p) { py1 = py1p; wy = py1; }
184 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
187 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
189 if (px1 > px2-kMinSize) { px1 = px2-kMinSize; wx = px1; }
190 if (px1 < px1p) { px1 = px1p; wx = px1; }
191 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
194 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
196 if (px2 < px1+kMinSize) { px2 = px1+kMinSize; wx = px2; }
197 if (px2 > px2p) { px2 = px2p; wx = px2; }
198 if (!ropaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
201 if (!opaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
202 Int_t dx = px - pxold;
203 Int_t dy = py - pyold;
204 px1 += dx; py1 += dy; px2 += dx; py2 += dy;
205 if (px1 < px1p) { dx = px1p - px1; px1 += dx; px2 += dx; wx = px+dx; }
206 if (px2 > px2p) { dx = px2 - px2p; px1 -= dx; px2 -= dx; wx = px-dx; }
207 if (py1 > py1p) { dy = py1 - py1p; py1 -= dy; py2 -= dy; wy = py-dy; }
208 if (py2 < py2p) { dy = py2p - py2; py1 += dy; py2 += dy; wy = py+dy; }
209 if (!opaque) gVirtualX->DrawBox(px1, py1, px2, py2, TVirtualX::kHollow);
215 gVirtualX->Warp(px, py);
221 if ((pINSIDE && opaque) || (fResizing && ropaque)) {
231 if (pTop || pBot || pL || pR || pINSIDE) {
232 fX1 = gPad->AbsPixeltoX(px1);
233 fY1 = gPad->AbsPixeltoY(py1);
234 fX2 = gPad->AbsPixeltoX(px2);
235 fY2 = gPad->AbsPixeltoY(py2);
241 if (parent == gPad) gPad->Modified(kTRUE);
242 if (!doing_again) gPad->SetCursor(kCross);
245 if (pTop || pBot || pL || pR )
246 gPad->Modified(kTRUE);
250 event = kButton1Motion;
252 gVirtualX->SetLineColor(-1);
253 gVirtualX->SetLineWidth(-1);
264 xpmin = Float_t(pypadmin-py1)/Float_t(pypadmin-pypadmax);
265 xpmax = Float_t(pypadmin-py2)/Float_t(pypadmin-pypadmax);
267 xpmin = Float_t(px1-pxpadmin)/Float_t(pxpadmax-pxpadmin);
268 xpmax = Float_t(px2-pxpadmin)/Float_t(pxpadmax-pxpadmin);
270 fSlider->SetMinimum(xpmin);
271 fSlider->SetMaximum(xpmax);
274 Int_t lenMethod = strlen(fSlider->GetMethod());
275 if (event == kButton1Up && lenMethod > 0 ) {
276 gPad->SetCursor(kWatch);
277 gROOT->ProcessLine(fSlider->GetMethod());
282 TObject *obj = fSlider->GetObject();
284 obj->ExecuteEvent(event,0,0);
291 void TSliderBox::SavePrimitive(std::ostream &, Option_t * )