зеркало из https://github.com/mozilla/gecko-dev.git
Menus know about the ENTER key to execute, and know how to dismiss themselves
on mouse clicks.
This commit is contained in:
Родитель
eef0e8edf6
Коммит
ca1af77117
|
@ -39,6 +39,8 @@ public:
|
|||
NS_IMETHOD GetIsActive(PRBool& isActive) = 0;
|
||||
|
||||
NS_IMETHOD IsMenuBar(PRBool& isMenuBar) = 0;
|
||||
|
||||
NS_IMETHOD DismissChain() = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -39,6 +39,8 @@ public:
|
|||
NS_IMETHOD GetIsActive(PRBool& isActive) = 0;
|
||||
|
||||
NS_IMETHOD IsMenuBar(PRBool& isMenuBar) = 0;
|
||||
|
||||
NS_IMETHOD DismissChain() = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -406,4 +406,32 @@ nsMenuBarFrame::Escape()
|
|||
|
||||
// Clear our current menu item if we've got one.
|
||||
SetCurrentMenuItem(nsnull);
|
||||
}
|
||||
|
||||
void
|
||||
nsMenuBarFrame::Enter()
|
||||
{
|
||||
if (!mCurrentMenu)
|
||||
return;
|
||||
|
||||
// See if our menu is open.
|
||||
nsMenuFrame* menuFrame = (nsMenuFrame*)mCurrentMenu;
|
||||
if (menuFrame->IsOpen()) {
|
||||
// Let the child menu handle this.
|
||||
// menuFrame->Enter();
|
||||
return;
|
||||
}
|
||||
|
||||
// It's us. Open the current menu.
|
||||
menuFrame->OpenMenu(PR_TRUE);
|
||||
menuFrame->SelectFirstItem();
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMenuBarFrame::DismissChain()
|
||||
{
|
||||
SetCurrentMenuItem(nsnull);
|
||||
SetActive(PR_FALSE);
|
||||
return NS_OK;
|
||||
}
|
|
@ -51,6 +51,8 @@ public:
|
|||
|
||||
NS_IMETHOD IsActive() { return mIsActive; };
|
||||
|
||||
NS_IMETHOD DismissChain();
|
||||
|
||||
NS_IMETHOD Init(nsIPresContext& aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
|
@ -72,6 +74,9 @@ public:
|
|||
// Called when the ESC key is held down to close levels of menus.
|
||||
void Escape();
|
||||
|
||||
// Called to execute a menu item.
|
||||
void Enter();
|
||||
|
||||
protected:
|
||||
nsMenuBarListener* mMenuBarListener; // The listener that tells us about key and mouse events.
|
||||
PRBool mIsActive; // Whether or not the menu bar is active (a menu item is highlighted or shown).
|
||||
|
|
|
@ -136,6 +136,11 @@ nsMenuBarListener::KeyDown(nsIDOMEvent* aKeyEvent)
|
|||
if (active)
|
||||
mMenuBarFrame->Escape();
|
||||
}
|
||||
else if (theChar == NS_VK_ENTER) {
|
||||
// Open one level.
|
||||
if (active)
|
||||
mMenuBarFrame->Enter();
|
||||
}
|
||||
else {
|
||||
// Get the character code.
|
||||
nsCOMPtr<nsIDOMUIEvent> uiEvent = do_QueryInterface(aKeyEvent);
|
||||
|
|
|
@ -189,7 +189,7 @@ nsMenuFrame::HandleEvent(nsIPresContext& aPresContext,
|
|||
{
|
||||
aEventStatus = nsEventStatus_eConsumeDoDefault;
|
||||
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_DOWN) {
|
||||
// The menu item was clicked. Bring up the menu.
|
||||
// The menu item was selected. Bring up the menu.
|
||||
nsIFrame* frame = mPopupFrames.FirstChild();
|
||||
if (frame) {
|
||||
// We have children.
|
||||
|
@ -201,6 +201,15 @@ nsMenuFrame::HandleEvent(nsIPresContext& aPresContext,
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP) {
|
||||
// The menu item was invoked and can now be dismissed.
|
||||
nsCOMPtr<nsIAtom> tag;
|
||||
mContent->GetTag(*getter_AddRefs(tag));
|
||||
if (tag.get() == nsXULAtoms::xpmenuitem && mMenuParent) {
|
||||
// Close up the parent.
|
||||
mMenuParent->DismissChain();
|
||||
}
|
||||
}
|
||||
else if (aEvent->message == NS_MOUSE_EXIT) {
|
||||
// Deactivate the menu.
|
||||
PRBool isActive = PR_FALSE;
|
||||
|
|
|
@ -90,6 +90,8 @@ public:
|
|||
PRBool IsOpen() { return mMenuOpen; };
|
||||
void SetIsMenu(PRBool aIsMenu) { mIsMenu = aIsMenu; };
|
||||
|
||||
void GetMenuParent(nsIMenuParent** aResult) { NS_IF_ADDREF(mMenuParent); *aResult = mMenuParent; };
|
||||
|
||||
protected:
|
||||
void GetMenuChildrenElement(nsIContent** aResult);
|
||||
|
||||
|
|
|
@ -482,4 +482,24 @@ nsMenuPopupFrame::KeyboardNavigation(PRUint32 aDirection, PRBool& aHandledFlag)
|
|||
|
||||
aHandledFlag = PR_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMenuPopupFrame::DismissChain()
|
||||
{
|
||||
// Get our menu parent.
|
||||
nsIFrame* frame;
|
||||
GetParent(&frame);
|
||||
if (frame) {
|
||||
nsMenuFrame* menuFrame = (nsMenuFrame*)frame;
|
||||
menuFrame->OpenMenu(PR_FALSE);
|
||||
|
||||
// Get the parent.
|
||||
nsCOMPtr<nsIMenuParent> menuParent;
|
||||
menuFrame->GetMenuParent(getter_AddRefs(menuParent));
|
||||
if (menuParent)
|
||||
menuParent->DismissChain();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ public:
|
|||
NS_IMETHOD SetActive(PRBool aActiveFlag) { return NS_OK; }; // We don't care.
|
||||
NS_IMETHOD GetIsActive(PRBool& isActive) { isActive = PR_FALSE; return NS_OK; };
|
||||
NS_IMETHOD IsMenuBar(PRBool& isMenuBar) { isMenuBar = PR_FALSE; return NS_OK; };
|
||||
NS_IMETHOD DismissChain();
|
||||
|
||||
// Overridden methods
|
||||
NS_IMETHOD Init(nsIPresContext& aPresContext,
|
||||
|
|
Загрузка…
Ссылка в новой задаче