|
|
|
@ -1,185 +1,21 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Collections.Specialized; |
|
|
|
using System.Linq; |
|
|
|
using System.Text; |
|
|
|
using Avalonia.Collections; |
|
|
|
using Avalonia.Controls; |
|
|
|
using Avalonia.Controls.ApplicationLifetimes; |
|
|
|
using Avalonia.Controls.Platform; |
|
|
|
using Avalonia.Input; |
|
|
|
using Avalonia.Dialogs; |
|
|
|
using Avalonia.Native.Interop; |
|
|
|
using Avalonia.Platform.Interop; |
|
|
|
using Avalonia.Threading; |
|
|
|
using Avalonia.Dialogs; |
|
|
|
using Avalonia.Controls.ApplicationLifetimes; |
|
|
|
|
|
|
|
namespace Avalonia.Native |
|
|
|
{ |
|
|
|
enum OsxUnicodeSpecialKey |
|
|
|
{ |
|
|
|
NSUpArrowFunctionKey = 0xF700, |
|
|
|
NSDownArrowFunctionKey = 0xF701, |
|
|
|
NSLeftArrowFunctionKey = 0xF702, |
|
|
|
NSRightArrowFunctionKey = 0xF703, |
|
|
|
NSF1FunctionKey = 0xF704, |
|
|
|
NSF2FunctionKey = 0xF705, |
|
|
|
NSF3FunctionKey = 0xF706, |
|
|
|
NSF4FunctionKey = 0xF707, |
|
|
|
NSF5FunctionKey = 0xF708, |
|
|
|
NSF6FunctionKey = 0xF709, |
|
|
|
NSF7FunctionKey = 0xF70A, |
|
|
|
NSF8FunctionKey = 0xF70B, |
|
|
|
NSF9FunctionKey = 0xF70C, |
|
|
|
NSF10FunctionKey = 0xF70D, |
|
|
|
NSF11FunctionKey = 0xF70E, |
|
|
|
NSF12FunctionKey = 0xF70F, |
|
|
|
NSF13FunctionKey = 0xF710, |
|
|
|
NSF14FunctionKey = 0xF711, |
|
|
|
NSF15FunctionKey = 0xF712, |
|
|
|
NSF16FunctionKey = 0xF713, |
|
|
|
NSF17FunctionKey = 0xF714, |
|
|
|
NSF18FunctionKey = 0xF715, |
|
|
|
NSF19FunctionKey = 0xF716, |
|
|
|
NSF20FunctionKey = 0xF717, |
|
|
|
NSF21FunctionKey = 0xF718, |
|
|
|
NSF22FunctionKey = 0xF719, |
|
|
|
NSF23FunctionKey = 0xF71A, |
|
|
|
NSF24FunctionKey = 0xF71B, |
|
|
|
NSF25FunctionKey = 0xF71C, |
|
|
|
NSF26FunctionKey = 0xF71D, |
|
|
|
NSF27FunctionKey = 0xF71E, |
|
|
|
NSF28FunctionKey = 0xF71F, |
|
|
|
NSF29FunctionKey = 0xF720, |
|
|
|
NSF30FunctionKey = 0xF721, |
|
|
|
NSF31FunctionKey = 0xF722, |
|
|
|
NSF32FunctionKey = 0xF723, |
|
|
|
NSF33FunctionKey = 0xF724, |
|
|
|
NSF34FunctionKey = 0xF725, |
|
|
|
NSF35FunctionKey = 0xF726, |
|
|
|
NSInsertFunctionKey = 0xF727, |
|
|
|
NSDeleteFunctionKey = 0xF728, |
|
|
|
NSHomeFunctionKey = 0xF729, |
|
|
|
NSBeginFunctionKey = 0xF72A, |
|
|
|
NSEndFunctionKey = 0xF72B, |
|
|
|
NSPageUpFunctionKey = 0xF72C, |
|
|
|
NSPageDownFunctionKey = 0xF72D, |
|
|
|
NSPrintScreenFunctionKey = 0xF72E, |
|
|
|
NSScrollLockFunctionKey = 0xF72F, |
|
|
|
NSPauseFunctionKey = 0xF730, |
|
|
|
NSSysReqFunctionKey = 0xF731, |
|
|
|
NSBreakFunctionKey = 0xF732, |
|
|
|
NSResetFunctionKey = 0xF733, |
|
|
|
NSStopFunctionKey = 0xF734, |
|
|
|
NSMenuFunctionKey = 0xF735, |
|
|
|
NSUserFunctionKey = 0xF736, |
|
|
|
NSSystemFunctionKey = 0xF737, |
|
|
|
NSPrintFunctionKey = 0xF738, |
|
|
|
NSClearLineFunctionKey = 0xF739, |
|
|
|
NSClearDisplayFunctionKey = 0xF73A, |
|
|
|
NSInsertLineFunctionKey = 0xF73B, |
|
|
|
NSDeleteLineFunctionKey = 0xF73C, |
|
|
|
NSInsertCharFunctionKey = 0xF73D, |
|
|
|
NSDeleteCharFunctionKey = 0xF73E, |
|
|
|
NSPrevFunctionKey = 0xF73F, |
|
|
|
NSNextFunctionKey = 0xF740, |
|
|
|
NSSelectFunctionKey = 0xF741, |
|
|
|
NSExecuteFunctionKey = 0xF742, |
|
|
|
NSUndoFunctionKey = 0xF743, |
|
|
|
NSRedoFunctionKey = 0xF744, |
|
|
|
NSFindFunctionKey = 0xF745, |
|
|
|
NSHelpFunctionKey = 0xF746, |
|
|
|
NSModeSwitchFunctionKey = 0xF747 |
|
|
|
} |
|
|
|
|
|
|
|
public class MenuActionCallback : CallbackBase, IAvnActionCallback |
|
|
|
{ |
|
|
|
private Action _action; |
|
|
|
|
|
|
|
public MenuActionCallback(Action action) |
|
|
|
{ |
|
|
|
_action = action; |
|
|
|
} |
|
|
|
|
|
|
|
void IAvnActionCallback.Run() |
|
|
|
{ |
|
|
|
_action?.Invoke(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class PredicateCallback : CallbackBase, IAvnPredicateCallback |
|
|
|
{ |
|
|
|
private Func<bool> _predicate; |
|
|
|
|
|
|
|
public PredicateCallback(Func<bool> predicate) |
|
|
|
{ |
|
|
|
_predicate = predicate; |
|
|
|
} |
|
|
|
|
|
|
|
bool IAvnPredicateCallback.Evaluate() |
|
|
|
{ |
|
|
|
return _predicate(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
class AvaloniaNativeMenuExporter : ITopLevelNativeMenuExporter |
|
|
|
{ |
|
|
|
private IAvaloniaNativeFactory _factory; |
|
|
|
private NativeMenu _menu; |
|
|
|
private bool _resetQueued; |
|
|
|
private bool _exported = false; |
|
|
|
private IAvnWindow _nativeWindow; |
|
|
|
private List<NativeMenuItem> _menuItems = new List<NativeMenuItem>(); |
|
|
|
|
|
|
|
private static Dictionary<Key, OsxUnicodeSpecialKey> osxKeys = new Dictionary<Key, OsxUnicodeSpecialKey> |
|
|
|
{ |
|
|
|
{Key.Up, OsxUnicodeSpecialKey.NSUpArrowFunctionKey }, |
|
|
|
{Key.Down, OsxUnicodeSpecialKey.NSDownArrowFunctionKey }, |
|
|
|
{Key.Left, OsxUnicodeSpecialKey.NSLeftArrowFunctionKey }, |
|
|
|
{Key.Right, OsxUnicodeSpecialKey.NSRightArrowFunctionKey }, |
|
|
|
{ Key.F1, OsxUnicodeSpecialKey.NSF1FunctionKey }, |
|
|
|
{ Key.F2, OsxUnicodeSpecialKey.NSF2FunctionKey }, |
|
|
|
{ Key.F3, OsxUnicodeSpecialKey.NSF3FunctionKey }, |
|
|
|
{ Key.F4, OsxUnicodeSpecialKey.NSF4FunctionKey }, |
|
|
|
{ Key.F5, OsxUnicodeSpecialKey.NSF5FunctionKey }, |
|
|
|
{ Key.F6, OsxUnicodeSpecialKey.NSF6FunctionKey }, |
|
|
|
{ Key.F7, OsxUnicodeSpecialKey.NSF7FunctionKey }, |
|
|
|
{ Key.F8, OsxUnicodeSpecialKey.NSF8FunctionKey }, |
|
|
|
{ Key.F9, OsxUnicodeSpecialKey.NSF9FunctionKey }, |
|
|
|
{ Key.F10, OsxUnicodeSpecialKey.NSF10FunctionKey }, |
|
|
|
{ Key.F11, OsxUnicodeSpecialKey.NSF11FunctionKey }, |
|
|
|
{ Key.F12, OsxUnicodeSpecialKey.NSF12FunctionKey }, |
|
|
|
{ Key.F13, OsxUnicodeSpecialKey.NSF13FunctionKey }, |
|
|
|
{ Key.F14, OsxUnicodeSpecialKey.NSF14FunctionKey }, |
|
|
|
{ Key.F15, OsxUnicodeSpecialKey.NSF15FunctionKey }, |
|
|
|
{ Key.F16, OsxUnicodeSpecialKey.NSF16FunctionKey }, |
|
|
|
{ Key.F17, OsxUnicodeSpecialKey.NSF17FunctionKey }, |
|
|
|
{ Key.F18, OsxUnicodeSpecialKey.NSF18FunctionKey }, |
|
|
|
{ Key.F19, OsxUnicodeSpecialKey.NSF19FunctionKey }, |
|
|
|
{ Key.F20, OsxUnicodeSpecialKey.NSF20FunctionKey }, |
|
|
|
{ Key.F21, OsxUnicodeSpecialKey.NSF21FunctionKey }, |
|
|
|
{ Key.F22, OsxUnicodeSpecialKey.NSF22FunctionKey }, |
|
|
|
{ Key.F23, OsxUnicodeSpecialKey.NSF23FunctionKey }, |
|
|
|
{ Key.F24, OsxUnicodeSpecialKey.NSF24FunctionKey }, |
|
|
|
{ Key.Insert, OsxUnicodeSpecialKey.NSInsertFunctionKey }, |
|
|
|
{ Key.Delete, OsxUnicodeSpecialKey.NSDeleteFunctionKey }, |
|
|
|
{ Key.Home, OsxUnicodeSpecialKey.NSHomeFunctionKey }, |
|
|
|
//{ Key.Begin, OsxUnicodeSpecialKey.NSBeginFunctionKey },
|
|
|
|
{ Key.End, OsxUnicodeSpecialKey.NSEndFunctionKey }, |
|
|
|
{ Key.PageUp, OsxUnicodeSpecialKey.NSPageUpFunctionKey }, |
|
|
|
{ Key.PageDown, OsxUnicodeSpecialKey.NSPageDownFunctionKey }, |
|
|
|
{ Key.PrintScreen, OsxUnicodeSpecialKey.NSPrintScreenFunctionKey }, |
|
|
|
{ Key.Scroll, OsxUnicodeSpecialKey.NSScrollLockFunctionKey }, |
|
|
|
//{ Key.SysReq, OsxUnicodeSpecialKey.NSSysReqFunctionKey },
|
|
|
|
//{ Key.Break, OsxUnicodeSpecialKey.NSBreakFunctionKey },
|
|
|
|
//{ Key.Reset, OsxUnicodeSpecialKey.NSResetFunctionKey },
|
|
|
|
//{ Key.Stop, OsxUnicodeSpecialKey.NSStopFunctionKey },
|
|
|
|
//{ Key.Menu, OsxUnicodeSpecialKey.NSMenuFunctionKey },
|
|
|
|
//{ Key.UserFunction, OsxUnicodeSpecialKey.NSUserFunctionKey },
|
|
|
|
//{ Key.SystemFunction, OsxUnicodeSpecialKey.NSSystemFunctionKey },
|
|
|
|
{ Key.Print, OsxUnicodeSpecialKey.NSPrintFunctionKey }, |
|
|
|
//{ Key.ClearLine, OsxUnicodeSpecialKey.NSClearLineFunctionKey },
|
|
|
|
//{ Key.ClearDisplay, OsxUnicodeSpecialKey.NSClearDisplayFunctionKey },
|
|
|
|
}; |
|
|
|
private NativeMenu _menu; |
|
|
|
private IAvnMenu _nativeMenu; |
|
|
|
|
|
|
|
public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory) |
|
|
|
{ |
|
|
|
@ -193,7 +29,6 @@ namespace Avalonia.Native |
|
|
|
{ |
|
|
|
_factory = factory; |
|
|
|
|
|
|
|
_menu = NativeMenu.GetMenu(Application.Current); |
|
|
|
DoLayoutReset(); |
|
|
|
} |
|
|
|
|
|
|
|
@ -203,17 +38,19 @@ namespace Avalonia.Native |
|
|
|
|
|
|
|
public void SetNativeMenu(NativeMenu menu) |
|
|
|
{ |
|
|
|
if (menu == null) |
|
|
|
menu = new NativeMenu(); |
|
|
|
|
|
|
|
if (_menu != null) |
|
|
|
((INotifyCollectionChanged)_menu.Items).CollectionChanged -= OnMenuItemsChanged; |
|
|
|
_menu = menu; |
|
|
|
((INotifyCollectionChanged)_menu.Items).CollectionChanged += OnMenuItemsChanged; |
|
|
|
_menu = menu == null ? new NativeMenu() : menu; |
|
|
|
|
|
|
|
DoLayoutReset(); |
|
|
|
} |
|
|
|
|
|
|
|
internal void UpdateIfNeeded() |
|
|
|
{ |
|
|
|
if (_resetQueued) |
|
|
|
{ |
|
|
|
DoLayoutReset(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static NativeMenu CreateDefaultAppMenu() |
|
|
|
{ |
|
|
|
var result = new NativeMenu(); |
|
|
|
@ -237,50 +74,34 @@ namespace Avalonia.Native |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
private void OnItemPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e) |
|
|
|
{ |
|
|
|
QueueReset(); |
|
|
|
} |
|
|
|
|
|
|
|
private void OnMenuItemsChanged(object sender, NotifyCollectionChangedEventArgs e) |
|
|
|
{ |
|
|
|
QueueReset(); |
|
|
|
} |
|
|
|
|
|
|
|
void DoLayoutReset() |
|
|
|
{ |
|
|
|
_resetQueued = false; |
|
|
|
foreach (var i in _menuItems) |
|
|
|
{ |
|
|
|
i.PropertyChanged -= OnItemPropertyChanged; |
|
|
|
if (i.Menu != null) |
|
|
|
((INotifyCollectionChanged)i.Menu.Items).CollectionChanged -= OnMenuItemsChanged; |
|
|
|
} |
|
|
|
|
|
|
|
_menuItems.Clear(); |
|
|
|
|
|
|
|
if(_nativeWindow is null) |
|
|
|
if (_nativeWindow is null) |
|
|
|
{ |
|
|
|
_menu = NativeMenu.GetMenu(Application.Current); |
|
|
|
var appMenu = NativeMenu.GetMenu(Application.Current); |
|
|
|
|
|
|
|
if(_menu != null) |
|
|
|
{ |
|
|
|
SetMenu(_menu); |
|
|
|
} |
|
|
|
else |
|
|
|
if (appMenu == null) |
|
|
|
{ |
|
|
|
SetMenu(CreateDefaultAppMenu()); |
|
|
|
appMenu = CreateDefaultAppMenu(); |
|
|
|
NativeMenu.SetMenu(Application.Current, appMenu); |
|
|
|
} |
|
|
|
|
|
|
|
SetMenu(appMenu); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
SetMenu(_nativeWindow, _menu?.Items); |
|
|
|
if (_menu != null) |
|
|
|
{ |
|
|
|
SetMenu(_nativeWindow, _menu); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
_exported = true; |
|
|
|
} |
|
|
|
|
|
|
|
private void QueueReset() |
|
|
|
internal void QueueReset() |
|
|
|
{ |
|
|
|
if (_resetQueued) |
|
|
|
return; |
|
|
|
@ -288,188 +109,64 @@ namespace Avalonia.Native |
|
|
|
Dispatcher.UIThread.Post(DoLayoutReset, DispatcherPriority.Background); |
|
|
|
} |
|
|
|
|
|
|
|
private IAvnAppMenu CreateSubmenu(ICollection<NativeMenuItemBase> children) |
|
|
|
private void SetMenu(NativeMenu menu) |
|
|
|
{ |
|
|
|
var menu = _factory.CreateMenu(); |
|
|
|
|
|
|
|
SetChildren(menu, children); |
|
|
|
var menuItem = menu.Parent; |
|
|
|
|
|
|
|
return menu; |
|
|
|
} |
|
|
|
var appMenuHolder = menuItem?.Parent; |
|
|
|
|
|
|
|
private void AddMenuItem(NativeMenuItem item) |
|
|
|
{ |
|
|
|
if (item.Menu?.Items != null) |
|
|
|
if (menu.Parent is null) |
|
|
|
{ |
|
|
|
((INotifyCollectionChanged)item.Menu.Items).CollectionChanged += OnMenuItemsChanged; |
|
|
|
menuItem = new NativeMenuItem(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static string ConvertOSXSpecialKeyCodes(Key key) |
|
|
|
{ |
|
|
|
if (osxKeys.ContainsKey(key)) |
|
|
|
{ |
|
|
|
return ((char)osxKeys[key]).ToString(); |
|
|
|
} |
|
|
|
else |
|
|
|
if (appMenuHolder is null) |
|
|
|
{ |
|
|
|
return key.ToString().ToLower(); |
|
|
|
} |
|
|
|
} |
|
|
|
appMenuHolder = new NativeMenu(); |
|
|
|
|
|
|
|
private void SetChildren(IAvnAppMenu menu, ICollection<NativeMenuItemBase> children) |
|
|
|
{ |
|
|
|
foreach (var i in children) |
|
|
|
{ |
|
|
|
if (i is NativeMenuItem item) |
|
|
|
{ |
|
|
|
AddMenuItem(item); |
|
|
|
|
|
|
|
var menuItem = _factory.CreateMenuItem(); |
|
|
|
|
|
|
|
using (var buffer = new Utf8Buffer(item.Header)) |
|
|
|
{ |
|
|
|
menuItem.Title = buffer.DangerousGetHandle(); |
|
|
|
} |
|
|
|
|
|
|
|
if (item.Gesture != null) |
|
|
|
{ |
|
|
|
using (var buffer = new Utf8Buffer(ConvertOSXSpecialKeyCodes(item.Gesture.Key))) |
|
|
|
{ |
|
|
|
menuItem.SetGesture(buffer.DangerousGetHandle(), (AvnInputModifiers)item.Gesture.KeyModifiers); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
menuItem.SetAction(new PredicateCallback(() => |
|
|
|
{ |
|
|
|
if (item.Command != null || item.HasClickHandlers) |
|
|
|
{ |
|
|
|
return item.Enabled; |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
}), new MenuActionCallback(() => { item.RaiseClick(); })); |
|
|
|
menu.AddItem(menuItem); |
|
|
|
|
|
|
|
if (item.Menu?.Items?.Count >= 0) |
|
|
|
{ |
|
|
|
var submenu = _factory.CreateMenu(); |
|
|
|
|
|
|
|
using (var buffer = new Utf8Buffer(item.Header)) |
|
|
|
{ |
|
|
|
submenu.Title = buffer.DangerousGetHandle(); |
|
|
|
} |
|
|
|
|
|
|
|
menuItem.SetSubMenu(submenu); |
|
|
|
|
|
|
|
AddItemsToMenu(submenu, item.Menu?.Items); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (i is NativeMenuItemSeperator seperator) |
|
|
|
{ |
|
|
|
menu.AddItem(_factory.CreateMenuItemSeperator()); |
|
|
|
} |
|
|
|
appMenuHolder.Add(menuItem); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void AddItemsToMenu(IAvnAppMenu menu, ICollection<NativeMenuItemBase> items, bool isMainMenu = false) |
|
|
|
{ |
|
|
|
foreach (var i in items) |
|
|
|
{ |
|
|
|
if (i is NativeMenuItem item) |
|
|
|
{ |
|
|
|
var menuItem = _factory.CreateMenuItem(); |
|
|
|
|
|
|
|
AddMenuItem(item); |
|
|
|
|
|
|
|
menuItem.SetAction(new PredicateCallback(() => |
|
|
|
{ |
|
|
|
if (item.Command != null || item.HasClickHandlers) |
|
|
|
{ |
|
|
|
return item.Enabled; |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
}), new MenuActionCallback(() => { item.RaiseClick(); })); |
|
|
|
|
|
|
|
if (item.Menu?.Items.Count >= 0 || isMainMenu) |
|
|
|
{ |
|
|
|
var subMenu = CreateSubmenu(item.Menu?.Items); |
|
|
|
|
|
|
|
menuItem.SetSubMenu(subMenu); |
|
|
|
|
|
|
|
using (var buffer = new Utf8Buffer(item.Header)) |
|
|
|
{ |
|
|
|
subMenu.Title = buffer.DangerousGetHandle(); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
using (var buffer = new Utf8Buffer(item.Header)) |
|
|
|
{ |
|
|
|
menuItem.Title = buffer.DangerousGetHandle(); |
|
|
|
} |
|
|
|
|
|
|
|
if (item.Gesture != null) |
|
|
|
{ |
|
|
|
using (var buffer = new Utf8Buffer(item.Gesture.Key.ToString().ToLower())) |
|
|
|
{ |
|
|
|
menuItem.SetGesture(buffer.DangerousGetHandle(), (AvnInputModifiers)item.Gesture.KeyModifiers); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
menu.AddItem(menuItem); |
|
|
|
} |
|
|
|
else if(i is NativeMenuItemSeperator seperator) |
|
|
|
{ |
|
|
|
menu.AddItem(_factory.CreateMenuItemSeperator()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
menuItem.Menu = menu; |
|
|
|
|
|
|
|
private void SetMenu(NativeMenu menu) |
|
|
|
{ |
|
|
|
var appMenu = _factory.ObtainAppMenu(); |
|
|
|
var setMenu = false; |
|
|
|
|
|
|
|
if (appMenu is null) |
|
|
|
if (_nativeMenu is null) |
|
|
|
{ |
|
|
|
appMenu = _factory.CreateMenu(); |
|
|
|
} |
|
|
|
_nativeMenu = IAvnMenu.Create(_factory); |
|
|
|
|
|
|
|
var menuItem = menu.Parent; |
|
|
|
_nativeMenu.Initialise(this, appMenuHolder, ""); |
|
|
|
|
|
|
|
if(menu.Parent is null) |
|
|
|
{ |
|
|
|
menuItem = new NativeMenuItem(); |
|
|
|
setMenu = true; |
|
|
|
} |
|
|
|
|
|
|
|
menuItem.Menu = menu; |
|
|
|
|
|
|
|
appMenu.Clear(); |
|
|
|
AddItemsToMenu(appMenu, new List<NativeMenuItemBase> { menuItem }); |
|
|
|
_nativeMenu.Update(_factory, appMenuHolder); |
|
|
|
|
|
|
|
_factory.SetAppMenu(appMenu); |
|
|
|
if (setMenu) |
|
|
|
{ |
|
|
|
_factory.SetAppMenu(_nativeMenu); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void SetMenu(IAvnWindow avnWindow, ICollection<NativeMenuItemBase> menuItems) |
|
|
|
private void SetMenu(IAvnWindow avnWindow, NativeMenu menu) |
|
|
|
{ |
|
|
|
if (menuItems is null) |
|
|
|
var setMenu = false; |
|
|
|
|
|
|
|
if (_nativeMenu is null) |
|
|
|
{ |
|
|
|
menuItems = new List<NativeMenuItemBase>(); |
|
|
|
} |
|
|
|
_nativeMenu = IAvnMenu.Create(_factory); |
|
|
|
|
|
|
|
var appMenu = avnWindow.ObtainMainMenu(); |
|
|
|
_nativeMenu.Initialise(this, menu, ""); |
|
|
|
|
|
|
|
if (appMenu is null) |
|
|
|
{ |
|
|
|
appMenu = _factory.CreateMenu(); |
|
|
|
setMenu = true; |
|
|
|
} |
|
|
|
|
|
|
|
appMenu.Clear(); |
|
|
|
AddItemsToMenu(appMenu, menuItems); |
|
|
|
_nativeMenu.Update(_factory, menu); |
|
|
|
|
|
|
|
avnWindow.SetMainMenu(appMenu); |
|
|
|
if(setMenu) |
|
|
|
{ |
|
|
|
avnWindow.SetMainMenu(_nativeMenu); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|