123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /* -*- 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
|