Menus know about the ENTER key to execute, and know how to dismiss themselves

on mouse clicks.
This commit is contained in:
hyatt%netscape.com 1999-07-24 01:59:32 +00:00
Родитель eef0e8edf6
Коммит ca1af77117
9 изменённых файлов: 76 добавлений и 2 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -407,3 +407,31 @@ 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);

Просмотреть файл

@ -483,3 +483,23 @@ 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,