45 ClassImp(TGraphEditor);
62 TGraphEditor::TGraphEditor(
const TGWindow *p, Int_t width,
63 Int_t height, UInt_t options, Pixel_t back)
64 : TGedFrame(p, width, height, options | kVerticalFrame, back)
73 fTitle =
new TGTextEntry(
this,
new TGTextBuffer(50), kGRAPH_TITLE);
74 fTitle->Resize(135, fTitle->GetDefaultHeight());
75 fTitle->SetToolTipText(
"Enter the graph title string");
77 AddFrame(fTitle,
new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
80 TGCompositeFrame *f2 =
new TGCompositeFrame(
this, 80, 20, kVerticalFrame);
81 fgr =
new TGButtonGroup(f2,3,1,3,5,
"Shape");
82 fgr->SetRadioButtonExclusive(kTRUE);
83 fShape =
new TGRadioButton(fgr,
"No Line",kSHAPE_NOLINE);
84 fShape->SetToolTipText(
"The points are not connected by a line");
85 fShape0 =
new TGRadioButton(fgr,
"Smooth Line ",kSHAPE_SMOOTH);
86 fShape0->SetToolTipText(
"Draw a smooth graph curve");
87 fShape1 =
new TGRadioButton(fgr,
"Simple Line ",kSHAPE_SIMPLE);
88 fShape1->SetToolTipText(
"Draw a simple poly-line between the graph points");
89 fShape2 =
new TGRadioButton(fgr,
"Bar Chart",kSHAPE_BAR);
90 fShape2->SetToolTipText(
"Draw a bar chart at each graph point");
91 fShape3 =
new TGRadioButton(fgr,
"Fill area",kSHAPE_FILL);
92 fShape3->SetToolTipText(
"A fill area is drawn");
94 fgr->SetLayoutHints(fShape1lh=
new TGLayoutHints(kLHintsLeft, 0,3,0,0), fShape1);
96 fgr->ChangeOptions(kFitWidth|kChildFrame|kVerticalFrame);
97 f2->AddFrame(fgr,
new TGLayoutHints(kLHintsLeft, 4, 0, 0, 0));
100 fMarkerOnOff =
new TGCheckButton(f2,
"Show Marker",kMARKER_ONOFF);
101 fMarkerOnOff->SetToolTipText(
"Make Marker visible/invisible");
102 f2->AddFrame(fMarkerOnOff,
new TGLayoutHints(kLHintsTop, 5, 1, 0, 3));
103 AddFrame(f2,
new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
106 MakeTitle(
"Exclusion Zone");
107 TGCompositeFrame *f3 =
new TGCompositeFrame(
this, 80, 20, kHorizontalFrame);
108 AddFrame(f3,
new TGLayoutHints(kLHintsTop, 1, 1, 5, 0));
110 fExSide =
new TGCheckButton(f3,
"+-",kGRAPH_LINE_SIDE);
111 fExSide->SetToolTipText(
"Zone is drawing side");
112 f3->AddFrame(fExSide,
new TGLayoutHints(kLHintsTop, 5, 1, 0, 0));
114 fWidthCombo =
new TGLineWidthComboBox(f3, kGRAPH_LINE_WIDTH,
115 kHorizontalFrame | kSunkenFrame | kDoubleBorder,
116 GetWhitePixel(), kTRUE);
117 fWidthCombo->Resize(91, 20);
118 f3->AddFrame(fWidthCombo,
new TGLayoutHints(kLHintsLeft, 7, 1, 1, 1));
119 fWidthCombo->Associate(f3);
124 TGraphEditor::~TGraphEditor()
139 void TGraphEditor::ConnectSignals2Slots()
143 fTitle->Connect(
"TextChanged(const char *)",
"TGraphEditor",
this,
"DoTitle(const char *)");
144 fgr->Connect(
"Clicked(Int_t)",
"TGraphEditor",
this,
"DoShape()");
145 fMarkerOnOff->Connect(
"Toggled(Bool_t)",
"TGraphEditor",
this,
"DoMarkerOnOff(Bool_t)");
146 fWidthCombo->Connect(
"Selected(Int_t)",
"TGraphEditor",
this,
"DoGraphLineWidth()");
147 fExSide->Connect(
"Clicked()",
"TGraphEditor",
this,
"DoGraphLineWidth()");
154 void TGraphEditor::SetModel(TObject* obj)
158 fGraph = (TGraph *)obj;
159 fAvoidSignal = kTRUE;
162 const char *text = fGraph->GetTitle();
163 fTitle->SetText(text);
165 TString opt = GetDrawOption();
171 Int_t l = opt.Length()-1;
173 dum.Remove(dum.First(opt[i]),1);
174 if (dum.Contains(opt[i])){
175 opt.Remove(opt.First(opt[i]),1);
183 if (opt.Contains(
"C")) {
184 fgr->SetButton(kSHAPE_SMOOTH, kTRUE);
186 }
else if (opt.Contains(
"L")) {
187 fgr->SetButton(kSHAPE_SIMPLE, kTRUE);
189 }
else if (opt.Contains(
"B")){
190 fgr->SetButton(kSHAPE_BAR, kTRUE);
192 }
else if (opt.Contains(
"F")){
193 fgr->SetButton(kSHAPE_FILL, kTRUE);
196 fgr->SetButton(kSHAPE_NOLINE, kTRUE);
199 if (make) SetDrawOption(opt);
203 if (opt==
"A" || opt==
"AP" || opt==
"PA" || opt ==
"P") {
204 if (!opt.Contains(
"P"))
206 fMarkerOnOff->SetState(kButtonDisabled);
207 }
else if (opt.Contains(
"P")) {
208 fMarkerOnOff->SetState(kButtonDown);
209 }
else fMarkerOnOff->SetState(kButtonUp);
212 if (fGraph->GetLineWidth()<0) fExSide->SetState(kButtonDown, kFALSE);
213 else fExSide->SetState(kButtonUp, kFALSE);
214 fWidthCombo->Select(TMath::Abs(Int_t(fGraph->GetLineWidth()/100)), kFALSE);
216 if (fInit) ConnectSignals2Slots();
217 fAvoidSignal = kFALSE;
222 void TGraphEditor::DoTitle(
const char *text)
226 if (fAvoidSignal)
return;
227 fGraph->SetTitle(text);
233 void TGraphEditor::DoShape()
237 if (fAvoidSignal)
return;
239 if (fGraph->InheritsFrom(TGraphErrors::Class()))
240 opt = fGraph->GetDrawOption();
242 opt = GetDrawOption();
246 if (fShape->GetState() == kButtonDown) s = kSHAPE_NOLINE;
247 else if (fShape0->GetState() == kButtonDown) s = kSHAPE_SMOOTH;
248 else if (fShape1->GetState() == kButtonDown) s = kSHAPE_SIMPLE;
249 else if (fShape2->GetState() == kButtonDown) s = kSHAPE_BAR;
250 else s = kSHAPE_FILL;
255 case kSHAPE_NOLINE: {
256 if (opt.Contains(fDrawShape))
257 opt.Remove(opt.First(fDrawShape),1);
259 fMarkerOnOff->SetState(kButtonDisabled);
264 case kSHAPE_SMOOTH: {
265 if (fDrawShape ==
' ')
267 else if (opt.Contains(fDrawShape))
268 opt.Replace(opt.First(fDrawShape),1,
'C');
274 case kSHAPE_SIMPLE: {
275 if (fDrawShape ==
' ')
277 else if (opt.Contains(fDrawShape))
278 opt.Replace(opt.First(fDrawShape),1,
'L');
285 if (fDrawShape ==
' ')
287 else if (opt.Contains(fDrawShape))
288 opt.Replace(opt.First(fDrawShape),1,
'B');
295 if (fDrawShape ==
' ')
297 else if (opt.Contains(fDrawShape))
298 opt.Replace(opt.First(fDrawShape),1,
'F');
304 if (gPad && gPad->GetVirtCanvas())
305 gPad->GetVirtCanvas()->SetCursor(kWatch);
306 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));
309 if (opt.Contains(
"P"))
310 fMarkerOnOff->SetState(kButtonDown);
312 fMarkerOnOff->SetState(kButtonUp);
313 if (opt==
"A" || opt==
"AP" || opt==
"PA" || opt ==
"P") {
314 if (!opt.Contains(
"P"))
316 fMarkerOnOff->SetState(kButtonDisabled);
320 if (opt.Contains(
"L") || opt.Contains(
"C")) {
321 if (fGraph->GetLineWidth()<0) fExSide->SetState(kButtonDown, kFALSE);
322 else fExSide->SetState(kButtonUp, kFALSE);
323 fWidthCombo->SetEnabled(kTRUE);
325 fExSide->SetState(kButtonDisabled);
326 fWidthCombo->SetEnabled(kFALSE);
330 if (gPad && gPad->GetVirtCanvas())
331 gPad->GetVirtCanvas()->SetCursor(kPointer);
332 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
337 void TGraphEditor::DoMarkerOnOff(Bool_t on)
341 if (fAvoidSignal)
return;
342 TString t = GetDrawOption();
347 if (!t.Contains(
"P")) t+=
"P";
348 fShape->SetState(kButtonEngaged);
351 while (t.Contains(
"P")) t.Remove(t.First(
"P"),1);
352 fShape->SetState(kButtonDisabled);
359 void TGraphEditor::DoGraphLineWidth()
363 if (fAvoidSignal)
return;
364 Int_t width = fWidthCombo->GetSelected();
365 Int_t lineWidth = TMath::Abs(fGraph->GetLineWidth()%100);
367 if (fExSide->GetState() == kButtonDown) side = -1;
368 fGraph->SetLineWidth(side*(100*width+lineWidth));