Back out checkin for bug 333896 which causes tinderbox orange since nsWidgetAtoms aren't initialized.

git-svn-id: svn://10.0.0.236/trunk@196669 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dbaron%dbaron.org 2006-05-16 13:35:27 +00:00
parent 78cc4a35c6
commit cc15a61526
23 changed files with 284 additions and 252 deletions

View File

@ -54,46 +54,29 @@
******/
WIDGET_ATOM(accesskey, "accesskey") // The shortcut key for a menu or menu item
WIDGET_ATOM(ascending, "ascending")
WIDGET_ATOM(autocheck, "autocheck")
WIDGET_ATOM(checkbox, "checkbox")
WIDGET_ATOM(checked, "checked")
WIDGET_ATOM(_class, "class")
WIDGET_ATOM(collapsed, "collapsed")
WIDGET_ATOM(command, "command")
WIDGET_ATOM(curpos, "curpos")
WIDGET_ATOM(_default, "default")
WIDGET_ATOM(descending, "descending")
WIDGET_ATOM(disabled, "disabled")
WIDGET_ATOM(_false, "false")
WIDGET_ATOM(firsttab, "first-tab")
WIDGET_ATOM(focused, "focused")
WIDGET_ATOM(hidden, "hidden")
WIDGET_ATOM(horizontal, "horizontal")
WIDGET_ATOM(id, "id")
WIDGET_ATOM(increment, "increment")
WIDGET_ATOM(input, "input")
WIDGET_ATOM(menuseparator, "menuseparator") // Divider between menu items
WIDGET_ATOM(modifiers, "modifiers") // The modifiers attribute
WIDGET_ATOM(key, "key") // The key element / attribute
WIDGET_ATOM(label, "label")
WIDGET_ATOM(maxpos, "maxpos")
WIDGET_ATOM(command, "command")
WIDGET_ATOM(menu, "menu") // Represents an XP menu
WIDGET_ATOM(menuitem, "menuitem") // Represents an XP menu item
WIDGET_ATOM(menupopup, "menupopup") // The XP menu's children.
WIDGET_ATOM(menuseparator, "menuseparator") // Divider between menu items
WIDGET_ATOM(mode, "mode")
WIDGET_ATOM(modifiers, "modifiers") // The modifiers attribute
WIDGET_ATOM(mozinputchecked, "_moz-input-checked")
WIDGET_ATOM(mozmenuactive, "_moz-menuactive")
WIDGET_ATOM(name, "name")
WIDGET_ATOM(open, "open") // Whether or not a menu, tree, etc. is open
WIDGET_ATOM(orient, "orient")
WIDGET_ATOM(pageincrement, "pageincrement")
WIDGET_ATOM(radio, "radio")
WIDGET_ATOM(readonly, "readonly")
WIDGET_ATOM(selected, "selected")
WIDGET_ATOM(sortdirection, "sortDirection")
WIDGET_ATOM(_true, "true")
WIDGET_ATOM(type, "type")
WIDGET_ATOM(value, "value")
WIDGET_ATOM(menupopup, "menupopup") // The XP menu's children.
WIDGET_ATOM(id, "id")
WIDGET_ATOM(accesskey, "accesskey") // The shortcut key for a menu or menu item
WIDGET_ATOM(name, "name")
WIDGET_ATOM(type, "type")
WIDGET_ATOM(autocheck, "autocheck")
WIDGET_ATOM(checked, "checked")
WIDGET_ATOM(disabled, "disabled")
WIDGET_ATOM(label, "label")
WIDGET_ATOM(hidden, "hidden")
WIDGET_ATOM(curpos, "curpos")
WIDGET_ATOM(maxpos, "maxpos")
WIDGET_ATOM(increment, "increment")
WIDGET_ATOM(pageincrement, "pageincrement")
WIDGET_ATOM(orient, "orient")

View File

@ -73,7 +73,6 @@ endif
LOCAL_INCLUDES = \
-I$(srcdir) \
-I$(srcdir)/../xpwidgets \
-I$(srcdir)/../../public \
-I$(srcdir)/../windows \
$(NULL)

View File

@ -422,8 +422,9 @@ nsMenuBarX::MenuConstruct(const nsMenuEvent & aMenuEvent, nsIWidget* aParentWind
// Make nsMenu a child of nsMenuBar. nsMenuBar takes ownership.
AddMenu(pnsMenu);
if (menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::id,
NS_LITERAL_STRING("menu_Help"), eCaseMatters)) {
nsAutoString menuIDstring;
menu->GetAttr(kNameSpaceID_None, nsWidgetAtoms::id, menuIDstring);
if (menuIDstring.EqualsLiteral("menu_Help")) {
nsMenuEvent event(PR_TRUE, 0, nsnull);
event.mCommand = (unsigned int)nsnull;
nsCOMPtr<nsIMenuListener> listener(do_QueryInterface(pnsMenu));
@ -494,9 +495,9 @@ NS_IMETHODIMP nsMenuBarX::AddMenu(nsIMenu * aMenu)
nsCOMPtr<nsIContent> menu;
aMenu->GetMenuContent(getter_AddRefs(menu));
if (!menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) &&
menu->GetChildCount() > 0) {
nsAutoString menuHidden;
menu->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, menuHidden);
if (!menuHidden.EqualsLiteral("true") && menu->GetChildCount() > 0) {
NSMenuItem* newMenuItem = [[[NSMenuItem alloc] initWithTitle:@"SomeMenuItem" action:NULL keyEquivalent:@""] autorelease];
[mRootMenu addItem:newMenuItem];
[newMenuItem setSubmenu:menuRef];

View File

@ -389,8 +389,9 @@ nsMenuItemX::UncheckRadioSiblings(nsIContent* inCheckedContent)
if (sibling) {
if (sibling != inCheckedContent) { // skip this node
// if the current sibling is in the same group, clear it
if (sibling->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::name,
myGroupName, eCaseMatters))
nsAutoString currGroupName;
sibling->GetAttr(kNameSpaceID_None, nsWidgetAtoms::name, currGroupName);
if (currGroupName == myGroupName)
sibling->SetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, NS_LITERAL_STRING("false"), PR_TRUE);
}
}
@ -410,8 +411,9 @@ nsMenuItemX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpaceID, nsIA
// if we're a radio menu, uncheck our sibling radio items. No need to
// do any of this if we're just a normal check menu.
if (mMenuType == eRadio) {
if (mContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString checked;
mContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, checked);
if (checked.EqualsLiteral("true"))
UncheckRadioSiblings(mContent);
}
nsCOMPtr<nsIMenuListener> listener = do_QueryInterface(mMenuParent);

