diff --git a/designer/designer.pp b/designer/designer.pp index 3004d60baa..27ce6552d3 100644 --- a/designer/designer.pp +++ b/designer/designer.pp @@ -138,7 +138,7 @@ type MouseDownComponent: TComponent; MouseDownSender: TComponent; MouseDownPos: TPoint; - MouseDownClickCount: integer; + MouseDownShift: TShiftState; MouseUpPos: TPoint; LastMouseMovePos: TPoint; PopupMenuComponentEditor: TBaseComponentEditor; @@ -158,6 +158,8 @@ type procedure KeyDown(Sender: TControl; var TheMessage: TLMKEY); procedure KeyUp(Sender: TControl; var TheMessage: TLMKEY); function HandleSetCursor(var TheMessage: TLMessage): boolean; + procedure GetMouseMsgShift(TheMessage: TLMMouse; var Shift: TShiftState; + var Button: TMouseButton); // procedures for working with components and persistents function GetDesignControl(AControl: TControl): TControl; @@ -1253,6 +1255,45 @@ begin end; end; +procedure TDesigner.GetMouseMsgShift(TheMessage: TLMMouse; + var Shift: TShiftState; var Button: TMouseButton); +begin + Shift := []; + if (TheMessage.keys and MK_Shift) = MK_Shift then + Include(Shift,ssShift); + if (TheMessage.keys and MK_Control) = MK_Control then + Include(Shift,ssCtrl); + + case TheMessage.Msg of + LM_LBUTTONUP,LM_LBUTTONDBLCLK,LM_LBUTTONTRIPLECLK,LM_LBUTTONQUADCLK: + begin + Include(Shift,ssLeft); + Button:=mbLeft; + end; + LM_MBUTTONUP,LM_MBUTTONDBLCLK,LM_MBUTTONTRIPLECLK,LM_MBUTTONQUADCLK: + begin + Include(Shift,ssMiddle); + Button:=mbMiddle; + end; + LM_RBUTTONUP,LM_RBUTTONDBLCLK,LM_RBUTTONTRIPLECLK,LM_RBUTTONQUADCLK: + begin + Include(Shift,ssRight); + Button:=mbRight; + end; + else + Button:=mbExtra1; + end; + + case TheMessage.Msg of + LM_LBUTTONDBLCLK,LM_MBUTTONDBLCLK,LM_RBUTTONDBLCLK: + Include(Shift,ssDouble); + LM_LBUTTONTRIPLECLK,LM_MBUTTONTRIPLECLK,LM_RBUTTONTRIPLECLK: + Include(Shift,ssTriple); + LM_LBUTTONQUADCLK,LM_MBUTTONQUADCLK,LM_RBUTTONQUADCLK: + Include(Shift,ssQuad); + end; +end; + function TDesigner.GetDesignControl(AControl: TControl): TControl; // checks if AControl is designable. // if not check Owner. @@ -1313,6 +1354,8 @@ var ParentForm: TCustomForm; Shift: TShiftState; DesignSender: TControl; + Button: TMouseButton; + Handled: Boolean; begin FHintTimer.Enabled := False; Exclude(FFLags, dfHasSized); @@ -1342,28 +1385,8 @@ begin end; MouseDownSender := DesignSender; - case TheMessage.Msg of - LM_LBUTTONDOWN, LM_MBUTTONDOWN, LM_RBUTTONDOWN: - MouseDownClickCount := 1; - - LM_LBUTTONDBLCLK,LM_MBUTTONDBLCLK,LM_RBUTTONDBLCLK: - MouseDownClickCount := 2; - - LM_LBUTTONTRIPLECLK,LM_MBUTTONTRIPLECLK,LM_RBUTTONTRIPLECLK: - MouseDownClickCount := 3; - - LM_LBUTTONQUADCLK,LM_MBUTTONQUADCLK,LM_RBUTTONQUADCLK: - MouseDownClickCount := 4; - else - MouseDownClickCount := 1; - end; - - Shift := []; - if (TheMessage.keys and MK_Shift) = MK_Shift then - Include(Shift, ssShift); - if (TheMessage.keys and MK_Control) = MK_Control then - Include(Shift, ssCtrl); - + GetMouseMsgShift(TheMessage,Shift,Button); + MouseDownShift:=Shift; {$IFDEF VerboseDesigner} DebugLn('************************************************************'); @@ -1384,9 +1407,15 @@ begin DebugLn(', No CTRL down'); {$ENDIF} + if Mediator<>nil then begin + Handled:=false; + Mediator.MouseDown(Button,Shift,MouseDownPos,Handled); + if Handled then exit; + end; + SelectedCompClass := GetSelectedComponentClass; - if (TheMessage.Keys and MK_LButton) > 0 then begin + if Button=mbLeft then begin // left button // -> check if a grabber was activated ControlSelection.ActiveGrabber:= @@ -1460,6 +1489,7 @@ procedure TDesigner.MouseUpOnControl(Sender : TControl; var ParentCI, NewCI: TComponentInterface; NewLeft, NewTop, NewWidth, NewHeight: Integer; + Button: TMouseButton; Shift: TShiftState; SenderParentForm: TCustomForm; RubberBandWasActive: boolean; @@ -1468,28 +1498,6 @@ var SelectionChanged, NewRubberbandSelection: boolean; DesignSender: TControl; - procedure GetShift; - begin - Shift := []; - if (TheMessage.keys and MK_Shift) = MK_Shift then - Include(Shift,ssShift); - if (TheMessage.keys and MK_Control) = MK_Control then - Include(Shift,ssCtrl); - - case TheMessage.Msg of - LM_LBUTTONUP: Include(Shift,ssLeft); - LM_MBUTTONUP: Include(Shift,ssMiddle); - LM_RBUTTONUP: Include(Shift,ssRight); - end; - - if MouseDownClickCount=2 then - Include(Shift,ssDouble); - if MouseDownClickCount=3 then - Include(Shift,ssTriple); - if MouseDownClickCount=4 then - Include(Shift,ssQuad); - end; - procedure AddComponent; var NewParent: TComponent; @@ -1665,7 +1673,7 @@ var begin // select only the mouse down component ControlSelection.AssignPersistent(MouseDownComponent); - if (MouseDownClickCount = 2) and (ControlSelection.SelectionForm = Form) then + if (ssDouble in MouseDownShift) and (ControlSelection.SelectionForm = Form) then begin // Double Click -> invoke 'Edit' of the component editor FShiftState := Shift; @@ -1682,6 +1690,8 @@ var end; end; +var + Handled: Boolean; Begin FHintTimer.Enabled := False; SetCaptureControl(nil); @@ -1705,7 +1715,7 @@ Begin RubberBandWasActive:=ControlSelection.RubberBandActive; SelectedCompClass:=GetSelectedComponentClass; - GetShift; + GetMouseMsgShift(TheMessage,Shift,Button); MouseUpPos:=GetFormRelativeMousePosition(Form); {$IFDEF VerboseDesigner} @@ -1716,7 +1726,13 @@ Begin DebugLn(''); {$ENDIF} - if TheMessage.Msg=LM_LBUTTONUP then begin + if Mediator<>nil then begin + Handled:=false; + Mediator.MouseUp(Button,Shift,MouseUpPos,Handled); + if Handled then exit; + end; + + if Button=mbLeft then begin if SelectedCompClass = nil then begin // layout mode (selection, moving and resizing) if not (dfHasSized in FFlags) then begin @@ -1733,7 +1749,7 @@ Begin // create new a component on the form AddComponent; end; - end else if TheMessage.Msg=LM_RBUTTONUP then begin + end else if Button=mbRight then begin // right click -> popup menu DisableRubberBand; if EnvironmentOptions.RightClickSelects @@ -1763,6 +1779,7 @@ end; procedure TDesigner.MouseMoveOnControl(Sender: TControl; var TheMessage: TLMMouse); var + Button: TMouseButton; Shift : TShiftState; SenderParentForm:TCustomForm; OldMouseMovePos: TPoint; @@ -1771,13 +1788,15 @@ var SelectedCompClass: TRegisteredComponent; CurSnappedMousePos, OldSnappedMousePos: TPoint; DesignSender: TControl; + Handled: Boolean; begin + GetMouseMsgShift(TheMessage,Shift,Button); + if [dfShowEditorHints]*FFlags<>[] then begin FHintTimer.Enabled := False; // hide hint - FHintTimer.Enabled := - (TheMessage.keys or (MK_LButton and MK_RButton and MK_MButton) = 0); + FHintTimer.Enabled := Shift*[ssLeft,ssRight,ssMiddle]=[]; if FHintWindow.Visible then FHintWindow.Visible := False; end; @@ -1792,6 +1811,12 @@ begin if (OldMouseMovePos.X=LastMouseMovePos.X) and (OldMouseMovePos.Y=LastMouseMovePos.Y) then exit; + if Mediator<>nil then begin + Handled:=false; + Mediator.MouseMove(Shift,LastMouseMovePos,Handled); + if Handled then exit; + end; + if ControlSelection.SelectionForm=Form then Grabber:=ControlSelection.GrabberAtPos( LastMouseMovePos.X, LastMouseMovePos.Y) @@ -1812,12 +1837,6 @@ begin exit; end; - Shift := []; - if (TheMessage.keys and MK_Shift) = MK_Shift then - Include(Shift,ssShift); - if (TheMessage.keys and MK_Control) = MK_Control then - Include(Shift,ssCtrl); - if (ControlSelection.SelectionForm=nil) or (ControlSelection.SelectionForm=Form) then begin diff --git a/ideintf/docs/formeditingintf.xml b/ideintf/docs/formeditingintf.xml index 27231f1c9c..b0c00cb5df 100644 --- a/ideintf/docs/formeditingintf.xml +++ b/ideintf/docs/formeditingintf.xml @@ -181,6 +181,13 @@ When you handled a key, set Key:=0. The designed Root component. + + + Called by the IDE before it handles a mouse move message + + + Called by the IDE before it handles a mouse up message + diff --git a/ideintf/formeditingintf.pas b/ideintf/formeditingintf.pas index 730f4bf4dc..12df783f9d 100644 --- a/ideintf/formeditingintf.pas +++ b/ideintf/formeditingintf.pas @@ -119,7 +119,6 @@ type procedure GetClientArea(AComponent: TComponent; out CurClientArea: TRect; out ScrollOffset: TPoint); virtual; function GetComponentOriginOnForm(AComponent: TComponent): TPoint; virtual; - procedure Paint; virtual; function ComponentIsIcon(AComponent: TComponent): boolean; virtual; function ParentAcceptsChild(Parent: TComponent; Child: TComponentClass): boolean; virtual; function ComponentIsVisible(AComponent: TComponent): Boolean; virtual; @@ -127,9 +126,16 @@ type function ComponentAtPos(p: TPoint; MinClass: TComponentClass; Flags: TDMCompAtPosFlags): TComponent; virtual; procedure GetChilds(Parent: TComponent; ChildComponents: TFPList); virtual; + + // events procedure InitComponent(AComponent, NewParent: TComponent; NewBounds: TRect); virtual; + procedure Paint; virtual; procedure KeyDown(Sender: TControl; var Key: word; Shift: TShiftState); virtual; procedure KeyUp(Sender: TControl; var Key: word; Shift: TShiftState); virtual; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; p: TPoint; var Handled: boolean); virtual; + procedure MouseMove(Shift: TShiftState; p: TPoint; var Handled: boolean); virtual; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; p: TPoint; var Handled: boolean); virtual; + property LCLForm: TForm read FLCLForm write SetLCLForm; property Designer: TComponentEditorDesigner read FDesigner write SetDesigner; property Root: TComponent read FRoot write SetRoot; @@ -541,5 +547,23 @@ begin end; +procedure TDesignerMediator.MouseDown(Button: TMouseButton; Shift: TShiftState; + p: TPoint; var Handled: boolean); +begin + +end; + +procedure TDesignerMediator.MouseMove(Shift: TShiftState; p: TPoint; + var Handled: boolean); +begin + +end; + +procedure TDesignerMediator.MouseUp(Button: TMouseButton; Shift: TShiftState; + p: TPoint; var Handled: boolean); +begin + +end; + end.