Cocoa: a better way to find the Edit menu in Open/Save Dialog

in the past, it's only relied on title matching. in a multi-language environment, it is possible to use different vocabulary and cause mismatching. now a shortcut key matching method is added.
This commit is contained in:
rich2014 2024-05-25 16:41:14 +08:00
parent 4edf553ea4
commit 43bac2286a
2 changed files with 51 additions and 6 deletions

View File

@ -78,6 +78,8 @@ function LCLMenuItemInit(item: NSMenuItem; const atitle: string; VKKey: Word = 0
function ToggleAppMenu(ALogicalEnabled: Boolean): Boolean;
procedure Do_SetCheck(const ANSMenuItem: NSMenuItem; const Checked: boolean);
function FindEditMenu(const menu:NSMenu; const title:NSString): NSMenuItem;
implementation
type
@ -195,6 +197,46 @@ begin
ANSMenuItem.setState( menustate[Checked] );
end;
function FindEditMenuByKeyEquivalent(const menu: NSMenu;
const keyEquivalent:NSString): NSMenuItem;
var
item: NSMenuItem;
subItem: NSMenuItem;
begin
Result:= nil;
if NOT Assigned(menu) then
Exit;
for item in menu.itemArray do begin
if item.hasSubmenu then begin
for subItem in item.submenu.itemArray do begin
if NOT keyEquivalent.isEqualToString(subItem.keyEquivalent) then
continue;
if subItem.keyEquivalentModifierMask <> NSCommandKeyMask then
continue;
Result:= item;
Exit;
end;
end;
end;
end;
function FindEditMenu(const menu: NSMenu; const title: NSString): NSMenuItem;
var
index: NSInteger;
begin
if NOT Assigned(menu) then
Exit;
index:= menu.indexOfItemWithTitle(title);
if index >= 0 then begin
Result:= menu.itemAtIndex(index);
Exit;
end;
Result:= FindEditMenuByKeyEquivalent(menu, NSSTR('c')); // Command+C
end;
function getHotkeyFromTitle( aTitle:String ): Word;
var
i: Integer;

View File

@ -416,6 +416,7 @@ var
appMenu: NSMenuItem;
editMenu: NSMenuItem;
editSubmenu: NSMenu;
editMenuTitle: NSString;
begin
oldMainMenu:= NSApplication(NSApp).mainMenu;
mainMenu:= oldMainMenu;
@ -429,20 +430,22 @@ var
appMenu.release;
end;
editMenuIndex:= mainMenu.indexOfItemWithTitle(CocoaConst.NSSTR_EDIT_MENU);
if editMenuIndex < 0 then begin
editMenuIndex:= mainMenu.numberOfItems;
end else begin
oldEditMenu:= mainMenu.itemAtIndex(editMenuIndex);
oldEditMenu:= FindEditMenu(mainMenu, CocoaConst.NSSTR_EDIT_MENU);
if Assigned(oldEditMenu) then begin
editMenuIndex:= mainMenu.indexOfItem(oldEditMenu);
oldEditMenu.retain;
mainMenu.removeItemAtIndex(editMenuIndex);
editMenuTitle:= oldEditMenu.title;
end else begin
editMenuIndex:= mainMenu.numberOfItems;
editMenuTitle:= CocoaConst.NSSTR_EDIT_MENU;
end;
editMenu:= NSMenuItem.alloc.init;
mainMenu.insertItem_atIndex(editMenu, editMenuIndex);
editMenu.release;
editSubmenu:= NSMenu.alloc.initWithTitle(CocoaConst.NSSTR_EDIT_MENU);
editSubmenu:= NSMenu.alloc.initWithTitle(editMenuTitle);
editMenu.setSubmenu(editSubmenu);
editSubmenu.release;