View File

@ -147,10 +147,10 @@ nsMenuX::Create(nsISupports * aParent, const nsAString &aLabel, const nsAString
SetLabel(aLabel);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hiddenValue, collapsedValue;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if (hiddenValue.EqualsLiteral("true") || collapsedValue.EqualsLiteral("true"))
mVisible = PR_FALSE;
if (menubar && mMenuContent->GetChildCount() == 0)
@ -584,31 +584,33 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
return;
// if menu should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if (hidden.EqualsLiteral("true"))
return;
// create nsMenuItem
nsCOMPtr<nsIMenuItem> pnsMenuItem = do_CreateInstance(kMenuItemCID);
if (pnsMenuItem) {
nsAutoString disabled;
nsAutoString checked;
nsAutoString type;
nsAutoString menuitemName;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, disabled);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, checked);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::type, type);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuitemName);
// printf("menuitem %s \n", NS_LossyConvertUTF16toASCII(menuitemName).get());
PRBool enabled =
! (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters));
PRBool enabled = !(disabled.EqualsLiteral("true"));
static nsIContent::AttrValuesArray strings[] =
{&nsWidgetAtoms::checkbox, &nsWidgetAtoms::radio, nsnull};
nsIMenuItem::EMenuItemType itemType = nsIMenuItem::eRegular;
switch (inMenuItemContent->FindAttrValueIn(kNameSpaceID_None, nsWidgetAtoms::type,
strings, eCaseMatters)) {
case 0: itemType = nsIMenuItem::eCheckbox; break;
case 1: itemType = nsIMenuItem::eRadio; break;
}
if (type.EqualsLiteral("checkbox"))
itemType = nsIMenuItem::eCheckbox;
else if (type.EqualsLiteral("radio"))
itemType = nsIMenuItem::eRadio;
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShellWeakRef);
if (!docShell)
@ -648,8 +650,7 @@ void nsMenuX::LoadMenuItem(nsIMenu* inParentMenu, nsIContent* inMenuItemContent)
pnsMenuItem->SetModifiers(modifiers);
}
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eCaseMatters))
if (checked.EqualsLiteral("true"))
pnsMenuItem->SetChecked(PR_TRUE);
else
pnsMenuItem->SetChecked(PR_FALSE);
@ -664,8 +665,9 @@ void
nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
{
// if menu should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if (hidden.EqualsLiteral("true"))
return;
nsAutoString menuName;
@ -683,8 +685,9 @@ nsMenuX::LoadSubMenu(nsIMenu * pParentMenu, nsIContent* inMenuItemContent)
pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuItemContent);
// set if it's enabled or disabled
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString disabled;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, disabled);
if (disabled.EqualsLiteral("true"))
pnsMenu->SetEnabled(PR_FALSE);
else
pnsMenu->SetEnabled(PR_TRUE);
@ -700,8 +703,9 @@ void
nsMenuX::LoadSeparator(nsIContent* inMenuItemContent)
{
// if item should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if (hidden.EqualsLiteral("true"))
return;
AddSeparator();
@ -970,11 +974,12 @@ nsMenuX::CountVisibleBefore(PRUint32* outVisibleBefore)
nsCOMPtr<nsIContent> menuContent;
currMenu->GetMenuContent(getter_AddRefs(menuContent));
if (menuContent) {
nsAutoString hiddenValue, collapsedValue;
menuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
menuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if (menuContent->GetChildCount() > 0 ||
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) &&
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters)) {
!hiddenValue.EqualsLiteral("true") &&
!collapsedValue.EqualsLiteral("true")) {
++(*outVisibleBefore);
}
}
@ -1003,8 +1008,9 @@ nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpaceID, nsIAtom
if (aAttribute == nsWidgetAtoms::disabled) {
SetRebuild(PR_TRUE);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString valueString;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, valueString);
if (valueString.EqualsLiteral("true"))
SetEnabled(PR_FALSE);
else
SetEnabled(PR_TRUE);
@ -1032,11 +1038,12 @@ nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpaceID, nsIAtom
}
else if (aAttribute == nsWidgetAtoms::hidden || aAttribute == nsWidgetAtoms::collapsed) {
SetRebuild(PR_TRUE);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters)) {
nsAutoString hiddenValue, collapsedValue;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if (hiddenValue.EqualsLiteral("true") || collapsedValue.EqualsLiteral("true")) {
if (mVisible) {
if (menubarParent) {
PRUint32 indexToRemove = 0;

View File

@ -417,8 +417,9 @@ nsNativeScrollbar::SetContent(nsIContent* inContent, nsISupports* inScrollbar,
// we may have to re-create the scrollbar view as horizontal. Check the
// 'orient' attribute and rebuild the view with all the settings
// present in the current view
if (mContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::orient,
nsWidgetAtoms::horizontal, eCaseMatters))
nsAutoString orient;
mContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::orient, orient);
if ( orient.Equals(NS_LITERAL_STRING("horizontal")) )
RecreateHorizontalScrollbar();
}

View File

@ -143,7 +143,6 @@ endif
LOCAL_INCLUDES = \
-I$(srcdir)/../xpwidgets \
-I$(srcdir)/../../public \
-I$(srcdir) \
-I$(topsrcdir)/gfx/src/gtk \
$(NULL)

View File

@ -55,7 +55,6 @@
#include "nsTransform2D.h"
#include "nsIMenuFrame.h"
#include "nsIMenuParent.h"
#include "nsWidgetAtoms.h"
#include "prlink.h"
#include <gdk/gdkprivate.h>
@ -78,6 +77,12 @@ nsNativeThemeGTK::nsNativeThemeGTK()
do_GetService("@mozilla.org/observer-service;1");
obsServ->AddObserver(this, "xpcom-shutdown", PR_FALSE);
mInputCheckedAtom = do_GetAtom("_moz-input-checked");
mInputAtom = do_GetAtom("input");
mCurPosAtom = do_GetAtom("curpos");
mMaxPosAtom = do_GetAtom("maxpos");
mMenuActiveAtom = do_GetAtom("_moz-menuactive");
memset(mDisabledWidgetTypes, 0, sizeof(mDisabledWidgetTypes));
memset(mSafeWidgetStates, 0, sizeof(mSafeWidgetStates));
@ -194,15 +199,13 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
// widgets, so don't adjust stateFrame here.
aFrame = aFrame->GetParent();
}
} else if (content->Tag() == nsWidgetAtoms::input) {
atom = nsWidgetAtoms::mozinputchecked;
} else if (content->Tag() == mInputAtom) {
atom = mInputCheckedAtom;
}
if (aWidgetFlags) {
if (!atom) {
atom = (aWidgetType == NS_THEME_CHECKBOX ||
aWidgetType == NS_THEME_CHECKBOX_LABEL) ? nsWidgetAtoms::checked
: nsWidgetAtoms::selected;
atom = (aWidgetType == NS_THEME_CHECKBOX || aWidgetType == NS_THEME_CHECKBOX_LABEL) ? mCheckedAtom : mSelectedAtom;
}
*aWidgetFlags = CheckBooleanAttr(aFrame, atom);
}
@ -234,8 +237,8 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
// the slider to the actual scrollbar object
nsIFrame *tmpFrame = aFrame->GetParent()->GetParent();
aState->curpos = CheckIntAttr(tmpFrame, nsWidgetAtoms::curpos);
aState->maxpos = CheckIntAttr(tmpFrame, nsWidgetAtoms::maxpos);
aState->curpos = CheckIntAttr(tmpFrame, mCurPosAtom);
aState->maxpos = CheckIntAttr(tmpFrame, mMaxPosAtom);
}
// menu item state is determined by the attribute "_moz-menuactive",
@ -261,7 +264,7 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
menuFrame->MenuIsOpen(isOpen);
aState->inHover = isOpen;
} else {
aState->inHover = CheckBooleanAttr(aFrame, nsWidgetAtoms::mozmenuactive);
aState->inHover = CheckBooleanAttr(aFrame, mMenuActiveAtom);
}
aState->active = FALSE;
@ -269,8 +272,8 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
if (aWidgetType == NS_THEME_CHECKMENUITEM ||
aWidgetType == NS_THEME_RADIOMENUITEM) {
*aWidgetFlags = aFrame && aFrame->GetContent()->
AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eIgnoreCase);
AttrValueIs(kNameSpaceID_None, mCheckedAtom,
NS_LITERAL_STRING("true"), eIgnoreCase);
}
}
}
@ -363,13 +366,12 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
*aWidgetFlags = 0;
if (aWidgetType == NS_THEME_TAB &&
CheckBooleanAttr(aFrame, nsWidgetAtoms::selected))
CheckBooleanAttr(aFrame, mSelectedAtom))
*aWidgetFlags |= MOZ_GTK_TAB_SELECTED;
else if (aWidgetType == NS_THEME_TAB_LEFT_EDGE)
*aWidgetFlags |= MOZ_GTK_TAB_BEFORE_SELECTED;
if (aFrame->GetContent()->HasAttr(kNameSpaceID_None,
nsWidgetAtoms::firsttab))
if (aFrame->GetContent()->HasAttr(kNameSpaceID_None, mFirstTabAtom))
*aWidgetFlags |= MOZ_GTK_TAB_FIRST;
}
@ -691,11 +693,9 @@ nsNativeThemeGTK::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
// Check the attribute to see if it's relevant.
// disabled, checked, dlgtype, default, etc.
*aShouldRepaint = PR_FALSE;
if (aAttribute == nsWidgetAtoms::disabled ||
aAttribute == nsWidgetAtoms::checked ||
aAttribute == nsWidgetAtoms::selected ||
aAttribute == nsWidgetAtoms::focused ||
aAttribute == nsWidgetAtoms::mozmenuactive)
if (aAttribute == mDisabledAtom || aAttribute == mCheckedAtom ||
aAttribute == mSelectedAtom || aAttribute == mFocusedAtom ||
aAttribute == mMenuActiveAtom)
*aShouldRepaint = PR_TRUE;
}

