1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
9 #include "mozilla/RefPtr.h"
10 #include "nsISupports.h"
11 #include "nsMenuGroupOwnerX.h"
12 #include "nsMenuItemIconX.h"
13 #include "nsChangeObserver.h"
14 #include "nsStringFwd.h"
16 #import <Cocoa/Cocoa.h>
18 class nsMenuItemIconX
;
26 } // namespace mozilla
29 knsMenuItemNoModifier
= 0,
30 knsMenuItemShiftModifier
= (1 << 0),
31 knsMenuItemAltModifier
= (1 << 1),
32 knsMenuItemControlModifier
= (1 << 2),
33 knsMenuItemCommandModifier
= (1 << 3)
37 eRegularMenuItemType
= 0,
38 eCheckboxMenuItemType
,
40 eSeparatorMenuItemType
43 // Once instantiated, this object lives until its DOM node or its parent window
44 // is destroyed. Do not hold references to this, they can become invalid any
45 // time the DOM node can be destroyed.
46 class nsMenuItemX final
: public nsChangeObserver
,
47 public nsMenuItemIconX::Listener
{
49 nsMenuItemX(nsMenuX
* aParent
, const nsString
& aLabel
, EMenuItemType aItemType
,
50 nsMenuGroupOwnerX
* aMenuGroupOwner
, nsIContent
* aNode
);
52 bool IsVisible() const { return mIsVisible
; }
54 // Unregisters nsMenuX from the nsMenuGroupOwner, and nulls out the group
55 // owner pointer. This is needed because nsMenuX is reference-counted and can
56 // outlive its owner, and the menu group owner asserts that everything has
57 // been unregistered when it is destroyed.
58 void DetachFromGroupOwner();
60 // Nulls out our reference to the parent.
61 // This is needed because nsMenuX is reference-counted and can outlive its
63 void DetachFromParent() { mMenuParent
= nullptr; }
65 NS_INLINE_DECL_REFCOUNTING(nsMenuItemX
)
67 NS_DECL_CHANGEOBSERVER
69 // nsMenuItemIconX::Listener
70 void IconUpdated() override
;
73 nsresult
SetChecked(bool aIsChecked
);
74 EMenuItemType
GetMenuItemType();
75 void DoCommand(NSEventModifierFlags aModifierFlags
, int16_t aButton
);
76 nsresult
DispatchDOMEvent(const nsString
& eventName
,
77 bool* preventDefaultCalled
);
79 nsMenuX
* ParentMenu() { return mMenuParent
; }
80 nsIContent
* Content() { return mContent
; }
81 NSMenuItem
* NativeNSMenuItem() { return mNativeMenuItem
; }
83 void Dump(uint32_t aIndent
) const;
86 virtual ~nsMenuItemX();
88 void UncheckRadioSiblings(nsIContent
* aCheckedElement
);
91 nsCOMPtr
<nsIContent
> mContent
; // XUL <menuitem> or <menuseparator>
95 // nsMenuItemX objects should always have a valid native menu item.
96 NSMenuItem
* mNativeMenuItem
= nil
; // [strong]
97 nsMenuX
* mMenuParent
= nullptr; // [weak]
98 nsMenuGroupOwnerX
* mMenuGroupOwner
= nullptr; // [weak]
99 RefPtr
<mozilla::dom::Element
> mCommandElement
;
100 mozilla::UniquePtr
<nsMenuItemIconX
> mIcon
; // always non-null
101 bool mIsChecked
= false;
102 bool mIsVisible
= false;
105 #endif // nsMenuItemX_h_