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
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
//
// nsMenuBarFrame
//
#ifndef nsMenuBarFrame_h__
#define nsMenuBarFrame_h__
#include "mozilla/Attributes.h"
#include "nsAtom.h"
#include "nsCOMPtr.h"
#include "nsBoxFrame.h"
#include "nsMenuFrame.h"
#include "nsMenuBarListener.h"
#include "nsMenuParent.h"
class nsIContent;
namespace mozilla {
class PresShell;
namespace dom {
class KeyboardEvent;
} // namespace dom
} // namespace mozilla
nsIFrame* NS_NewMenuBarFrame(mozilla::PresShell* aPresShell,
mozilla::ComputedStyle* aStyle);
class nsMenuBarFrame final : public nsBoxFrame, public nsMenuParent {
public:
NS_DECL_QUERYFRAME
NS_DECL_FRAMEARENA_HELPERS(nsMenuBarFrame)
explicit nsMenuBarFrame(ComputedStyle* aStyle, nsPresContext* aPresContext);
// nsMenuParent interface
virtual nsMenuFrame* GetCurrentMenuItem() override;
NS_IMETHOD SetCurrentMenuItem(nsMenuFrame* aMenuItem) override;
virtual void CurrentMenuIsBeingDestroyed() override;
NS_IMETHOD ChangeMenuItem(nsMenuFrame* aMenuItem, bool aSelectFirstItem,
bool aFromKey) override;
NS_IMETHOD SetActive(bool aActiveFlag) override;
virtual bool IsMenuBar() override { return true; }
virtual bool IsContextMenu() override { return false; }
virtual bool IsActive() override { return mIsActive; }
virtual bool IsMenu() override { return false; }
virtual bool IsOpen() override {
// menubars are considered always open
return true;
}
bool IsMenuOpen() { return mCurrentMenu && mCurrentMenu->IsOpen(); }
void InstallKeyboardNavigator();
void RemoveKeyboardNavigator();
virtual void Init(nsIContent* aContent, nsContainerFrame* aParent,
nsIFrame* aPrevInFlow) override;
virtual void DestroyFrom(nsIFrame* aDestructRoot,
PostDestroyData& aPostDestroyData) override;
virtual void LockMenuUntilClosed(bool aLock) override {}
virtual bool IsMenuLocked() override { return false; }
// Non-interface helpers
// The 'stay active' flag is set when navigating from one top-level menu
// to another, to prevent the menubar from deactivating and submenus from
// firing extra DOMMenuItemActive events.
bool GetStayActive() { return mStayActive; }
void SetStayActive(bool aStayActive) { mStayActive = aStayActive; }
// Called when a menu on the menu bar is clicked on. Returns a menu if one
// needs to be closed.
nsMenuFrame* ToggleMenuActiveState();
bool IsActiveByKeyboard() { return mActiveByKeyboard; }
void SetActiveByKeyboard() { mActiveByKeyboard = true; }
// indicate that a menu on the menubar was closed. Returns true if the caller
// may deselect the menuitem.
virtual bool MenuClosed() override;
// Called when Enter is pressed while the menubar is focused. If the current
// menu is open, let the child handle the key.
nsMenuFrame* Enter(mozilla::WidgetGUIEvent* aEvent);
// Used to handle ALT+key combos
nsMenuFrame* FindMenuWithShortcut(mozilla::dom::KeyboardEvent* aKeyEvent,
bool aPeek);
virtual bool IsFrameOfType(uint32_t aFlags) const override {
// Override bogus IsFrameOfType in nsBoxFrame.
if (aFlags & (nsIFrame::eReplacedContainsBlock | nsIFrame::eReplaced))
return false;
return nsBoxFrame::IsFrameOfType(aFlags);
}
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override {
return MakeFrameName(u"MenuBar"_ns, aResult);
}
#endif
protected:
RefPtr<nsMenuBarListener> mMenuBarListener; // The listener that tells us
// about key and mouse events.
// flag that is temporarily set when switching from one menu on the menubar to
// another to indicate that the menubar should not be deactivated.
bool mStayActive;
bool mIsActive; // Whether or not the menu bar is active (a menu item is
// highlighted or shown).
// whether the menubar was made active via the keyboard.
bool mActiveByKeyboard;
// The current menu that is active (highlighted), which may not be open. This
// will be null if no menu is active.
nsMenuFrame* mCurrentMenu;
}; // class nsMenuBarFrame
#endif
|