sparta: fix designer not receiving key events. Issue #29044

git-svn-id: trunk@51145 -
This commit is contained in:
ondrej 2016-01-03 12:07:22 +00:00
parent cdfb590aee
commit 44161ce987
3 changed files with 117 additions and 28 deletions

View File

@ -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}

View File

@ -50,6 +50,7 @@ begin
GlobalDesignHook.AddHandlerShowMethod(TSpartaMainIDE.OnShowMethod);
GlobalDesignHook.AddHandlerRefreshPropertyValues(TSpartaMainIDE.OnDesignRefreshPropertyValues);
GlobalDesignHook.AddHandlerMouseDown(TSpartaMainIDE.OnDesignMouseDown);
IDETabMaster := TDTXTabMaster.Create;
IDEComponentsMaster := TDTXComponentsMaster.Create;

View File

@ -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;