1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 // $MpId: AliMpVPainter.cxx,v 1.9 2006/03/17 11:35:29 ivana Exp $
20 // Class AliMpVPainter
22 // Class for drawing objects into canvas
23 // Included in AliRoot: 2003/05/02
24 // Authors: David Guez, IPN Orsay
26 #include "AliMpVPainter.h"
27 #include "AliMpGraphContext.h"
28 #include "AliMpSector.h"
30 #include "AliMpZone.h"
31 #include "AliMpSubZone.h"
32 #include "AliMpVRowSegment.h"
33 #include "AliMpMotifPosition.h"
34 #include "AliMpSectorPainter.h"
35 #include "AliMpRowPainter.h"
36 #include "AliMpZonePainter.h"
37 #include "AliMpSubZonePainter.h"
38 #include "AliMpRowSegmentPainter.h"
39 #include "AliMpMotifPainter.h"
41 #include "AliMpPCBPainter.h"
42 #include "AliMpSlat.h"
43 #include "AliMpSlatPainter.h"
46 #include <TVirtualX.h>
49 ClassImp(AliMpVPainter)
51 //_______________________________________________________________________
52 AliMpVPainter::AliMpVPainter()
56 /// Default constructor
58 AliMpGraphContext *gr = AliMpGraphContext::Instance();
59 fPadPosition = gr->GetPadPosition();
60 fPadDimensions = gr->GetPadDimensions();
61 fColor=gr->GetColor();
62 fTrashList = new TList;
65 //_____________________________________________________________________________
66 AliMpVPainter::AliMpVPainter(const AliMpVPainter& right)
69 /// Protected copy constructor (not provided)
71 Fatal("AliMpVPainter", "Copy constructor not provided.");
74 //_______________________________________________________________________
75 AliMpVPainter::~AliMpVPainter()
85 //_____________________________________________________________________________
86 AliMpVPainter& AliMpVPainter::operator=(const AliMpVPainter& right)
88 /// Assignment operator (not provided)
90 // check assignment to self
91 if (this == &right) return *this;
93 Fatal("operator =", "Assignment operator not provided.");
98 //_______________________________________________________________________
99 Bool_t AliMpVPainter::IsInside(const TVector2 &point,const TVector2& pos,const TVector2& dim)
101 /// Is the point <point> inside the area (pos,dim)?
103 return ( (TMath::Abs(point.X()-pos.X())<dim.X() ) && (TMath::Abs(point.Y()-pos.Y())<dim.Y() ) );
106 //_______________________________________________________________________
107 Int_t AliMpVPainter::DistancetoPrimitive(Int_t x, Int_t y)
109 /// Distance to the center if (x,y) is inside the box defined by (fPadPosition,fPadDimensions)
112 TVector2 point = TVector2(gPad->AbsPixeltoX(x), gPad->AbsPixeltoY(y));
113 if ( IsInside(point,fPadPosition,fPadDimensions) )
115 return (Int_t)(point-fPadPosition).Mod();
120 //_______________________________________________________________________
121 void AliMpVPainter::DumpObject() const
123 /// Dump the painted object
126 //_______________________________________________________________________
127 TObject* AliMpVPainter::Clone(const char* newname) const
129 /// Create a clone of this object
131 AliMpVPainter *newobj = (AliMpVPainter *)TObject::Clone(newname);
132 if (!newobj) return 0;
133 AliMpGraphContext *gr = AliMpGraphContext::Instance();
134 newobj->fPadPosition = gr->GetPadPosition();
135 newobj->fPadDimensions = gr->GetPadDimensions();
139 //_______________________________________________________________________
140 TObject* AliMpVPainter::DrawClone(Option_t* option) const
142 /// Draw the clone object
144 TVirtualPad *pad = gROOT->GetSelectedPad();
145 TVirtualPad *padsav = gPad;
147 TObject *newobj = Clone();
149 if (!newobj) return 0;
152 newobj->Draw(option);
153 if (padsav) padsav->cd();
157 //_______________________________________________________________________
158 AliMpVPainter *AliMpVPainter::CreatePainter(TObject *object)
160 /// Create a new painter, which correspond to the
163 AliMpVPainter *painter=0;
164 if (object->InheritsFrom(AliMpSector::Class()))
165 painter = new AliMpSectorPainter((AliMpSector *)object);
166 else if (object->InheritsFrom(AliMpZone::Class()))
167 painter = new AliMpZonePainter((AliMpZone *)object);
168 else if (object->InheritsFrom(AliMpSubZone::Class()))
169 painter = new AliMpSubZonePainter((AliMpSubZone *)object);
170 else if (object->InheritsFrom(AliMpRow::Class()))
171 painter = new AliMpRowPainter((AliMpRow *)object);
172 else if (object->InheritsFrom(AliMpVRowSegment::Class()))
173 painter = new AliMpRowSegmentPainter((AliMpVRowSegment *)object);
174 else if (object->InheritsFrom(AliMpMotifPosition::Class()))
175 painter = new AliMpMotifPainter((AliMpMotifPosition *)object);
176 else if (object->InheritsFrom(AliMpPCB::Class()))
177 painter = new AliMpPCBPainter((AliMpPCB *)object);
178 else if (object->InheritsFrom(AliMpSlat::Class()))
179 painter = new AliMpSlatPainter((AliMpSlat*)object);
183 //_______________________________________________________________________
184 void AliMpVPainter::AddPainter(AliMpVPainter *painter)
186 /// Add a painter to the list of painters (private)
188 fTrashList->Add(painter);
192 //_______________________________________________________________________
193 AliMpVPainter *AliMpVPainter::DrawObject(TObject *object,Option_t *option)
195 /// Draw the object \n
196 /// Return the AliMpVPainter object created for the drawing
198 AliMpVPainter *painter=CreatePainter(object);
201 painter->Draw(option);
207 //_______________________________________________________________________
208 void AliMpVPainter::InitGraphContext()
210 /// Set the pad and real area of the graphic context to
211 /// the one stored in this painter
213 AliMpGraphContext *gr = AliMpGraphContext::Instance();
214 gr->SetPadPosition(fPadPosition);
215 gr->SetPadDimensions(fPadDimensions);
216 gr->SetRealPosition(GetPosition());
217 gr->SetRealDimensions(GetDimensions());
218 gVirtualX->SetFillColor(fColor);
219 gVirtualX->SetTextColor(1);
220 gVirtualX->SetLineColor(1);
223 //_______________________________________________________________________
224 void AliMpVPainter::PaintWholeBox(Bool_t fill)
226 /// Paint the box around the total pad area given in this painter
227 /// fill it or bnot following the parameter value
229 Double_t x1,y1,x2,y2;
230 x1 = fPadPosition.X()-fPadDimensions.X();
231 y1 = fPadPosition.Y()-fPadDimensions.Y();
232 x2 = fPadPosition.X()+fPadDimensions.X();
233 y2 = fPadPosition.Y()+fPadDimensions.Y();
235 Style_t sty = gVirtualX->GetFillStyle();
236 gVirtualX->SetFillStyle(fill?1:0);
237 gPad->PaintBox(x1,y1,x2,y2);
238 gVirtualX->SetFillStyle(0);
239 gPad->PaintBox(x1,y1,x2,y2);
240 gVirtualX->SetFillStyle(sty);
243 //_______________________________________________________________________
244 TVector2 AliMpVPainter::RealToPad(const TVector2& realPos)
246 /// Transform a real position into its equivalent position in a canvas
248 AliMpGraphContext *gr = AliMpGraphContext::Instance();
250 gr->SetPadPosition(fPadPosition);
251 gr->SetPadDimensions(fPadDimensions);
252 gr->SetRealPosition(GetPosition());
253 gr->SetRealDimensions(GetDimensions());
256 TVector2 ans = gr->RealToPad(realPos);