cocoa: using a single place to process keyDown event related to LCL callbacks

git-svn-id: trunk@59178 -
This commit is contained in:
dmitry 2018-09-29 04:27:41 +00:00
parent 75d1f28106
commit aa5acf09a9
5 changed files with 61 additions and 122 deletions

View File

@ -253,16 +253,10 @@ begin
end;
procedure TCocoaButton.keyDown(event: NSEvent);
const
KeyCode_Space = 49;
begin
if not Assigned(callback) or not callback.KeyEvent(event) then
begin
// space would attempt to change checked status
if event.keyCode = KeyCode_Space then
lclCheckMixedAllowance;
inherited keyDown(event);
end;
if event.keyCode = kVK_Space then
lclCheckMixedAllowance;
inherited keyDown(event);
end;
procedure TCocoaButton.keyUp(event: NSEvent);

View File

@ -206,7 +206,6 @@ type
procedure mouseMoved(event: NSEvent); override;
procedure scrollWheel(event: NSEvent); override;
// key
procedure keyDown(event: NSEvent); override;
procedure keyUp(event: NSEvent); override;
procedure flagsChanged(event: NSEvent); override;
// nsview
@ -337,6 +336,7 @@ type
procedure lclAddManTick(atick : integer); message 'lclAddManTick:';
procedure lclSetManTickDraw(adraw: Boolean); message 'lclSetManTickDraw:';
procedure lclExpectedKeys(var wantTabs, wantArrows, wantAll: Boolean); override;
end;
TCocoaSliderCell = objcclass(NSSliderCell)
@ -604,23 +604,6 @@ begin
inherited scrollWheel(event);
end;
procedure TCocoaCustomControl.keyDown(event: NSEvent);
var
cb : ICommonCallback;
res : Boolean;
begin
cb := lclGetCallback;
if Assigned(cb) then
begin
cb.KeyEvPrepare(event);
cb.KeyEvBefore(res);
if res then inherited keyDown(event);
cb.KeyEvAfter;
end else
inherited keyDown(event);
end;
procedure TCocoaCustomControl.keyUp(event: NSEvent);
begin
if not Assigned(callback) or not callback.KeyEvent(event) then
@ -1358,8 +1341,7 @@ begin
MK_RIGHT : SnapToInteger(1);
else
// If this isn't done callback.KeyEvent will cause arrow left/right to change control
if Assigned(callback) then callback.KeyEvent(event)
else inherited keyDown(event);
inherited keyDown(event);
end;
end;
@ -1492,6 +1474,14 @@ begin
self.setNeedsDisplay;
end;
procedure TCocoaSlider.lclExpectedKeys(var wantTabs, wantArrows,
wantAll: Boolean);
begin
wantTabs := false;
wantArrows := true;
wantAll := false;
end;
type
NSViewControlSizeExt = objccategory external (NSView)
function controlSize: Integer; message 'controlSize';

View File

@ -102,7 +102,6 @@ type
procedure mouseExited(event: NSEvent); override;
procedure mouseMoved(event: NSEvent); override;
// key
procedure keyDown(event: NSEvent); override;
procedure keyUp(event: NSEvent); override;
procedure lclExpectedKeys(var wantTabs, wantKeys, wantAllKeys: Boolean); override;
procedure lclSetFirstColumCheckboxes(acheckboxes: Boolean); message 'lclSetFirstColumCheckboxes:';
@ -557,21 +556,6 @@ begin
inherited mouseMoved(event);
end;
procedure TCocoaTableListView.keyDown(event: NSEvent);
var
allow : Boolean;
begin
if not Assigned(callback) then
inherited keyDown(event)
else
begin
callback.KeyEvPrepare(event);
callback.KeyEvBefore(allow);
if allow then inherited KeyDown(event);
callback.KeyEvAfter;
end;
end;
procedure TCocoaTableListView.keyUp(event: NSEvent);
var
allow : Boolean;

View File

