40 #ifndef ROOT_TVirtualX
41 #include <TVirtualX.h>
48 const Short_t Level::fgkMaxLevelLabel = 4;
49 const Int_t Level::fgkMaxColor = 4;
50 const Int_t Level::fgkMaxStyle = 2;
51 Style_t Level::fgDefaultStyle[fgkMaxStyle] = {1, 2};
52 Color_t Level::fgDefaultColor[fgkMaxColor] = {9, 2, 1, 6};
53 Float_t Level::fgDefaultLabelSize = 0.03;
54 Color_t Level::fgDefaultLabelColor = 1;
55 Bool_t Level::fgMovable =
false;
70 fDefaultStyle(kKnown),
78 TLine::SetX1(0); TLine::SetX2(0); TLine::SetY1(0); TLine::SetY2(0);
81 fExtra.SetLineColor(17); fExtra.SetLineStyle(2); fExtra.SetBit(TObject::kInvalidObject);
83 fLabel0.SetX(0); fLabel0.SetY(0); fLabel0.SetTextAlign(21); fLabel0.SetBit(TObject::kCannotPick);
84 fLabel1.SetX(0); fLabel1.SetY(0); fLabel1.SetTextAlign(21); fLabel1.SetBit(TObject::kCannotPick);
85 fLabel2.SetX(0); fLabel2.SetY(0); fLabel2.SetTextAlign(23); fLabel2.SetBit(TObject::kCannotPick);
86 fLabel3.SetX(0); fLabel3.SetY(0); fLabel3.SetTextAlign(23); fLabel3.SetBit(TObject::kCannotPick);
103 fDefaultStyle = style;
111 fDefaultColor = color;
118 fLabel0.SetTextSize(size);
119 fLabel1.SetTextSize(size);
120 fLabel2.SetTextSize(size);
121 fLabel3.SetTextSize(size);
127 fLabel0.SetTextColor(color);
128 fLabel1.SetTextColor(color);
129 fLabel2.SetTextColor(color);
130 fLabel3.SetTextColor(color);
142 if ( fExtra.TestBit(TObject::kInvalidObject) ) {
143 fExtra.SetBit(TObject::kCannotPick);
144 fExtra.SetX1(TLine::GetX1());fExtra.SetX2(TLine::GetX2());
145 fExtra.SetBit(TObject::kInvalidObject,
false);
148 if ( x1 < GetX1() ) {
150 fExtra.SetX2(TMath::Max(TLine::GetX1(),fExtra.GetX2()));
158 if ( fExtra.TestBit(TObject::kInvalidObject) ) {
159 fExtra.SetBit(TObject::kCannotPick);
160 fExtra.SetX1(TLine::GetX1());fExtra.SetX2(TLine::GetX2());
161 fExtra.SetBit(TObject::kInvalidObject,
false);
164 if ( x2 > GetX2() ) {
166 fExtra.SetX1(TMath::Min(TLine::GetX2(),fExtra.GetX1()));
174 TString st = s; Short_t end = (st.Length() < fgkMaxLevelLabel) ? st.Length(): fgkMaxLevelLabel;
176 for( Short_t i = 0; i < end; i++ ) {
177 if ( st[i] ==
'0' ) {
189 TString st = s; Short_t end = (st.Length() < fgkMaxLevelLabel) ? st.Length(): fgkMaxLevelLabel;
191 for( Short_t i = 0; i < end; ++i ) {
192 if (st.CountChar(st[i]) > 1) {
195 fLog <<
warning << Form(
"Unambiguous position label pattern, set to %s", fPosLabel.Data()) <<
dolog;
206 if (which < 0 || which >= fgkMaxLevelLabel)
return;
209 fLabel0.SetText(fLabel0.GetX(),fLabel0.GetY(),label);
212 fLabel1.SetText(fLabel1.GetX(),fLabel1.GetY(),label);
215 fLabel2.SetText(fLabel2.GetX(),fLabel2.GetY(),label);
218 fLabel3.SetText(fLabel3.GetX(),fLabel3.GetY(),label);
226 fLabel0.SetText(fLabel0.GetX(),fLabel0.GetY(),l0);
227 fLabel1.SetText(fLabel1.GetX(),fLabel1.GetY(),l1);
228 fLabel2.SetText(fLabel2.GetX(),fLabel2.GetY(),l2);
229 fLabel3.SetText(fLabel3.GetX(),fLabel3.GetY(),l3);
237 fExtra.SetBit(TObject::kInvalidObject,
false);
239 fExtra.SetBit(TObject::kInvalidObject,
true);
253 if ( which <= 0 )
return fLabel0;
255 if ( which == 1 )
return fLabel1;
256 if ( which == 2 )
return fLabel2;
264 Double_t dx = x1-TLine::GetX1(); TLine::SetX1(x1);
266 for (Int_t i = 0; i <= 3; i+=3) {
267 Int_t idx = fPosLabel[i] -
'0';
275 Double_t dx = x2-TLine::GetX2(); TLine::SetX2(x2);
277 for (Int_t i = 1; i <= 2; ++i) {
278 Int_t idx = fPosLabel[i] -
'0';
286 Double_t dy = y1-TLine::GetY1();
288 for (Int_t i = 0; i < fgkMaxLevelLabel; ++i) {
290 if (i > 1) align = 23;
292 Int_t idx = fPosLabel[i] -
'0';
299 TLine::SetY1(y1); TLine::SetY2(y1);
305 Double_t dy = y2-TLine::GetY2();
307 for (Int_t i = 0; i < fgkMaxLevelLabel; ++i) {
309 if (i > 1) align = 23;
311 Int_t idx = fPosLabel[i] -
'0';
318 TLine::SetY1(y2); TLine::SetY2(y2); fExtra.SetY1(y2); fExtra.SetY2(y2);
324 if ( GetY1() == ((
Level *)lev)->GetY1() )
326 else if ( GetY1() < ((
Level *)lev)->GetY1() )
337 if (!fExtra.TestBit(TObject::kInvalidObject))
338 fExtra.Paint(option);
340 TLine::Paint(option);
344 if ( fVisLabel[0] ==
'1' ) {
345 idx = fPosLabel[0] -
'0';
348 if ( fVisLabel[1] ==
'1' ) {
349 idx = fPosLabel[1] -
'0';
352 if ( fVisLabel[2] ==
'1' ) {
353 idx = fPosLabel[2] -
'0';
357 if ( fVisLabel[3] ==
'1' ) {
358 idx = fPosLabel[3] -
'0';
374 if ( fVisLabel[0] ==
'1' ) {
375 idx = fPosLabel[0] -
'0';
378 if ( fVisLabel[1] ==
'1' ) {
379 idx = fPosLabel[1] -
'0';
382 if ( fVisLabel[2] ==
'1' ) {
383 idx = fPosLabel[2] -
'0';
387 if ( fVisLabel[3] ==
'1' ) {
388 idx = fPosLabel[3] -
'0';
409 static Int_t d1,d2,px1,px2,py1,py2;
410 static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
411 static Bool_t p1, p2, pL;
412 Double_t dpx,dpy,xp1,yp1;
414 Double_t vx0,vx1,vx2,vx3,vy0,vy1,vy2,vy3;
415 vx0 = fLabel0.GetX() - GetX1(); vy0 = fLabel0.GetY() - GetY1();
416 vx1 = fLabel1.GetX() - GetX2(); vy1 = fLabel1.GetY() - GetY1();
417 vx2 = fLabel2.GetX() - GetX2(); vy2 = fLabel2.GetY() - GetY1();
418 vx3 = fLabel3.GetX() - GetX1(); vy3 = fLabel3.GetY() - GetY1();
420 if (!gPad->IsEditable())
return;
424 gVirtualX->SetLineColor(-1);
431 if (TestBit(kLineNDC)) {
432 px1 = gPad->UtoPixel(fX1);
433 py1 = gPad->VtoPixel(fY1);
434 px2 = gPad->UtoPixel(fX2);
435 py2 = gPad->VtoPixel(fY2);
437 px1 = gPad->XtoAbsPixel(gPad->XtoPad(fX1));
438 py1 = gPad->YtoAbsPixel(gPad->YtoPad(fY1));
439 px2 = gPad->XtoAbsPixel(gPad->XtoPad(fX2));
440 py2 = gPad->YtoAbsPixel(gPad->YtoPad(fY2));
442 p1 = p2 = pL = kFALSE;
444 d1 = TMath::Abs(px1 - px) + TMath::Abs(py1-py);
446 px1old = px1; py1old = py1;
448 gPad->SetCursor(kPointer);
451 d2 = TMath::Abs(px2 - px) + TMath::Abs(py2-py);
453 px2old = px2; py2old = py2;
455 gPad->SetCursor(kPointer);
460 pxold = px; pyold = py;
461 gPad->SetCursor(kMove);
468 gVirtualX->DrawLine(px1old, py1old, px2, py2);
469 gVirtualX->DrawLine(px, py, px2, py2);
474 gVirtualX->DrawLine(px1, py1, px2old, py2old);
475 gVirtualX->DrawLine(px1, py1, px, py);
480 gVirtualX->DrawLine(px1, py1, px2, py2);
481 dx = px-pxold; dy = py-pyold;
482 px1 += dx; py1 += dy; px2 += dx; py2 += dy;
483 gVirtualX->DrawLine(px1, py1, px2, py2);
491 if (TestBit(kLineNDC)) {
492 dpx = gPad->GetX2() - gPad->GetX1();
493 dpy = gPad->GetY2() - gPad->GetY1();
497 fX1 = (gPad->AbsPixeltoX(px)-xp1)/dpx;
498 fY1 = (gPad->AbsPixeltoY(py)-yp1)/dpy;
502 fX2 = (gPad->AbsPixeltoX(px)-xp1)/dpx;
503 fY2 = (gPad->AbsPixeltoY(py)-yp1)/dpy;
507 fX1 = (gPad->AbsPixeltoX(px1)-xp1)/dpx;
508 fY1 = (gPad->AbsPixeltoY(py1)-yp1)/dpy;
509 fX2 = (gPad->AbsPixeltoX(px2)-xp1)/dpx;
510 fY2 = (gPad->AbsPixeltoY(py2)-yp1)/dpy;
514 fLabel0.SetX(fX1+vx0); fLabel0.SetY(fY1+vy0);
515 fLabel1.SetX(fX2); fLabel1.SetY(fY1);
516 fLabel2.SetX(fX2); fLabel2.SetY(fY1);
517 fLabel3.SetX(fX1); fLabel3.SetY(fY1);
519 fLabel1.SetX(fX1); fLabel1.SetY(fY1);
520 fLabel0.SetX(fX2+vx0); fLabel0.SetY(fY1+vy0);
521 fLabel3.SetX(fX2); fLabel3.SetY(fY1);
522 fLabel2.SetX(fX1); fLabel2.SetY(fY1);
526 fX1 = gPad->PadtoX(gPad->AbsPixeltoX(px));
527 fY1 = gPad->PadtoY(gPad->AbsPixeltoY(py));
531 fX2 = gPad->PadtoX(gPad->AbsPixeltoX(px));
532 fY2 = gPad->PadtoY(gPad->AbsPixeltoY(py));
536 fX1 = gPad->PadtoX(gPad->AbsPixeltoX(px1));
537 fY1 = gPad->PadtoY(gPad->AbsPixeltoY(py1));
538 fX2 = gPad->PadtoX(gPad->AbsPixeltoX(px2));
539 fY2 = gPad->PadtoY(gPad->AbsPixeltoY(py2));
547 fLabel0.SetX(fX1+vx0); fLabel0.SetY(fY1+vy0);
548 fLabel1.SetX(fX2+vx1); fLabel1.SetY(fY1+vy1);
549 fLabel2.SetX(fX2+vx2); fLabel2.SetY(fY1+vy2);
550 fLabel3.SetX(fX1+vx3); fLabel3.SetY(fY1+vy3);
553 if (fExtra.GetX1() < fX1)
556 if (fExtra.GetX2() > fX2)
559 fExtra.SetY1(fY1); fExtra.SetY2(fY1);
573 gPad->Modified(kTRUE);
574 gVirtualX->SetLineColor(-1);
582 event = gVirtualX->RequestLocator(1,1,px,py);
virtual const char * GetLabel0()
Get labels title.
virtual Bool_t IsVisible()
return visible
virtual void SetColor(EDefaultColor color)
Set color.
virtual void Paint(Option_t *option="")
used to paint a level
virtual void SetLabelsColor(Color_t color)
set all labels color
LogMessage & warning(LogMessage &)
virtual EDefaultStyle GetDefaultStyle()
return default style
virtual void SetLabelsSize(Float_t size)
set all labels size
virtual EDefaultColor GetDefaultColor()
return default color
void SetExtraLineX2(Double_t)
virtual void ExtraLine(Bool_t extra=true)
Set extraline drawning.
virtual void Draw(Option_t *option="")
virtual const char * GetLabel3()
virtual const char * GetLabel1()
virtual const char * GetLabel2()
static Float_t GetDefaultLabelSize()
header file for a general Level
virtual TLatex & GetLabel(Int_t)
All labels are shifted when moving a level to another position.
LogMessage & dolog(LogMessage &)
virtual void SetDefaultLabels()
Set default labels.
virtual void SetPosLabel(const char *)
set position for levels
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)
to execute an event for this level
virtual void SetX2(Double_t)
All labels are shifted when moving a level to another position.
virtual void SetY1(Double_t)
All labels are shifted when moving a level to another position.
virtual void SetLabels(const char *l0, const char *l1, const char *l2, const char *l3)
set label titles
virtual Int_t Compare(const TObject *) const
used to sort a list of levels
static Bool_t IsMovable()
virtual void SetVisLabel(const char *)
Used to determine which label should be drawn.
virtual void SetLabel(const char *, Int_t)
to set labels
virtual void SetX1(Double_t)
All labels are shifted when moving a level to another position.
virtual void SetProcessMethod(const char *)
To set the current method.
virtual void SetY2(Double_t)
All labels are shifted when moving a level to another position.
void SetExtraLine(Double_t, Double_t)
extra line
virtual void SetStyle(EDefaultStyle style)
Set style.
static Color_t GetDefaultLabelColor()
void SetExtraLineX1(Double_t)
Base class describing a general level.