From 048acfbea7e392eda7aa51e02e159c6a69cc42f8 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Tue, 15 Sep 2009 18:41:38 +0000 Subject: [PATCH] carbon: Implements checking the visibility of the TTrayIcon menu via private method git-svn-id: trunk@21714 - --- lcl/interfaces/carbon/carbontrayicon.inc | 65 ++++++++++++++++++- lcl/interfaces/carbon/carbonwsextctrls.pp | 1 + .../carbon/pascocoa/appkit/NSMenuItem.inc | 10 +-- .../carbon/pascocoa/foundation/NSObject.inc | 26 ++++++-- 4 files changed, 91 insertions(+), 11 deletions(-) diff --git a/lcl/interfaces/carbon/carbontrayicon.inc b/lcl/interfaces/carbon/carbontrayicon.inc index acc0379f19..8e83016cdc 100644 --- a/lcl/interfaces/carbon/carbontrayicon.inc +++ b/lcl/interfaces/carbon/carbontrayicon.inc @@ -41,14 +41,19 @@ type procedure RemoveIcon(); function ConvertTIconToNSImage(AIcon: TIcon): NSImage; function ConvertTBitmapToNSImage(ABitmap: TBitmap): NSImage; + function IsMenuVisible: Boolean; { Objective-C compatible methods } class procedure HandleMenuItemClick(_self: objc.id; _cmd: SEL; sender: objc.id); cdecl; //static; + class procedure HandleMenuWillOpen(_self: objc.id; _cmd: SEL; sender: objc.id); cdecl; //static; + class procedure HandleMenuDidClose(_self: objc.id; _cmd: SEL; sender: objc.id); cdecl; //static; end; const Str_TPrivateCocoaCarbonTrayIcon = 'TTrayIcon'; Str_HandleMenuItemClick = 'HandleMenuItemClick'; + Str_HandleMenuWillOpen = 'menuWillOpen:'; + Str_HandleMenuDidClose = 'menuDidClose:'; { TPrivateCocoaCarbonTrayIcon } @@ -64,6 +69,8 @@ const procedure TPrivateCocoaCarbonTrayIcon.AddMethods; begin AddMethod(Str_HandleMenuItemClick, 'v@:@', Pointer(HandleMenuItemClick)); + AddMethod(Str_HandleMenuWillOpen, 'v@:@', Pointer(HandleMenuWillOpen)); + AddMethod(Str_HandleMenuDidClose, 'v@:@', Pointer(HandleMenuDidClose)); end; constructor TPrivateCocoaCarbonTrayIcon.Create; @@ -103,7 +110,7 @@ end; class function TPrivateCocoaCarbonTrayIcon.getClass: objc.id; begin - Result := objc_getClass(Str_NSObject); + Result := objc_getClass({Str_TPrivateCocoaCarbonTrayIcon} Str_NSObject); end; {Removes/replaces all occurences of a character from a string} @@ -131,6 +138,8 @@ var Item: NSMenuItem; begin Result := NSMenu.initWithTitle(EmptyMenuTitle); +// Result.setVersion(0); + Result.setDelegate(Self.Handle); for i := 0 to APopUpMenu.Items.Count - 1 do begin @@ -335,10 +344,27 @@ begin Result.unlockFocus; end; +function _NSGetCarbonMenu(AMenu: objc.id {NSMenu}): MenuRef; cdecl; external name '_NSGetCarbonMenu'; + +function TPrivateCocoaCarbonTrayIcon.IsMenuVisible: Boolean; +var + CarbonMenu: MenuRef; + theMenuTrackingData: MenuTrackingData; +begin + Result := False; + + if menu = nil then Exit; + + CarbonMenu := _NSGetCarbonMenu(menu.Handle); + if CarbonMenu = nil then Exit; + + Result := GetMenuTrackingData(CarbonMenu, theMenuTrackingData) = noErr; +end; + { Here we try to get the LCL MenuItem from the Tag and then call it's OnClick method } class procedure TPrivateCocoaCarbonTrayIcon.HandleMenuItemClick(_self: objc.id; - _cmd: SEL; sender: objc.id); cdecl; + _cmd: SEL; sender: objc.id); cdecl; //static; var AMenuItem: NSMenuItem; LCLMenu: TMenuItem; @@ -348,6 +374,28 @@ begin if (LCLMenu <> nil) and Assigned(LCLMenu.OnClick) then LCLMenu.OnClick(LCLMenu); end; +class procedure TPrivateCocoaCarbonTrayIcon.HandleMenuWillOpen(_self: objc.id; + _cmd: SEL; sender: objc.id); cdecl; //static; +var + AMenu: NSMenu; + LCLMenu: TPopUpMenu; +begin + AMenu := NSMenu.CreateWithHandle(sender); +// LCLMenu := TPopUpMenu(PtrInt(AMenu.menuRepresentation())); +// if (LCLMenu <> nil) and Assigned(LCLMenu.OnPopUp) then LCLMenu.OnPopUp(LCLMenu); +end; + +class procedure TPrivateCocoaCarbonTrayIcon.HandleMenuDidClose(_self: objc.id; + _cmd: SEL; sender: objc.id); cdecl; //static; +var + AMenu: NSMenu; + LCLMenu: TPopUpMenu; +begin + AMenu := NSMenu.CreateWithHandle(sender); +// LCLMenu := TPopUpMenu(PtrInt(AMenu.menuRepresentation())); +// if (LCLMenu <> nil) and Assigned(LCLMenu.OnClose) then LCLMenu.OnClose(LCLMenu); +end; + { TCarbonWSCustomTrayIcon } class function TCarbonWSCustomTrayIcon.Hide(const ATrayIcon: TCustomTrayIcon): Boolean; @@ -459,5 +507,18 @@ begin Result := Point(0, 0); end; +class function TCarbonWSCustomTrayIcon.IsTrayIconMenuVisible(const ATrayIcon: TCustomTrayIcon): Boolean; +var + APrivateTrayIcon: TPrivateCocoaCarbonTrayIcon; +begin + Result := False; + + APrivateTrayIcon := TPrivateCocoaCarbonTrayIcon(ATrayIcon.Handle); + + if APrivateTrayIcon = nil then Exit; + + Result := APrivateTrayIcon.IsMenuVisible; +end; + {$endif CarbonUseCocoa} diff --git a/lcl/interfaces/carbon/carbonwsextctrls.pp b/lcl/interfaces/carbon/carbonwsextctrls.pp index 08a79b13e8..0ecc2fed91 100644 --- a/lcl/interfaces/carbon/carbonwsextctrls.pp +++ b/lcl/interfaces/carbon/carbonwsextctrls.pp @@ -185,6 +185,7 @@ type class procedure InternalUpdate(const ATrayIcon: TCustomTrayIcon); override; class function ShowBalloonHint(const ATrayIcon: TCustomTrayIcon): Boolean; override; class function GetPosition(const ATrayIcon: TCustomTrayIcon): TPoint; override; + class function IsTrayIconMenuVisible(const ATrayIcon: TCustomTrayIcon): Boolean; {$endif CarbonUseCocoa} end; diff --git a/lcl/interfaces/carbon/pascocoa/appkit/NSMenuItem.inc b/lcl/interfaces/carbon/pascocoa/appkit/NSMenuItem.inc index a14bb880be..a1ce7287c2 100644 --- a/lcl/interfaces/carbon/pascocoa/appkit/NSMenuItem.inc +++ b/lcl/interfaces/carbon/pascocoa/appkit/NSMenuItem.inc @@ -155,8 +155,8 @@ function target: objc.id; procedure setAction(_aSelector: SEL); function action: SEL; - procedure setTag(_anInt: Integer); - function tag: Integer; + procedure setTag(_anInt: PtrInt); + function tag: PtrInt; procedure setRepresentedObject(_anObject: objc.id); function representedObject: objc.id; {.$ifdef MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3} @@ -555,9 +555,9 @@ begin Result := SEL(objc_msgSend(Handle, sel_registerName(PChar(StrNSMenuItem_action)), [])); end; -procedure NSMenuItem.setTag(_anInt: Integer); +procedure NSMenuItem.setTag(_anInt: PtrInt); type - TmsgSendWrapper = procedure (param1: objc.id; param2: SEL;_anInt: Integer); cdecl; + TmsgSendWrapper = procedure (param1: objc.id; param2: SEL;_anInt: PtrInt); cdecl; var vmethod: TmsgSendWrapper; begin @@ -565,7 +565,7 @@ begin vmethod(Handle, sel_registerName(PChar(StrNSMenuItem_setTag)), _anInt); end; -function NSMenuItem.tag: Integer; +function NSMenuItem.tag: PtrInt; begin Result := Integer(objc_msgSend(Handle, sel_registerName(PChar(StrNSMenuItem_tag)), [])); end; diff --git a/lcl/interfaces/carbon/pascocoa/foundation/NSObject.inc b/lcl/interfaces/carbon/pascocoa/foundation/NSObject.inc index e6c9166e92..98e52ee037 100644 --- a/lcl/interfaces/carbon/pascocoa/foundation/NSObject.inc +++ b/lcl/interfaces/carbon/pascocoa/foundation/NSObject.inc @@ -19,6 +19,9 @@ const Str_alloc = 'alloc'; Str_init = 'init'; + Str_version = 'version'; + Str_setVersion = 'setVersion:'; + {*************** Basic protocols ***************} Str_retain = 'retain'; @@ -92,10 +95,10 @@ FOUNDATION_EXPORT unsigned NSExtraRefCount(id object);} + (BOOL)instancesRespondToSelector:(SEL)aSelector; + (BOOL)conformsToProtocol:(Protocol *)protocol; - (IMP)methodForSelector:(SEL)aSelector; -+ (IMP)instanceMethodForSelector:(SEL)aSelector; -+ (int)version; -+ (void)setVersion:(int)aVersion; -- (void)doesNotRecognizeSelector:(SEL)aSelector; ++ (IMP)instanceMethodForSelector:(SEL)aSelector;} + function version: PtrInt; + procedure setVersion(aVersion: PtrInt); +{- (void)doesNotRecognizeSelector:(SEL)aSelector; - (void)forwardInvocation:(NSInvocation *)anInvocation; - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector; @@ -292,6 +295,21 @@ begin Result := True; end; +function NSObject.version: PtrInt; +begin + Result := PtrInt(objc_msgSend(Handle, sel_registerName(PChar(Str_version)), [])); +end; + +procedure NSObject.setVersion(aVersion: PtrInt); +type + TmsgSendWrapper = procedure (param1: objc.id; param2: SEL;_anInt: PtrInt); cdecl; +var + vmethod: TmsgSendWrapper; +begin + vmethod := TmsgSendWrapper(@objc_msgSend); + vmethod(Handle, sel_registerName(PChar(Str_setVersion)), aVersion); +end; + {*************** Basic protocols ***************} function NSObject.retain: objc.id;