From 0f9be635f0715d0c176d65fb20211f584100042d Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 3 Jan 2008 15:39:34 +0000 Subject: [PATCH] - rethink DrawDefaultDockImage: add 3 dock image operation: show, hide and move - implement qt DrawDefaultDockImage git-svn-id: trunk@13608 - --- lcl/include/dragmanager.inc | 14 +++---- lcl/include/intfbaselcl.inc | 65 ++++++++++++++++++-------------- lcl/include/lclintf.inc | 4 +- lcl/include/lclintfh.inc | 2 +- lcl/interfaces/qt/qtint.pp | 1 + lcl/interfaces/qt/qtlclintf.inc | 14 ++++++- lcl/interfaces/qt/qtlclintfh.inc | 1 + lcl/interfaces/qt/qtobject.inc | 3 ++ lcl/lcltype.pp | 2 + 9 files changed, 66 insertions(+), 40 deletions(-) diff --git a/lcl/include/dragmanager.inc b/lcl/include/dragmanager.inc index 0f2f7ababa..843482847e 100644 --- a/lcl/include/dragmanager.inc +++ b/lcl/include/dragmanager.inc @@ -60,7 +60,7 @@ type TDockPerformer = class(TDragDockComon) private FDockObject: TDragDockObject; - procedure DefaultDockImage(ADrawRect: TRect; Erase: Boolean); + procedure DefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); protected function Dragging(AControl: TControl): boolean; override; procedure DragStarted(APosition: TPoint); override; @@ -304,7 +304,7 @@ begin FDragImageList := FDockObject.GetDragImages; if FDragImageList <> nil then FDragImageList.BeginDrag(0, APosition.X, APosition.Y); - DefaultDockImage(FDockObject.DockRect, False); + DefaultDockImage(FDockObject.EraseDockRect, FDockObject.DockRect, disShow); FDockObject.EraseDockRect := FDockObject.DockRect; end; @@ -467,9 +467,7 @@ begin //Draw the form outlines when the position has changed if not CompareMem(@DockRect, @EraseDockRect, SizeOf(TRect)) then begin - if EraseDockRect.Left <> Maxint then - DefaultDockImage(FDockObject.EraseDockRect, True); - DefaultDockImage(FDockObject.DockRect, False); + DefaultDockImage(FDockObject.EraseDockRect, FDockObject.DockRect, disMove); EraseDockRect := DockRect; end; end; @@ -489,7 +487,7 @@ begin FDockObject := nil; SetCaptureControl(nil); - DefaultDockImage(ADockObjectCopy.EraseDockRect, True); + DefaultDockImage(ADockObjectCopy.EraseDockRect, ADockObjectCopy.DockRect, disHide); ADockObjectCopy.Floating := ADockObjectCopy.DragTarget = nil; Accepted := ADockObjectCopy.DragTarget <> nil; @@ -545,9 +543,9 @@ begin end; -procedure TDockPerformer.DefaultDockImage(ADrawRect: TRect; Erase: Boolean); +procedure TDockPerformer.DefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); begin - WidgetSet.DrawDefaultDockImage(ADrawRect, Erase); + WidgetSet.DrawDefaultDockImage(AOldRect, ANewRect, AOperation); end; { TDragManagerDefault } diff --git a/lcl/include/intfbaselcl.inc b/lcl/include/intfbaselcl.inc index f95117ec84..37534f8e18 100644 --- a/lcl/include/intfbaselcl.inc +++ b/lcl/include/intfbaselcl.inc @@ -140,36 +140,45 @@ procedure TWidgetSet.DrawArrow(Arrow: TComponent; Canvas: TPersistent); begin end; -procedure TWidgetSet.DrawDefaultDockImage(ARect: TRect; Erase: Boolean); -const - PenSize=4; -var - DC: HDC; - OldPen, NewPen: HPen; - OldRop: Integer; - LogPen: TLogPen; -begin - LogPen.lopnColor := $00FFFFFF; - LogPen.lopnWidth := Point(PenSize, 0); - LogPen.lopnStyle := PS_SOLID; - DC := GetDC(0); - try - NewPen := CreatePenIndirect(LogPen); - OldPen := SelectObject(DC, NewPen); - OldRop := SetROP2(DC, R2_XORPEN); - with ARect do - begin - MoveToEx(DC, Left+PenSize, Top+PenSize, nil); - LineTo(DC, Right-PenSize,Top+PenSize); - LineTo(DC, Right-PenSize, Bottom-PenSize); - LineTo(DC, Left+PenSize,Bottom-PenSize); - LineTo(DC, Left+PenSize, Top+PenSize); +procedure TWidgetSet.DrawDefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); + + procedure DefaultDockImage(ARect: TRect); + const + PenSize=4; + var + DC: HDC; + OldPen, NewPen: HPen; + OldRop: Integer; + LogPen: TLogPen; + begin + LogPen.lopnColor := $00FFFFFF; + LogPen.lopnWidth := Point(PenSize, 0); + LogPen.lopnStyle := PS_SOLID; + DC := GetDC(0); + try + NewPen := CreatePenIndirect(LogPen); + OldPen := SelectObject(DC, NewPen); + OldRop := SetROP2(DC, R2_XORPEN); + with ARect do + begin + MoveToEx(DC, Left+PenSize, Top+PenSize, nil); + LineTo(DC, Right-PenSize,Top+PenSize); + LineTo(DC, Right-PenSize, Bottom-PenSize); + LineTo(DC, Left+PenSize,Bottom-PenSize); + LineTo(DC, Left+PenSize, Top+PenSize); + end; + finally + SetROP2(DC, OldRop); + DeleteObject(SelectObject(DC, OldPen)); + ReleaseDC(0, DC); end; - finally - SetROP2(DC, OldRop); - DeleteObject(SelectObject(DC, OldPen)); - ReleaseDC(0, DC); end; + +begin + if AOperation in [disMove, disHide] then + DefaultDockImage(AOldRect); + if AOperation in [disMove, disShow] then + DefaultDockImage(ANewRect); end; function TWidgetSet.ExtUTF8Out(DC: HDC; X, Y: Integer; Options: Longint; diff --git a/lcl/include/lclintf.inc b/lcl/include/lclintf.inc index 3ccc8f0e39..a0a4d42e4f 100644 --- a/lcl/include/lclintf.inc +++ b/lcl/include/lclintf.inc @@ -149,9 +149,9 @@ begin WidgetSet.DrawArrow(Arrow, Canvas); end; -procedure DrawDefaultDockImage(ARect: TRect; Erase: Boolean); +procedure DrawDefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); begin - WidgetSet.DrawDefaultDockImage(ARect, Erase); + WidgetSet.DrawDefaultDockImage(AOldRect, ANewRect, AOperation); end; function ExtUTF8Out(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; diff --git a/lcl/include/lclintfh.inc b/lcl/include/lclintfh.inc index 09956fa71e..e4474b302f 100644 --- a/lcl/include/lclintfh.inc +++ b/lcl/include/lclintfh.inc @@ -66,7 +66,7 @@ function CreateStandardCursor(ACursor: SmallInt): hCursor; {$IFDEF IF_BASE_MEMBE function DCClipRegionValid(DC: HDC): boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} procedure DeallocateHWnd(Wnd: HWND); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} procedure DrawArrow(Arrow: TComponent; Canvas: TPersistent); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} -procedure DrawDefaultDockImage(ARect: TRect; Erase: Boolean); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} +procedure DrawDefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function ExtUTF8Out(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; Str: PChar; Count: Longint; Dx: PInteger): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} diff --git a/lcl/interfaces/qt/qtint.pp b/lcl/interfaces/qt/qtint.pp index ed29e1a4e3..a9ae4935e7 100644 --- a/lcl/interfaces/qt/qtint.pp +++ b/lcl/interfaces/qt/qtint.pp @@ -60,6 +60,7 @@ type App: QApplicationH; SavedDCList: TList; FOldFocusWidget: QWidgetH; + FDockImage: QRubberBandH; protected FStockNullBrush: HBRUSH; FStockBlackBrush: HBRUSH; diff --git a/lcl/interfaces/qt/qtlclintf.inc b/lcl/interfaces/qt/qtlclintf.inc index 2438a8890b..9945b9480f 100644 --- a/lcl/interfaces/qt/qtlclintf.inc +++ b/lcl/interfaces/qt/qtlclintf.inc @@ -114,6 +114,18 @@ begin end; end; +procedure TQtWidgetSet.DrawDefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); +begin + if FDockImage = nil then + FDockImage := QRubberBand_create(QRubberBandRectangle); + + QRubberBand_setGeometry(FDockImage, @ANewRect); + case AOperation of + disShow: QWidget_show(FDockImage); + disHide: QWidget_hide(FDockImage); + end; +end; + {------------------------------------------------------------------------------ Function: FontCanUTF8 @@ -129,7 +141,7 @@ begin Result := False; {$endif} {$else} - Result := IsValidGDIObject(Font); + Result := IsValidGDIObject(Font); {$endif} end; diff --git a/lcl/interfaces/qt/qtlclintfh.inc b/lcl/interfaces/qt/qtlclintfh.inc index 3f8fb81411..7c82331325 100644 --- a/lcl/interfaces/qt/qtlclintfh.inc +++ b/lcl/interfaces/qt/qtlclintfh.inc @@ -32,6 +32,7 @@ function CreateStandardCursor(ACursor: SmallInt): hCursor; override; procedure DrawArrow(Arrow: TComponent; Canvas: TPersistent); override; +procedure DrawDefaultDockImage(AOldRect, ANewRect: TRect; AOperation: TDockImageOperation); override; function FontCanUTF8(Font: HFont): boolean; override; function FontIsMonoSpace(Font: HFont): boolean; override; diff --git a/lcl/interfaces/qt/qtobject.inc b/lcl/interfaces/qt/qtobject.inc index 4c626271fe..8c653950a6 100644 --- a/lcl/interfaces/qt/qtobject.inc +++ b/lcl/interfaces/qt/qtobject.inc @@ -29,6 +29,7 @@ begin InitStockItems; QtWidgetSet := Self; + FDockImage := nil; end; {------------------------------------------------------------------------------ @@ -40,6 +41,8 @@ end; ------------------------------------------------------------------------------} destructor TQtWidgetSet.Destroy; begin + if FDockImage <> nil then + QRubberBand_destroy(FDockImage); DestroyGlobalCaret; Clipboard.Free; FreeStockItems; diff --git a/lcl/lcltype.pp b/lcl/lcltype.pp index 3ce4fefb90..2b7ac5ff2e 100644 --- a/lcl/lcltype.pp +++ b/lcl/lcltype.pp @@ -67,6 +67,8 @@ type TCriticalSection = PtrUInt; PCriticalSection = ^TCriticalSection; + TDockImageOperation = (disShow, disMove, disHide); + {$ifndef WINDOWS} {$IFDEF CPU64} // temp solution for 32bit system.Thandle