Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TPadEditor.cxx
Go to the documentation of this file.
1 // @(#)root/ged:$Id$
2 // Author: Ilka Antcheva 24/06/04
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 
13 //////////////////////////////////////////////////////////////////////////
14 // //
15 // TPadEditor //
16 // //
17 // Editor of pad/canvas objects. //
18 // color and fill style, //
19 // 'Edit' check box sets pad/canvad editable, //
20 // 'Crosshair' sets a cross hair on the pad, //
21 // 'Fixed aspect ratio' can be set when resizing the pad //
22 // 'TickX' and 'TickY' set ticks along the X and Y axis //
23 // 'GridX' and 'GridY' set a grid along the X and Y axis //
24 // pad/canvas border size can be set if a sinken or a raised //
25 // border mode is selected; no border mode can be set to //
26 // //
27 //////////////////////////////////////////////////////////////////////////
28 //Begin_Html
29 /*
30 <img src="gif/TPadEditor.gif">
31 */
32 //End_Html
33 
34 #include "TPadEditor.h"
35 #include "TGedEditor.h"
36 #include "TGComboBox.h"
37 #include "TGButtonGroup.h"
38 #include "TGLabel.h"
39 #include "TCanvas.h"
40 
41 ClassImp(TPadEditor);
42 
43 enum EPadWid {
44  kCOLOR,
45  kPAD_FAR,
46  kPAD_EDIT,
47  kPAD_CROSS,
48  kPAD_GRIDX,
49  kPAD_GRIDY,
50  kPAD_LOGX,
51  kPAD_LOGY,
52  kPAD_LOGZ,
53  kPAD_TICKX,
54  kPAD_TICKY,
55  kPAD_BSIZE,
56  kPAD_BMODE
57 };
58 
59 
60 ////////////////////////////////////////////////////////////////////////////////
61 /// Constructor of TPad editor GUI.
62 
63 TPadEditor::TPadEditor(const TGWindow *p, Int_t width,
64  Int_t height, UInt_t options, Pixel_t back)
65  : TGedFrame(p, width, height, options | kVerticalFrame, back)
66 {
67  fPadPointer = 0;
68 
69  MakeTitle("Pad/Canvas");
70 
71  fFixedAR = new TGCheckButton(this, "Fixed aspect ratio", kPAD_FAR);
72  fFixedAR->SetToolTipText("Set fixed aspect ratio");
73  AddFrame(fFixedAR, new TGLayoutHints(kLHintsTop, 4, 1, 2, 1));
74 
75  TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
76  TGCompositeFrame *f3 = new TGCompositeFrame(f2, 40, 20, kVerticalFrame);
77  fCrosshair = new TGCheckButton(f3, "Crosshair", kPAD_CROSS);
78  fCrosshair->SetToolTipText("Set crosshair");
79  f3->AddFrame(fCrosshair, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
80  fGridX = new TGCheckButton(f3, "GridX", kPAD_GRIDX);
81  fGridX->SetToolTipText("Set grid along X");
82  f3->AddFrame(fGridX, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
83  fTickX = new TGCheckButton(f3, "TickX", kPAD_TICKX);
84  fTickX->SetToolTipText("Set tick marks along X");
85  f3->AddFrame(fTickX, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
86  f2->AddFrame(f3, new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
87 
88  TGCompositeFrame *f4 = new TGCompositeFrame(f2, 40, 20, kVerticalFrame);
89  fEditable = new TGCheckButton(f4, "Edit", kPAD_EDIT);
90  fEditable->SetToolTipText("Set editable mode");
91  f4->AddFrame(fEditable, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
92  fGridY = new TGCheckButton(f4, "GridY", kPAD_GRIDY);
93  fGridY->SetToolTipText("Set grid along Y");
94  f4->AddFrame(fGridY, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
95  fTickY = new TGCheckButton(f4, "TickY", kPAD_TICKY);
96  fTickY->SetToolTipText("Set tick marks along Y");
97  f4->AddFrame(fTickY, new TGLayoutHints(kLHintsTop, 3, 1, 1, 1));
98  f2->AddFrame(f4, new TGLayoutHints(kLHintsTop, 0, 1, 0, 0));
99 
100  AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
101 
102  MakeTitle("Log Scale");
103 
104  TGCompositeFrame *f5 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
105  fLogX = new TGCheckButton(f5, ":X", kPAD_LOGX);
106  fLogX->SetToolTipText("Set logarithmic scale along X");
107  f5->AddFrame(fLogX, new TGLayoutHints(kLHintsTop, 4, 1, 1, 1));
108  fLogY = new TGCheckButton(f5, ":Y", kPAD_LOGY);
109  fLogY->SetToolTipText("Set logarithmic scale along Y");
110  f5->AddFrame(fLogY, new TGLayoutHints(kLHintsTop, 15, 1, 1, 1));
111  fLogZ = new TGCheckButton(f5, ":Z", kPAD_LOGZ);
112  fLogZ->SetToolTipText("Set logarithmic scale along Z");
113  f5->AddFrame(fLogZ, new TGLayoutHints(kLHintsTop, 15, 1, 1, 1));
114  AddFrame(f5, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
115 
116  TGCompositeFrame *f6 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
117  fBgroup = new TGButtonGroup(f6,3,1,3,0, "Border Mode");
118  fBgroup->SetRadioButtonExclusive(kTRUE);
119  fBmode = new TGRadioButton(fBgroup, " Sunken border", 77);
120  fBmode->SetToolTipText("Set a sinken border of the pad/canvas");
121  fBmode0 = new TGRadioButton(fBgroup, " No border", 78);
122  fBmode0->SetToolTipText("Set no border of the pad/canvas");
123  fBmode1 = new TGRadioButton(fBgroup, " Raised border", 79);
124  fBmode1->SetToolTipText("Set a raised border of the pad/canvas");
125  fBmodelh = new TGLayoutHints(kLHintsLeft, 0,0,3,0);
126  fBgroup->SetLayoutHints(fBmodelh, fBmode);
127  fBgroup->ChangeOptions(kFitWidth|kChildFrame|kVerticalFrame);
128  f6->AddFrame(fBgroup, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 4, 1, 0, 0));
129  AddFrame(f6, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
130 
131  TGCompositeFrame *f7 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
132  TGLabel *fSizeLbl = new TGLabel(f7, "Size:");
133  f7->AddFrame(fSizeLbl, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 6, 1, 0, 0));
134  fBsize = new TGLineWidthComboBox(f7, kPAD_BSIZE);
135  fBsize->Resize(92, 20);
136  f7->AddFrame(fBsize, new TGLayoutHints(kLHintsLeft, 13, 1, 0, 0));
137  fBsize->Associate(this);
138  AddFrame(f7, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
139 
140  fInit = kTRUE;
141 }
142 
143 ////////////////////////////////////////////////////////////////////////////////
144 /// Destructor of fill editor.
145 
146 TPadEditor::~TPadEditor()
147 {
148  // children of TGButonGroup are not deleted
149  delete fBmode;
150  delete fBmode0;
151  delete fBmode1;
152  delete fBmodelh;
153 }
154 
155 ////////////////////////////////////////////////////////////////////////////////
156 /// Connect signals to slots.
157 
158 void TPadEditor::ConnectSignals2Slots()
159 {
160  fFixedAR->Connect("Toggled(Bool_t)","TPadEditor",this,"DoFixedAspectRatio(Bool_t)");
161  fCrosshair->Connect("Toggled(Bool_t)","TPadEditor",this,"DoCrosshair(Bool_t)");
162  fEditable->Connect("Toggled(Bool_t)","TPadEditor",this,"DoEditable(Bool_t)");
163  fGridX->Connect("Toggled(Bool_t)","TPadEditor",this,"DoGridX(Bool_t)");
164  fGridY->Connect("Toggled(Bool_t)","TPadEditor",this,"DoGridY(Bool_t)");
165  fTickX->Connect("Toggled(Bool_t)","TPadEditor",this,"DoTickX(Bool_t)");
166  fTickY->Connect("Toggled(Bool_t)","TPadEditor",this,"DoTickY(Bool_t)");
167  fLogX->Connect("Toggled(Bool_t)","TPadEditor",this,"DoLogX(Bool_t)");
168  fLogY->Connect("Toggled(Bool_t)","TPadEditor",this,"DoLogY(Bool_t)");
169  fLogZ->Connect("Toggled(Bool_t)","TPadEditor",this,"DoLogZ(Bool_t)");
170  fBgroup->Connect("Clicked(Int_t)","TPadEditor",this,"DoBorderMode()");
171  fBsize->Connect("Selected(Int_t)", "TPadEditor", this, "DoBorderSize(Int_t)");
172  fInit = kFALSE;
173 }
174 
175 ////////////////////////////////////////////////////////////////////////////////
176 /// Pick up the used fill attributes.
177 
178 void TPadEditor::SetModel(TObject* obj)
179 {
180  if (!obj || !obj->InheritsFrom("TPad"))
181  return;
182  fPadPointer = (TPad *)obj;
183  fAvoidSignal = kTRUE;
184  Bool_t on;
185 
186  on = fPadPointer->HasFixedAspectRatio();
187  if (on) fFixedAR->SetState(kButtonDown);
188  else fFixedAR->SetState(kButtonUp);
189 
190  on = fPadPointer->HasCrosshair();
191  if (on) fCrosshair->SetState(kButtonDown);
192  else fCrosshair->SetState(kButtonUp);
193 
194  on = fPadPointer->IsEditable();
195  if (on) fEditable->SetState(kButtonDown);
196  else fEditable->SetState(kButtonUp);
197 
198  on = fPadPointer->GetGridx();
199  if (on) fGridX->SetState(kButtonDown);
200  else fGridX->SetState(kButtonUp);
201 
202  on = fPadPointer->GetGridy();
203  if (on) fGridY->SetState(kButtonDown);
204  else fGridY->SetState(kButtonUp);
205 
206  Int_t par;
207  par = fPadPointer->GetLogx();
208  if (par) fLogX->SetState(kButtonDown);
209  else fLogX->SetState(kButtonUp);
210 
211  par = fPadPointer->GetLogy();
212  if (par) fLogY->SetState(kButtonDown);
213  else fLogY->SetState(kButtonUp);
214 
215  par = fPadPointer->GetLogz();
216  if (par) fLogZ->SetState(kButtonDown);
217  else fLogZ->SetState(kButtonUp);
218 
219  par = fPadPointer->GetTickx();
220  if (par) fTickX->SetState(kButtonDown);
221  else fTickX->SetState(kButtonUp);
222 
223  par = fPadPointer->GetTicky();
224  if (par) fTickY->SetState(kButtonDown);
225  else fTickY->SetState(kButtonUp);
226 
227  par = fPadPointer->GetBorderMode();
228  if (par == -1) {
229  fBgroup->SetButton(77, kTRUE);
230  fBsize->SetEnabled(kTRUE);
231  } else if (par == 1) {
232  fBgroup->SetButton(79, kTRUE);
233  fBsize->SetEnabled(kTRUE);
234  } else {
235  fBgroup->SetButton(78, kTRUE);
236  fBsize->SetEnabled(kFALSE);
237  }
238  par = fPadPointer->GetBorderSize();
239  if (par < 1) par = 1;
240  if (par > 16) par = 16;
241  fBsize->Select(par);
242 
243  if (fInit) ConnectSignals2Slots();
244 
245  fAvoidSignal = kFALSE;
246 }
247 
248 ////////////////////////////////////////////////////////////////////////////////
249 /// Exclude TAttLineEditor from this interface.
250 
251 void TPadEditor::ActivateBaseClassEditors(TClass* cl)
252 {
253  fGedEditor->ExcludeClassEditor(TAttLine::Class());
254  TGedFrame::ActivateBaseClassEditors(cl);
255 }
256 
257 ////////////////////////////////////////////////////////////////////////////////
258 /// Slot connected to the check box 'Editable'.
259 
260 void TPadEditor::DoEditable(Bool_t on)
261 {
262  if (fAvoidSignal) return;
263  fPadPointer->SetEditable(on);
264  Update();
265 }
266 
267 ////////////////////////////////////////////////////////////////////////////////
268 /// Slot connected to the check box 'Crosshair'.
269 
270 void TPadEditor::DoCrosshair(Bool_t on)
271 {
272  if (fAvoidSignal) return;
273  fPadPointer->SetCrosshair(on);
274  Update();
275 }
276 
277 ////////////////////////////////////////////////////////////////////////////////
278 /// Slot connected to the check box 'Fixed aspect ratio'.
279 
280 void TPadEditor::DoFixedAspectRatio(Bool_t on)
281 {
282  if (fAvoidSignal) return;
283  fPadPointer->SetFixedAspectRatio(on);
284  Update();
285 }
286 
287 ////////////////////////////////////////////////////////////////////////////////
288 /// Slot connected to the check box 'GridX'.
289 
290 void TPadEditor::DoGridX(Bool_t on)
291 {
292  if (fAvoidSignal) return;
293  fPadPointer->SetGridx(on);
294  Update();
295 }
296 
297 ////////////////////////////////////////////////////////////////////////////////
298 /// Slot connected to the check box 'GridY'.
299 
300 void TPadEditor::DoGridY(Bool_t on)
301 {
302  if (fAvoidSignal) return;
303  fPadPointer->SetGridy(on);
304  Update();
305 }
306 
307 ////////////////////////////////////////////////////////////////////////////////
308 /// Slot connected to the check box 'LogX'.
309 
310 void TPadEditor::DoLogX(Bool_t on)
311 {
312  if (fAvoidSignal) return;
313  fPadPointer->SetLogx(on);
314  Update();
315 }
316 
317 ////////////////////////////////////////////////////////////////////////////////
318 /// Slot connected to the check box 'LogY'.
319 
320 void TPadEditor::DoLogY(Bool_t on)
321 {
322  if (fAvoidSignal) return;
323  fPadPointer->SetLogy(on);
324  Update();
325 }
326 
327 ////////////////////////////////////////////////////////////////////////////////
328 /// Slot connected to the check box 'LogZ'.
329 
330 void TPadEditor::DoLogZ(Bool_t on)
331 {
332  if (fAvoidSignal) return;
333  fPadPointer->SetLogz(on);
334  Update();
335 }
336 
337 ////////////////////////////////////////////////////////////////////////////////
338 /// Slot connected to the check box 'TickX'.
339 
340 void TPadEditor::DoTickX(Bool_t on)
341 {
342  if (fAvoidSignal) return;
343  fPadPointer->SetTickx(on);
344  Update();
345 }
346 
347 ////////////////////////////////////////////////////////////////////////////////
348 /// Slot connected to the check box 'TickY'.
349 
350 void TPadEditor::DoTickY(Bool_t on)
351 {
352  if (fAvoidSignal) return;
353  fPadPointer->SetTicky(on);
354  Update();
355 }
356 
357 ////////////////////////////////////////////////////////////////////////////////
358 /// Slot connected to the border mode settings.
359 
360 void TPadEditor::DoBorderMode()
361 {
362  if (fAvoidSignal) return;
363  Int_t mode = 0;
364  if (fBmode->GetState() == kButtonDown) mode = -1;
365  else if (fBmode0->GetState() == kButtonDown) mode = 0;
366  else mode = 1;
367 
368  if (!mode) {
369  fBsize->SetEnabled(kFALSE);
370  } else {
371  fBsize->SetEnabled(kTRUE);
372  }
373  fPadPointer->SetBorderMode(mode);
374  Update();
375 }
376 
377 ////////////////////////////////////////////////////////////////////////////////
378 /// Slot connected to the border size settings.
379 
380 void TPadEditor::DoBorderSize(Int_t size)
381 {
382  if (fAvoidSignal) return;
383  fPadPointer->SetBorderSize(size);
384  Update();
385 }