cocoa: start work on sizing/positioning

git-svn-id: trunk@34128 -
This commit is contained in:
paul 2011-12-12 07:52:53 +00:00
parent 9c38c40343
commit 61a5e41099
2 changed files with 91 additions and 4 deletions

View File

@ -86,10 +86,15 @@ type
{ ICommonCallback }
ICommonCallback = interface
// mouse events
procedure MouseDown(x,y: Integer);
procedure MouseUp(x,y: Integer);
procedure MouseClick(ClickCount: Integer);
procedure MouseMove(x,y: Integer);
// size,pos events
procedure frameDidChange;
procedure boundsDidChange;
// misc events
procedure Draw(ctx: NSGraphicsContext; const bounds, dirty: NSRect);
function ResetCursorRects: Boolean;
end;
@ -129,6 +134,8 @@ type
TCocoaButton = objcclass(NSButton)
protected
procedure actionButtonClick(sender: NSObject); message 'actionButtonClick:';
procedure boundsDidChange(sender: NSNotification); message 'boundsDidChange:';
procedure frameDidChange(sender: NSNotification); message 'frameDidChange:';
public
callback: IButtonCallback;
function initWithFrame(frameRect: NSRect): id; override;
@ -316,6 +323,16 @@ begin
callback.ButtonClick;
end;
procedure TCocoaButton.boundsDidChange(sender: NSNotification);
begin
callback.boundsDidChange;
end;
procedure TCocoaButton.frameDidChange(sender: NSNotification);
begin
callback.frameDidChange;
end;
function TCocoaButton.initWithFrame(frameRect: NSRect): id;
begin
Result := inherited initWithFrame(frameRect);
@ -323,6 +340,10 @@ begin
begin
setTarget(Self);
setAction(objcselector('actionButtonClick:'));
NSNotificationCenter.defaultCenter.addObserver_selector_name_object(Self, objcselector('boundsDidChange:'), NSViewBoundsDidChangeNotification, Result);
NSNotificationCenter.defaultCenter.addObserver_selector_name_object(Self, objcselector('frameDidChange:'), NSViewFrameDidChangeNotification, Result);
Result.setPostsBoundsChangedNotifications(True);
Result.setPostsFrameChangedNotifications(True);
end;
end;

View File

@ -10,7 +10,7 @@ uses
MacOSAll, CocoaAll,
Classes, Controls, SysUtils,
//
WSControls, LCLType, LCLProc, Forms,
WSControls, LCLType, LMessages, LCLProc, Forms,
CocoaPrivate, CocoaGDIObjects, CocoaUtils, LCLMessageGlue;
type
@ -26,14 +26,16 @@ type
TLCLCommonCallback = class(TObject, ICommonCallBack)
public
Owner: NSObject;
Target : TControl;
Target : TWinControl;
Context : TCocoaContext;
constructor Create(AOwner: NSObject; ATarget: TControl); virtual;
constructor Create(AOwner: NSObject; ATarget: TWinControl); virtual;
destructor Destroy; override;
procedure MouseDown(x,y: Integer); virtual;
procedure MouseUp(x,y: Integer); virtual;
procedure MouseClick(clickCount: Integer); virtual;
procedure MouseMove(x,y: Integer); virtual;
procedure frameDidChange; virtual;
procedure boundsDidChange; virtual;
procedure Draw(ControlContext: NSGraphicsContext; const bounds, dirty: NSRect); virtual;
function ResetCursorRects: Boolean; virtual;
end;
@ -111,7 +113,7 @@ end;
{ TLCLCommonCallback }
constructor TLCLCommonCallback.Create(AOwner: NSObject; ATarget: TControl);
constructor TLCLCommonCallback.Create(AOwner: NSObject; ATarget: TWinControl);
begin
inherited Create;
Owner := AOwner;
@ -144,6 +146,70 @@ begin
LCLSendMouseMoveMsg(Target, x,y, []);
end;
procedure TLCLCommonCallback.frameDidChange;
begin
boundsDidChange;
end;
procedure TLCLCommonCallback.boundsDidChange;
var
NewBounds, OldBounds: TRect;
PosMsg: TLMWindowPosChanged;
Resized, Moved: Boolean;
begin
NewBounds := Owner.lclFrame;
OldBounds := Target.BoundsRect;
Resized :=
(OldBounds.Right - OldBounds.Left <> NewBounds.Right - NewBounds.Left) or
(OldBounds.Bottom - OldBounds.Top <> NewBounds.Bottom - NewBounds.Top);
Moved :=
(OldBounds.Left <> NewBounds.Left) or
(OldBounds.Top <> NewBounds.Top);
// send window pos changed
if Resized or Moved then
begin
PosMsg.Msg := LM_WINDOWPOSCHANGED;
PosMsg.Result := 0;
New(PosMsg.WindowPos);
try
with PosMsg.WindowPos^ do
begin
hWndInsertAfter := 0;
x := NewBounds.Left;
y := NewBounds.Right;
cx := NewBounds.Right - NewBounds.Left;
cy := NewBounds.Bottom - NewBounds.Top;
flags := 0;
end;
DeliverMessage(Target, PosMsg);
finally
Dispose(PosMsg.WindowPos);
end;
end;
// update client rect
if Resized or Target.ClientRectNeedsInterfaceUpdate then
begin
Target.InvalidateClientRectCache(False);
end;
// then send a LM_SIZE message
if Resized then
begin
LCLSendSizeMsg(Target, NewBounds.Right - NewBounds.Left,
NewBounds.Bottom - NewBounds.Top, Size_SourceIsInterface);
end;
// then send a LM_MOVE message
if Moved then
begin
LCLSendMoveMsg(Target, NewBounds.Left,
NewBounds.Top, Move_SourceIsInterface);
end;
end;
procedure TLCLCommonCallback.Draw(ControlContext: NSGraphicsContext;
const bounds, dirty:NSRect);
var