cocoa: send LM_CLICKED for button clicks and LM_CHANGED for checkbox change

git-svn-id: trunk@34125 -
This commit is contained in:
paul 2011-12-12 06:14:44 +00:00
parent 1f95690d16
commit 66e6e42951
4 changed files with 88 additions and 48 deletions

View File

@ -94,6 +94,12 @@ type
function ResetCursorRects: Boolean; function ResetCursorRects: Boolean;
end; end;
{ IButtonCallback }
IButtonCallback = interface(ICommonCallback)
procedure ButtonClick;
end;
{ IWindowCallback } { IWindowCallback }
IWindowCallback = interface(ICommonCallBack) IWindowCallback = interface(ICommonCallBack)
@ -124,7 +130,7 @@ type
protected protected
procedure actionButtonClick(sender: NSObject); message 'actionButtonClick:'; procedure actionButtonClick(sender: NSObject); message 'actionButtonClick:';
public public
callback : ICommonCallback; callback: IButtonCallback;
function initWithFrame(frameRect: NSRect): id; override; function initWithFrame(frameRect: NSRect): id; override;
function acceptsFirstResponder: Boolean; override; function acceptsFirstResponder: Boolean; override;
procedure mouseDown(event: NSEvent); override; procedure mouseDown(event: NSEvent); override;
@ -203,7 +209,7 @@ type
TCocoaComboBoxList = class(TStringList) TCocoaComboBoxList = class(TStringList)
private private
fOwner : TCocoaComboBox; FOwner: TCocoaComboBox;
protected protected
procedure Changed; override; procedure Changed; override;
public public
@ -306,14 +312,15 @@ end;
procedure TCocoaButton.actionButtonClick(sender: NSObject); procedure TCocoaButton.actionButtonClick(sender: NSObject);
begin begin
callback.MouseClick(1); // this is the action handler of button
//todo: simulate MouseUp callback.ButtonClick;
end; end;
function TCocoaButton.initWithFrame(frameRect: NSRect): id; function TCocoaButton.initWithFrame(frameRect: NSRect): id;
begin begin
Result := inherited initWithFrame(frameRect); Result := inherited initWithFrame(frameRect);
if Assigned(Result) then begin if Assigned(Result) then
begin
setTarget(Self); setTarget(Self);
setAction(objcselector('actionButtonClick:')); setAction(objcselector('actionButtonClick:'));
end; end;
@ -321,7 +328,7 @@ end;
function TCocoaButton.acceptsFirstResponder: Boolean; function TCocoaButton.acceptsFirstResponder: Boolean;
begin begin
Result:=true; Result := True;
end; end;
procedure TCocoaButton.mouseUp(event: NSEvent); procedure TCocoaButton.mouseUp(event: NSEvent);

View File

@ -34,7 +34,7 @@ uses
// widgetset // widgetset
WSButtons, WSLCLClasses, WSProc, WSButtons, WSLCLClasses, WSProc,
// LCL Carbon // LCL Carbon
CocoaWSStdCtrls, CocoaUtils; CocoaWSCommon, CocoaWSStdCtrls, CocoaUtils;
type type
@ -72,7 +72,7 @@ class function TCocoaWSBitBtn.CreateHandle(const AWinControl: TWinControl;
var var
btn: NSButton; btn: NSButton;
begin begin
btn:=AllocButton(AWinControl, AParams, NSRoundedBezelStyle, NSMomentaryPushInButton); btn := AllocButton(AWinControl, TLCLButtonCallBack, AParams, NSRoundedBezelStyle, NSMomentaryPushInButton);
if Assigned(btn) then if Assigned(btn) then
AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y); AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y);
Result := TLCLIntfHandle(btn); Result := TLCLIntfHandle(btn);

View File

@ -38,6 +38,8 @@ type
function ResetCursorRects: Boolean; virtual; function ResetCursorRects: Boolean; virtual;
end; end;
TLCLCommonCallBackClass = class of TLCLCommonCallBack;
{ TCocoaWSWinControl } { TCocoaWSWinControl }
TCocoaWSWinControl=class(TWSWinControl) TCocoaWSWinControl=class(TWSWinControl)

View File

