mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 09:16:16 +02:00
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:
parent
4edf553ea4
commit
43bac2286a
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user