Cocoa: Rework TCocoaWidgetSet.WindowFromPoint so that it works with libraries

git-svn-id: trunk@43817 -
This commit is contained in:
freq 2014-01-26 18:30:46 +00:00
parent 99ba895921
commit 4c5854aba3
2 changed files with 148 additions and 28 deletions

View File

@ -84,6 +84,7 @@ type
function lclGetPropStorage: TStringList; message 'lclGetPropStorage'; function lclGetPropStorage: TStringList; message 'lclGetPropStorage';
function lclGetTarget: TObject; message 'lclGetTarget'; function lclGetTarget: TObject; message 'lclGetTarget';
function lclDeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult; message 'lclDeliverMessage:::'; function lclDeliverMessage(Msg: Cardinal; WParam: WParam; LParam: LParam): LResult; message 'lclDeliverMessage:::';
function lclIsHandle: Boolean; message 'lclIsHandle';
end; end;
{ LCLViewExtension } { LCLViewExtension }
@ -176,6 +177,7 @@ type
TCocoaMenu = objcclass(NSMenu) TCocoaMenu = objcclass(NSMenu)
public public
procedure lclItemSelected(sender: id); message 'lclItemSelected:'; procedure lclItemSelected(sender: id); message 'lclItemSelected:';
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaMenuItem } { TCocoaMenuItem }
@ -185,6 +187,7 @@ type
menuItemCallback: IMenuItemCallback; menuItemCallback: IMenuItemCallback;
procedure lclItemSelected(sender: id); message 'lclItemSelected:'; procedure lclItemSelected(sender: id); message 'lclItemSelected:';
function lclGetCallback: IMenuItemCallback; override; function lclGetCallback: IMenuItemCallback; override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaButton } { TCocoaButton }
@ -215,6 +218,8 @@ type
procedure mouseExited(event: NSEvent); override; procedure mouseExited(event: NSEvent); override;
procedure mouseMoved(event: NSEvent); override; procedure mouseMoved(event: NSEvent); override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaTextField } { TCocoaTextField }
@ -227,6 +232,7 @@ type
function lclGetCallback: ICommonCallback; override; function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override; procedure lclClearCallback; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaSecureTextField } { TCocoaSecureTextField }
@ -238,6 +244,7 @@ type
function becomeFirstResponder: Boolean; override; function becomeFirstResponder: Boolean; override;
function resignFirstResponder: Boolean; override; function resignFirstResponder: Boolean; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
@ -252,6 +259,7 @@ type
function lclGetCallback: ICommonCallback; override; function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override; procedure lclClearCallback; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaPanel } { TCocoaPanel }
@ -284,6 +292,7 @@ type
procedure mouseExited(event: NSEvent); override; procedure mouseExited(event: NSEvent); override;
procedure mouseMoved(event: NSEvent); override; procedure mouseMoved(event: NSEvent); override;
procedure sendEvent(event: NSEvent); override; procedure sendEvent(event: NSEvent); override;
function lclIsHandle: Boolean; override;
end; end;
@ -315,6 +324,7 @@ type
procedure mouseExited(event: NSEvent); override; procedure mouseExited(event: NSEvent); override;
procedure mouseMoved(event: NSEvent); override; procedure mouseMoved(event: NSEvent); override;
procedure sendEvent(event: NSEvent); override; procedure sendEvent(event: NSEvent); override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaCustomControl } { TCocoaCustomControl }
@ -345,6 +355,7 @@ type
procedure flagsChanged(event: NSEvent); override; procedure flagsChanged(event: NSEvent); override;
// other // other
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaWindowContent } { TCocoaWindowContent }
@ -360,6 +371,7 @@ type
procedure viewWillMoveToWindow(newWindow: NSWindow); override; procedure viewWillMoveToWindow(newWindow: NSWindow); override;
procedure dealloc; override; procedure dealloc; override;
procedure setHidden(aisHidden: Boolean); override; procedure setHidden(aisHidden: Boolean); override;
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaScrollView } { TCocoaScrollView }
@ -373,6 +385,7 @@ type
function lclGetCallback: ICommonCallback; override; function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override; procedure lclClearCallback; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
@ -417,6 +430,7 @@ type
procedure comboBoxWillDismiss(notification: NSNotification); message 'comboBoxWillDismiss:'; procedure comboBoxWillDismiss(notification: NSNotification); message 'comboBoxWillDismiss:';
procedure comboBoxSelectionDidChange(notification: NSNotification); message 'comboBoxSelectionDidChange:'; procedure comboBoxSelectionDidChange(notification: NSNotification); message 'comboBoxSelectionDidChange:';
procedure comboBoxSelectionIsChanging(notification: NSNotification); message 'comboBoxSelectionIsChanging:'; procedure comboBoxSelectionIsChanging(notification: NSNotification); message 'comboBoxSelectionIsChanging:';
function lclIsHandle: Boolean; override;
end; end;
{ TCocoaScrollBar } { TCocoaScrollBar }
@ -430,6 +444,7 @@ type
function lclGetCallback: ICommonCallback; override; function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override; procedure lclClearCallback; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
TCocoaListView = objcclass; TCocoaListView = objcclass;
@ -485,6 +500,7 @@ type
// key // key
procedure keyDown(event: NSEvent); override; procedure keyDown(event: NSEvent); override;
procedure keyUp(event: NSEvent); override; procedure keyUp(event: NSEvent); override;
function lclIsHandle: Boolean; override;
end; end;
@ -499,6 +515,7 @@ type
function lclGetCallback: ICommonCallback; override; function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override; procedure lclClearCallback; override;
procedure resetCursorRects; override; procedure resetCursorRects; override;
function lclIsHandle: Boolean; override;
end; end;
procedure SetViewDefaults(AView: NSView); procedure SetViewDefaults(AView: NSView);
@ -519,6 +536,11 @@ end;
{ TCocoaWindowContent } { TCocoaWindowContent }
function TCocoaWindowContent.lclIsHandle: Boolean;
begin
Result:=true;
end;
function TCocoaWindowContent.lclOwnWindow: NSWindow; function TCocoaWindowContent.lclOwnWindow: NSWindow;
begin begin
if not isembedded then if not isembedded then
@ -590,6 +612,11 @@ end;
{ TCocoaPanel } { TCocoaPanel }
function TCocoaPanel.lclIsHandle: Boolean;
begin
Result:=true;
end;
function TCocoaPanel.windowShouldClose(sender: id): LongBool; function TCocoaPanel.windowShouldClose(sender: id): LongBool;
var var
canClose: Boolean; canClose: Boolean;
@ -758,6 +785,11 @@ end;
{ TCocoaWindow } { TCocoaWindow }
function TCocoaWindow.lclIsHandle: Boolean;
begin
Result:=true;
end;
function TCocoaWindow.windowShouldClose(sender: id): LongBool; function TCocoaWindow.windowShouldClose(sender: id): LongBool;
var var
canClose: Boolean; canClose: Boolean;
@ -928,6 +960,11 @@ end;
{ TCocoaScrollView } { TCocoaScrollView }
function TCocoaScrollView.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaScrollView.acceptsFirstResponder: Boolean; function TCocoaScrollView.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -965,6 +1002,11 @@ end;
{ TCocoaScrollBar } { TCocoaScrollBar }
function TCocoaScrollBar.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaScrollBar.acceptsFirstResponder: Boolean; function TCocoaScrollBar.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1002,6 +1044,11 @@ end;
{ TCocoaGroupBox } { TCocoaGroupBox }
function TCocoaGroupBox.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaGroupBox.acceptsFirstResponder: Boolean; function TCocoaGroupBox.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1039,6 +1086,11 @@ end;
{ TCocoaButton } { TCocoaButton }
function TCocoaButton.lclIsHandle: Boolean;
begin
Result := True;
end;
procedure TCocoaButton.actionButtonClick(sender: NSObject); procedure TCocoaButton.actionButtonClick(sender: NSObject);
begin begin
// this is the action handler of button // this is the action handler of button
@ -1167,6 +1219,11 @@ end;
{ TCocoaTextField } { TCocoaTextField }
function TCocoaTextField.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaTextField.acceptsFirstResponder: Boolean; function TCocoaTextField.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1205,6 +1262,11 @@ end;
{ TCocoaTextView } { TCocoaTextView }
function TCocoaTextView.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaTextView.acceptsFirstResponder: Boolean; function TCocoaTextView.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1240,6 +1302,11 @@ end;
{ TCocoaSecureTextField } { TCocoaSecureTextField }
function TCocoaSecureTextField.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaSecureTextField.acceptsFirstResponder: Boolean; function TCocoaSecureTextField.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1265,6 +1332,11 @@ end;
{ TCocoaCustomControl } { TCocoaCustomControl }
function TCocoaCustomControl.lclIsHandle: Boolean;
begin
Result := True;
end;
function TCocoaCustomControl.acceptsFirstResponder: Boolean; function TCocoaCustomControl.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1494,6 +1566,11 @@ begin
Result := 0; Result := 0;
end; end;
function LCLObjectExtension.lclIsHandle: Boolean;
begin
result:=false;
end;
{ LCLControlExtension } { LCLControlExtension }
function RectToViewCoord(view: NSView; const r: TRect): NSRect; function RectToViewCoord(view: NSView; const r: TRect): NSRect;
@ -1665,6 +1742,7 @@ begin
end; end;
end; end;
{ LCLWindowExtension } { LCLWindowExtension }
function LCLWindowExtension.lclIsVisible: Boolean; function LCLWindowExtension.lclIsVisible: Boolean;
@ -1809,6 +1887,11 @@ end;
{ TCocoaListView } { TCocoaListView }
function TCocoaListView.lclIsHandle: Boolean;
begin
Result:=true;
end;
function TCocoaListView.acceptsFirstResponder: Boolean; function TCocoaListView.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -1977,6 +2060,11 @@ end;
{ TCocoaComboBox } { TCocoaComboBox }
function TCocoaComboBox.lclIsHandle: Boolean;
begin
Result:=true;
end;
function TCocoaComboBox.acceptsFirstResponder: Boolean; function TCocoaComboBox.acceptsFirstResponder: Boolean;
begin begin
Result := True; Result := True;
@ -2057,6 +2145,11 @@ end;
{ TCocoaMenu } { TCocoaMenu }
function TCocoaMenu.lclIsHandle: Boolean;
begin
Result:=true;
end;
procedure TCocoaMenu.lclItemSelected(sender:id); procedure TCocoaMenu.lclItemSelected(sender:id);
begin begin
@ -2064,6 +2157,11 @@ end;
{ TCocoaMenuITem } { TCocoaMenuITem }
function TCocoaMenuItem.lclIsHandle: Boolean;
begin
Result:=true;
end;
procedure TCocoaMenuItem.lclItemSelected(sender:id); procedure TCocoaMenuItem.lclItemSelected(sender:id);
begin begin
menuItemCallback.ItemSelected; menuItemCallback.ItemSelected;