View File

@ -97,6 +97,13 @@ private:
void RefreshWidgetWindow(nsIFrame* aFrame);
nsCOMPtr<nsIAtom> mTypeAtom;
nsCOMPtr<nsIAtom> mInputCheckedAtom;
nsCOMPtr<nsIAtom> mInputAtom;
nsCOMPtr<nsIAtom> mCurPosAtom;
nsCOMPtr<nsIAtom> mMaxPosAtom;
nsCOMPtr<nsIAtom> mMenuActiveAtom;
PRUint8 mDisabledWidgetTypes[32];
PRUint8 mSafeWidgetStates[1024]; // 256 widgets * 32 bits per widget
static const char* sDisabledEngines[];

View File

@ -130,7 +130,7 @@ EXTRA_DSO_LDOPTS += -lthebes
endif
EXPORTS = \
nsIGdkPixbufImage.h \
nsIGdkPixbufImage.h \
mozdrawingarea.h \
mozcontainer.h \
$(NULL)
@ -161,7 +161,6 @@ endif
DEFINES +=
INCLUDES += \
-I$(srcdir)/../xpwidgets \
-I$(srcdir)/../../public \
$(NULL)
test_container: mozdrawingarea.o mozcontainer.o test_container.c

View File

@ -57,7 +57,6 @@
#include "nsIMenuParent.h"
#include "prlink.h"
#include "nsIDOMHTMLInputElement.h"
#include "nsWidgetAtoms.h"
#include <gdk/gdkprivate.h>
#include <gdk/gdkx.h>
@ -84,6 +83,12 @@ nsNativeThemeGTK::nsNativeThemeGTK()
do_GetService("@mozilla.org/observer-service;1");
obsServ->AddObserver(this, "xpcom-shutdown", PR_FALSE);
mInputCheckedAtom = do_GetAtom("_moz-input-checked");
mInputAtom = do_GetAtom("input");
mCurPosAtom = do_GetAtom("curpos");
mMaxPosAtom = do_GetAtom("maxpos");
mMenuActiveAtom = do_GetAtom("_moz-menuactive");
memset(mDisabledWidgetTypes, 0, sizeof(mDisabledWidgetTypes));
memset(mSafeWidgetStates, 0, sizeof(mSafeWidgetStates));
@ -202,9 +207,7 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
}
if (aWidgetFlags) {
if (!atom) {
atom = (aWidgetType == NS_THEME_CHECKBOX ||
aWidgetType == NS_THEME_CHECKBOX_LABEL) ? nsWidgetAtoms::checked
: nsWidgetAtoms::selected;
atom = (aWidgetType == NS_THEME_CHECKBOX || aWidgetType == NS_THEME_CHECKBOX_LABEL) ? mCheckedAtom : mSelectedAtom;
}
*aWidgetFlags = CheckBooleanAttr(aFrame, atom);
}
@ -246,8 +249,8 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
// the slider to the actual scrollbar object
nsIFrame *tmpFrame = aFrame->GetParent()->GetParent();
aState->curpos = CheckIntAttr(tmpFrame, nsWidgetAtoms::curpos);
aState->maxpos = CheckIntAttr(tmpFrame, nsWidgetAtoms::maxpos);
aState->curpos = CheckIntAttr(tmpFrame, mCurPosAtom);
aState->maxpos = CheckIntAttr(tmpFrame, mMaxPosAtom);
}
// menu item state is determined by the attribute "_moz-menuactive",
@ -273,7 +276,7 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
menuFrame->MenuIsOpen(isOpen);
aState->inHover = isOpen;
} else {
aState->inHover = CheckBooleanAttr(aFrame, nsWidgetAtoms::mozmenuactive);
aState->inHover = CheckBooleanAttr(aFrame, mMenuActiveAtom);
}
aState->active = FALSE;
@ -281,8 +284,8 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
if (aWidgetType == NS_THEME_CHECKMENUITEM ||
aWidgetType == NS_THEME_RADIOMENUITEM) {
*aWidgetFlags = aFrame && aFrame->GetContent()->
AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eIgnoreCase);
AttrValueIs(kNameSpaceID_None, mCheckedAtom,
NS_LITERAL_STRING("true"), eIgnoreCase);
}
}
}
@ -375,13 +378,12 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame,
*aWidgetFlags = 0;
if (aWidgetType == NS_THEME_TAB &&
CheckBooleanAttr(aFrame, nsWidgetAtoms::selected))
CheckBooleanAttr(aFrame, mSelectedAtom))
*aWidgetFlags |= MOZ_GTK_TAB_SELECTED;
else if (aWidgetType == NS_THEME_TAB_LEFT_EDGE)
*aWidgetFlags |= MOZ_GTK_TAB_BEFORE_SELECTED;
if (aFrame->GetContent()->HasAttr(kNameSpaceID_None,
nsWidgetAtoms::firsttab))
if (aFrame->GetContent()->HasAttr(kNameSpaceID_None, mFirstTabAtom))
*aWidgetFlags |= MOZ_GTK_TAB_FIRST;
}
@ -870,11 +872,9 @@ nsNativeThemeGTK::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
// Check the attribute to see if it's relevant.
// disabled, checked, dlgtype, default, etc.
*aShouldRepaint = PR_FALSE;
if (aAttribute == nsWidgetAtoms::disabled ||
aAttribute == nsWidgetAtoms::checked ||
aAttribute == nsWidgetAtoms::selected ||
aAttribute == nsWidgetAtoms::focused ||
aAttribute == nsWidgetAtoms::mozmenuactive)
if (aAttribute == mDisabledAtom || aAttribute == mCheckedAtom ||
aAttribute == mSelectedAtom || aAttribute == mFocusedAtom ||
aAttribute == mMenuActiveAtom)
*aShouldRepaint = PR_TRUE;
}

