/* -*- 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/. */ // // nsMenuBarFrame // #ifndef nsMenuBarFrame_h__ #define nsMenuBarFrame_h__ #include "mozilla/Attributes.h" #include "nsIAtom.h" #include "nsCOMPtr.h" #include "nsBoxFrame.h" #include "nsMenuFrame.h" #include "nsMenuBarListener.h" #include "nsMenuParent.h" class nsIContent; nsIFrame* NS_NewMenuBarFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); class nsMenuBarFrame final : public nsBoxFrame, public nsMenuParent { public: NS_DECL_QUERYFRAME_TARGET(nsMenuBarFrame) NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS explicit nsMenuBarFrame(nsStyleContext* aContext); // 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 { return true; } // menubars are considered always open 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) 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(nsIDOMKeyEvent* aKeyEvent); 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(NS_LITERAL_STRING("MenuBar"), 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; mozilla::dom::EventTarget* mTarget; }; // class nsMenuBarFrame #endif