1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsMenuBarX_h_
#define nsMenuBarX_h_
#import <Cocoa/Cocoa.h>
#include "mozilla/UniquePtr.h"
#include "nsMenuBaseX.h"
#include "nsMenuGroupOwnerX.h"
#include "nsChangeObserver.h"
#include "nsINativeMenuService.h"
#include "nsString.h"
class nsMenuBarX;
class nsMenuX;
class nsIWidget;
class nsIContent;
namespace mozilla {
namespace dom {
class Document;
class Element;
}
}
// ApplicationMenuDelegate is used to receive Cocoa notifications.
@interface ApplicationMenuDelegate : NSObject <NSMenuDelegate> {
nsMenuBarX* mApplicationMenu; // weak ref
}
- (id)initWithApplicationMenu:(nsMenuBarX*)aApplicationMenu;
@end
// The native menu service for creating native menu bars.
class nsNativeMenuServiceX : public nsINativeMenuService {
public:
NS_DECL_ISUPPORTS
nsNativeMenuServiceX() {}
NS_IMETHOD CreateNativeMenuBar(nsIWidget* aParent, mozilla::dom::Element* aMenuBarNode) override;
protected:
virtual ~nsNativeMenuServiceX() {}
};
// Objective-C class used to allow us to intervene with keyboard event handling.
// We allow mouse actions to work normally.
@interface GeckoNSMenu : NSMenu {
}
- (BOOL)performSuperKeyEquivalent:(NSEvent*)theEvent;
@end
// Objective-C class used as action target for menu items
@interface NativeMenuItemTarget : NSObject {
}
- (IBAction)menuItemHit:(id)sender;
@end
// Objective-C class used for menu items on the Services menu to allow Gecko
// to override their standard behavior in order to stop key equivalents from
// firing in certain instances.
@interface GeckoServicesNSMenuItem : NSMenuItem {
}
- (id)target;
- (SEL)action;
- (void)_doNothing:(id)sender;
@end
// Objective-C class used as the Services menu so that Gecko can override the
// standard behavior of the Services menu in order to stop key equivalents
// from firing in certain instances.
@interface GeckoServicesNSMenu : NSMenu {
}
- (void)addItem:(NSMenuItem*)newItem;
- (NSMenuItem*)addItemWithTitle:(NSString*)aString
action:(SEL)aSelector
keyEquivalent:(NSString*)keyEquiv;
- (void)insertItem:(NSMenuItem*)newItem atIndex:(NSInteger)index;
- (NSMenuItem*)insertItemWithTitle:(NSString*)aString
action:(SEL)aSelector
keyEquivalent:(NSString*)keyEquiv
atIndex:(NSInteger)index;
- (void)_overrideClassOfMenuItem:(NSMenuItem*)menuItem;
@end
// Once instantiated, this object lives until its DOM node or its parent window is destroyed.
// Do not hold references to this, they can become invalid any time the DOM node can be destroyed.
class nsMenuBarX : public nsMenuGroupOwnerX, public nsChangeObserver {
public:
nsMenuBarX();
virtual ~nsMenuBarX();
static NativeMenuItemTarget* sNativeEventTarget;
static nsMenuBarX* sLastGeckoMenuBarPainted;
// The following content nodes have been removed from the menu system.
// We save them here for use in command handling.
nsCOMPtr<nsIContent> mAboutItemContent;
nsCOMPtr<nsIContent> mPrefItemContent;
nsCOMPtr<nsIContent> mQuitItemContent;
// nsChangeObserver
NS_DECL_CHANGEOBSERVER
// nsMenuObjectX
void* NativeData() override { return (void*)mNativeMenu; }
nsMenuObjectTypeX MenuObjectType() override { return eMenuBarObjectType; }
// nsMenuBarX
nsresult Create(nsIWidget* aParent, mozilla::dom::Element* aElement);
void SetParent(nsIWidget* aParent);
uint32_t GetMenuCount();
bool MenuContainsAppMenu();
nsMenuX* GetMenuAt(uint32_t aIndex);
nsMenuX* GetXULHelpMenu();
void SetSystemHelpMenu();
nsresult Paint();
void ForceUpdateNativeMenuAt(const nsAString& indexString);
void ForceNativeMenuReload(); // used for testing
static char GetLocalizedAccelKey(const char* shortcutID);
static void ResetNativeApplicationMenu();
void SetNeedsRebuild();
void ApplicationMenuOpened();
bool PerformKeyEquivalent(NSEvent* theEvent);
protected:
void ConstructNativeMenus();
void ConstructFallbackNativeMenus();
nsresult InsertMenuAtIndex(nsMenuX* aMenu, uint32_t aIndex);
void RemoveMenuAtIndex(uint32_t aIndex);
void HideItem(mozilla::dom::Document* inDoc, const nsAString& inID, nsIContent** outHiddenNode);
void AquifyMenuBar();
NSMenuItem* CreateNativeAppMenuItem(nsMenuX* inMenu, const nsAString& nodeID, SEL action, int tag,
NativeMenuItemTarget* target);
nsresult CreateApplicationMenu(nsMenuX* inMenu);
nsTArray<mozilla::UniquePtr<nsMenuX>> mMenuArray;
nsIWidget* mParentWindow; // [weak]
GeckoNSMenu* mNativeMenu; // root menu, representing entire menu bar
bool mNeedsRebuild;
ApplicationMenuDelegate* mApplicationMenuDelegate;
};
#endif // nsMenuBarX_h_
|