View File

@ -97,6 +97,13 @@ private:
void RefreshWidgetWindow(nsIFrame* aFrame);
nsCOMPtr<nsIAtom> mTypeAtom;
nsCOMPtr<nsIAtom> mInputCheckedAtom;
nsCOMPtr<nsIAtom> mInputAtom;
nsCOMPtr<nsIAtom> mCurPosAtom;
nsCOMPtr<nsIAtom> mMaxPosAtom;
nsCOMPtr<nsIAtom> mMenuActiveAtom;
PRUint8 mDisabledWidgetTypes[32];
PRUint8 mSafeWidgetStates[1024]; // 256 widgets * 32 bits per widget
static const char* sDisabledEngines[];

View File

@ -443,8 +443,9 @@ nsMenuBarX::MenuConstruct( const nsMenuEvent & aMenuEvent, nsIWidget* aParentWin
// Make nsMenu a child of nsMenuBar. nsMenuBar takes ownership
AddMenu(pnsMenu);
if (menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::id,
NS_LITERAL_STRING("menu_Help"), eCaseMatters)) {
nsAutoString menuIDstring;
menu->GetAttr(kNameSpaceID_None, nsWidgetAtoms::id, menuIDstring);
if ( menuIDstring.EqualsLiteral("menu_Help") ) {
nsMenuEvent event(PR_TRUE, 0, nsnull);
nsCOMPtr<nsIMenuListener> listener(do_QueryInterface(pnsMenu));
listener->MenuSelected(event);
@ -528,9 +529,9 @@ NS_METHOD nsMenuBarX::AddMenu(nsIMenu * aMenu)
if(!helpMenu) {
nsCOMPtr<nsIContent> menu;
aMenu->GetMenuContent(getter_AddRefs(menu));
if(!menu->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) &&
menu->GetChildCount() > 0) {
nsAutoString menuHidden;
menu->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, menuHidden);
if(!menuHidden.EqualsLiteral("true") && menu->GetChildCount() > 0) {
// make sure we only increment |mNumMenus| if the menu is visible, since
// we use it as an index of where to insert the next menu.
mNumMenus++;

View File

@ -257,8 +257,9 @@ NS_METHOD nsMenuItemX::DoCommand()
{
// flip "checked" state if we're a checkbox menu, or an un-checked radio menu
if (mMenuType == nsIMenuItem::eCheckbox || (mMenuType == nsIMenuItem::eRadio && !mIsChecked)) {
if (!mContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::autocheck,
nsWidgetAtoms::_false, eCaseMatters))
nsAutoString value;
mContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::autocheck, value);
if (!value.EqualsLiteral("false"))
SetChecked(!mIsChecked);
/* the AttributeChanged code will update all the internal state */
}
@ -364,8 +365,9 @@ nsMenuItemX :: UncheckRadioSiblings(nsIContent* inCheckedContent)
if ( sibling ) {
if ( sibling != inCheckedContent ) { // skip this node
// if the current sibling is in the same group, clear it
if (sibling->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::name,
myGroupName, eCaseMatters))
nsAutoString currGroupName;
sibling->GetAttr(kNameSpaceID_None, nsWidgetAtoms::name, currGroupName);
if ( currGroupName == myGroupName )
sibling->SetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, NS_LITERAL_STRING("false"), PR_TRUE);
}
}
@ -387,8 +389,9 @@ nsMenuItemX :: AttributeChanged ( nsIDocument *aDocument, PRInt32 aNameSpaceID,
// if we're a radio menu, uncheck our sibling radio items. No need to
// do any of this if we're just a normal check menu.
if ( mMenuType == eRadio ) {
if (mContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString checked;
mContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, checked);
if (checked.EqualsLiteral("true") )
UncheckRadioSiblings(mContent);
}

View File

@ -165,10 +165,10 @@ nsMenuX::Create(nsISupports * aParent, const nsAString &aLabel, const nsAString
SetLabel(aLabel);
SetAccessKey(aAccessKey);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hiddenValue, collapsedValue;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if ( hiddenValue.EqualsLiteral("true") || collapsedValue.EqualsLiteral("true") )
mVisible = PR_FALSE;
if (menubar && mMenuContent->GetChildCount() == 0)
@ -816,16 +816,25 @@ void nsMenuX::LoadMenuItem( nsIMenu* inParentMenu, nsIContent* inMenuItemContent
return;
// if menu should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if ( hidden.EqualsLiteral("true") )
return;
// Create nsMenuItem
nsCOMPtr<nsIMenuItem> pnsMenuItem = do_CreateInstance ( kMenuItemCID ) ;
if ( pnsMenuItem ) {
nsAutoString disabled;
nsAutoString checked;
nsAutoString type;
nsAutoString menuitemName;
nsAutoString menuitemCmd;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, disabled);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::checked, checked);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::type, type);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::label, menuitemName);
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::command, menuitemCmd);
// Bug 164155 - Carbon interprets a leading hyphen on a menu item as
// a separator. We want a real menu item, so "escape" the hyphen by inserting
@ -835,18 +844,13 @@ void nsMenuX::LoadMenuItem( nsIMenu* inParentMenu, nsIContent* inMenuItemContent
//printf("menuitem %s \n", NS_LossyConvertUTF16toASCII(menuitemName).get());
PRBool enabled =
! (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters));
PRBool enabled = ! (disabled.EqualsLiteral("true"));
static nsIContent::AttrValuesArray strings[] =
{&nsWidgetAtoms::checkbox, &nsWidgetAtoms::radio, nsnull};
nsIMenuItem::EMenuItemType itemType = nsIMenuItem::eRegular;
switch (inMenuItemContent->FindAttrValueIn(kNameSpaceID_None, nsWidgetAtoms::type,
strings, eCaseMatters)) {
case 0: itemType = nsIMenuItem::eCheckbox; break;
case 1: itemType = nsIMenuItem::eRadio; break;
}
if ( type.EqualsLiteral("checkbox") )
itemType = nsIMenuItem::eCheckbox;
else if ( type.EqualsLiteral("radio") )
itemType = nsIMenuItem::eRadio;
nsCOMPtr<nsIDocShell> docShell = do_QueryReferent(mDocShellWeakRef);
if (!docShell)
@ -904,8 +908,7 @@ void nsMenuX::LoadMenuItem( nsIMenu* inParentMenu, nsIContent* inMenuItemContent
pnsMenuItem->SetModifiers ( modifiers );
}
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::checked,
nsWidgetAtoms::_true, eCaseMatters))
if ( checked.EqualsLiteral("true") )
pnsMenuItem->SetChecked(PR_TRUE);
else
pnsMenuItem->SetChecked(PR_FALSE);
@ -920,8 +923,9 @@ void
nsMenuX::LoadSubMenu( nsIMenu * pParentMenu, nsIContent* inMenuItemContent )
{
// if menu should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if ( hidden.EqualsLiteral("true") )
return;
nsAutoString menuName;
@ -939,8 +943,9 @@ nsMenuX::LoadSubMenu( nsIMenu * pParentMenu, nsIContent* inMenuItemContent )
pnsMenu->Create(supports, menuName, EmptyString(), mManager, docShell, inMenuItemContent);
// set if it's enabled or disabled
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString disabled;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, disabled);
if ( disabled.EqualsLiteral("true") )
pnsMenu->SetEnabled ( PR_FALSE );
else
pnsMenu->SetEnabled ( PR_TRUE );
@ -956,8 +961,9 @@ void
nsMenuX::LoadSeparator ( nsIContent* inMenuItemContent )
{
// if item should be hidden, bail
if (inMenuItemContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString hidden;
inMenuItemContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hidden);
if ( hidden.EqualsLiteral("true") )
return;
AddSeparator();
@ -1225,11 +1231,12 @@ nsMenuX :: CountVisibleBefore ( PRUint32* outVisibleBefore )
nsCOMPtr<nsIContent> menuContent;
currMenu->GetMenuContent(getter_AddRefs(menuContent));
if ( menuContent ) {
nsAutoString hiddenValue, collapsedValue;
menuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
menuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if ( menuContent->GetChildCount() > 0 ||
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) &&
!menuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters))
!hiddenValue.EqualsLiteral("true") &&
!collapsedValue.EqualsLiteral("true"))
++(*outVisibleBefore);
}
}
@ -1263,8 +1270,9 @@ nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpaceID, nsIAtom
if (aAttribute == nsWidgetAtoms::disabled) {
SetRebuild(PR_TRUE);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::disabled,
nsWidgetAtoms::_true, eCaseMatters))
nsAutoString valueString;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::disabled, valueString);
if (valueString.EqualsLiteral("true"))
SetEnabled(PR_FALSE);
else
SetEnabled(PR_TRUE);
@ -1298,10 +1306,11 @@ nsMenuX::AttributeChanged(nsIDocument *aDocument, PRInt32 aNameSpaceID, nsIAtom
else if (aAttribute == nsWidgetAtoms::hidden || aAttribute == nsWidgetAtoms::collapsed) {
SetRebuild(PR_TRUE);
if (mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::hidden,
nsWidgetAtoms::_true, eCaseMatters) ||
mMenuContent->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::collapsed,
nsWidgetAtoms::_true, eCaseMatters)) {
nsAutoString hiddenValue, collapsedValue;
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::hidden, hiddenValue);
mMenuContent->GetAttr(kNameSpaceID_None, nsWidgetAtoms::collapsed, collapsedValue);
if (hiddenValue.EqualsLiteral("true") || collapsedValue.EqualsLiteral("true")) {
if ( mVisible ) {
if ( menubarParent ) {
PRUint32 indexToRemove = 0;

View File

@ -56,7 +56,6 @@
#include "nsRegionPool.h"
#include "nsGfxUtils.h"
#include "nsUnicharUtils.h"
#include "nsWidgetAtoms.h"
static PRBool sInitializedBorders = PR_FALSE;
@ -113,6 +112,8 @@ nsNativeThemeMac::nsNativeThemeMac()
sListboxBGTransparent = PR_TRUE;
sTextfieldDisabledBGColorID = nsILookAndFeel::eColor__moz_field;
}
mMenuActiveAtom = do_GetAtom("_moz-menuactive");
}
nsNativeThemeMac::~nsNativeThemeMac()
@ -374,8 +375,7 @@ nsNativeThemeMac::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame*
case NS_THEME_MENUITEM:
::SetThemeBackground(kThemeBrushDialogBackgroundActive, 24, true);
DrawMenuItem(macRect, kThemeMenuItemPlain, IsDisabled(aFrame),
CheckBooleanAttr(aFrame, nsWidgetAtoms::mozmenuactive));
DrawMenuItem(macRect, kThemeMenuItemPlain, IsDisabled(aFrame), CheckBooleanAttr(aFrame, mMenuActiveAtom));
::SetThemeBackground(kThemeBrushWhite, 24, true);
break;
@ -764,11 +764,9 @@ nsNativeThemeMac::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
// Check the attribute to see if it's relevant.
// disabled, checked, dlgtype, default, etc.
*aShouldRepaint = PR_FALSE;
if (aAttribute == nsWidgetAtoms::disabled ||
aAttribute == nsWidgetAtoms::checked ||
aAttribute == nsWidgetAtoms::selected ||
aAttribute == nsWidgetAtoms::mozmenuactive ||
aAttribute == nsWidgetAtoms::sortdirection)
if (aAttribute == mDisabledAtom || aAttribute == mCheckedAtom ||
aAttribute == mSelectedAtom || aAttribute == mMenuActiveAtom ||
aAttribute == mSortDirectionAtom)
*aShouldRepaint = PR_TRUE;
}

