00001
00002
00003 #include <vcl.h>
00004 #pragma hdrstop
00005
00006 #include "MDITransfer.h"
00007 #include "mdiframe.h"
00008 #include "MDIEdit.h"
00009 #include <XMLDoc.hpp>
00010
00011
00012 #pragma package(smart_init)
00013 #pragma resource "*.dfm"
00014 TTransferForm *TransferForm;
00015
00016 __fastcall TTransferForm::TTransferForm(TComponent* Owner, TTransfer *transe)
00017 : TForm(Owner),
00018 _created(false),
00019 _selLine(-1),
00020 _selPoint(-1),
00021 _lineNr(-1),
00022 _endpoint(-1),
00023 _beginSelect(false),
00024 _beginSelectEndpoint(false),
00025 _beginCut(false),
00026 _beginMove(false)
00027 {
00028 }
00029
00030
00031 void __fastcall TTransferForm::_setHistoArea()
00032 {
00033
00034 HistoArea->Width = (int)((float)PHistoAreaBack->ClientWidth *
00035 histo->histoZoom);
00036
00037 HistoArea->Height = (int)((float)PHistoAreaBack->ClientHeight *
00038 histo->valZoom);
00039
00040 if (HistoArea->Width > PHistoAreaBack->Width)
00041 HistoArea->Left = (int)((float)HistoArea->Width *
00042 histo->histoPos);
00043 else
00044 HistoArea->Left = PHistoAreaBack->Width - HistoArea->Width;
00045
00046 if (HistoArea->Height > PHistoAreaBack->Height)
00047 HistoArea->Top = (int)((float)HistoArea->Height *
00048 histo->valPos);
00049 else
00050 HistoArea->Top = PHistoAreaBack->Height - HistoArea->Height;
00051 }
00052
00053
00054 void __fastcall TTransferForm::_setHistoZoom()
00055 {
00056
00057 TBHorizontal->Max = (int)(histo->getHMaxZoom(PHistoAreaBack)*100.0);
00058 }
00059
00060
00061 void __fastcall TTransferForm::_setValZoom()
00062 {
00063
00064 TBVertical->Position = (int)(histo->valZoom * 100.0);
00065 }
00066
00067
00068 void __fastcall TTransferForm::_setHistoPos()
00069 {
00070 if (SBHorizontal->PageSize > HistoArea->Width) {
00071
00072 if (HistoArea->Width > PHistoAreaBack->Width) {
00073 SBHorizontal->PageSize = PHistoAreaBack->Width;
00074 SBHorizontal->LargeChange = SBHorizontal->PageSize;
00075 } else {
00076 SBHorizontal->PageSize = HistoArea->Width;
00077 SBHorizontal->LargeChange = SBHorizontal->PageSize;
00078 }
00079
00080 SBHorizontal->Max = HistoArea->Width;
00081 } else {
00082
00083 SBHorizontal->Max = HistoArea->Width;
00084
00085 if (HistoArea->Width > PHistoAreaBack->Width) {
00086 SBHorizontal->PageSize = PHistoAreaBack->Width;
00087 SBHorizontal->LargeChange = SBHorizontal->PageSize;
00088 } else {
00089 SBHorizontal->PageSize = HistoArea->Width;
00090 SBHorizontal->LargeChange = SBHorizontal->PageSize;
00091 }
00092 }
00093 SBHorizontal->Position = SBHorizontal->Max * histo->histoPos;
00094 }
00095
00096
00097 void __fastcall TTransferForm::_setValPos()
00098 {
00099 if (SBVertical->PageSize > HistoArea->Height) {
00100
00101 if (HistoArea->Height > PHistoAreaBack->Height) {
00102 SBVertical->PageSize = PHistoAreaBack->Height;
00103 SBVertical->LargeChange = SBVertical->PageSize;
00104 } else {
00105 SBVertical->PageSize = HistoArea->Height;
00106 SBVertical->LargeChange = SBVertical->PageSize;
00107 }
00108
00109 SBVertical->Max = HistoArea->Height;
00110 } else {
00111
00112 SBVertical->Max = HistoArea->Height;
00113
00114 if (HistoArea->Height > PHistoAreaBack->Height) {
00115 SBVertical->PageSize = PHistoAreaBack->Height;
00116 SBVertical->LargeChange = SBVertical->PageSize;
00117 } else {
00118 SBVertical->PageSize = HistoArea->Height;
00119 SBVertical->LargeChange = SBVertical->PageSize;
00120 }
00121 }
00122 SBVertical->Position = SBVertical->Max * -histo->valPos;
00123 }
00124
00125
00126 void __fastcall TTransferForm::_movePointTo(int x, int y, bool start)
00127 {
00128 const int n = transe->numLines-1;
00129 const int idx = transe->getSelIdx();
00130 TLine *l = transe->getSelected();
00131
00132 int rx = (int)((float)x*histo->getHPP(HistoArea));
00133 int ry = (int)((float)(HistoArea->Height-y)/
00134 (float)HistoArea->Height*
00135 (float)0xff);
00136 if (start) {
00137 TLine *l2 = transe->getLine(idx-1);
00138
00139
00140 if (idx == 0) {
00141 rx=0;
00142 } else {
00143 if (rx>l->End.X) rx=l->End.X;
00144 if (l2) if (rx<l2->Start.X) rx=l2->Start.X;
00145 if (rx>histo->size) rx=histo->size;
00146 if (rx<0) rx=0;
00147 }
00148 if (ry>0xff) ry=0xff;
00149 if (ry<0) ry=0;
00150
00151
00152 l->Start.X = rx;
00153 l->Start.Y = ry;
00154 if (l2) {
00155 l2->End.X = rx;
00156 l2->End.Y = ry;
00157 }
00158 } else {
00159 TLine *l2 = transe->getLine(idx+1);
00160
00161
00162 if (idx == n) {
00163 rx=4096;
00164 } else {
00165 if (rx<l->Start.X) rx=l->Start.X;
00166 if (rx>l2->End.X) rx=l2->End.X;
00167 if (rx>histo->size) rx=histo->size;
00168 if (rx<0) rx=0;
00169 }
00170 if (ry>0xff) ry=0xff;
00171 if (ry<0) ry=0;
00172
00173
00174 l->End.X = rx;
00175 l->End.Y = ry;
00176 if (l2) {
00177 l2->Start.X = rx;
00178 l2->Start.Y = ry;
00179 }
00180 }
00181 transe->Dirty = true;
00182 }
00183
00184
00185 void __fastcall TTransferForm::_updateColor()
00186 {
00187 for (int i=0; i<size; ++i) color[i] = transe->getColor(data[i]);
00188 }
00189
00190
00191 void __fastcall TTransferForm::FormCreate(TObject *Sender)
00192 {
00193 histo->horizontal = true;
00194
00195 _setHistoArea();
00196 _setHistoZoom();
00197 _setHistoPos();
00198 _setValZoom();
00199 _setValPos();
00200
00201 LZoomX->Caption = AnsiString::FormatFloat("#0.00000", histo->histoZoom);
00202 LZoomY->Caption = AnsiString::FormatFloat("#0.00000", histo->valZoom);
00203 LHistoX->Caption = "0.000";
00204 LHistoY->Caption = "0.000";
00205 LbName->Items->Assign(transe->areaNames);
00206
00207 _created = true;
00208 }
00209
00210
00211 void __fastcall TTransferForm::FormClose(TObject *Sender,
00212 TCloseAction &Action)
00213 {
00214 Action=caFree;
00215 FrameForm->METransferfunktion->Checked = false;
00216 }
00217
00218
00219 void __fastcall TTransferForm::HistoAreaPaint(TObject *Sender)
00220 {
00221 histo->drawTo(HistoArea);
00222 transe->drawTo(HistoArea);
00223 }
00224
00225
00226 void __fastcall TTransferForm::PHistoAreaBackResize(TObject *Sender)
00227 {
00228
00229 if (histo->histoZoom > histo->getHMaxZoom(PHistoAreaBack))
00230 histo->histoZoom = histo->getHMaxZoom(PHistoAreaBack);
00231 _setHistoZoom();
00232 _setHistoArea();
00233 _setHistoPos();
00234 _setValPos();
00235 }
00236
00237
00238 void __fastcall TTransferForm::TBVerticalChange(TObject *Sender)
00239 {
00240 if (!_created) return;
00241 if (histo->horizontal) {
00242 histo->valZoom = (float)TBVertical->Position/100.0;
00243 } else {
00244 histo->histoZoom = (float)TBVertical->Position/100.0;
00245 }
00246 _setHistoArea();
00247 _setValPos();
00248 LZoomY->Caption = AnsiString::FormatFloat("#0.00000", histo->valZoom);
00249 }
00250
00251
00252 void __fastcall TTransferForm::TBHorizontalChange(TObject *Sender)
00253 {
00254 if (!_created) return;
00255 if (histo->horizontal) {
00256 histo->histoZoom = (float)TBHorizontal->Position/100.0;
00257 } else {
00258 histo->valZoom = (float)TBHorizontal->Position/100.0;
00259 }
00260 _setHistoArea();
00261 _setHistoPos();
00262 LZoomX->Caption = AnsiString::FormatFloat("#0.00000", histo->histoZoom);
00263 }
00264
00265
00266 void __fastcall TTransferForm::SBVerticalChange(TObject *Sender)
00267 {
00268 histo->valPos = -(float)SBVertical->Position/(float)HistoArea->Height;
00269 _setHistoArea();
00270 }
00271
00272
00273 void __fastcall TTransferForm::SBHorizontalChange(TObject *Sender)
00274 {
00275 histo->histoPos = -(float)SBHorizontal->Position/
00276 (float)HistoArea->Width;
00277 _setHistoArea();
00278 }
00279
00280
00281 void __fastcall TTransferForm::SFGColorMouseUp(TObject *Sender,
00282 TMouseButton Button, TShiftState Shift, int X, int Y)
00283 {
00284 if (_selLine != -1) {
00285 if (ColorDialog1->Execute()) {
00286 SFGColor->Brush->Color = ColorDialog1->Color;
00287 transe->Dirty = true;
00288 TLine *l = transe->getSelected();
00289 if (l->Start.Selected)
00290 l->Start.TC = SFGColor->Brush->Color;
00291 else if (l->End.Selected)
00292 l->End.TC = SFGColor->Brush->Color;
00293 HistoAreaPaint(this);
00294 _updateColor();
00295 }
00296 }
00297 }
00298
00299
00300 void __fastcall TTransferForm::SBGColorMouseUp(TObject *Sender,
00301 TMouseButton Button, TShiftState Shift, int X, int Y)
00302 {
00303 ColorDialog1->Execute();
00304 SBGColor->Brush->Color = ColorDialog1->Color;
00305 histo->background = SBGColor->Brush->Color;
00306 HistoAreaPaint(this);
00307 }
00308
00309
00310 void __fastcall TTransferForm::HistoAreaMouseMove(TObject *Sender,
00311 TShiftState Shift, int X, int Y)
00312 {
00313 LHistoX->Caption = AnsiString((int)((float)X*histo->getHPP(HistoArea)));
00314 LHistoY->Caption = AnsiString((int)((float)(HistoArea->Height-Y)/
00315 (float)HistoArea->Height*
00316 (float)0xff));
00317
00318 _lineNr = transe->lineNear(HistoArea, X, Y);
00319 _endpoint = transe->nearStart(_selLine, HistoArea, X, Y) ? 1 : -1;
00320 _endpoint = transe->nearEnd(_selLine, HistoArea, X, Y) ? 2 : _endpoint;
00321
00322 if (_beginMove) {
00323 _movePointTo(X,Y,(_selPoint == 1));
00324 HistoAreaPaint(this);
00325 } else if (_lineNr != -1 || _endpoint != -1) {
00326 if (SBCursor->Down)
00327 HistoArea->Cursor = crHandPoint;
00328 else if (SBCut->Down)
00329 HistoArea->Cursor = crCross;
00330 else if (SBMove->Down) {
00331 HistoArea->Cursor = crHandPoint;
00332 if (_endpoint != -1)
00333 HistoArea->Cursor = crSizeAll;
00334 }
00335 } else {
00336 HistoArea->Cursor = crDefault;
00337 }
00338 }
00339
00340
00341 void __fastcall TTransferForm::HistoAreaMouseDown(TObject *Sender,
00342 TMouseButton Button, TShiftState Shift, int X, int Y)
00343 {
00344 _beginSelect = (SBCursor->Down || SBMove->Down) && _lineNr != -1;
00345 _beginSelectEndpoint = SBCursor->Down && (_endpoint != -1);
00346 _beginCut = SBCut->Down && _lineNr != -1;
00347 _beginMove = SBMove->Down && ((_selLine != -1) && (_endpoint != -1));
00348 if (_beginMove)
00349 _selPoint = _endpoint;
00350 else
00351 _selPoint = -1;
00352 }
00353
00354
00355 void __fastcall TTransferForm::HistoAreaMouseUp(TObject *Sender,
00356 TMouseButton Button, TShiftState Shift, int X, int Y)
00357 {
00358 if (_beginCut) {
00359 _selLine = transe->split(HistoArea, X, Y);
00360 _updateColor();
00361 } else if (_beginMove) {
00362 _updateColor();
00363 } else if (_beginSelectEndpoint) {
00364 if (_endpoint == 1) {
00365 transe->selectStart(_selLine);
00366 SFGColor->Brush->Color =
00367 transe->getSelected()->Start.TC;
00368 } else if (_endpoint == 2) {
00369 transe->selectEnd(_selLine);
00370 SFGColor->Brush->Color =
00371 transe->getSelected()->End.TC;
00372 }
00373 } else if (_beginSelect) {
00374 _selLine = _lineNr;
00375 if (!_beginMove) transe->select(_selLine);
00376 TLine *l = transe->getSelected();
00377
00378 if (l) {
00379
00380 LStart->Caption = "(" + AnsiString(l->Start.X) + ", "
00381 + AnsiString(l->Start.Y) + ")";
00382 LEnd->Caption = "(" + AnsiString(l->End.X) + ", "
00383 + AnsiString(l->End.Y) + ")";
00384
00385 EName->Text = "";
00386
00387
00388
00389 if (l->Name <= LbName->Items->Count)
00390 LbName->ItemIndex = l->Name;
00391 else
00392 LbName->ItemIndex = -1;
00393 SStart->Brush->Color = l->Start.TC;
00394 SEnd->Brush->Color = l->End.TC;
00395 }
00396 } else if (SBCursor->Down) {
00397 transe->unselect();
00398
00399
00400 LStart->Caption = "(0, 0)";
00401 LEnd->Caption = "(0, 0)";
00402 SStart->Brush->Color = clBtnFace;
00403 SEnd->Brush->Color = clBtnFace;
00404
00405 LbName->ItemIndex = -1;
00406
00407 EName->Text = "";
00408
00409
00410 }
00411 HistoAreaPaint(this);
00412 _beginSelect = false;
00413 _beginSelectEndpoint = false;
00414 _beginCut = false;
00415 _beginMove = false;
00416 }
00417
00418
00419 void __fastcall TTransferForm::SpeedButton1Click(TObject *Sender)
00420 {
00421 _updateColor();
00422 }
00423
00424
00425 void __fastcall TTransferForm::ENameKeyPress(TObject *Sender, char &Key)
00426 {
00427 if (Key == 13) {
00428 SbNameOkayClick(this);
00429 } else {
00430 int idx = LbName->Items->IndexOf(EName->Text);
00431 if (idx != -1) LbName->ItemIndex = idx;
00432 }
00433 }
00434
00435
00436 void __fastcall TTransferForm::SbNameOkayClick(TObject *Sender)
00437 {
00438 int idx = LbName->Items->IndexOf(EName->Text);
00439 if (idx != -1) {
00440 LbName->ItemIndex = idx;
00441 } else {
00442 transe->areaNames->Add(EName->Text);
00443 LbName->Items->Assign(transe->areaNames);
00444 EName->Text = "";
00445 }
00446 }
00447
00448
00449 void __fastcall TTransferForm::LbNameClick(TObject *Sender)
00450 {
00451 if (LbName->ItemIndex != -1) {
00452 EName->Text = (*LbName->Items)[LbName->ItemIndex];
00453 TLine *l = transe->getSelected();
00454 if (l) l->Name = LbName->ItemIndex;
00455 }
00456 }
00457
00458
00459 void __fastcall TTransferForm::SbNameDelClick(TObject *Sender)
00460 {
00461 if (LbName->ItemIndex != -1) {
00462 transe->areaNames->Delete(LbName->ItemIndex);
00463 LbName->Items->Assign(transe->areaNames);
00464 EName->Text = "";
00465 TLine *l = transe->getSelected();
00466 if (l) l->Name = -1;
00467 }
00468 }
00469
00470
00471 void __fastcall TTransferForm::LbNameDblClick(TObject *Sender)
00472 {
00473 if (LbName->ItemIndex != -1) {
00474 LbName->ItemIndex = -1;
00475 EName->Text = "";
00476 TLine *l = transe->getSelected();
00477 if (l) l->Name = -1;
00478 }
00479 }
00480
00481
00482 void __fastcall TTransferForm::SbLoadClick(TObject *Sender)
00483 {
00484 if (OpenDialog1->Execute()) {
00485 _di_IXMLDocument obj = LoadXMLDocument(OpenDialog1->FileName);
00486 _di_IXMLNode doc = obj->DocumentElement;
00487 if (transe->loadFromXLM(doc))
00488 LbName->Items->Assign(transe->areaNames);
00489 }
00490 }
00491
00492
00493 void __fastcall TTransferForm::SbSaveClick(TObject *Sender)
00494 {
00495 if (SaveDialog1->Execute()) {
00496 _di_IXMLDocument obj = NewXMLDocument("1.0");
00497 _di_IXMLNode doc = obj->AddChild("Transferfunction");
00498 if (transe->saveToXML(doc))
00499 obj->SaveToFile(SaveDialog1->FileName);
00500 }
00501 }
00502
00503