5
// Michael Hutchinson <mhutchinson@novell.com>
8
// Copyright (c) 2009 Novell, Inc. (http://www.novell.com)
10
// Permission is hereby granted, free of charge, to any person obtaining a copy
11
// of this software and associated documentation files (the "Software"), to deal
12
// in the Software without restriction, including without limitation the rights
13
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
// copies of the Software, and to permit persons to whom the Software is
15
// furnished to do so, subject to the following conditions:
17
// The above copyright notice and this permission notice shall be included in
18
// all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29
using System.Runtime.InteropServices;
31
namespace MonoDevelop.MacInterop
33
internal static class HIToolbox
35
const string hiToolboxLib = "/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox";
37
[DllImport (hiToolboxLib)]
38
static extern CarbonMenuStatus CreateNewMenu (ushort menuId, MenuAttributes attributes, out IntPtr menuRef);
40
public static IntPtr CreateMenu (ushort id, string title, MenuAttributes attributes)
43
CheckResult (CreateNewMenu (id, attributes, out menuRef));
44
SetMenuTitle (menuRef, title);
48
[DllImport (hiToolboxLib)]
49
internal static extern CarbonMenuStatus SetRootMenu (IntPtr menuRef);
51
[DllImport (hiToolboxLib)]
52
internal static extern void DeleteMenu (IntPtr menuRef);
54
[DllImport (hiToolboxLib)]
55
internal static extern void FlashMenuBar (uint menuID);
57
[DllImport (hiToolboxLib)]
58
internal static extern uint GetMenuID (IntPtr menuRef);
60
[DllImport (hiToolboxLib)]
61
internal static extern void ClearMenuBar ();
63
[DllImport (hiToolboxLib)]
64
internal static extern ushort CountMenuItems (IntPtr menuRef);
66
[DllImport (hiToolboxLib)]
67
internal static extern void DeleteMenuItem (IntPtr menuRef, ushort index);
69
[DllImport (hiToolboxLib)]
70
internal static extern void InsertMenu (IntPtr menuRef, ushort before_id);
72
[DllImport (hiToolboxLib)]
73
static extern CarbonMenuStatus AppendMenuItemTextWithCFString (IntPtr menuRef, IntPtr cfString, MenuItemAttributes attributes, uint commandId, out ushort index);
75
public static ushort AppendMenuItem (IntPtr parentRef, string title, MenuItemAttributes attributes, uint commandId)
78
IntPtr str = CoreFoundation.CreateString (title);
79
CarbonMenuStatus result = AppendMenuItemTextWithCFString (parentRef, str, attributes, commandId, out index);
80
CoreFoundation.Release (str);
85
public static ushort AppendMenuSeparator (IntPtr parentRef)
88
CarbonMenuStatus result = AppendMenuItemTextWithCFString (parentRef, IntPtr.Zero, MenuItemAttributes.Separator, 0, out index);
93
[DllImport (hiToolboxLib)]
94
static extern CarbonMenuStatus InsertMenuItemTextWithCFString (IntPtr menuRef, IntPtr cfString, ushort afterItemIndex,
95
MenuItemAttributes attributes, uint commandID, out ushort index);
97
public static ushort InsertMenuItem (IntPtr parentRef, string title, ushort afterItemIndex, MenuItemAttributes attributes, uint commandId)
100
IntPtr str = CoreFoundation.CreateString (title);
101
CarbonMenuStatus result = InsertMenuItemTextWithCFString (parentRef, str, afterItemIndex, attributes, commandId, out index);
102
CoreFoundation.Release (str);
103
CheckResult (result);
107
public static ushort InsertMenuSeparator (IntPtr parentRef, ushort afterItemIndex)
110
CarbonMenuStatus result = InsertMenuItemTextWithCFString (parentRef, IntPtr.Zero, afterItemIndex, MenuItemAttributes.Separator, 0, out index);
111
CheckResult (result);
116
[DllImport (hiToolboxLib)]
117
static extern CarbonMenuStatus EnableMenuItem (IntPtr menuRef, ushort index);
119
public static void EnableMenuItem (HIMenuItem item)
121
CheckResult (EnableMenuItem (item.MenuRef, item.Index));
124
[DllImport (hiToolboxLib)]
125
static extern CarbonMenuStatus DisableMenuItem (IntPtr menuRef, ushort index);
127
public static void DisableMenuItem (HIMenuItem item)
129
CheckResult (DisableMenuItem (item.MenuRef, item.Index));
132
[DllImport (hiToolboxLib)]
133
static extern CarbonMenuStatus ChangeMenuItemAttributes (IntPtr menu, ushort item, MenuItemAttributes setTheseAttributes,
134
MenuItemAttributes clearTheseAttributes);
136
public static void ChangeMenuItemAttributes (HIMenuItem item, MenuItemAttributes toSet, MenuItemAttributes toClear)
138
CheckResult (ChangeMenuItemAttributes (item.MenuRef, item.Index, toSet, toClear));
141
[DllImport (hiToolboxLib)]
142
internal static extern CarbonMenuStatus SetMenuItemHierarchicalMenu (IntPtr parentMenu, ushort parent_index, IntPtr submenu);
144
[DllImport (hiToolboxLib)]
145
internal static extern CarbonMenuStatus GetMenuItemHierarchicalMenu (IntPtr parentMenu, ushort parent_index, out IntPtr submenu);
147
[DllImport (hiToolboxLib)]
148
static extern CarbonMenuStatus SetMenuTitleWithCFString (IntPtr menuRef, IntPtr cfstring);
150
public static void SetMenuTitle (IntPtr menuRef, string title)
152
IntPtr str = CoreFoundation.CreateString (title);
153
CarbonMenuStatus result = SetMenuTitleWithCFString (menuRef, str);
154
CoreFoundation.Release (str);
155
CheckResult (result);
158
[DllImport (hiToolboxLib)]
159
static extern CarbonMenuStatus SetMenuItemTextWithCFString (IntPtr menuRef, ushort index, IntPtr cfstring);
161
public static void SetMenuItemText (IntPtr menuRef, ushort index, string title)
163
IntPtr str = CoreFoundation.CreateString (title);
164
CarbonMenuStatus result = SetMenuItemTextWithCFString (menuRef, index, str);
165
CoreFoundation.Release (str);
166
CheckResult (result);
169
[DllImport (hiToolboxLib)]
170
internal static extern CarbonMenuStatus SetMenuItemKeyGlyph (IntPtr menuRef, ushort index, short glyph);
172
[DllImport (hiToolboxLib)]
173
internal static extern CarbonMenuStatus SetMenuItemCommandKey (IntPtr menuRef, ushort index, bool isVirtualKey, ushort key);
175
[DllImport (hiToolboxLib)]
176
internal static extern CarbonMenuStatus SetMenuItemModifiers (IntPtr menuRef, ushort index, MenuAccelModifier modifiers);
178
[DllImport (hiToolboxLib)]
179
static extern CarbonMenuStatus GetMenuItemCommandID (IntPtr menuRef, ushort index, out uint commandId);
181
public static uint GetMenuItemCommandID (HIMenuItem item)
184
CheckResult (GetMenuItemCommandID (item.MenuRef, item.Index, out id));
188
[DllImport (hiToolboxLib)]
189
static extern CarbonMenuStatus GetIndMenuItemWithCommandID (IntPtr startAtMenuRef, uint commandID, uint commandItemIndex,
190
out IntPtr itemMenuRef, out ushort itemIndex);
192
public static HIMenuItem GetMenuItem (uint commandId)
196
CheckResult (GetIndMenuItemWithCommandID (IntPtr.Zero, commandId, 1, out itemMenuRef, out itemIndex));
197
return new HIMenuItem (itemMenuRef, itemIndex);
200
[DllImport (hiToolboxLib)]
201
public static extern CarbonMenuStatus CancelMenuTracking (IntPtr rootMenu, bool inImmediate, MenuDismissalReason reason);
203
[DllImport (hiToolboxLib)]
204
public static extern CarbonMenuStatus SetMenuItemData (IntPtr menu, uint indexOrCommandID, bool isCommandID, ref MenuItemData data);
206
[DllImport (hiToolboxLib)]
207
static extern CarbonMenuStatus SetMenuItemRefCon (IntPtr menuRef, ushort index, uint inRefCon);
209
public static void SetMenuItemReferenceConstant (HIMenuItem item, uint value)
211
CheckResult (SetMenuItemRefCon (item.MenuRef, item.Index, value));
214
[DllImport (hiToolboxLib)]
215
static extern CarbonMenuStatus GetMenuItemRefCon (IntPtr menuRef, ushort index, out uint inRefCon);
217
public static uint GetMenuItemReferenceConstant (HIMenuItem item)
220
CheckResult (GetMenuItemRefCon (item.MenuRef, item.Index, out val));
224
internal static void CheckResult (CarbonMenuStatus result)
226
if (result != CarbonMenuStatus.Ok)
227
throw new CarbonMenuException (result);
231
class CarbonMenuException : Exception
233
public CarbonMenuException (CarbonMenuStatus result)
235
this.Result = result;
238
public CarbonMenuStatus Result { get; private set; }
240
public override string ToString ()
242
return string.Format("CarbonMenuException: Result={0}\n{1}", Result, StackTrace);
246
internal enum CarbonMenuStatus // this is an OSStatus
249
PropertyInvalid = -5603,
250
PropertyNotFound = -5604,
252
UsesSystemDef = -5621,
253
ItemNotFound = -5622,
258
internal enum MenuAttributes {
259
ExcludesMarkColumn = 1,
260
AutoDisable = 1 << 2,
261
UsePencilGlyph = 1 << 3,
263
CondenseSeparators = 1 << 5,
264
DoNotCacheImage = 1 << 6,
265
DoNotUseUserCommandKeys = 1 << 7
268
internal enum MenuAccelModifier : byte
271
ShiftModifier = 1 << 0,
272
OptionModifier = 1 << 1,
273
ControlModifier = 1 << 2,
278
internal enum MenuItemAttributes : uint
281
IconDisabled = 1 << 1,
282
SubmenuParentChoosable = 1 << 2,
284
NotPreviousAlternate = 1 << 4,
287
SectionHeader = 1 << 7,
290
UseVirtualKey = 1 << 10,
291
CustomDraw = 1 << 11,
292
IncludeInCmdKeyMatching = 1 << 12,
293
AutoDisable = 1 << 13,
294
UpdateSingleItem = 1 << 14
297
internal enum MenuDismissalReason : uint
299
DismissedBySelection = 1,
300
DismissedByUserCancel = 2,
301
DismissedByMouseDown = 3,
302
DismissedByMouseUp = 4,
303
DismissedByKeyEvent = 5,
304
DismissedByAppSwitch = 6,
305
DismissedByTimeout = 7,
306
DismissedByCancelMenuTracking = 8,
307
DismissedByActivationChange = 9,
308
DismissedByFocusChange = 10,
312
[StructLayout(LayoutKind.Sequential, Pack = 2)]
313
internal struct MenuItemData
315
#pragma warning disable 0169
316
MenuItemDataFlags whichData; //8
317
IntPtr text; //Str255 //12
318
[MarshalAs (UnmanagedType.U2)] //14
320
[MarshalAs (UnmanagedType.U2)] //16
322
uint cmdKeyGlyph; //20
323
uint cmdKeyModifiers; //24
325
[MarshalAs (UnmanagedType.U1)] //26
327
[MarshalAs (UnmanagedType.U1)] //27
332
IntPtr iconHandle; //40
334
CarbonTextEncoding encoding; //48
335
ushort submenuID; //50
336
IntPtr submenuHandle; //54
339
// LAMESPEC: this field is documented as OptionBits
340
MenuItemAttributes attr; //66
343
IntPtr properties; //74
345
ushort cmdVirtualKey; //80
347
//these aren't documented
348
IntPtr attributedText; //84
350
#pragma warning restore 0169
357
whichData |= MenuItemDataFlags.Text;
365
whichData |= MenuItemDataFlags.Mark;
370
public char CommandKey {
371
get { return cmdKey; }
373
whichData |= MenuItemDataFlags.CmdKey;
378
public uint CommandKeyGlyph {
379
get { return cmdKeyGlyph; }
381
whichData |= MenuItemDataFlags.CmdKeyGlyph;
386
public MenuAccelModifier CommandKeyModifiers {
387
get { return (MenuAccelModifier) cmdKeyModifiers; }
389
whichData |= MenuItemDataFlags.CmdKeyModifiers;
390
cmdKeyModifiers = (uint) value;
395
get { return style; }
397
whichData |= MenuItemDataFlags.Style;
402
public bool Enabled {
403
get { return enabled; }
405
whichData |= MenuItemDataFlags.Enabled;
410
public bool IconEnabled {
411
get { return iconEnabled; }
413
whichData |= MenuItemDataFlags.IconEnabled;
419
get { return iconID; }
421
whichData |= MenuItemDataFlags.IconID;
426
public HIIconHandle IconHandle {
427
get { return new HIIconHandle (iconHandle, iconType); }
429
whichData |= MenuItemDataFlags.IconHandle;
430
iconHandle = value.Ref;
431
iconType = value.Type;
435
public uint CommandID {
436
get { return cmdID; }
438
whichData |= MenuItemDataFlags.CommandID;
443
public CarbonTextEncoding Encoding {
444
get { return encoding; }
446
whichData |= MenuItemDataFlags.TextEncoding;
451
public ushort SubmenuID {
452
get { return submenuID; }
454
whichData |= MenuItemDataFlags.SubmenuID;
459
public IntPtr SubmenuHandle {
460
get { return submenuHandle; }
462
whichData |= MenuItemDataFlags.SubmenuHandle;
463
submenuHandle = value;
468
get { return fontID; }
470
whichData |= MenuItemDataFlags.FontID;
475
public uint ReferenceConstant {
476
get { return refcon; }
478
whichData |= MenuItemDataFlags.Refcon;
483
public MenuItemAttributes Attributes {
486
whichData |= MenuItemDataFlags.Attributes;
491
public IntPtr CFText {
492
get { return cfText; }
494
whichData |= MenuItemDataFlags.CFString;
499
public IntPtr Properties {
500
get { return properties; }
502
whichData |= MenuItemDataFlags.Properties;
508
get { return indent; }
510
whichData |= MenuItemDataFlags.Indent;
515
public ushort CommandVirtualKey {
516
get { return cmdVirtualKey; }
518
whichData |= MenuItemDataFlags.CmdVirtualKey;
519
cmdVirtualKey = value;
525
#region 'Has' properties
527
public bool HasText {
528
get { return (whichData & MenuItemDataFlags.Text) != 0; }
531
public bool HasMark {
532
get { return (whichData & MenuItemDataFlags.Mark) != 0; }
535
public bool HasCommandKey {
536
get { return (whichData & MenuItemDataFlags.CmdKey) != 0; }
539
public bool HasCommandKeyGlyph {
540
get { return (whichData & MenuItemDataFlags.CmdKeyGlyph) != 0; }
543
public bool HasCommandKeyModifiers {
544
get { return (whichData & MenuItemDataFlags.CmdKeyModifiers) != 0; }
547
public bool HasStyle {
548
get { return (whichData & MenuItemDataFlags.Style) != 0; }
551
public bool HasEnabled {
552
get { return (whichData & MenuItemDataFlags.Enabled) != 0; }
555
public bool HasIconEnabled {
556
get { return (whichData & MenuItemDataFlags.IconEnabled) != 0; }
559
public bool HasIconID {
560
get { return (whichData & MenuItemDataFlags.IconID) != 0; }
563
public bool HasIconHandle {
564
get { return (whichData & MenuItemDataFlags.IconHandle) != 0; }
567
public bool HasCommandID {
568
get { return (whichData & MenuItemDataFlags.CommandID) != 0; }
571
public bool HasEncoding {
572
get { return (whichData & MenuItemDataFlags.TextEncoding) != 0; }
575
public bool HasSubmenuID {
576
get { return (whichData & MenuItemDataFlags.SubmenuID) != 0; }
579
public bool HasSubmenuHandle {
580
get { return (whichData & MenuItemDataFlags.SubmenuHandle) != 0; }
583
public bool HasFontID {
584
get { return (whichData & MenuItemDataFlags.FontID) != 0; }
587
public bool HasRefcon {
588
get { return (whichData & MenuItemDataFlags.Refcon) != 0; }
591
public bool HasAttributes {
592
get { return (whichData & MenuItemDataFlags.Attributes) != 0; }
595
public bool HasCFText {
596
get { return (whichData & MenuItemDataFlags.CFString) != 0; }
599
public bool HasProperties {
600
get { return (whichData & MenuItemDataFlags.Properties) != 0; }
603
public bool HasIndent {
604
get { return (whichData & MenuItemDataFlags.Indent) != 0; }
607
public bool HasCommandVirtualKey {
608
get { return (whichData & MenuItemDataFlags.CmdVirtualKey) != 0; }
619
public HIIconHandle (IntPtr @ref, uint type)
625
public IntPtr Ref { get { return _ref; } }
626
public uint Type { get { return type; } }
629
enum CarbonTextEncoding : uint
633
enum MenuItemDataFlags : ulong
638
CmdKeyGlyph = (1 << 3),
639
CmdKeyModifiers = (1 << 4),
642
IconEnabled = (1 << 7),
644
IconHandle = (1 << 9),
645
CommandID = (1 << 10),
646
TextEncoding = (1 << 11),
647
SubmenuID = (1 << 12),
648
SubmenuHandle = (1 << 13),
651
Attributes = (1 << 16),
652
CFString = (1 << 17),
653
Properties = (1 << 18),
655
CmdVirtualKey = (1 << 20),
656
AllDataVersionOne = 0x000FFFFF,
657
AllDataVersionTwo = AllDataVersionOne | CmdVirtualKey,
660
enum MenuGlyphs : byte //char
673
NonmarkingReturn = 0x0D,
675
DownwardArrowDashed = 0x10,
679
AppleLogoFilled = 0x14,
680
ParagraphKorean = 0x15,
682
LeftArrowDashed = 0x18,
683
UpArrowDashed = 0x19,
684
RightArrowDashed = 0x1A,
687
LeftDoubleQuotesJapanese = 0x1D,
688
RightDoubleQuotesJapanese = 0x1E,
689
TrademarkJapanese = 0x1F,
695
NorthwestArrow = 0x66,
698
SoutheastArrow = 0x69,
701
AppleLogoOutline = 0x6C,
702
ContextualMenu = 0x6D,