mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-08 10:39:15 +02:00
sparta: fix designer not receiving key events. Issue #29044
git-svn-id: trunk@51145 -
This commit is contained in:
parent
cdfb590aee
commit
44161ce987
@ -164,6 +164,7 @@ type
|
||||
|
||||
TSpartaMainIDE = class(TObject)
|
||||
public
|
||||
class function GetCurrentResizer: TResizer;
|
||||
class procedure TryFreeFormData(Form: TCustomForm);
|
||||
|
||||
class procedure Screen_FormAdded(Sender: TObject; Form: TCustomForm);
|
||||
@ -192,6 +193,9 @@ type
|
||||
class procedure OnShowMethod(const Name: String);
|
||||
class procedure OnDesignRefreshPropertyValues;
|
||||
class procedure OnMenuChanged;
|
||||
class procedure DesignerSetFocus;
|
||||
class procedure OnDesignMouseDown(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X, Y: Integer);
|
||||
end;
|
||||
|
||||
var
|
||||
@ -530,11 +534,6 @@ begin
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
case TheMessage.Msg of
|
||||
LM_LBUTTONDOWN, LM_RBUTTONDOWN, LM_MBUTTONDOWN, LM_XBUTTONDOWN:
|
||||
Form.Form.SetFocus; // set focus to form so that it receives key messages (Issue #29044)
|
||||
end;
|
||||
|
||||
FWndMethod(TheMessage);
|
||||
end;
|
||||
|
||||
@ -1121,6 +1120,15 @@ begin
|
||||
LDesignedForm.HideWindow;
|
||||
end;
|
||||
|
||||
class procedure TSpartaMainIDE.DesignerSetFocus;
|
||||
var
|
||||
LResizer: TResizer;
|
||||
begin
|
||||
LResizer := GetCurrentResizer;
|
||||
if LResizer<>nil then
|
||||
LResizer.FResizerFrame.DesignerSetFocus;
|
||||
end;
|
||||
|
||||
class procedure TSpartaMainIDE.EditorActivated(Sender: TObject);
|
||||
var
|
||||
LDesigner: TIDesigner;
|
||||
@ -1316,6 +1324,22 @@ begin
|
||||
LastActiveSourceEditor := nil;
|
||||
end;
|
||||
|
||||
class function TSpartaMainIDE.GetCurrentResizer: TResizer;
|
||||
var
|
||||
LForm: TCustomForm;
|
||||
LFormData: TDesignFormData;
|
||||
LSourceWindow: TSourceEditorWindowInterface;
|
||||
LPageCtrl: TModulePageControl;
|
||||
begin
|
||||
Result := nil;
|
||||
LForm := TCustomForm(GlobalDesignHook.LookupRoot);
|
||||
LFormData := FindDesignFormData(LForm);
|
||||
if LFormData=nil then Exit;
|
||||
LSourceWindow := (LFormData as IDesignedForm).LastActiveSourceWindow;
|
||||
LPageCtrl := FindModulePageControl(LSourceWindow);
|
||||
Result := LPageCtrl.Resizer;
|
||||
end;
|
||||
|
||||
class procedure TSpartaMainIDE.EditorCreate(Sender: TObject);
|
||||
|
||||
var
|
||||
@ -1525,22 +1549,19 @@ begin
|
||||
LWindowData.OnChangeBounds(Sender);
|
||||
end;
|
||||
|
||||
class procedure TSpartaMainIDE.OnDesignMouseDown(Sender: TObject;
|
||||
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
DesignerSetFocus;
|
||||
end;
|
||||
|
||||
class procedure TSpartaMainIDE.OnMenuChanged;
|
||||
var
|
||||
LForm: TCustomForm;
|
||||
LFormData: TDesignFormData;
|
||||
LSourceWindow: TSourceEditorWindowInterface;
|
||||
LPageCtrl: TModulePageControl;
|
||||
LResizer: TResizer;
|
||||
begin
|
||||
if (GlobalDesignHook.LookupRoot is TCustomForm) then
|
||||
begin
|
||||
LForm := TCustomForm(GlobalDesignHook.LookupRoot);
|
||||
LFormData := FindDesignFormData(LForm);
|
||||
LSourceWindow := (LFormData as IDesignedForm).LastActiveSourceWindow;
|
||||
LPageCtrl := FindModulePageControl(LSourceWindow);
|
||||
if LPageCtrl.Resizer<>nil then
|
||||
LPageCtrl.Resizer.FResizerFrame.OnMenuChanged;
|
||||
end;
|
||||
LResizer := GetCurrentResizer;
|
||||
if LResizer<>nil then
|
||||
LResizer.FResizerFrame.OnMenuChanged;
|
||||
end;
|
||||
|
||||
{$IFDEF USE_POPUP_PARENT_DESIGNER}
|
||||
|
@ -50,6 +50,7 @@ begin
|
||||
|
||||
GlobalDesignHook.AddHandlerShowMethod(TSpartaMainIDE.OnShowMethod);
|
||||
GlobalDesignHook.AddHandlerRefreshPropertyValues(TSpartaMainIDE.OnDesignRefreshPropertyValues);
|
||||
GlobalDesignHook.AddHandlerMouseDown(TSpartaMainIDE.OnDesignMouseDown);
|
||||
|
||||
IDETabMaster := TDTXTabMaster.Create;
|
||||
IDEComponentsMaster := TDTXComponentsMaster.Create;
|
||||
|
@ -17,8 +17,9 @@ unit sparta_ResizerFrame;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, contnrs, SysUtils, FileUtil, Forms, Controls, ExtCtrls, StdCtrls, Graphics, LCLType,
|
||||
lclintf, Menus, sparta_DesignedForm, Math, Types, FormEditingIntf, PropEdits;
|
||||
Classes, contnrs, SysUtils, FileUtil, Forms, Controls, ExtCtrls, StdCtrls,
|
||||
Graphics, LCLType, lclintf, Menus, LMessages, sparta_DesignedForm, Math,
|
||||
Types, FormEditingIntf, PropEdits;
|
||||
|
||||
type
|
||||
|
||||
@ -52,7 +53,11 @@ type
|
||||
FHorizontalScrollPos: Integer;
|
||||
FDesignedForm: IDesignedForm;
|
||||
FBackground: IDesignedFormBackground;
|
||||
FFakeFocusControl: TWinControl;
|
||||
|
||||
procedure FakeExitEnter(Sender: TObject);
|
||||
procedure FakeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
||||
procedure FakeKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
|
||||
procedure SetDesignedForm(const AValue: IDesignedForm);
|
||||
private
|
||||
{ private declarations }
|
||||
@ -129,6 +134,7 @@ type
|
||||
procedure ShowSizeControls;
|
||||
|
||||
procedure OnMenuChanged;
|
||||
procedure DesignerSetFocus;
|
||||
|
||||
property VerticalScrollPos: Integer read FVerticalScrollPos write FVerticalScrollPos;
|
||||
property HorizontalScrollPos: Integer read FHorizontalScrollPos write FHorizontalScrollPos;
|
||||
@ -217,17 +223,31 @@ begin
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.PanelPaint(Sender: TObject);
|
||||
var
|
||||
LWidth, LHeight: Integer;
|
||||
LOldColor: TColor;
|
||||
LCanvas: TCanvas;
|
||||
begin
|
||||
if FNodePositioning then
|
||||
Exit;
|
||||
if Sender = pR then
|
||||
TileImage(iResizerLineImg, pR.Canvas, 0, 0, SIZER_LINE_WIDTH, Height)
|
||||
else if Sender = pB then
|
||||
TileImage(iResizerLineImg, pB.Canvas, 0, 0, Width, SIZER_LINE_WIDTH)
|
||||
else if Sender = pL then
|
||||
TileImage(iResizerLineImg, pL.Canvas, 0, 0, SIZER_LINE_WIDTH, Height)
|
||||
else if Sender = pT then
|
||||
TileImage(iResizerLineImg, pT.Canvas, 0, 0, Width, SIZER_LINE_WIDTH);
|
||||
if (Sender = pR) or (Sender = pL) then
|
||||
begin
|
||||
LWidth := SIZER_LINE_WIDTH;
|
||||
LHeight := Height;
|
||||
end else
|
||||
begin
|
||||
LWidth := Width;
|
||||
LHeight := SIZER_LINE_WIDTH;
|
||||
end;
|
||||
LCanvas := (Sender as TPanel).Canvas;
|
||||
if FFakeFocusControl.Focused then
|
||||
begin
|
||||
LOldColor := LCanvas.Brush.Color;
|
||||
LCanvas.Brush.Color := $FFEEDD;
|
||||
LCanvas.FillRect(0, 0, LWidth, LHeight);
|
||||
LCanvas.Brush.Color := LOldColor;
|
||||
end;
|
||||
TileImage(iResizerLineImg, LCanvas, 0, 0, LWidth, LHeight);
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.pBGPaint(Sender: TObject);
|
||||
@ -752,6 +772,11 @@ begin
|
||||
//Result := DesignedForm.Width - DesignedForm.RealWidth;
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.DesignerSetFocus;
|
||||
begin
|
||||
FFakeFocusControl.SetFocus;
|
||||
end;
|
||||
|
||||
function TResizerFrame.DesignedHeightToScroll: Integer;
|
||||
begin
|
||||
if DesignedForm = nil then
|
||||
@ -767,6 +792,14 @@ constructor TResizerFrame.Create(TheOwner: TComponent);
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
|
||||
FFakeFocusControl := TEdit.Create(Self);
|
||||
FFakeFocusControl.Parent := Self;
|
||||
FFakeFocusControl.Top := -100;
|
||||
FFakeFocusControl.OnKeyDown := FakeKeyDown;
|
||||
FFakeFocusControl.OnKeyUp := FakeKeyUp;
|
||||
FFakeFocusControl.OnEnter := FakeExitEnter;
|
||||
FFakeFocusControl.OnExit := FakeExitEnter;
|
||||
|
||||
FNodes := TObjectList.Create(False);
|
||||
CreateNodes;
|
||||
|
||||
@ -800,6 +833,40 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.FakeExitEnter(Sender: TObject);
|
||||
begin
|
||||
pL.Repaint;
|
||||
pT.Repaint;
|
||||
pR.Repaint;
|
||||
pB.Repaint;
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.FakeKeyDown(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
var
|
||||
LWndProc: TWndMethod;
|
||||
LMsg: TLMKeyUp;
|
||||
begin
|
||||
LWndProc := FDesignedForm.Form.WindowProc;
|
||||
LMsg.msg := CN_KEYDOWN;
|
||||
LMsg.CharCode := Key;
|
||||
LWndProc(TLMessage(LMsg));
|
||||
Key := 0;
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.FakeKeyUp(Sender: TObject; var Key: Word;
|
||||
Shift: TShiftState);
|
||||
var
|
||||
LWndProc: TWndMethod;
|
||||
LMsg: TLMKeyUp;
|
||||
begin
|
||||
LWndProc := FDesignedForm.Form.WindowProc;
|
||||
LMsg.msg := CN_KEYUP;
|
||||
LMsg.CharCode := Key;
|
||||
LWndProc(TLMessage(LMsg));
|
||||
Key := 0;
|
||||
end;
|
||||
|
||||
procedure TResizerFrame.PositionNodes(AroundControl: TWinControl);
|
||||
var
|
||||
Node,T,L,CT,CL,FR,FB,FT,FL: Integer;
|
||||
|
Loading…
Reference in New Issue
Block a user