cocoa: send focus messages

git-svn-id: trunk@34456 -
This commit is contained in:
paul 2011-12-28 02:49:08 +00:00
parent 76ed6fbc72
commit 5aa7fcbf48
3 changed files with 227 additions and 10 deletions

View File

@ -65,6 +65,7 @@ type
TCocoaWidgetSet = class(TWidgetSet)
private
FFocusedObject: NSObject;
FTerminating: Boolean;
pool: NSAutoreleasePool;
@ -107,8 +108,7 @@ type
function CreateTimer(Interval: integer; TimerFunc: TWSTimerProc): THandle; override;
function DestroyTimer(TimerHandle: THandle): boolean; override;
function PrepareUserEventInfo(Handle: HWND; Msg: Cardinal; wParam: WParam;
lParam: LParam): NSMutableDictionary;
function PrepareUserEventInfo(Handle: HWND; Msg: Cardinal; wParam: WParam; lParam: LParam): NSMutableDictionary;
function PrepareUserEvent(Handle: HWND; Info: NSDictionary): NSEvent;
procedure InitStockItems;

View File

@ -48,14 +48,17 @@ type
procedure frameDidChange;
procedure boundsDidChange;
// misc events
function DeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult;
procedure Draw(ctx: NSGraphicsContext; const bounds, dirty: NSRect);
function ResetCursorRects: Boolean;
procedure BecomeFirstResponder;
procedure ResignFirstResponder;
// non event methods
function DeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult;
function GetPropStorage: TStringList;
function GetContext: TCocoaContext;
function GetTarget: TObject;
function GetHasCaret: Boolean;
procedure SetHasCaret(AValue: Boolean);
function ResetCursorRects: Boolean;
// properties
property HasCaret: Boolean read GetHasCaret write SetHasCaret;
@ -171,6 +174,8 @@ type
callback: IButtonCallback;
function initWithFrame(frameRect: NSRect): id; override;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure mouseDown(event: NSEvent); override;
procedure mouseDragged(event: NSEvent); override;
@ -186,6 +191,8 @@ type
TCocoaTextField = objcclass(NSTextField)
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
end;
@ -193,8 +200,11 @@ type
{ TCocoaSecureTextField }
TCocoaSecureTextField = objcclass(NSSecureTextField)
public
callback : ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
procedure resetCursorRects; override;
end;
@ -202,8 +212,11 @@ type
{ TCocoaTextView }
TCocoaTextView = objcclass(NSTextView)
public
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
end;
@ -221,6 +234,8 @@ type
public
callback: IWindowCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure mouseUp(event: NSEvent); override;
procedure mouseDown(event: NSEvent); override;
@ -234,7 +249,11 @@ type
{ TCocoaCustomControl }
TCocoaCustomControl = objcclass(NSControl)
public
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
procedure drawRect(dirtyRect: NSRect); override;
function lclGetCallback: ICommonCallback; override;
procedure mouseDown(event: NSEvent); override;
@ -249,7 +268,11 @@ type
{ TCocoaScrollView }
TCocoaScrollView = objcclass(NSScrollView)
public
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
end;
@ -279,13 +302,15 @@ type
{ TCocoaComboBox }
TCocoaComboBox = objcclass(NSComboBox, NSComboBoxDataSourceProtocol, NSComboBoxDelegateProtocol)
public
callback: IComboboxCallBack;
list: TCocoaComboBoxList;
resultNS: NSString; //use to return values to combo
function comboBox_objectValueForItemAtIndex_(combo: TCocoaComboBox; row: NSInteger): id;
message 'comboBox:objectValueForItemAtIndex:';
function numberOfItemsInComboBox(combo: TCocoaComboBox): NSInteger;
message 'numberOfItemsInComboBox:';
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function comboBox_objectValueForItemAtIndex_(combo: TCocoaComboBox; row: NSInteger): id; message 'comboBox:objectValueForItemAtIndex:';
function numberOfItemsInComboBox(combo: TCocoaComboBox): NSInteger; message 'numberOfItemsInComboBox:';
procedure dealloc; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
@ -298,7 +323,11 @@ type
{ TCocoaScrollBar }
TCocoaScrollBar = objcclass(NSScroller)
public
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
end;
@ -318,9 +347,13 @@ type
{ TCocoaListView }
TCocoaListView = objcclass(NSTableView, NSTableViewDataSourceProtocol)
public
callback: ICommonCallback;
list: TCocoaStringList;
resultNS: NSString; //use to return values to combo
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
function numberOfRowsInTableView(aTableView: NSTableView): NSInteger; message 'numberOfRowsInTableView:';
function tableView_objectValueForTableColumn_row(tableView: NSTableView;
@ -333,7 +366,11 @@ type
{ TCocoaGroupBox }
TCocoaGroupBox = objcclass(NSBox)
public
callback: ICommonCallback;
function acceptsFirstResponder: Boolean; override;
function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override;
function lclGetCallback: ICommonCallback; override;
procedure resetCursorRects; override;
end;
@ -342,6 +379,23 @@ implementation
{ TCocoaScrollView }
function TCocoaScrollView.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaScrollView.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaScrollView.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaScrollView.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -355,6 +409,23 @@ end;
{ TCocoaScrollBar }
function TCocoaScrollBar.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaScrollBar.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaScrollBar.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaScrollBar.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -368,6 +439,23 @@ end;
{ TCocoaGroupBox }
function TCocoaGroupBox.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaGroupBox.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaGroupBox.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaGroupBox.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -416,6 +504,18 @@ begin
Result := True;
end;
function TCocoaButton.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaButton.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaButton.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -472,6 +572,18 @@ begin
Result := True;
end;
function TCocoaTextField.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaTextField.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaTextField.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -493,6 +605,18 @@ begin
Result := True;
end;
function TCocoaTextView.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaTextView.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaTextView.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -545,6 +669,18 @@ begin
Result := True;
end;
function TCocoaWindow.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaWindow.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaWindow.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -637,7 +773,19 @@ end;
function TCocoaSecureTextField.acceptsFirstResponder: Boolean;
begin
Result:=True;
Result := True;
end;
function TCocoaSecureTextField.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaSecureTextField.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
procedure TCocoaSecureTextField.resetCursorRects;
@ -648,6 +796,23 @@ end;
{ TCocoaCustomControl }
function TCocoaCustomControl.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaCustomControl.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaCustomControl.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
procedure TCocoaCustomControl.drawRect(dirtyRect:NSRect);
begin
inherited drawRect(dirtyRect);
@ -1038,6 +1203,23 @@ end;
{ TCocoaListView }
function TCocoaListView.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaListView.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaListView.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaListView.lclGetCallback: ICommonCallback;
begin
Result := callback;
@ -1109,6 +1291,23 @@ end;
{ TCocoaComboBox }
function TCocoaComboBox.acceptsFirstResponder: Boolean;
begin
Result := True;
end;
function TCocoaComboBox.becomeFirstResponder: Boolean;
begin
Result := inherited becomeFirstResponder;
callback.BecomeFirstResponder;
end;
function TCocoaComboBox.resignFirstResponder: Boolean;
begin
Result := inherited resignFirstResponder;
callback.ResignFirstResponder;
end;
function TCocoaComboBox.comboBox_objectValueForItemAtIndex_(combo:TCocoaComboBox;
row: NSInteger):id;
begin

View File

@ -44,6 +44,8 @@ type
procedure MouseMove(x,y: Integer); virtual;
procedure frameDidChange; virtual;
procedure boundsDidChange; virtual;
procedure BecomeFirstResponder; virtual;
procedure ResignFirstResponder; virtual;
function DeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult; virtual;
procedure Draw(ControlContext: NSGraphicsContext; const bounds, dirty: NSRect); virtual;
function ResetCursorRects: Boolean; virtual;
@ -88,6 +90,9 @@ procedure SetViewDefaults(AView: NSView);
implementation
uses
CocoaInt;
function AllocCustomControl(const AWinControl: TWinControl): TCocoaCustomControl;
begin
if not Assigned(AWinControl) then
@ -251,6 +256,16 @@ begin
end;
end;
procedure TLCLCommonCallback.BecomeFirstResponder;
begin
LCLSendSetFocusMsg(Target);
end;
procedure TLCLCommonCallback.ResignFirstResponder;
begin
LCLSendKillFocusMsg(Target);
end;
function TLCLCommonCallback.DeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult;
var
Message: TLMessage;
@ -263,10 +278,13 @@ begin
end;
procedure TLCLCommonCallback.Draw(ControlContext: NSGraphicsContext;
const bounds, dirty:NSRect);
const bounds, dirty: NSRect);
var
struct: TPaintStruct;
begin
// todo: think more about draw call while previous draw still active
if Assigned(FContext) then
Exit;
FContext := TCocoaContext.Create;
try
FContext.ctx := ControlContext;