Fixes a visibility logic bug. Also extends support for the collapsed attribute to all menu node types (menu, menu item, and separator). Apparently there was a previous assumption that collapsed would only be used on the menu type, but that is nonsense. In XUL collapsed=true is the same as visibility:collapsed, and according to CSS2 visibility:collapsed outside the context of a table is the same as hidden:true. Cleans up the code for hidden and collapsed attribute checks. b=373730 r=mano sr=pav

This commit is contained in:
joshmoz%gmail.com 2007-03-13 22:28:08 +00:00
Родитель a063d1457c
Коммит ec6e299f88
4 изменённых файлов: 33 добавлений и 43 удалений

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

@ -58,6 +58,8 @@ class nsIDOMNode;
extern "C" MenuRef _NSGetCarbonMenu(NSMenu* aMenu); extern "C" MenuRef _NSGetCarbonMenu(NSMenu* aMenu);
PRBool NodeIsHiddenOrCollapsed(nsIContent* inContent);
namespace MenuHelpersX namespace MenuHelpersX
{ {
nsEventStatus DispatchCommandTo(nsIWeakReference* aDocShellWeakRef, nsEventStatus DispatchCommandTo(nsIWeakReference* aDocShellWeakRef,

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

@ -87,6 +87,15 @@ enum {
}; };
PRBool NodeIsHiddenOrCollapsed(nsIContent* inContent)
{
return (inContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) ||
inContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters));
}
nsMenuBarX::nsMenuBarX() nsMenuBarX::nsMenuBarX()
: mParent(nsnull), mIsMenuBarAdded(PR_FALSE), mCurrentCommandID(eCommand_ID_Last), mDocument(nsnull) : mParent(nsnull), mIsMenuBarAdded(PR_FALSE), mCurrentCommandID(eCommand_ID_Last), mDocument(nsnull)
{ {
@ -502,9 +511,8 @@ NS_IMETHODIMP nsMenuBarX::AddMenu(nsIMenu * aMenu)
nsCOMPtr<nsIContent> menu; nsCOMPtr<nsIContent> menu;
aMenu->GetMenuContent(getter_AddRefs(menu)); aMenu->GetMenuContent(getter_AddRefs(menu));
if (!menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden, if (menu->GetChildCount() > 0 &&
nsWidgetAtoms::_true, eCaseMatters) && !NodeIsHiddenOrCollapsed(menu)) {
menu->GetChildCount() > 0) {
NSMenuItem* newMenuItem = [[[NSMenuItem alloc] initWithTitle:@"SomeMenuItem" action:NULL keyEquivalent:@""] autorelease]; NSMenuItem* newMenuItem = [[[NSMenuItem alloc] initWithTitle:@"SomeMenuItem" action:NULL keyEquivalent:@""] autorelease];
[mRootMenu addItem:newMenuItem]; [mRootMenu addItem:newMenuItem];
[newMenuItem setSubmenu:menuRef]; [newMenuItem setSubmenu:menuRef];

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

@ -135,9 +135,9 @@ protected:
PRBool OnDestroyed(); PRBool OnDestroyed();
PRBool OnCreated(); PRBool OnCreated();
void LoadMenuItem(nsIMenu* pParentMenu, nsIContent* menuitemContent); void LoadMenuItem(nsIMenu* pParentMenu, nsIContent* inMenuItemContent);
void LoadSubMenu(nsIMenu * pParentMenu, nsIContent* menuitemContent); void LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuContent);
void LoadSeparator(nsIContent* menuitemContent); void LoadSeparator(nsIContent* inSeparatorContent);
NSMenu* CreateMenuWithGeckoString(nsString& menuTitle); NSMenu* CreateMenuWithGeckoString(nsString& menuTitle);

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

@ -153,10 +153,7 @@ nsMenuX::Create(nsISupports * aParent, const nsAString &aLabel, const nsAString
// SetLabel will create the native menu if it has not been created yet // SetLabel will create the native menu if it has not been created yet
SetLabel(aLabel); SetLabel(aLabel);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden, if (NodeIsHiddenOrCollapsed(mMenuContent))
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters))
mVisible = PR_FALSE; mVisible = PR_FALSE;
if (menubar && mMenuContent->GetChildCount() == 0) if (menubar && mMenuContent->GetChildCount() == 0)
@ -614,9 +611,7 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
if (!inMenuItemContent) if (!inMenuItemContent)
return; return;
// if menu should be hidden, bail if (NodeIsHiddenOrCollapsed(inMenuItemContent))
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
return; return;
// create nsMenuItem // create nsMenuItem
@ -687,15 +682,13 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
} }
void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent) void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuContent)
{ {
// if menu should be hidden, bail if (NodeIsHiddenOrCollapsed(inMenuContent))
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
return; return;
nsAutoString menuName; nsAutoString menuName;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuName); inMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuName);
//printf("Creating Menu [%s] \n", NS_LossyConvertUTF16toASCII(menuName).get()); //printf("Creating Menu [%s] \n", NS_LossyConvertUTF16toASCII(menuName).get());
// Create nsMenu // Create nsMenu
@ -706,11 +699,11 @@ void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
if (!docShell) if (!docShell)
return; return;
nsCOMPtr<nsISupports> supports(do_QueryInterface(pParentMenu)); nsCOMPtr<nsISupports> supports(do_QueryInterface(pParentMenu));
pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuItemContent); pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuContent);
// set if it's enabled or disabled // set if it's enabled or disabled
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled, if (inMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters)) nsWidgetAtoms::_true, eCaseMatters))
pnsMenu->SetEnabled(PR_FALSE); pnsMenu->SetEnabled(PR_FALSE);
else else
pnsMenu->SetEnabled(PR_TRUE); pnsMenu->SetEnabled(PR_TRUE);
@ -722,11 +715,9 @@ void nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
} }
void nsMenuX::LoadSeparator(nsIContent* inMenuItemContent) void nsMenuX::LoadSeparator(nsIContent* inSeparatorContent)
{ {
// if item should be hidden, bail if (NodeIsHiddenOrCollapsed(inSeparatorContent))
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
return; return;
AddSeparator(); AddSeparator();
@ -968,30 +959,22 @@ nsresult nsMenuX::CountVisibleBefore(PRUint32* outVisibleBefore)
for (PRUint32 i = 0; i < numMenus; i++) { for (PRUint32 i = 0; i < numMenus; i++) {
nsCOMPtr<nsIMenu> currMenu; nsCOMPtr<nsIMenu> currMenu;
menubarParent->GetMenuAt(i, *getter_AddRefs(currMenu)); menubarParent->GetMenuAt(i, *getter_AddRefs(currMenu));
// we found ourselves, break out
if (currMenu == NS_STATIC_CAST(nsIMenu*, this)) { if (currMenu == NS_STATIC_CAST(nsIMenu*, this)) {
// we found ourselves, break out
gotThisMenu = PR_TRUE; gotThisMenu = PR_TRUE;
break; break;
} }
// check the current menu to see if it is visible (not hidden, not collapsed). If
// it is, count it.
if (currMenu) { if (currMenu) {
nsCOMPtr<nsIContent> menuContent; nsCOMPtr<nsIContent> menuContent;
currMenu->GetMenuContent(getter_AddRefs(menuContent)); currMenu->GetMenuContent(getter_AddRefs(menuContent));
if (menuContent) { if (menuContent &&
if (menuContent->GetChildCount() > 0 || menuContent->GetChildCount() > 0 &&
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden, !NodeIsHiddenOrCollapsed(menuContent)) {
nsWidgetAtoms::_true, eCaseMatters) && ++(*outVisibleBefore);
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters)) {
++(*outVisibleBefore);
}
} }
} }
}
} // for each menu
return gotThisMenu ? NS_OK : NS_ERROR_FAILURE; return gotThisMenu ? NS_OK : NS_ERROR_FAILURE;
} // CountVisibleBefore } // CountVisibleBefore
@ -1061,10 +1044,7 @@ NS_IMETHODIMP nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpa
else if (aAttribute == nsWidgetAtoms::hidden || aAttribute == nsWidgetAtoms::collapsed) { else if (aAttribute == nsWidgetAtoms::hidden || aAttribute == nsWidgetAtoms::collapsed) {
SetRebuild(PR_TRUE); SetRebuild(PR_TRUE);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden, if (NodeIsHiddenOrCollapsed(mMenuContent)) {
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters)) {
if (mVisible) { if (mVisible) {
if (menubarParent) { if (menubarParent) {
PRUint32 indexToRemove = 0; PRUint32 indexToRemove = 0;