View File

@ -121,4 +121,5 @@ protected:
private:
ThemeEraseUPP mEraseProc;
nsCOMPtr<nsIAtom> mMenuActiveAtom;
};

View File

@ -117,12 +117,7 @@ endif # BUILD_STATIC_LIBS
EXPORTS = nsdefs.h
LOCAL_INCLUDES = \
-I. \
-I$(srcdir)/../xpwidgets \
-I$(srcdir)/../../public \
-I$(srcdir) \
$(NULL)
LOCAL_INCLUDES = -I. -I$(srcdir)/../xpwidgets -I$(srcdir)
FORCE_STATIC_LIB = 1

View File

@ -56,7 +56,6 @@
#include "nsIDOMHTMLInputElement.h"
#include "nsIMenuFrame.h"
#include "nsIMenuParent.h"
#include "nsWidgetAtoms.h"
#include <malloc.h>
#ifdef MOZ_CAIRO_GFX
@ -203,6 +202,11 @@ nsNativeThemeWin::nsNativeThemeWin() {
getThemeColor = (GetThemeColorPtr)GetProcAddress(mThemeDLL, "GetThemeColor");
}
mInputAtom = do_GetAtom("input");
mInputCheckedAtom = do_GetAtom("_moz-input-checked");
mTypeAtom = do_GetAtom("type");
mMenuActiveAtom = do_GetAtom("_moz-menuactive");
UpdateConfig();
// If there is a relevant change in forms.css for windows platform,
@ -384,8 +388,7 @@ nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame, PRUint8 aWidgetType,
// XXXdwh This check will need to be more complicated, since HTML radio groups
// use checked, but XUL radio groups use selected. There will need to be an
// IsNodeOfType test for HTML vs. XUL here.
nsIAtom* atom = (aWidgetType == NS_THEME_CHECKBOX) ? nsWidgetAtoms::checked
: nsWidgetAtoms::selected;
nsIAtom* atom = (aWidgetType == NS_THEME_CHECKBOX) ? mCheckedAtom : mSelectedAtom;
PRBool isHTML = PR_FALSE;
PRBool isHTMLChecked = PR_FALSE;
@ -1067,11 +1070,9 @@ nsNativeThemeWin::WidgetStateChanged(nsIFrame* aFrame, PRUint8 aWidgetType,
// Check the attribute to see if it's relevant.
// disabled, checked, dlgtype, default, etc.
*aShouldRepaint = PR_FALSE;
if (aAttribute == nsWidgetAtoms::disabled ||
aAttribute == nsWidgetAtoms::checked ||
aAttribute == nsWidgetAtoms::selected ||
aAttribute == nsWidgetAtoms::readonly ||
aAttribute == nsWidgetAtoms::mozmenuactive)
if (aAttribute == mDisabledAtom || aAttribute == mCheckedAtom ||
aAttribute == mSelectedAtom || aAttribute == mReadOnlyAtom ||
aAttribute == mMenuActiveAtom)
*aShouldRepaint = PR_TRUE;
}
@ -1519,7 +1520,7 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(nsIFrame* aFrame, PRUint8
aState |= DFCS_RTL;
}
if (CheckBooleanAttr(aFrame, nsWidgetAtoms::mozmenuactive))
if (CheckBooleanAttr(aFrame, mMenuActiveAtom))
aState |= DFCS_HOT;
// Only menu items of the appropriate type may have tick or bullet marks.

