46 TDiamond::TDiamond(): TPaveText()
53 TDiamond::TDiamond(Double_t x1, Double_t y1,Double_t x2, Double_t y2)
54 :TPaveText(x1,y1,x2,y2)
68 TDiamond::TDiamond(
const TDiamond &diamond) : TPaveText()
70 TBufferFile b(TBuffer::kWrite);
71 TDiamond *p = (TDiamond*)(&diamond);
85 Int_t TDiamond::DistancetoPrimitive(Int_t px, Int_t py)
87 return TPaveText::DistancetoPrimitive(px,py);
93 void TDiamond::Draw(Option_t *option)
109 void TDiamond::ExecuteEvent(Int_t event, Int_t px, Int_t py)
113 const Int_t kMaxDiff = 5;
114 const Int_t kMinSize = 20;
116 static Int_t px1, px2, py1, py2, pxl, pyl, pxt, pyt, pxold, pyold;
117 static Int_t px1p, px2p, py1p, py2p;
118 static Int_t pTx,pTy,pLx,pLy,pRx,pRy,pBx,pBy;
119 static Double_t x1c,x2c,x3c,x4c;
120 static Bool_t pTop, pL, pR, pBot, pINSIDE;
121 static Int_t i,x[5], y[5];
124 Bool_t opaque = gPad->OpaqueMoving();
125 Bool_t ropaque = gPad->OpaqueResizing();
127 if (!gPad->IsEditable())
return;
136 gVirtualX->SetLineColor(-1);
139 gVirtualX->SetLineColor(GetFillColor());
141 gVirtualX->SetLineColor(1);
142 gVirtualX->SetLineWidth(2);
148 px1 = gPad->XtoAbsPixel(GetX1());
149 py1 = gPad->YtoAbsPixel(GetY1());
150 px2 = gPad->XtoAbsPixel(GetX2());
151 py2 = gPad->YtoAbsPixel(GetY2());
168 px1p = parent->XtoAbsPixel(parent->GetX1()) + parent->GetBorderSize();
169 py1p = parent->YtoAbsPixel(parent->GetY1()) - parent->GetBorderSize();
170 px2p = parent->XtoAbsPixel(parent->GetX2()) - parent->GetBorderSize();
171 py2p = parent->YtoAbsPixel(parent->GetY2()) + parent->GetBorderSize();
173 pTx = pBx = (pxl+pxt)/2;
174 pLy = pRy = (pyl+pyt)/2;
180 pTop = pL = pR = pBot = pINSIDE = kFALSE;
182 if ((TMath::Abs(px-(pxl+pxt)/2) < kMaxDiff) &&
183 (TMath::Abs(py - pyl) < kMaxDiff)) {
184 pxold = pxl; pyold = pyl; pTop = kTRUE;
185 gPad->SetCursor(kTopSide);
188 if ((TMath::Abs(px-(pxl+pxt)/2) < kMaxDiff) &&
189 (TMath::Abs(py - pyt) < kMaxDiff)) {
190 pxold = pxt; pyold = pyt; pBot = kTRUE;
191 gPad->SetCursor(kBottomSide);
194 if ((TMath::Abs(py-(pyl+pyt)/2) < kMaxDiff) &&
195 (TMath::Abs(px - pxl) < kMaxDiff)) {
196 pxold = pxl; pyold = pyl; pL = kTRUE;
197 gPad->SetCursor(kLeftSide);
200 if ((TMath::Abs(py-(pyl+pyt)/2) < kMaxDiff) &&
201 (TMath::Abs(px - pxt) < kMaxDiff)) {
202 pxold = pxt; pyold = pyt; pR = kTRUE;
203 gPad->SetCursor(kRightSide);
206 x1c = (py-pTy)*(pTx-pLx)/(pTy-pLy)+pTx;
207 x2c = (py-pTy)*(pRx-pTx)/(pRy-pTy)+pTx;
208 x3c = (py-pRy)*(pRx-pBx)/(pRy-pBy)+pRx;
209 x4c = (py-pBy)*(pBx-pLx)/(pBy-pLy)+pBx;
211 if (px > x1c+kMaxDiff && px < x2c-kMaxDiff &&
212 px > x4c+kMaxDiff && px < x3c-kMaxDiff) {
213 pxold = px; pyold = py; pINSIDE = kTRUE;
214 if (event == kButton1Down)
215 gPad->SetCursor(kMove);
217 gPad->SetCursor(kCross);
221 if (pTop || pL || pR || pBot)
224 if (!pTop && !pL && !pR && !pBot && !pINSIDE)
225 gPad->SetCursor(kCross);
229 case kArrowKeyRelease:
233 x[0] = x[2] = x[4] = (px1+px2)/2;
238 y[1] = y[3] = (py1+py2)/2;
240 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
242 if (py2 > py1-kMinSize) { py2 = py1-kMinSize; wy = py2; }
243 if (py2 < py2p) { py2 = py2p; wy = py2; }
245 y[1] = y[3] = (py1+py2)/2;
246 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
249 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
251 if (py1 < py2+kMinSize) { py1 = py2+kMinSize; wy = py1; }
252 if (py1 > py1p) { py1 = py1p; wy = py1; }
254 y[1] = y[3] = (py1+py2)/2;
255 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
258 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
260 if (px1 > px2-kMinSize) { px1 = px2-kMinSize; wx = px1; }
261 if (px1 < px1p) { px1 = px1p; wx = px1; }
263 x[0] = x[2] = x[4] = (px1+px2)/2;
264 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
267 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
269 if (px2 < px1+kMinSize) { px2 = px1+kMinSize; wx = px2; }
270 if (px2 > px2p) { px2 = px2p; wx = px2; }
272 x[0] = x[2] = x[4] = (px1+px2)/2;
273 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
276 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
277 Int_t dx = px - pxold;
278 Int_t dy = py - pyold;
279 px1 += dx; py1 += dy; px2 += dx; py2 += dy;
280 if (px1 < px1p) { dx = px1p - px1; px1 += dx; px2 += dx; wx = px+dx; }
281 if (px2 > px2p) { dx = px2 - px2p; px1 -= dx; px2 -= dx; wx = px-dx; }
282 if (py1 > py1p) { dy = py1 - py1p; py1 -= dy; py2 -= dy; wy = py-dy; }
283 if (py2 < py2p) { dy = py2p - py2; py1 += dy; py2 += dy; wy = py+dy; }
284 x[0] = x[2] = x[4] = (px1+px2)/2;
289 y[1] = y[3] = (py1+py2)/2;
290 for (i=0;i<4;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
296 gVirtualX->Warp(px, py);
302 if ((pINSIDE && opaque) || (fResizing && ropaque)) {
303 if (pTop || pBot || pL || pR) {
304 fX1 = gPad->AbsPixeltoX(px1);
305 fY1 = gPad->AbsPixeltoY(py1);
306 fX2 = gPad->AbsPixeltoX(px2);
307 fY2 = gPad->AbsPixeltoY(py2);
310 fX1 = gPad->AbsPixeltoX(px1);
311 fY1 = gPad->AbsPixeltoY(py1);
312 fX2 = gPad->AbsPixeltoX(px2);
313 fY2 = gPad->AbsPixeltoY(py2);
316 if (parent == gPad) gPad->Modified(kTRUE);
319 if (pINSIDE) gPad->ShowGuidelines(
this, event,
'i',
true);
320 if (pTop) gPad->ShowGuidelines(
this, event,
't',
true);
321 if (pBot) gPad->ShowGuidelines(
this, event,
'b',
true);
322 if (pL) gPad->ShowGuidelines(
this, event,
'l',
true);
323 if (pR) gPad->ShowGuidelines(
this, event,
'r',
true);
325 if (pTop || pL || pR || pBot)
326 gPad->Modified(kTRUE);
334 gPad->ShowGuidelines(
this, event);
336 if (pTop || pBot || pL || pR || pINSIDE) {
337 fX1 = gPad->AbsPixeltoX(px1);
338 fY1 = gPad->AbsPixeltoY(py1);
339 fX2 = gPad->AbsPixeltoX(px2);
340 fY2 = gPad->AbsPixeltoY(py2);
346 if (parent == gPad) gPad->Modified(kTRUE);
350 if (pTop || pL || pR || pBot) gPad->Modified(kTRUE);
353 gVirtualX->SetLineColor(-1);
354 gVirtualX->SetLineWidth(-1);
361 ExecuteEvent(kButton1Down, px, py);
365 event = gVirtualX->RequestLocator(1, 1, px, py);
367 ExecuteEvent(kButton1Motion, px, py);
370 ExecuteEvent(kButton1Up, px, py);
380 void TDiamond::Paint(Option_t *)
382 Double_t x[7],y[7],depx,depy;
387 Int_t fillstyle = GetFillStyle();
388 Int_t fillcolor = GetFillColor();
389 Int_t linecolor = GetLineColor();
391 Double_t wy = gPad->PixeltoY(0) - gPad->PixeltoY(fBorderSize);
392 Double_t wx = gPad->PixeltoX(fBorderSize) - gPad->PixeltoX(0);
398 else if (y2-y1<x2-x1) {
406 x[0] = x[2] = (x1+x2)/2+depx;
411 y[1] = y[3] =(y1+y2)/2+depy;
412 x[4] = x[0]; y[4] = y[0];
413 SetFillStyle(fillstyle);
414 SetFillColor(linecolor);
416 gPad->PaintFillArea(4,x,y);
418 x[0] = x[2] = (x1+x2)/2;
423 y[1] = y[3] = (y1+y2)/2;
424 x[4] = x[0]; y[4] =y[0];
425 SetLineColor(linecolor);
426 SetFillColor(fillcolor);
429 gPad->PaintFillArea(4,x,y);
430 gPad->PaintPolyLine(5,x,y);
433 PaintPrimitives(kDiamond);
439 void TDiamond::SavePrimitive(std::ostream &out, Option_t * )
441 Bool_t saved = gROOT->ClassSaved(TDiamond::Class());
447 out<<
"diamond = new TDiamond("<<fX1<<
","<<fY1<<
","<<fX2<<
","<<fY2<<
");"<<std::endl;
449 SaveFillAttributes(out,
"diamond",0,1001);
450 SaveLineAttributes(out,
"diamond",1,1,1);
451 SaveTextAttributes(out,
"diamond",11,0,1,62,0.05);
453 SaveLines(out,
"diamond",saved);
454 out<<
" diamond->Draw();"<<std::endl;