//--------------------------------------------------------------------------- #include #pragma hdrstop #include "TPDocControl.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // // TPDocControl // //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(TPDocControl *) { new TPDocControl(NULL); } //--------------------------------------------------------------------------- __fastcall TPDocControl::TPDocControl(TComponent* Owner) : TCustomControl(Owner) { ControlStyle = ControlStyle << csReplicatable << csOpaque; Height = 105; Width = 105; FSheet = NULL; FDesign = true; FGridSpace = 8; SelectElement = NULL; dcm = dcmNone; } //--------------------------------------------------------------------------- __fastcall TPDocControl::~TPDocControl() { } //--------------------------------------------------------------------------- // Private Function //--------------------------------------------------------------------------- void __fastcall TPDocControl::WMKeyDown(TMessage &msg) { // if (FOnKeyDown) FOnKeyDown(this, &Key, Shift); } //--------------------------------------------------------------------------- void __fastcall TPDocControl::WMKeyUp(TMessage &msg) { // if (FOnKeyUp) FOnKeyUp(this, &Key, Shift); // if (FOnKeyUp) FOnKeyUp(this); } //--------------------------------------------------------------------------- void __fastcall TPDocControl::WMKeyPress(TMessage &msg) { // if (FOnKeyUp) FOnKeyUp(this, &Key, Shift); // if (FOnKeyUp) FOnKeyUp(this); } //--------------------------------------------------------------------------- void __fastcall TPDocControl::SetDesign(bool Value) { if (FDesign != Value) { FDesign = Value; Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocControl::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 TPDocControl::SetSheet(TPDocSheet *Value) { if (FSheet != Value) { FSheet = Value; Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocControl::SetPosX(LONG Value) { if (ViewStatus.Position.x != Value) { ViewStatus.Position.x = Value - (Value % FGridSpace); Refresh(); } } //--------------------------------------------------------------------------- void __fastcall TPDocControl::SetPosY(LONG Value) { if (ViewStatus.Position.y != Value) { ViewStatus.Position.y = Value - (Value % FGridSpace); Refresh(); } } //--------------------------------------------------------------------------- // Protected Function //--------------------------------------------------------------------------- void __fastcall TPDocControl::Paint() { TPDocElement *dp; RECT r, tr; HDC dcSrc, dcMemV = NULL, dcForm = NULL; HBITMAP bmMemV = NULL; int x, y, w, h; if (ComponentState.Contains(csDesigning)) { // TGraphicControl::Canvas->Pen->Style = psDash; // TGraphicControl::Canvas->Brush->Style = bsClear; // TGraphicControl::Canvas->Rectangle(0, 0, Width, Height); TCustomControl::Canvas->Pen->Style = psDash; TCustomControl::Canvas->Brush->Style = bsClear; TCustomControl::Canvas->Rectangle(0, 0, Width, Height); } else { if (Width<=0 || Height<=0) return; // dcSrc = TGraphicControl::Canvas->Handle; dcSrc = TCustomControl::Canvas->Handle; try { w = Width * ViewStatus.ZoomOut / ViewStatus.ZoomIn; h = Height * ViewStatus.ZoomOut / ViewStatus.ZoomIn; 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 * ViewStatus.ZoomIn / ViewStatus.ZoomOut > 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); 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); /*//============================================================ if (dp->Type != detArrow) { dp->PaintReport(FSheet, dcMemV, ViewStatus, false); } else { dp->PaintReport(FSheet, dcMemV, ViewStatus, dp == SelectElement); } *///============================================================ } } } if (FOnEditPaint) FOnEditPaint(this, dcMemV); BitBlt(dcSrc, 0, 0, Width, Height, dcMemV, 0, 0, SRCCOPY); } } __finally { if (dcForm) FSheet->Bitmap->DeleteDC(dcForm); if (dcMemV) DeleteDC(dcMemV); if (bmMemV) DeleteObject(bmMemV); } } } //--------------------------------------------------------------------------- void __fastcall TPDocControl::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 (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); SelectElement->ControlModeMouseMove(TCustomControl::Canvas->Handle, ViewStatus, X, Y); } else { TControl::MouseDown(Button, Shift, X, Y); } } //--------------------------------------------------------------------- void __fastcall TPDocControl::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) { 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(TCustomControl::Canvas->Handle, ViewStatus, X, Y); } else { TControl::MouseMove(Shift, X, Y); } } //--------------------------------------------------------------------- void __fastcall TPDocControl::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 TPDocControl::RemoveData() { SelectElement = NULL; FSheet->RemoveData(); Refresh(); } //--------------------------------------------------------------------------- void __fastcall TPDocControl::RemoveSelect() { FSheet->RemoveData(SelectElement); SelectElement = NULL; dcm = dcmNone; Refresh(); } //--------------------------------------------------------------------------- bool __fastcall TPDocControl::Select(POINT pt) { SelectElement = FSheet->Select(pt); Refresh(); return SelectElement != NULL; } //--------------------------------------------------------------------------- void __fastcall TPDocControl::SetPosition(int x, int y) { ViewStatus.Position.x = x; ViewStatus.Position.y = y; Refresh(); } //--------------------------------------------------------------------------- HDC __fastcall TPDocControl::GetHandle() { // return TGraphicControl::Canvas->Handle; return TCustomControl::Canvas->Handle; } //--------------------------------------------------------------------------- void __fastcall TPDocControl::SetZoom(int zi, int zo) { if (ViewStatus.ZoomIn != zi || ViewStatus.ZoomOut != zo) { ViewStatus.ZoomIn = zi; ViewStatus.ZoomOut = zo; Refresh(); } } //--------------------------------------------------------------------------- TPDocElement * __fastcall TPDocControl::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; } //--------------------------------------------------------------------------- RECT __fastcall TPDocControl::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; } //--------------------------------------------------------------------------- namespace Tpdoccontrol { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TPDocControl)}; RegisterComponents("Texpia", classes, 0); } } //---------------------------------------------------------------------------