/*
<img src="gif/TLineEditor.gif">
*/
//End_Html
#include "TLineEditor.h"
#include "TGLabel.h"
#include "TGNumberEntry.h"
#include "TLine.h"
#include "TVirtualPad.h"
ClassImp(TLineEditor)
enum ELineWid {
kLine_STAX,
kLine_STAY,
kLine_ENDX,
kLine_ENDY,
kLine_VERTICAL,
kLine_HORIZONTAL
};
TLineEditor::TLineEditor(const TGWindow *p, Int_t width,
Int_t height, UInt_t options, Pixel_t back)
: TGedFrame(p, width, height, options | kVerticalFrame, back)
{
fLine = 0;
MakeTitle("Points");
TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
AddFrame(f3, new TGLayoutHints(kLHintsTop, 1, 1, 3, 0));
TGCompositeFrame *f3a = new TGCompositeFrame(f3, 80, 20);
f3->AddFrame(f3a, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
TGLabel *fStartPointXLabel = new TGLabel(f3a, "Start X:");
f3a->AddFrame(fStartPointXLabel, new TGLayoutHints(kLHintsNormal, 8, 0, 5, 5));
TGLabel *fStartPointYLabel = new TGLabel(f3a, "Y:");
f3a->AddFrame(fStartPointYLabel, new TGLayoutHints(kLHintsNormal, 37, 0, 5, 5));
TGLabel *fEndPointXLabel = new TGLabel(f3a, "End X:");
f3a->AddFrame(fEndPointXLabel, new TGLayoutHints(kLHintsNormal, 10, 0, 5, 5));
TGLabel *fEndPointYLabel = new TGLabel(f3a, "Y:");
f3a->AddFrame(fEndPointYLabel, new TGLayoutHints(kLHintsNormal, 37, 0, 5, 5));
TGCompositeFrame *f3b = new TGCompositeFrame(f3, 80, 20, kFixedWidth);
f3->AddFrame(f3b, new TGLayoutHints(kLHintsNormal, 8, 0, 0, 0));
fStartPointX = new TGNumberEntry(f3b, 0.0, 8, kLine_STAX,
TGNumberFormat::kNESRealThree,
TGNumberFormat::kNEAAnyNumber,
TGNumberFormat::kNELNoLimits);
fStartPointX->GetNumberEntry()->SetToolTipText("Set start point X coordinate of Line.");
f3b->AddFrame(fStartPointX, new TGLayoutHints(kLHintsExpandX, 1, 1, 1, 1));
fStartPointY = new TGNumberEntry(f3b, 0.0, 8, kLine_STAY,
TGNumberFormat::kNESRealThree,
TGNumberFormat::kNEAAnyNumber,
TGNumberFormat::kNELNoLimits);
fStartPointY->GetNumberEntry()->SetToolTipText("Set start point Y coordinate of Line.");
f3b->AddFrame(fStartPointY, new TGLayoutHints(kLHintsExpandX, 1, 1, 3, 1));
fEndPointX = new TGNumberEntry(f3b, 0.0, 8, kLine_ENDX,
TGNumberFormat::kNESRealThree,
TGNumberFormat::kNEAAnyNumber,
TGNumberFormat::kNELNoLimits);
fEndPointX->GetNumberEntry()->SetToolTipText("Set end point X xoordinate of Line.");
f3b->AddFrame(fEndPointX, new TGLayoutHints(kLHintsExpandX, 1, 1, 3, 1));
fEndPointY = new TGNumberEntry(f3b, 0.0, 8, kLine_ENDY,
TGNumberFormat::kNESRealThree,
TGNumberFormat::kNEAAnyNumber,
TGNumberFormat::kNELNoLimits);
fEndPointY->GetNumberEntry()->SetToolTipText("Set end point Y coordinate of Line.");
f3b->AddFrame(fEndPointY, new TGLayoutHints(kLHintsExpandX, 1, 1, 3, 1));
fVertical = new TGCheckButton(this,"Vertical",kLine_VERTICAL);
fVertical->SetToolTipText("Set vertical");
AddFrame(fVertical, new TGLayoutHints(kLHintsTop, 8, 1, 5, 0));
fHorizontal = new TGCheckButton(this,"Horizontal",kLine_HORIZONTAL);
fHorizontal->SetToolTipText("Set horizontal");
AddFrame(fHorizontal, new TGLayoutHints(kLHintsTop, 8, 1, 3, 0));
}
TLineEditor::~TLineEditor()
{
}
void TLineEditor::ConnectSignals2Slots()
{
fStartPointX->Connect("ValueSet(Long_t)", "TLineEditor", this, "DoStartPoint()");
(fStartPointX->GetNumberEntry())->Connect("ReturnPressed()", "TLineEditor", this, "DoStartPoint()");
fStartPointY->Connect("ValueSet(Long_t)", "TLineEditor", this, "DoStartPoint()");
(fStartPointY->GetNumberEntry())->Connect("ReturnPressed()", "TLineEditor", this, "DoStartPoint()");
fEndPointX->Connect("ValueSet(Long_t)", "TLineEditor", this, "DoEndPoint()");
(fEndPointX->GetNumberEntry())->Connect("ReturnPressed()", "TLineEditor", this, "DoEndPoint()");
fEndPointY->Connect("ValueSet(Long_t)", "TLineEditor", this, "DoEndPoint()");
(fEndPointY->GetNumberEntry())->Connect("ReturnPressed()", "TLineEditor", this, "DoEndPoint()");
fVertical->Connect("Clicked()","TLineEditor",this,"DoLineVertical()");
fHorizontal->Connect("Clicked()","TLineEditor",this,"DoLineHorizontal()");
fInit = kFALSE;
}
void TLineEditor::SetModel(TObject* obj)
{
fLine = (TLine *)obj;
fAvoidSignal = kTRUE;
Float_t val = fLine->GetX1();
fStartPointX->SetNumber(val);
val = fLine->GetX2();
fEndPointX->SetNumber(val);
val = fLine->GetY1();
fStartPointY->SetNumber(val);
val = fLine->GetY2();
fEndPointY->SetNumber(val);
if (fLine->IsHorizontal()) fHorizontal->SetState(kButtonDown, kFALSE);
else fHorizontal->SetState(kButtonUp, kFALSE);
if (fLine->IsVertical()) fVertical->SetState(kButtonDown, kFALSE);
else fVertical->SetState(kButtonUp, kFALSE);
if (fInit) ConnectSignals2Slots();
fAvoidSignal = kFALSE;
}
void TLineEditor::DoStartPoint()
{
if (fAvoidSignal) return;
fLine->SetX1((Double_t)fStartPointX->GetNumber());
fLine->SetY1((Double_t)fStartPointY->GetNumber());
fLine->Paint(fLine->GetDrawOption());
Update();
}
void TLineEditor::DoEndPoint()
{
if (fAvoidSignal) return;
fLine->SetX2((Double_t)fEndPointX->GetNumber());
fLine->SetY2((Double_t)fEndPointY->GetNumber());
fLine->Paint(fLine->GetDrawOption());
Update();
}
void TLineEditor::DoLineVertical()
{
if (fAvoidSignal) return;
if (fVertical->GetState() == kButtonDown) {
fLine->SetVertical();
fHorizontal->SetState(kButtonUp, kFALSE);
} else {
fLine->SetVertical(kFALSE);
}
Update();
}
void TLineEditor::DoLineHorizontal()
{
if (fAvoidSignal) return;
if (fHorizontal->GetState() == kButtonDown) {
fLine->SetHorizontal();
fVertical->SetState(kButtonUp, kFALSE);
} else {
fLine->SetHorizontal(kFALSE);
}
Update();
}