From 6d6f3c6f62797f31040b2e11ec347f890b2db533 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 25 Apr 2018 20:49:53 +0000 Subject: [PATCH] jvcllaz: Add TJvMovablePanel git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6356 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../jvcllaz/design/JvCtrls/JvCtrlsReg.pas | 2 +- .../jvcllaz/design/JvCtrls/images/images.txt | 1 + .../design/JvCtrls/images/tjvmovablepanel.png | Bin 0 -> 373 bytes components/jvcllaz/resource/jvctrlsreg.res | Bin 10188 -> 10624 bytes .../jvcllaz/run/JvCtrls/JvMovableBevel.pas | 271 +++++++++++++++--- 5 files changed, 240 insertions(+), 34 deletions(-) create mode 100644 components/jvcllaz/design/JvCtrls/images/tjvmovablepanel.png diff --git a/components/jvcllaz/design/JvCtrls/JvCtrlsReg.pas b/components/jvcllaz/design/JvCtrls/JvCtrlsReg.pas index 548d1bf19..4efb5ac93 100644 --- a/components/jvcllaz/design/JvCtrls/JvCtrlsReg.pas +++ b/components/jvcllaz/design/JvCtrls/JvCtrlsReg.pas @@ -22,7 +22,7 @@ uses procedure Register; begin RegisterComponents(RsPaletteJvcl, [ - TJvMovableBevel, TJvRuler, + TJvMovableBevel, TJvMovablePanel, TJvRuler, TJvHint, TJvHTLabel, TJvHTListbox, TJvHTCombobox ]); { diff --git a/components/jvcllaz/design/JvCtrls/images/images.txt b/components/jvcllaz/design/JvCtrls/images/images.txt index 54cd5fac2..7108a785b 100644 --- a/components/jvcllaz/design/JvCtrls/images/images.txt +++ b/components/jvcllaz/design/JvCtrls/images/images.txt @@ -3,4 +3,5 @@ tjvhtcombobox.bmp tjvhtlabel.bmp tjvhtlistbox.bmp tjvmovablebevel.bmp +tjvmovablepanel.png tjvruler.bmp diff --git a/components/jvcllaz/design/JvCtrls/images/tjvmovablepanel.png b/components/jvcllaz/design/JvCtrls/images/tjvmovablepanel.png new file mode 100644 index 0000000000000000000000000000000000000000..66e44cedaf02503da0a2545c447a368bb929c781 GIT binary patch literal 373 zcmV-*0gC>KP)R7l6QmCccaAP|Kg*4P)fOkq83C>w(3JrUI8U;=Y86k?bv zE}+$WV(d}ymwBhQ(D%VZ8fAJgf*NFz5q0rN^9k@Fa{#zW^T*@w3hPTqwBi*eFZZS5r}A)`5Y7j7qOY-GLHgsnnxoF3j2`CT51@E zV*qAen8fzVId?6hH96-%MCT(4A8(0>V69Dpk`c+}Z^h)jkD8k+5y?GBnXg7Pj^pa@ zYpq?(Jk(}SM0?N1S5-|fRu!N%0G$RLF`qhII?7@#=cCPT8duwZGc9BF92n6Ca+$vX zMqC#2e!eNKU$H2)gsR?vaZ(1r-!}v59U$vluKQOher>K?NzpWYmdiaD&tv)rrkeP8 TW>Cw$00000NkvXXu0mjfw#l6R literal 0 HcmV?d00001 diff --git a/components/jvcllaz/resource/jvctrlsreg.res b/components/jvcllaz/resource/jvctrlsreg.res index f8f14fa63e575c4ff6130e9d5a9dce50a2defede..f21e41d82f96f7e17014b46b2c6cfcf1c85e0bf6 100644 GIT binary patch delta 442 zcmX@(-w?dPL{YPpk%7U6fq~)we=dd)1}}y%244n$AnC~9#Nfl=$`Al#`2lI4$$^T( z^_>BJ?z~)5TtE%Ho*phiKw1KXIoN>YgL2y+K#H@#BeIx*f$s(|D`W7IgFlCs_CSy3?D#q$mlJ4`xXY-`OZ#Nk0CV!QYxX4yCb3cPy zjM(S8eVS|IH)?EcS#__WFo^BIeRJklvI?)G*ZmIHtjk>&<9X4fcG_uMiSx<7*q6=v hQIQsKdM_{}89ZJ6T-G@yGy$0zzz{arY^gYz4FGOmtQG(O delta 16 YcmZn&KI6Z^L~-&5VV2Erl%}u&06pmj=>Px# diff --git a/components/jvcllaz/run/JvCtrls/JvMovableBevel.pas b/components/jvcllaz/run/JvCtrls/JvMovableBevel.pas index 8a31dd30d..2c5a8e5b1 100644 --- a/components/jvcllaz/run/JvCtrls/JvMovableBevel.pas +++ b/components/jvcllaz/run/JvCtrls/JvMovableBevel.pas @@ -31,7 +31,6 @@ interface uses SysUtils, Classes, Controls, Forms, ExtCtrls; -// JvExExtCtrls; type TJvBevelScrollTextDirection = (tdNone, tdUpToDown, tdDownToUp, tdLeftToRight, @@ -73,9 +72,47 @@ type property OnSized: TNotifyEvent read FOnSized write FOnSized; end; + TJvMovablePanel = class(TPanel) + private + FStartX: Integer; + FStartY: Integer; + FStartPoint: TPoint; + FMinSize: Integer; + FMoving: Boolean; // If True then we are moving the object around. + FSizing: Boolean; // if True then we are sizing the object; + FDirection: TJvBevelScrollTextDirection; + FBorderSize: Byte; + FOnMoving: TNotifyEvent; + FOnMoved: TNotifyEvent; + FOnSizing: TNotifyEvent; + FOnSized: TNotifyEvent; + protected + procedure DoMove(Shift: TShiftState; DeltaX, DeltaY: Integer); + procedure DoSize(Shift: TShiftState; DeltaX, DeltaY: Integer); + procedure SelectCursor(X, Y: Integer); + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseEnter; override; + procedure MouseLeave; override; + public + constructor Create(AOwner: TComponent); override; + published + property BorderSize: Byte read FBorderSize write FBorderSize default 4; + property OnMoving: TNotifyEvent read FOnMoving write FOnMoving; + property OnSizing: TNotifyEvent read FOnSizing write FOnSizing; + property OnMoved: TNotifyEvent read FOnMoved write FOnMoved; + property OnSized: TNotifyEvent read FOnSized write FOnSized; + end; + implementation + +//=== TJvMovableBevel ========================================================== + constructor TJvMovableBevel.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -253,7 +290,6 @@ begin inherited MouseDown(Button, Shift, X, Y); end; - procedure TJvMovableBevel.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin @@ -351,31 +387,6 @@ begin inherited MouseEnter; end; -(* -procedure TJvMovableBevel.MouseEnter(Control: TControl); -var - Pos: TPoint; -begin - if csDesigning in ComponentState then - Exit; - Pos := ScreenToClient(Mouse.CursorPos); - SelectCursor(Pos.X, Pos.Y); - inherited MouseEnter(Control); -end; - -procedure TJvMovableBevel.MouseLeave(Control: TControl); -begin - if csDesigning in ComponentState then - Exit; - if (not FMoving) and (not FSizing) then - begin - Screen.Cursor := crDefault; - FDirection := tdNone; - end; - inherited MouseLeave(Control); -end; - *) - procedure TJvMovableBevel.MouseLeave; begin if csDesigning in ComponentState then @@ -388,12 +399,206 @@ begin inherited MouseLeave; end; -{$IFDEF UNITVERSIONING} -initialization - RegisterUnitVersion(HInstance, UnitVersioning); -finalization - UnregisterUnitVersion(HInstance); -{$ENDIF UNITVERSIONING} +//=== TJvMovablePanel ========================================================== + +constructor TJvMovablePanel.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FBorderSize := 4; + FMinSize := 8; +end; + +procedure TJvMovablePanel.DoMove(Shift: TShiftState; DeltaX, DeltaY: Integer); +begin + Top := Top + DeltaY; + Left := Left + DeltaX; +end; + +procedure TJvMovablePanel.DoSize(Shift: TShiftState; DeltaX, DeltaY: Integer); +begin + case FDirection of + tdUpToDown: + begin + Height := Height + DeltaY; + Top := Top - DeltaY; + end; + tdDownToUp: + Height := FStartY - DeltaY; + tdLeftToRight: + begin + Width := Width + DeltaX; + Left := Left - DeltaX; + end; + tdRightToLeft: + Width := FStartX - DeltaX; + tdTopLeftToBottomRight: + begin + Top := Top - DeltaY; + Left := Left - DeltaX; + Height := Height + DeltaY; + Width := Width + DeltaX; + end; + tdTopRightToBottomLeft: + begin + Height := Height + DeltaY; + Width := FStartX - DeltaX; + Top := Top - DeltaY; + end; + tdBottomLeftToTopRight: + begin + Left := Left - DeltaX; + Height := FStartY - DeltaY; + Width := Width + DeltaX; + end; + tdBottomRightToTopLeft: + begin + Height := FStartY - DeltaY; + Width := FStartX - DeltaX; + end; + end; +end; + +procedure TJvMovablePanel.SelectCursor(X, Y: longint); +begin + if (Y > 0) and (Y <= FBorderSize) then + begin + if (X > 0) and (X <= FBorderSize) then + begin + Screen.Cursor := crSizeNWSE; + FDirection := tdTopLeftToBottomRight; + end + else + if (X >= Width - FBorderSize) and (X < Width) then + begin + Screen.Cursor := crSizeNESW; + FDirection := tdTopRightToBottomLeft; + end + else + begin + Screen.Cursor := crSizeNS; + FDirection := tdUpToDown; + end; + end + else + if (Y >= Height - FBorderSize) and (Y < Height) then + begin + if (X > 0) and (X <= FBorderSize) then + begin + Screen.Cursor := crSizeNESW; + FDirection := tdBottomLeftToTopRight; + end + else + if (X >= Width - FBorderSize) and (X < Width) then + begin + Screen.Cursor := crSizeNWSE; + FDirection := tdBottomRightToTopLeft; + end + else + begin + Screen.Cursor := crSizeNS; + FDirection := tdDownToUp; + end; + end + else + if (X >= 1) and (X <= FBorderSize) then + begin + Screen.Cursor := crSizeWE; + FDirection := tdLeftToRight; + end + else + if (X >= Width - FBorderSize) and (X < Width) then + begin + Screen.Cursor := crSizeWE; + FDirection := tdRightToLeft; + end + else + begin + Screen.Cursor := crDefault; + FDirection := tdNone; + end +end; + +procedure TJvMovablePanel.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + if FMoving then + DoMove(Shift, X - FStartX, Y - FStartY) + else + if FSizing then + DoSize(Shift, FStartX - X, FStartY - Y) + else + SelectCursor(X, Y); + inherited MouseMove(Shift, X, Y); +end; + +procedure TJvMovablePanel.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + if FDirection > tdNone then + begin + FSizing := True; + if Assigned(FOnSizing) then + FOnSizing(Self); + end + else + begin + FMoving := True; + if Assigned(FOnMoving) then + FOnMoving(Self); + end; + FStartPoint := Point(Left, Top); + FStartX := X; + FStartY := Y; + inherited MouseDown(Button, Shift, X, Y); +end; + + +procedure TJvMovablePanel.MouseUp(Button: TMouseButton; Shift: TShiftState; +X, Y: Integer); +begin + SelectCursor(X, Y); + FStartX := 0; + FStartY := 0; + if Height < 0 then + begin + Top := Top + Height; + Height := Abs(Height); + end; + if Width < 0 then + begin + Left := Left + Width; + Width := Abs(Width); + end; + inherited MouseUp(Button, Shift, X, Y); + if FMoving and Assigned(FOnMoved) then + FOnMoved(Self); + if FSizing and Assigned(FOnSized) then + FOnSized(Self); + FMoving := False; + FSizing := False; +end; + +procedure TJvMovablePanel.MouseEnter; +var + Pos: TPoint; +begin + if csDesigning in ComponentState then + Exit; + Pos := ScreenToClient(Mouse.CursorPos); + SelectCursor(Pos.X, Pos.Y); + inherited MouseEnter; +end; + +procedure TJvMovablePanel.MouseLeave; +begin + if csDesigning in ComponentState then + Exit; + if (not FMoving) and (not FSizing) then + begin + Screen.Cursor := crDefault; + FDirection := tdNone; + end; + inherited MouseLeave; +end; end.