//--------------------------------------------------------------------------- #include #pragma hdrstop #include "TPDocument.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // // TPDocument // //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(TPDocument *) { new TPDocument(NULL); } //--------------------------------------------------------------------------- __fastcall TPDocument::TPDocument(TComponent* Owner) : TGraphicControl(Owner) { ControlStyle = ControlStyle << csReplicatable << csOpaque; Height = 105; Width = 105; FSheet = NULL; FDesign = true; FGridSpace = 8; SelectElement = NULL; dcm = dcmNone; } //--------------------------------------------------------------------------- __fastcall TPDocument::~TPDocument() { } //--------------------------------------------------------------------------- // Private Function //--------------------------------------------------------------------------- void __fastcall TPDocument::WMKeyDown(TMessage &msg) { // if (FOnKeyDown) FOnKeyDown(this, &Key, Shift); // if (FOnKeyDown) FOnKeyDown(this); } //--------------------------------------------------------------------------- void __fastcall TPDocument::WMKeyUp(TMessage &msg) { // if (FOnKeyUp) FOnKeyUp(this, &Key, Shift); // if (FOnKeyUp) FOnKeyUp(this); } //--------------------------------------------------------------------------- void __fastcall TPDocument::WMKeyPress(TMessage &msg) { // if (FOnKeyPress) FOnKeyPress(this, &Key, Shift); // if (FOnKeyPress) FOnKeyPress(this); } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetDesign(bool Value) { if (FDesign != Value) { FDesign = Value; Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetGridSpace(int Value) { if (FGridSpace != Value) { FGridSpace = Value; if (FGridSpace) { ViewStatus.Position.x -= ViewStatus.Position.x % FGridSpace; ViewStatus.Position.y -= ViewStatus.Position.y % FGridSpace; } Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetSheet(TPDocSheet *Value) { if (FSheet != Value) { FSheet = Value; Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetPosX(LONG Value) { if (ViewStatus.Position.x != Value) { ViewStatus.Position.x = Value - (Value % FGridSpace); if (ViewStatus.Position.x < 0) ViewStatus.Position.x = 0; //added by k3dogs(2000/10/25)0º¸´Ù ÀÛÀ¸¸é access violation error°¡ ³­´Ù. Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetPosY(LONG Value) { if (ViewStatus.Position.y != Value) { ViewStatus.Position.y = Value - (Value % FGridSpace); if (ViewStatus.Position.y < 0) ViewStatus.Position.y = 0; Refresh(); } } //--------------------------------------------------------------------------- // Protected Function //--------------------------------------------------------------------------- void __fastcall TPDocument::Paint() { TPDocElement *dp; RECT r, tr; HDC dcSrc, dcMemV = NULL, dcForm = NULL; HBITMAP bmMemV = NULL; int x, y, w, h, zi, zo; if (ComponentState.Contains(csDesigning)) { TGraphicControl::Canvas->Pen->Style = psDash; TGraphicControl::Canvas->Brush->Style = bsClear; TGraphicControl::Canvas->Rectangle(0, 0, Width, Height); } else { if (Width<=0 || Height<=0) return; dcSrc = TGraphicControl::Canvas->Handle; try { zi = ViewStatus.ZoomIn; zo = ViewStatus.ZoomOut; if (FDesign) { w = Width * zo / zi; h = Height * zo / zi; } else { w = Width * zo / zi; h = Height * zo / zi; } bmMemV = CreateCompatibleBitmap(dcSrc, w, h); dcMemV = CreateCompatibleDC(dcSrc); SelectObject(dcMemV, bmMemV); r = Rect(0, 0, w, h); FillRect(dcMemV, &r, GetStockObject(WHITE_BRUSH)); if (FDesign) { if (FGridSpace * zi / zo > 4) { for (y = 0; y < h; y += FGridSpace) { for (x = 0; x < w; x += FGridSpace) { SetPixel(dcMemV, x, y, clBlack); } } } if (FSheet) { for (int i = 0; i < FSheet->Element->Count; i++) { dp = (TPDocElement *)FSheet->Element->Items[i]; if (dp->Range.left - ViewStatus.Position.x < w || dp->Range.top - ViewStatus.Position.y < h || dp->Range.right - ViewStatus.Position.x >= 0 || dp->Range.bottom - ViewStatus.Position.y >= 0) { dp->PaintDesign(dcMemV, ViewStatus, dp == SelectElement); } } } if (FOnEditPaint) FOnEditPaint(this, dcMemV); StretchBlt(dcSrc, 0, 0, Width, Height, dcMemV, 0, 0, w, h, SRCCOPY); } else { if (FSheet) { if (FSheet->Bitmap) { dcForm = FSheet->Bitmap->CreateDC(); // BitBlt(dcMemV, 0, 0, Width, Height, dcForm, ViewStatus.Position.x, ViewStatus.Position.y, SRCCOPY); BitBlt(dcMemV, 0, 0, w, h, dcForm, ViewStatus.Position.x, ViewStatus.Position.y, SRCCOPY); FSheet->Bitmap->DeleteDC(dcForm); dcForm = NULL; } for (int i = 0; i < FSheet->Element->Count; i++) { dp = (TPDocElement *)FSheet->Element->Items[i]; if (dp->Range.left - ViewStatus.Position.x < Width || dp->Range.top - ViewStatus.Position.y < Height || dp->Range.right - ViewStatus.Position.x >= 0 || dp->Range.bottom - ViewStatus.Position.y >= 0) { dp->PaintReport(FSheet, dcMemV, ViewStatus, false, dp == SelectElement, 0); // 0-->Korean.. } } } if (FOnEditPaint) FOnEditPaint(this, dcMemV); // BitBlt(dcSrc, 0, 0, Width, Height, dcMemV, 0, 0, SRCCOPY); StretchBlt(dcSrc, 0, 0, Width, Height, dcMemV, 0, 0, w, h, SRCCOPY); } } __finally { if (dcForm) FSheet->Bitmap->DeleteDC(dcForm); if (dcMemV) DeleteDC(dcMemV); if (bmMemV) DeleteObject(bmMemV); } } } //--------------------------------------------------------------------------- void __fastcall TPDocument::MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) { X = ViewStatus.View2PatternX(X); Y = ViewStatus.View2PatternY(Y); if (FGridSpace) { X -= X % FGridSpace; Y -= Y % FGridSpace; } //========================================================= if (Shift.Contains(ssDouble)) return; if (Button == mbLeft) { if (dcm != dcmNone) { SelectElement->ControlMode = dcm; SelectElement->ControlModeMouseDown(X, Y); dcm = dcmNone; Refresh(); } } if (SelectElement && SelectElement->ControlMode != dcmNone) { SelectElement->ControlModeMouseMove(TGraphicControl::Canvas->Handle, ViewStatus, X, Y); } else { TControl::MouseDown(Button, Shift, X, Y); } /* if (Button == mbLeft && !Shift.Contains(ssDouble)) { if (dcm != dcmNone) { SelectElement->ControlMode = dcm; SelectElement->ControlModeMouseDown(X, Y); dcm = dcmNone; Refresh(); } } if (SelectElement && SelectElement->ControlMode != dcmNone) { SelectElement->ControlModeMouseMove(TGraphicControl::Canvas->Handle, ViewStatus, X, Y); } else { TControl::MouseDown(Button, Shift, X, Y); } */ //========================================================= } //--------------------------------------------------------------------- void __fastcall TPDocument::MouseMove(TShiftState Shift, int X, int Y) { int px, py; RECT rc; X = ViewStatus.View2PatternX(X); Y = ViewStatus.View2PatternY(Y); //==================================================================== maybe be modified.... if (FDesign) { // Design Tool if (SelectElement && SelectElement->ControlMode == dcmNone) { dcm = SelectElement->GetControlMode(X, Y); Cursor = GetCursor(dcm); } } else { // Report Tool //==================================================================== if (SelectElement) { if (SelectElement->Type == detArrow || SelectElement->Type == detSheafImage || SelectElement->Type == detSheafLabel || SelectElement->Type == detSheafLine) { if (SelectElement && SelectElement->ControlMode == dcmNone) { dcm = SelectElement->GetControlMode(X, Y); Cursor = GetCursor(dcm); } } } } //==================================================================== if (FGridSpace) { X -= X % FGridSpace; Y -= Y % FGridSpace; } if (SelectElement && SelectElement->ControlMode != dcmNone) { SelectElement->ControlModeMouseMove(TGraphicControl::Canvas->Handle, ViewStatus, X, Y); } else { TControl::MouseMove(Shift, X, Y); } } //--------------------------------------------------------------------- void __fastcall TPDocument::MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y) { int px, py; RECT rc; X = ViewStatus.View2PatternX(X); Y = ViewStatus.View2PatternY(Y); if (FGridSpace) { X -= X % FGridSpace; Y -= Y % FGridSpace; } if (SelectElement && SelectElement->ControlMode != dcmNone) { SelectElement->GetNewRange(X, Y); SelectElement->ControlModeMouseUp(); SelectElement->ControlMode = dcmNone; Refresh(); } else { TControl::MouseUp(Button, Shift, X, Y); } } //--------------------------------------------------------------------- // Public Function //--------------------------------------------------------------------------- void __fastcall TPDocument::RemoveData() { SelectElement = NULL; FSheet->RemoveData(); Refresh(); } //--------------------------------------------------------------------------- void __fastcall TPDocument::RemoveSelect() { FSheet->RemoveData(SelectElement); SelectElement = NULL; dcm = dcmNone; Refresh(); } //--------------------------------------------------------------------------- bool __fastcall TPDocument::Select(POINT pt, bool paint) { SelectElement = FSheet->Select(pt); if (paint) Refresh(); return SelectElement != NULL; } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetPosition(int x, int y) { ViewStatus.Position.x = x; ViewStatus.Position.y = y; Refresh(); } //--------------------------------------------------------------------------- HDC __fastcall TPDocument::GetHandle() { return TGraphicControl::Canvas->Handle; } //--------------------------------------------------------------------------- void __fastcall TPDocument::SetZoom(int zi, int zo) { if (ViewStatus.ZoomIn != zi || ViewStatus.ZoomOut != zo) { ViewStatus.ZoomIn = zi; ViewStatus.ZoomOut = zo; Refresh(); } } //--------------------------------------------------------------------------- TPDocElement * __fastcall TPDocument::GetSelectElement(bool subelement) { TPDocElement *sp; if (subelement) { if (SelectElement->Type == detInput) { sp = ((TPDocInput *)SelectElement)->IPElement; } else if (SelectElement->Type == detChart) { sp = ((TPDocChart *)SelectElement)->GetSelectElement(); } } else { sp = SelectElement; } return sp; } //--------------------------------------------------------------------------- void __fastcall TPDocument::ResetSelectElement() { if (SelectElement) { SelectElement = NULL; dcm = dcmNone; } } //--------------------------------------------------------------------------- RECT __fastcall TPDocument::ChangeRect(RECT rc) { rc.left = ViewStatus.Pattern2ViewX(rc.left); rc.top = ViewStatus.Pattern2ViewY(rc.top); rc.right = ViewStatus.Pattern2ViewX(rc.right); rc.bottom = ViewStatus.Pattern2ViewY(rc.bottom); return rc; } //--------------------------------------------------------------------------- POINT __fastcall TPDocument::ChangePoint(POINT tp) { tp.x = ViewStatus.Pattern2ViewX(tp.x); tp.y= ViewStatus.Pattern2ViewY(tp.y); return tp; } //--------------------------------------------------------------------------- TPDocViewStatus __fastcall TPDocument::GetViewStatus() { return ViewStatus; } //--------------------------------------------------------------------------- namespace Tpdocument { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TPDocument)}; RegisterComponents("Texpia", classes, 0); } } //---------------------------------------------------------------------------