View File

@ -127,6 +127,11 @@ private:
HANDLE mHeaderTheme;
BOOL mFlatMenus;
nsCOMPtr<nsIAtom> mInputAtom;
nsCOMPtr<nsIAtom> mInputCheckedAtom;
nsCOMPtr<nsIAtom> mTypeAtom;
nsCOMPtr<nsIAtom> mMenuActiveAtom;
};
// Creator function

View File

@ -77,12 +77,15 @@ CPPSRCS = \
nsPrimitiveHelpers.cpp \
nsXPLookAndFeel.cpp \
nsClipboardHelper.cpp \
nsPrintOptionsImpl.cpp \
nsPrintOptionsImpl.cpp \
nsPrintSettingsImpl.cpp \
nsPrintSession.cpp \
nsWidgetAtoms.cpp \
nsPrintSession.cpp \
$(NULL)
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
CPPSRCS += nsWidgetAtoms.cpp
endif
ifneq (,$(filter beos os2 mac qt cocoa windows,$(MOZ_WIDGET_TOOLKIT)))
CPPSRCS += nsBaseClipboard.cpp
endif
@ -98,7 +101,6 @@ endif
LOCAL_INCLUDES = \
-I$(srcdir)/../$(MOZ_WIDGET_TOOLKIT) \
-I$(srcdir)/../../public \
-I$(srcdir) \
$(NULL)

