mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 19:59:14 +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;
|
function ToggleAppMenu(ALogicalEnabled: Boolean): Boolean;
|
||||||
procedure Do_SetCheck(const ANSMenuItem: NSMenuItem; const Checked: boolean);
|
procedure Do_SetCheck(const ANSMenuItem: NSMenuItem; const Checked: boolean);
|
||||||
|
|
||||||
|
function FindEditMenu(const menu:NSMenu; const title:NSString): NSMenuItem;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -195,6 +197,46 @@ begin
|
|||||||
ANSMenuItem.setState( menustate[Checked] );
|
ANSMenuItem.setState( menustate[Checked] );
|
||||||
end;
|
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;
|
function getHotkeyFromTitle( aTitle:String ): Word;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
@ -416,6 +416,7 @@ var
|
|||||||
appMenu: NSMenuItem;
|
appMenu: NSMenuItem;
|
||||||
editMenu: NSMenuItem;
|
editMenu: NSMenuItem;
|
||||||
editSubmenu: NSMenu;
|
editSubmenu: NSMenu;
|
||||||
|
editMenuTitle: NSString;
|
||||||
begin
|
begin
|
||||||
oldMainMenu:= NSApplication(NSApp).mainMenu;
|
oldMainMenu:= NSApplication(NSApp).mainMenu;
|
||||||
mainMenu:= oldMainMenu;
|
mainMenu:= oldMainMenu;
|
||||||
@ -429,20 +430,22 @@ var
|
|||||||
appMenu.release;
|
appMenu.release;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
editMenuIndex:= mainMenu.indexOfItemWithTitle(CocoaConst.NSSTR_EDIT_MENU);
|
oldEditMenu:= FindEditMenu(mainMenu, CocoaConst.NSSTR_EDIT_MENU);
|
||||||
if editMenuIndex < 0 then begin
|
if Assigned(oldEditMenu) then begin
|
||||||
editMenuIndex:= mainMenu.numberOfItems;
|
editMenuIndex:= mainMenu.indexOfItem(oldEditMenu);
|
||||||
end else begin
|
|
||||||
oldEditMenu:= mainMenu.itemAtIndex(editMenuIndex);
|
|
||||||
oldEditMenu.retain;
|
oldEditMenu.retain;
|
||||||
mainMenu.removeItemAtIndex(editMenuIndex);
|
mainMenu.removeItemAtIndex(editMenuIndex);
|
||||||
|
editMenuTitle:= oldEditMenu.title;
|
||||||
|
end else begin
|
||||||
|
editMenuIndex:= mainMenu.numberOfItems;
|
||||||
|
editMenuTitle:= CocoaConst.NSSTR_EDIT_MENU;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
editMenu:= NSMenuItem.alloc.init;
|
editMenu:= NSMenuItem.alloc.init;
|
||||||
mainMenu.insertItem_atIndex(editMenu, editMenuIndex);
|
mainMenu.insertItem_atIndex(editMenu, editMenuIndex);
|
||||||
editMenu.release;
|
editMenu.release;
|
||||||
|
|
||||||
editSubmenu:= NSMenu.alloc.initWithTitle(CocoaConst.NSSTR_EDIT_MENU);
|
editSubmenu:= NSMenu.alloc.initWithTitle(editMenuTitle);
|
||||||
editMenu.setSubmenu(editSubmenu);
|
editMenu.setSubmenu(editSubmenu);
|
||||||
editSubmenu.release;
|
editSubmenu.release;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user