35 TLatex *TCreatePrimitives::fgText = 0;
36 TCurlyLine *TCreatePrimitives::fgCLine = 0;
37 TArrow *TCreatePrimitives::fgArrow = 0;
38 TLine *TCreatePrimitives::fgLine = 0;
39 TCurlyArc *TCreatePrimitives::fgCArc = 0;
40 TArc *TCreatePrimitives::fgArc = 0;
41 TEllipse *TCreatePrimitives::fgEllipse = 0;
42 TPave *TCreatePrimitives::fgPave = 0;
43 TPaveText *TCreatePrimitives::fgPaveText = 0;
44 TPavesText *TCreatePrimitives::fgPavesText = 0;
45 TDiamond *TCreatePrimitives::fgDiamond = 0;
46 TPaveLabel *TCreatePrimitives::fgPaveLabel = 0;
47 TGraph *TCreatePrimitives::fgPolyLine = 0;
48 TBox *TCreatePrimitives::fgPadBBox = 0;
53 TCreatePrimitives::TCreatePrimitives()
60 TCreatePrimitives::~TCreatePrimitives()
70 void TCreatePrimitives::Ellipse(Int_t event, Int_t px, Int_t py, Int_t mode)
72 static Double_t x0, y0, x1, y1;
73 Double_t xc,yc,r1,r2,xold,yold;
78 x0 = gPad->AbsPixeltoX(px);
79 y0 = gPad->AbsPixeltoY(py);
80 xold = gPad->AbsPixeltoX(px);
81 yold = gPad->AbsPixeltoY(py);
85 xold = gPad->AbsPixeltoX(px);
86 yold = gPad->AbsPixeltoY(py);
88 if (gPad->GetLogx()) xold = TMath::Power(10,xold);
89 if (gPad->GetLogy()) yold = TMath::Power(10,yold);
94 r1 = 0.5*TMath::Abs(xold-x0);
101 fgArc =
new TArc(xc, yc, r1);
104 gPad->Modified(kTRUE);
107 if (mode == kEllipse) {
108 r1 = 0.5*TMath::Abs(xold-x0);
109 r2 = 0.5*TMath::Abs(yold-y0);
111 fgEllipse->SetR1(r1);
112 fgEllipse->SetR2(r2);
113 fgEllipse->SetX1(xc);
114 fgEllipse->SetY1(yc);
116 fgEllipse =
new TEllipse(xc, yc, r1, r2);
119 gPad->Modified(kTRUE);
125 x1 = gPad->AbsPixeltoX(px);
126 y1 = gPad->AbsPixeltoY(py);
127 if (gPad->GetLogx()) {
128 x0 = TMath::Power(10,x0);
129 x1 = TMath::Power(10,x1);
131 if (gPad->GetLogy()) {
132 y0 = TMath::Power(10,y0);
133 y1 = TMath::Power(10,y1);
139 gPad->GetCanvas()->Selected(gPad, fgArc, kButton1Down);
142 if (mode == kEllipse) {
143 gPad->GetCanvas()->Selected(gPad, fgEllipse, kButton1Down);
147 gROOT->SetEditorMode();
158 void TCreatePrimitives::Line(Int_t event, Int_t px, Int_t py, Int_t mode)
160 static Double_t x0, y0, x1, y1;
162 static Int_t pxold, pyold;
163 static Int_t px0, py0;
164 Double_t radius, phimin,phimax;
169 x0 = gPad->AbsPixeltoX(px);
170 y0 = gPad->AbsPixeltoY(py);
172 pxold = px; pyold = py;
173 if (gPad->GetLogx()) x0 = TMath::Power(10,x0);
174 if (gPad->GetLogy()) y0 = TMath::Power(10,y0);
181 x1 = gPad->AbsPixeltoX(pxold);
182 y1 = gPad->AbsPixeltoY(pyold);
183 if (gPad->GetLogx()) x1 = TMath::Power(10,x1);
184 if (gPad->GetLogy()) y1 = TMath::Power(10,y1);
191 fgLine =
new TLine(x0,y0,x1,y1);
194 gPad->Modified(kTRUE);
198 if (mode == kArrow) {
203 fgArrow =
new TArrow(x0,y0,x1,y1
204 , TArrow::GetDefaultArrowSize()
205 , TArrow::GetDefaultOption());
208 gPad->Modified(kTRUE);
212 if (mode == kCurlyLine) {
213 if (fgCLine) fgCLine->SetEndPoint(x1, y1);
215 fgCLine =
new TCurlyLine(x0,y0,x1,y1
216 , TCurlyLine::GetDefaultWaveLength()
217 , TCurlyLine::GetDefaultAmplitude());
220 gPad->Modified(kTRUE);
224 if (mode == kCurlyArc) {
226 radius = gPad->PixeltoX((Int_t)(TMath::Sqrt((Double_t)((px-px0)*(px-px0) + (py-py0)*(py-py0)))))
229 fgCArc->SetStartPoint(x1, y1);
230 fgCArc->SetRadius(radius);
234 fgCArc =
new TCurlyArc(x0,y0,radius,phimin,phimax
235 , TCurlyArc::GetDefaultWaveLength()
236 , TCurlyArc::GetDefaultAmplitude());
239 gPad->Modified(kTRUE);
246 gPad->GetCanvas()->Selected(gPad, fgLine, kButton1Down);
249 if (mode == kArrow) {
250 gPad->GetCanvas()->Selected(gPad, fgArrow, kButton1Down);
253 if (mode == kCurlyLine) {
254 gPad->GetCanvas()->Selected(gPad, fgCLine, kButton1Down);
257 if (mode == kCurlyArc) {
258 gPad->GetCanvas()->Selected(gPad, fgCArc, kButton1Down);
261 gROOT->SetEditorMode();
274 void TCreatePrimitives::Pad(Int_t event, Int_t px, Int_t py, Int_t)
276 static Int_t px1old, py1old, px2old, py2old;
277 static Int_t px1, py1, px2, py2, pxl, pyl, pxt, pyt;
279 Double_t xlow, ylow, xup, yup;
284 TIter next(gPad->GetListOfPrimitives());
286 while ((obj = next())) {
287 if (obj->InheritsFrom(TPad::Class())) {
295 padsav = (TPad*)gPad;
297 px1 = gPad->XtoAbsPixel(gPad->GetX1());
298 py1 = gPad->YtoAbsPixel(gPad->GetY1());
299 px2 = gPad->XtoAbsPixel(gPad->GetX2());
300 py2 = gPad->YtoAbsPixel(gPad->GetY2());
301 px1old = px; py1old = py;
306 px2old = TMath::Max(px2old, px1);
307 px2old = TMath::Min(px2old, px2);
309 py2old = TMath::Max(py2old, py2);
310 py2old = TMath::Min(py2old, py1);
311 pxl = TMath::Min(px1old, px2old);
312 pxt = TMath::Max(px1old, px2old);
313 pyl = TMath::Max(py1old, py2old);
314 pyt = TMath::Min(py1old, py2old);
317 fgPadBBox->SetX1(gPad->AbsPixeltoX(pxl));
318 fgPadBBox->SetY1(gPad->AbsPixeltoY(pyl));
319 fgPadBBox->SetX2(gPad->AbsPixeltoX(pxt));
320 fgPadBBox->SetY2(gPad->AbsPixeltoY(pyt));
322 fgPadBBox =
new TBox(pxl, pyl, pxt, pyt);
323 fgPadBBox->Draw(
"l");
325 gPad->Modified(kTRUE);
332 xlow = (Double_t(pxl) - Double_t(px1))/(Double_t(px2) - Double_t(px1));
333 ylow = (Double_t(py1) - Double_t(pyl))/(Double_t(py1) - Double_t(py2));
334 xup = (Double_t(pxt) - Double_t(px1))/(Double_t(px2) - Double_t(px1));
335 yup = (Double_t(py1) - Double_t(pyt))/(Double_t(py1) - Double_t(py2));
337 gROOT->SetEditorMode();
338 if (xup <= xlow || yup <= ylow)
return;
339 newpad =
new TPad(Form(
"%s_%d",gPad->GetName(),n+1),
"newpad",xlow, ylow, xup, yup);
340 if (newpad->IsZombie())
break;
341 newpad->SetFillColor(gStyle->GetPadColor());
343 TCanvas *canvas = gPad->GetCanvas();
344 if (canvas) canvas->Selected((TPad*)gPad, newpad, kButton1Down);
356 void TCreatePrimitives::Pave(Int_t event, Int_t px, Int_t py, Int_t mode)
358 static Double_t x0, y0;
359 Double_t xp0,xp1,yp0,yp1,xold,yold;
361 if (mode == kPaveLabel)
362 ((TPad *)gPad)->EventPave();
367 if (mode == kPaveLabel) {
368 if ((py == kKey_Return) || (py == kKey_Enter)) {
369 TString s(fgPaveLabel->GetTitle());
370 Int_t l = s.Length();
372 fgPaveLabel->SetLabel(s.Data());
373 gSystem->ProcessEvents();
374 gPad->Modified(kTRUE);
375 gROOT->SetEditorMode();
378 }
else if (py == kKey_Backspace) {
379 TString s(fgPaveLabel->GetTitle());
380 Int_t l = s.Length();
382 s.Replace(l-2, 2,
"<");
383 fgPaveLabel->SetLabel(s.Data());
384 gPad->Modified(kTRUE);
387 }
else if (isprint(py)) {
388 TString s(fgPaveLabel->GetTitle());
389 Int_t l = s.Length();
390 s.Insert(l-1,(
char)py);
391 fgPaveLabel->SetLabel(s.Data());
392 gPad->Modified(kTRUE);
399 x0 = gPad->AbsPixeltoX(px);
400 y0 = gPad->AbsPixeltoY(py);
404 xold = gPad->AbsPixeltoX(px);
405 yold = gPad->AbsPixeltoY(py);
407 xp0 = gPad->PadtoX(x0);
408 xp1 = gPad->PadtoX(xold);
409 yp0 = gPad->PadtoY(y0);
410 yp1 = gPad->PadtoY(yold);
429 fgPave =
new TPave(xp0,yp0,xp1,yp1);
432 gPad->Modified(kTRUE);
436 if (mode == kPaveText ) {
439 fgPaveText->SetX1(xold);
440 fgPaveText->SetX2(x0);
442 fgPaveText->SetX1(x0);
443 fgPaveText->SetX2(xold);
446 fgPaveText->SetY1(yold);
447 fgPaveText->SetY2(y0);
449 fgPaveText->SetY1(y0);
450 fgPaveText->SetY2(yold);
453 fgPaveText =
new TPaveText(xp0,yp0,xp1,yp1);
456 gPad->Modified(kTRUE);
460 if (mode == kPavesText) {
463 fgPavesText->SetX1(xold);
464 fgPavesText->SetX2(x0);
466 fgPavesText->SetX1(x0);
467 fgPavesText->SetX2(xold);
470 fgPavesText->SetY1(yold);
471 fgPavesText->SetY2(y0);
473 fgPavesText->SetY1(y0);
474 fgPavesText->SetY2(yold);
477 fgPavesText =
new TPavesText(xp0,yp0,xp1,yp1);
480 gPad->Modified(kTRUE);
484 if (mode == kPaveLabel) {
487 fgPaveLabel->SetX1(xold);
488 fgPaveLabel->SetX2(x0);
490 fgPaveLabel->SetX1(x0);
491 fgPaveLabel->SetX2(xold);
494 fgPaveLabel->SetY1(yold);
495 fgPaveLabel->SetY2(y0);
497 fgPaveLabel->SetY1(y0);
498 fgPaveLabel->SetY2(yold);
501 fgPaveLabel =
new TPaveLabel(xp0,yp0,xp1,yp1,
">");
504 gPad->Modified(kTRUE);
508 if (mode == kDiamond) {
511 fgDiamond->SetX1(xold);
512 fgDiamond->SetX2(x0);
514 fgDiamond->SetX1(x0);
515 fgDiamond->SetX2(xold);
518 fgDiamond->SetY1(yold);
519 fgDiamond->SetY2(y0);
521 fgDiamond->SetY1(y0);
522 fgDiamond->SetY2(yold);
525 fgDiamond =
new TDiamond(x0,y0,xold,yold);
528 gPad->Modified(kTRUE);
534 gPad->GetCanvas()->Selected(gPad, fgPave, kButton1Down);
536 gPad->GetCanvas()->Selected(gPad, fgPave, kButton1Down);
539 if (mode == kPaveText ) {
540 gPad->GetCanvas()->Selected(gPad, fgPaveText, kButton1Down);
543 if (mode == kPavesText) {
544 gPad->GetCanvas()->Selected(gPad, fgPavesText, kButton1Down);
547 if (mode == kDiamond) {
548 gPad->GetCanvas()->Selected(gPad, fgDiamond, kButton1Down);
551 if (mode == kPaveLabel) {
552 gPad->GetCanvas()->Selected(gPad, fgPaveLabel, kButton1Down);
553 ((TPad *)gPad)->StartEditing();
554 gSystem->ProcessEvents();
555 if (mode == kPaveLabel) {
556 gPad->Modified(kTRUE);
561 gROOT->SetEditorMode();
572 void TCreatePrimitives::PolyLine(Int_t event, Int_t px, Int_t py, Int_t mode)
574 static Int_t pxnew, pynew, pxold, pyold, dp;
575 Double_t xnew, ynew, xold, yold;
576 static Int_t npoints = 0;
585 fgPolyLine->Set(fgPolyLine->GetN() +1);
586 fgPolyLine->SetPoint(npoints, gPad->PadtoX(gPad->AbsPixeltoX(pxnew)),
587 gPad->PadtoY(gPad->AbsPixeltoY(pynew)));
590 xnew = gPad->PadtoX(gPad->AbsPixeltoX(pxnew));
591 ynew = gPad->PadtoY(gPad->AbsPixeltoY(pynew));
592 fgPolyLine->GetPoint(fgPolyLine->GetN()-3, xold, yold);
593 pxold = gPad->XtoAbsPixel(xold);
594 pyold = gPad->YtoAbsPixel(yold);
595 dp = TMath::Abs(pxnew-pxold) +TMath::Abs(pynew-pyold);
597 if (mode == kPolyLine) {
598 fgPolyLine->Set(npoints-1);
600 fgPolyLine->GetPoint(0, xnew, ynew);
601 fgPolyLine->SetPoint(npoints, xnew, ynew);
603 gPad->GetCanvas()->Selected(gPad, fgPolyLine, kButton1Down);
608 gROOT->SetEditorMode();
616 if (mode == kPolyLine) {
617 fgPolyLine->Set(npoints);
619 fgPolyLine->GetPoint(0, xnew, ynew);
620 fgPolyLine->SetPoint(npoints, xnew, ynew);
622 gPad->GetCanvas()->Selected(gPad, fgPolyLine, kButton1Down);
627 gROOT->SetEditorMode();
635 fgPolyLine->SetPoint(npoints, gPad->PadtoX(gPad->AbsPixeltoX(pxnew)),
636 gPad->PadtoY(gPad->AbsPixeltoY(pynew)));
640 if (mode == kPolyLine) {
641 fgPolyLine =
new TGraph(1);
642 fgPolyLine->ResetBit(TGraph::kClipFrame);
644 fgPolyLine = (TGraph*)
new TCutG(
"CUTG",1);
646 fgPolyLine->SetPoint(0, gPad->PadtoX(gPad->AbsPixeltoX(pxnew)),
647 gPad->PadtoY(gPad->AbsPixeltoY(pynew)));
648 fgPolyLine->Draw(
"L");
659 void TCreatePrimitives::Text(Int_t event, Int_t px, Int_t py, Int_t mode)
661 static Double_t x, y;
666 if ((py == kKey_Return) || (py == kKey_Enter)) {
667 TString s(fgText->GetTitle());
668 Int_t l = s.Length();
670 fgText->SetText(x,y,s.Data());
671 gSystem->ProcessEvents();
672 gPad->Modified(kTRUE);
673 gROOT->SetEditorMode();
675 gPad->GetCanvas()->Selected(gPad, fgText, kButton1Down);
677 }
else if (py == kKey_Backspace) {
678 TString s(fgText->GetTitle());
679 Int_t l = s.Length();
681 s.Replace(l-2, 2,
"<");
682 fgText->SetText(x,y,s.Data());
683 gPad->Modified(kTRUE);
686 }
else if (isprint(py)) {
687 TString s(fgText->GetTitle());
688 Int_t l = s.Length();
689 s.Insert(l-1,(
char)py);
690 fgText->SetText(x,y,s.Data());
691 gPad->Modified(kTRUE);
698 TString s(fgText->GetTitle());
699 Int_t l = s.Length();
701 fgText->SetText(x,y,s.Data());
704 x = gPad->AbsPixeltoX(px);
705 y = gPad->AbsPixeltoY(py);
706 if (gPad->GetLogx()) x = TMath::Power(10,x);
707 if (gPad->GetLogy()) y = TMath::Power(10,y);
709 if (mode == kMarker) {
711 marker =
new TMarker(x,y,gStyle->GetMarkerStyle());
712 gPad->GetCanvas()->Selected(gPad, marker, kButton1Down);
714 gROOT->SetEditorMode();
718 ((TPad *)gPad)->StartEditing();
719 gSystem->ProcessEvents();
721 fgText =
new TLatex(x,y,
"<");
723 gPad->Modified(kTRUE);