View File

@ -73,6 +73,17 @@ nsILookAndFeel::nsColorID nsNativeTheme::sListboxDisabledBGColorID = nsILookAndF
nsNativeTheme::nsNativeTheme()
{
mDisabledAtom = do_GetAtom("disabled");
mCheckedAtom = do_GetAtom("checked");
mSelectedAtom = do_GetAtom("selected");
mFocusedAtom = do_GetAtom("focused");
mFirstTabAtom = do_GetAtom("first-tab");
mDefaultAtom = do_GetAtom("default");
mValueAtom = do_GetAtom("value");
mModeAtom = do_GetAtom("mode");
mClassAtom = do_GetAtom("class");
mSortDirectionAtom = do_GetAtom("sortDirection");
mReadOnlyAtom = do_GetAtom("readonly");
}
nsIPresShell *
@ -146,6 +157,16 @@ nsNativeTheme::CheckIntAttr(nsIFrame* aFrame, nsIAtom* aAtom)
return value;
}
PRBool
nsNativeTheme::GetAttr(nsIFrame* aFrame, nsIAtom* aAtom, nsAString& attrValue)
{
if (!aFrame)
return PR_FALSE;
aFrame->GetContent()->GetAttr(kNameSpaceID_None, aAtom, attrValue);
return !attrValue.IsEmpty();
}
PRBool
nsNativeTheme::GetCheckedOrSelected(nsIFrame* aFrame, PRBool aCheckSelected)
{
@ -168,8 +189,7 @@ nsNativeTheme::GetCheckedOrSelected(nsIFrame* aFrame, PRBool aCheckSelected)
}
}
return CheckBooleanAttr(aFrame, aCheckSelected ? nsWidgetAtoms::selected
: nsWidgetAtoms::checked);
return CheckBooleanAttr(aFrame, aCheckSelected ? mSelectedAtom : mCheckedAtom);
}
static void
@ -297,47 +317,3 @@ nsNativeTheme::IsWidgetStyled(nsPresContext* aPresContext, nsIFrame* aFrame,
return PR_FALSE;
}
// treeheadercell:
nsNativeTheme::TreeSortDirection
nsNativeTheme::GetTreeSortDirection(nsIFrame* aFrame)
{
if (!aFrame)
return eTreeSortDirection_Natural;
static nsIContent::AttrValuesArray strings[] =
{&nsWidgetAtoms::descending, &nsWidgetAtoms::ascending, nsnull};
switch (aFrame->GetContent()->FindAttrValueIn(kNameSpaceID_None,
nsWidgetAtoms::sortdirection,
strings, eCaseMatters)) {
case 0: return eTreeSortDirection_Descending;
case 1: return eTreeSortDirection_Ascending;
}
return eTreeSortDirection_Natural;
}
// tab:
PRBool
nsNativeTheme::IsBottomTab(nsIFrame* aFrame)
{
if (!aFrame)
return PR_FALSE;
nsAutoString classStr;
aFrame->GetContent()->GetAttr(kNameSpaceID_None, nsWidgetAtoms::_class, classStr);
return !classStr.IsEmpty() && classStr.Find("tab-bottom") != kNotFound;
}
// progressbar:
PRBool
nsNativeTheme::IsIndeterminateProgress(nsIFrame* aFrame)
{
if (!aFrame)
return PR_FALSE;
// return aFrame->GetContent()->AttrValueIs(kNameSpaceID_None, nsWidgetAtoms::mode,
// NS_LITERAL_STRING("undetermined"),
// eCaseMatters);
return PR_TRUE;
}