@ -146,6 +146,14 @@ type
class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override; class function GetText(const AWinControl: TWinControl; var AText: String): Boolean; override;
end; end;
{ TLCLButtonCallback }
TLCLButtonCallback = class(TLCLCommonCallback, IButtonCallback)
public
procedure ButtonClick; virtual;
end;
TLCLButtonCallBackClass = class of TLCLButtonCallBack;
{ TCocoaWSButton } { TCocoaWSButton }
TCocoaWSButton = class(TWSButton) TCocoaWSButton = class(TWSButton)
@ -154,6 +162,13 @@ type
class procedure SetDefault(const AButton: TCustomButton; ADefault: Boolean); override; class procedure SetDefault(const AButton: TCustomButton; ADefault: Boolean); override;
end; end;
{ TLCLCheckBoxCallback }
TLCLCheckBoxCallback = class(TLCLButtonCallBack)
public
procedure ButtonClick; override;
end;
{ TCocoaWSCustomCheckBox } { TCocoaWSCustomCheckBox }
TCocoaWSCustomCheckBox = class(TWSCustomCheckBox) TCocoaWSCustomCheckBox = class(TWSCustomCheckBox)
@ -188,20 +203,20 @@ type
end; end;
function AllocTextView(ATarget: TWinControl; const AParams: TCreateParams; fieldEditor: Boolean): NSTextView; function AllocTextView(ATarget: TWinControl; const AParams: TCreateParams; fieldEditor: Boolean): NSTextView;
function AllocButton(ATarget: TWinControl; const AParams: TCreateParams; btnBezel: NSBezelStyle; btnType: NSButtonType): NSButton; function AllocButton(const ATarget: TWinControl; const ACallBackClass: TLCLButtonCallBackClass; const AParams: TCreateParams; btnBezel: NSBezelStyle; btnType: NSButtonType): NSButton;
function AllocTextField(ATarget: TWinControl; const AParams: TCreateParams): TCocoaTextField; function AllocTextField(ATarget: TWinControl; const AParams: TCreateParams): TCocoaTextField;
function AllocSecureTextField(ATarget: TWinControl; const AParams: TCreateParams): TCocoaSecureTextField; function AllocSecureTextField(ATarget: TWinControl; const AParams: TCreateParams): TCocoaSecureTextField;
implementation implementation
function AllocButton(ATarget: TWinControl; const AParams: TCreateParams; btnBezel: NSBezelStyle; btnType: NSButtonType): NSButton; function AllocButton(const ATarget: TWinControl; const ACallBackClass: TLCLButtonCallBackClass; const AParams: TCreateParams; btnBezel: NSBezelStyle; btnType: NSButtonType): NSButton;
var var
cap: NSString; cap: NSString;
begin begin
Result := TCocoaButton.alloc.lclInitWithCreateParams(AParams); Result := TCocoaButton.alloc.lclInitWithCreateParams(AParams);
if Assigned(Result) then if Assigned(Result) then
begin begin
TCocoaButton(Result).callback:=TLCLCommonCallback.Create(Result, ATarget); TCocoaButton(Result).callback := ACallBackClass.Create(Result, ATarget);
Result.initWithFrame(CreateParamsToNSRect(AParams)); Result.initWithFrame(CreateParamsToNSRect(AParams));
cap := NSStringUTF8(AParams.Caption); cap := NSStringUTF8(AParams.Caption);
Result.setTitle(cap); Result.setTitle(cap);
@ -240,6 +255,22 @@ begin
end; end;
end; end;
{ TLCLButtonCallback }
procedure TLCLButtonCallback.ButtonClick;
begin
SendSimpleMessage(Target, LM_CLICKED);
end;
{ TLCLCheckBoxCallback }
procedure TLCLCheckBoxCallback.ButtonClick;
begin
inherited;
SendSimpleMessage(Target, LM_CHANGED);
// todo: win32 has something about dbcheckbox handling here. so maybe we need to handle it special too
end;
{ TLCLComboboxCallback } { TLCLComboboxCallback }
procedure TLCLComboboxCallback.ComboBoxWillPopUp; procedure TLCLComboboxCallback.ComboBoxWillPopUp;
@ -280,7 +311,7 @@ class function TCocoaWSButton.CreateHandle(const AWinControl: TWinControl;
var var
btn: NSButton; btn: NSButton;
begin begin
btn:=AllocButton(AWinControl, AParams, NSRoundedBezelStyle, NSMomentaryPushInButton); btn := AllocButton(AWinControl, TLCLButtonCallback, AParams, NSRoundedBezelStyle, NSMomentaryPushInButton);
if Assigned(btn) then if Assigned(btn) then
AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y); AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y);
Result:=TLCLIntfHandle(btn); Result:=TLCLIntfHandle(btn);
@ -322,7 +353,7 @@ class function TCocoaWSCustomCheckBox.CreateHandle(const AWinControl: TWinContro
var var
btn: NSButton; btn: NSButton;
begin begin
btn:=AllocButton(AWinControl, AParams, 0, NSSwitchButton); btn := AllocButton(AWinControl, TLCLCheckBoxCallBack, AParams, 0, NSSwitchButton);
if Assigned(btn) then if Assigned(btn) then
AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y); AddViewToNSObject(btn, NSObject(AParams.WndParent), AParams.X, AParams.Y);
Result := TLCLIntfHandle(btn); Result := TLCLIntfHandle(btn);
@ -371,7 +402,7 @@ class function TCocoaWSRadioButton.CreateHandle(const AWinControl: TWinControl;
var var
btn: NSButton; btn: NSButton;
begin begin
btn:=AllocButton(AWinControl, AParams, 0, NSRadioButton); btn := AllocButton(AWinControl, TLCLCheckBoxCallBack, AParams, 0, NSRadioButton);
Result := TLCLIntfHandle(btn); Result := TLCLIntfHandle(btn);
end; end;
@ -712,7 +743,7 @@ var
btn: NSButton; btn: NSButton;
cl: NSButtonCell; cl: NSButtonCell;
begin begin
btn:=AllocButton(AWinControl, AParams, NSTexturedRoundedBezelStyle, NSToggleButton); btn := AllocButton(AWinControl, TLCLButtonCallBack, AParams, NSTexturedRoundedBezelStyle, NSToggleButton);
cl := NSButtonCell(NSButton(btn).cell); cl := NSButtonCell(NSButton(btn).cell);
cl.setShowsStateBy(cl.showsStateBy or NSContentsCellMask); cl.setShowsStateBy(cl.showsStateBy or NSContentsCellMask);
Result := TLCLIntfHandle(btn); Result := TLCLIntfHandle(btn);