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/. */
5 
6 #ifndef nsMenuItemX_h_
7 #define nsMenuItemX_h_
8 
9 #include "mozilla/RefPtr.h"
10 #include "nsMenuBaseX.h"
11 #include "nsMenuGroupOwnerX.h"
12 #include "nsChangeObserver.h"
13 
14 #import <Cocoa/Cocoa.h>
15 
16 class nsString;
17 class nsMenuItemIconX;
18 class nsMenuX;
19 
20 enum {
21   knsMenuItemNoModifier      = 0,
22   knsMenuItemShiftModifier   = (1 << 0),
23   knsMenuItemAltModifier     = (1 << 1),
24   knsMenuItemControlModifier = (1 << 2),
25   knsMenuItemCommandModifier = (1 << 3)
26 };
27 
28 enum EMenuItemType {
29   eRegularMenuItemType = 0,
30   eCheckboxMenuItemType,
31   eRadioMenuItemType,
32   eSeparatorMenuItemType
33 };
34 
35 
36 // Once instantiated, this object lives until its DOM node or its parent window is destroyed.
37 // Do not hold references to this, they can become invalid any time the DOM node can be destroyed.
38 class nsMenuItemX : public nsMenuObjectX,
39                     public nsChangeObserver
40 {
41 public:
42   nsMenuItemX();
43   virtual ~nsMenuItemX();
44 
45   NS_DECL_CHANGEOBSERVER
46 
47   // nsMenuObjectX
NativeData()48   void*             NativeData() override {return (void*)mNativeMenuItem;}
MenuObjectType()49   nsMenuObjectTypeX MenuObjectType() override {return eMenuItemObjectType;}
50 
51   // nsMenuItemX
52   nsresult      Create(nsMenuX* aParent, const nsString& aLabel, EMenuItemType aItemType,
53                        nsMenuGroupOwnerX* aMenuGroupOwner, nsIContent* aNode);
54   nsresult      SetChecked(bool aIsChecked);
55   EMenuItemType GetMenuItemType();
56   void          DoCommand();
57   nsresult      DispatchDOMEvent(const nsString &eventName, bool* preventDefaultCalled);
58   void          SetupIcon();
59 
60 protected:
61   void UncheckRadioSiblings(nsIContent* inCheckedElement);
62   void SetKeyEquiv();
63 
64   EMenuItemType             mType;
65   // nsMenuItemX objects should always have a valid native menu item.
66   NSMenuItem*               mNativeMenuItem;      // [strong]
67   nsMenuX*                  mMenuParent;          // [weak]
68   nsMenuGroupOwnerX*        mMenuGroupOwner;      // [weak]
69   nsCOMPtr<nsIContent>      mCommandContent;
70   // The icon object should never outlive its creating nsMenuItemX object.
71   RefPtr<nsMenuItemIconX> mIcon;
72   bool                      mIsChecked;
73 };
74 
75 #endif // nsMenuItemX_h_
76