View File

@ -45,7 +45,6 @@
#include "nsString.h"
#include "nsMargin.h"
#include "nsILookAndFeel.h"
#include "nsWidgetAtoms.h"
class nsIFrame;
class nsIPresShell;
@ -76,12 +75,12 @@ class nsNativeTheme
// all widgets:
PRBool IsDisabled(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::disabled);
return CheckBooleanAttr(aFrame, mDisabledAtom);
}
// button:
PRBool IsDefaultButton(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::_default);
return CheckBooleanAttr(aFrame, mDefaultAtom);
}
// checkbox:
@ -95,35 +94,55 @@ class nsNativeTheme
}
PRBool IsFocused(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::focused);
return CheckBooleanAttr(aFrame, mFocusedAtom);
}
// tab:
PRBool IsSelectedTab(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::selected);
return CheckBooleanAttr(aFrame, mSelectedAtom);
}
// toolbarbutton:
PRBool IsCheckedButton(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::checked);
return CheckBooleanAttr(aFrame, mCheckedAtom);
}
// treeheadercell:
TreeSortDirection GetTreeSortDirection(nsIFrame* aFrame);
TreeSortDirection GetTreeSortDirection(nsIFrame* aFrame) {
nsAutoString sortdir;
if (GetAttr(aFrame, mSortDirectionAtom, sortdir)) {
if (sortdir.EqualsLiteral("descending"))
return eTreeSortDirection_Descending;
else if (sortdir.EqualsLiteral("ascending"))
return eTreeSortDirection_Ascending;
}
return eTreeSortDirection_Natural;
}
// tab:
PRBool IsBottomTab(nsIFrame* aFrame);
PRBool IsBottomTab(nsIFrame* aFrame) {
nsAutoString classStr;
if (GetAttr(aFrame, mClassAtom, classStr))
return classStr.Find("tab-bottom") != kNotFound;
return PR_FALSE;
}
// progressbar:
PRBool IsIndeterminateProgress(nsIFrame* aFrame);
PRBool IsIndeterminateProgress(nsIFrame* aFrame) {
nsAutoString mode;
if (GetAttr(aFrame, mModeAtom, mode))
return mode.EqualsLiteral("undetermined");
return PR_FALSE;
}
PRInt32 GetProgressValue(nsIFrame* aFrame) {
return CheckIntAttr(aFrame, nsWidgetAtoms::value);
return CheckIntAttr(aFrame, mValueAtom);
}
// textfield:
PRBool IsReadOnly(nsIFrame* aFrame) {
return CheckBooleanAttr(aFrame, nsWidgetAtoms::readonly);
return CheckBooleanAttr(aFrame, mReadOnlyAtom);
}
// These are used by nsNativeThemeGtk
@ -132,9 +151,20 @@ class nsNativeTheme
PRBool CheckBooleanAttr(nsIFrame* aFrame, nsIAtom* aAtom);
private:
PRBool GetAttr(nsIFrame* aFrame, nsIAtom* aAtom, nsAString& attrValue);
PRBool GetCheckedOrSelected(nsIFrame* aFrame, PRBool aCheckSelected);
protected:
// these are available to subclasses because they are useful in
// implementing WidgetStateChanged()
nsCOMPtr<nsIAtom> mDisabledAtom;
nsCOMPtr<nsIAtom> mCheckedAtom;
nsCOMPtr<nsIAtom> mSelectedAtom;
nsCOMPtr<nsIAtom> mReadOnlyAtom;
nsCOMPtr<nsIAtom> mFirstTabAtom;
nsCOMPtr<nsIAtom> mFocusedAtom;
nsCOMPtr<nsIAtom> mSortDirectionAtom;
// these should be set to appropriate platform values by the subclass, to
// match the values in forms.css. These defaults match forms.css
static nsMargin sButtonBorderSize;
@ -157,4 +187,10 @@ protected:
static PRBool sListboxBGTransparent;
static nsILookAndFeel::nsColorID sListboxBGColorID;
static nsILookAndFeel::nsColorID sListboxDisabledBGColorID;
private:
nsCOMPtr<nsIAtom> mDefaultAtom;
nsCOMPtr<nsIAtom> mValueAtom;
nsCOMPtr<nsIAtom> mModeAtom;
nsCOMPtr<nsIAtom> mClassAtom;
};