@ -63,7 +63,6 @@ type
procedure lclClearCallback; override;
procedure resetCursorRects; override;
// key
//procedure keyDown(event: NSEvent); override; -> keyDown doesn't work in NSTextField
procedure keyUp(event: NSEvent); override;
procedure textDidChange(notification: NSNotification); override;
// mouse
@ -85,7 +84,6 @@ type
function acceptsFirstResponder: Boolean; override;
procedure resetCursorRects; override;
// key
//procedure keyDown(event: NSEvent); override; -> keyDown doesn't work in NSTextField
procedure keyUp(event: NSEvent); override;
// mouse
procedure mouseDown(event: NSEvent); override;
@ -115,7 +113,6 @@ type
procedure changeColor(sender: id); override;
// key
procedure keyDown(event: NSEvent); override;
procedure keyUp(event: NSEvent); override;
procedure flagsChanged(event: NSEvent); override;
// mouse
@ -143,8 +140,6 @@ type
TCocoaFieldEditor = objcclass(NSTextView)
public
function lclGetCallback: ICommonCallback; override;
// keyboard
procedure keyDown(event: NSEvent); override;
// mouse
procedure mouseDown(event: NSEvent); override;
procedure mouseUp(event: NSEvent); override;
@ -480,30 +475,6 @@ begin
else Result := nil;
end;
procedure TCocoaFieldEditor.keyDown(event: NSEvent);
var
cb : ICommonCallback;
res : Boolean;
v : NSView;
begin
v := GetEditBox(Self);
if Assigned(v) then
cb := v.lclGetCallback
else
cb := nil;
if not Assigned(cb) then
begin
inherited keyDown(event);
Exit;
end;
cb.KeyEvPrepare(event);
cb.KeyEvBefore(res);
if res then inherited keyDown(event);
cb.KeyEvAfter;
end;
procedure TCocoaFieldEditor.mouseDown(event: NSEvent);
var
v : NSView;
@ -724,20 +695,6 @@ begin
//inherited changeColor(sender);
end;
procedure TCocoaTextView.keyDown(event: NSEvent);
var
res : Boolean;
begin
if Assigned(callback) then
begin
callback.KeyEvPrepare(event);
callback.KeyEvBefore(res);
if res then inherited keyDown(event);
callback.KeyEvAfter;
end else
inherited keyDown(event);
end;
procedure TCocoaTextView.keyUp(event: NSEvent);
var
res : Boolean;

View File

@ -239,36 +239,61 @@ var
r : NSResponder;
fr : NSResponder;
mn : NSMenu;
cb : ICommonCallback;
allowcocoa : Boolean;
begin
fr := win.firstResponder;
r := fr;
processed := false;
allowcocoa := true;
// let controls to performKeyEquivalent first
while Assigned(r) and not processed do begin
if r.respondsToSelector(objcselector('performKeyEquivalent:')) then
processed := r.performKeyEquivalent(event);
if not processed then r := r.nextResponder;
end;
if processed then Exit;
// let menus do the hot key, if controls don't like it.
if not processed then
if Assigned(fr) then
begin
mn := NSApplication(NSApp).mainMenu;
if Assigned(mn) then
processed := mn.performKeyEquivalent(event);
end;
if processed then Exit;
r := fr;
while Assigned(r) and not processed do begin
if r.respondsToSelector(objcselector('keyDown:')) then
cb := fr.lclGetCallback;
if Assigned(cb) then
begin
r.keyDown(event);
processed := true;
cb.KeyEvPrepare(event);
cb.KeyEvBefore(allowcocoa);
end;
if not processed then r := r.nextResponder;
end else
cb := nil;
// try..finally here is to handle "Exit"s
// rather than excepting any exceptions to happen
try
if not allowcocoa then Exit;
// let controls to performKeyEquivalent first
while Assigned(r) and not processed do begin
if r.respondsToSelector(objcselector('performKeyEquivalent:')) then
processed := r.performKeyEquivalent(event);
if not processed then r := r.nextResponder;
end;
if processed then Exit;
// let menus do the hot key, if controls don't like it.
if not processed then
begin
mn := NSApplication(NSApp).mainMenu;
if Assigned(mn) then
processed := mn.performKeyEquivalent(event);
end;
if processed then Exit;
r := fr;
while Assigned(r) and not processed do begin
if r.respondsToSelector(objcselector('keyDown:')) then
begin
r.keyDown(event);
processed := true;
end;
if not processed then r := r.nextResponder;
end;
finally
if Assigned(cb) then
cb.KeyEvAfter;
end;
end;
@ -950,19 +975,8 @@ begin
end;
procedure TCocoaWindow.keyDown(event: NSEvent);
var
cb : ICommonCallback;
res : Boolean;
begin
cb := lclGetCallback;
if Assigned(cb) then
begin
cb.KeyEvPrepare(event);
cb.KeyEvBefore(res);
inherited keyDown(event);
cb.KeyEvAfter;
end else
inherited keyDown(event);
inherited keyDown(event);
end;
procedure TCocoaWindow.keyUp(event: NSEvent);