View File

@ -988,13 +988,10 @@ begin
end; end;
function TCocoaWidgetSet.IsWindow(handle: HWND): boolean; function TCocoaWidgetSet.IsWindow(handle: HWND): boolean;
var
Obj: NSObject;
begin begin
if handle <> 0 then if handle <> 0 then
begin begin
Obj := NSObject(handle); Result := NSObject(handle).lclIsHandle;
Result := Obj.isKindOfClass(NSWindow);
end end
else else
Result := False; Result := False;
@ -1002,42 +999,67 @@ end;
function TCocoaWidgetSet.WindowFromPoint(Point: TPoint): HWND; function TCocoaWidgetSet.WindowFromPoint(Point: TPoint): HWND;
var var
r: TRect; winrect: TRect;
windows: NSArray; windows: NSArray;
subviews: NSArray; win: integer;
contentView: NSView; window: NSWindow;
i, n: integer;
obj: NSObject; function ViewFromPoint(view:NSView): HWND;
var rect: TRect;
p:TPoint;
begin
Result:=0;
if not assigned(view) then
exit;
if view.lclIsHandle then
begin
p:=Point;
view.lclScreenToLocal(p.X,p.Y);
rect:=view.lclClientFrame;
if PtInRect(rect, p) then
Result:=HWND(view);
//debugln('Point:'+DbgS(p)+' Rect:'+DbgS(rect)+' Result:'+dbgS(Result));
end
//else
// debugln('No lcl');
end;
function RecurseSubviews(view:NSView):HWND;
var sv:integer;
begin
// first check views subview if there is a embedded view
Result:=0;
sv:=0;
while (Result=0) and (sv<view.subviews.count) do
begin
Result:=RecurseSubviews(view.subviews.objectAtIndex(sv));
inc(sv)
end;
if Result=0 then
Result:=ViewFromPoint(view);
end;
begin begin
Result := 0; Result := 0;
if not assigned(NSApp) then if not assigned(NSApp) then
Exit; Exit;
windows := NSApp.windows; windows := NSApp.windows;
for win := 0 to windows.count - 1 do
for i := 0 to windows.count - 1 do
begin begin
obj:=windows.objectAtIndex(i); window:=windows.objectAtIndex(win);
if obj.isKindOfClass(NSWindow) then winrect := window.lclFrame;
begin if PtInRect(winrect, Point) then
r := NSWindow(obj).lclFrame; begin
if PtInRect(r, Point) then Result:=RecurseSubviews(window.contentView);
begin if Result<>0 then
//debugln('Point:'+DbgS(point)+' Rect:'+DbgS(r)); exit;
//todo: Find NSViews
{ contentView:=NSWindow(obj).contentView;
if assigned(contentView) then
begin
end; }
Result := HWND(obj);
Exit;
end; end;
end; end;
end;
end; end;
function TCocoaWidgetSet.GetRgnBox(RGN: HRGN; lpRect: PRect): Longint; function TCocoaWidgetSet.GetRgnBox(RGN: HRGN; lpRect: PRect): Longint;
begin begin
Result := ERROR; Result := ERROR;