From a3c8811bc4052afb894829ca66e9a6c56626cacd Mon Sep 17 00:00:00 2001 From: "Mook (sb)" Date: Thu, 30 Oct 2008 13:04:23 +0330 Subject: [PATCH] Bug 442419 - allow custom max for progressmeter; r=enndeakin, sr=roc --- layout/xul/base/src/nsProgressMeterFrame.cpp | 20 +++++++++++++++---- .../bug-442419-progressmeter-max-ref.xul | 7 +++++++ .../reftests/bug-442419-progressmeter-max.xul | 7 +++++++ toolkit/content/tests/reftests/reftest.list | 1 + toolkit/content/widgets/progressmeter.xml | 12 ++++++++--- widget/src/cocoa/nsNativeThemeCocoa.h | 2 +- widget/src/cocoa/nsNativeThemeCocoa.mm | 11 ++++++---- widget/src/xpwidgets/nsNativeTheme.h | 4 ++++ widget/src/xpwidgets/nsWidgetAtomList.h | 1 + 9 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 toolkit/content/tests/reftests/bug-442419-progressmeter-max-ref.xul create mode 100644 toolkit/content/tests/reftests/bug-442419-progressmeter-max.xul create mode 100644 toolkit/content/tests/reftests/reftest.list diff --git a/layout/xul/base/src/nsProgressMeterFrame.cpp b/layout/xul/base/src/nsProgressMeterFrame.cpp index 457cbe3e3f50..8f6bc00d52c3 100644 --- a/layout/xul/base/src/nsProgressMeterFrame.cpp +++ b/layout/xul/base/src/nsProgressMeterFrame.cpp @@ -129,15 +129,27 @@ nsProgressMeterFrame::AttributeChanged(PRInt32 aNameSpaceID, nsCOMPtr remainderContent = remainderChild->GetContent(); if (!remainderContent) return NS_OK; - nsAutoString value; + nsAutoString value, maxValue; mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::value, value); + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::max, maxValue); PRInt32 error; PRInt32 flex = value.ToInteger(&error); - if (flex < 0) flex = 0; - if (flex > 100) flex = 100; + PRInt32 maxFlex = maxValue.ToInteger(&error); + if (NS_FAILED(error) || maxValue.IsEmpty()) { + maxFlex = 100; + } + if (maxFlex < 1) { + maxFlex = 1; + } + if (flex < 0) { + flex = 0; + } + if (flex > maxFlex) { + flex = maxFlex; + } - PRInt32 remainder = 100 - flex; + PRInt32 remainder = maxFlex - flex; nsAutoString leftFlex, rightFlex; leftFlex.AppendInt(flex); diff --git a/toolkit/content/tests/reftests/bug-442419-progressmeter-max-ref.xul b/toolkit/content/tests/reftests/bug-442419-progressmeter-max-ref.xul new file mode 100644 index 000000000000..a034b6e671d0 --- /dev/null +++ b/toolkit/content/tests/reftests/bug-442419-progressmeter-max-ref.xul @@ -0,0 +1,7 @@ + + + + + + + diff --git a/toolkit/content/tests/reftests/bug-442419-progressmeter-max.xul b/toolkit/content/tests/reftests/bug-442419-progressmeter-max.xul new file mode 100644 index 000000000000..62259640648b --- /dev/null +++ b/toolkit/content/tests/reftests/bug-442419-progressmeter-max.xul @@ -0,0 +1,7 @@ + + + + + + + diff --git a/toolkit/content/tests/reftests/reftest.list b/toolkit/content/tests/reftests/reftest.list new file mode 100644 index 000000000000..b5118d03ab9f --- /dev/null +++ b/toolkit/content/tests/reftests/reftest.list @@ -0,0 +1 @@ +== bug-442419-progressmeter-max.xul bug-442419-progressmeter-max-ref.xul diff --git a/toolkit/content/widgets/progressmeter.xml b/toolkit/content/widgets/progressmeter.xml index 40e5d3774120..f65bec5fe55d 100644 --- a/toolkit/content/widgets/progressmeter.xml +++ b/toolkit/content/widgets/progressmeter.xml @@ -22,16 +22,17 @@ 100) - p = 100; + else if (p > max) + p = max; var c = this.value; if (p != c) { var delta = p - c; if (delta < 0) delta = -delta; - if (delta > 3 || p == 0 || p == 100) { + if (delta > 3 || p == 0 || p == max) { this.setAttribute("value", p); // Fire DOM event so that accessible value change events occur var event = document.createEvent('Events'); @@ -43,6 +44,11 @@ return val; ]]> + diff --git a/widget/src/cocoa/nsNativeThemeCocoa.h b/widget/src/cocoa/nsNativeThemeCocoa.h index 8c3cf781b6cb..d3d3ef169291 100644 --- a/widget/src/cocoa/nsNativeThemeCocoa.h +++ b/widget/src/cocoa/nsNativeThemeCocoa.h @@ -100,7 +100,7 @@ protected: PRInt32 inState); void DrawProgress(CGContextRef context, const HIRect& inBoxRect, PRBool inIsIndeterminate, PRBool inIsHorizontal, - PRInt32 inValue, nsIFrame* aFrame); + PRInt32 inValue, PRInt32 inMaxValue, nsIFrame* aFrame); void DrawTab(CGContextRef context, const HIRect& inBoxRect, PRBool inIsDisabled, PRBool inIsFrontmost, PRBool inIsHorizontal, PRBool inTabBottom, diff --git a/widget/src/cocoa/nsNativeThemeCocoa.mm b/widget/src/cocoa/nsNativeThemeCocoa.mm index 117e75351a60..a2d9e7de2561 100644 --- a/widget/src/cocoa/nsNativeThemeCocoa.mm +++ b/widget/src/cocoa/nsNativeThemeCocoa.mm @@ -850,7 +850,8 @@ nsNativeThemeCocoa::DrawFrame(CGContextRef cgContext, HIThemeFrameKind inKind, void nsNativeThemeCocoa::DrawProgress(CGContextRef cgContext, const HIRect& inBoxRect, PRBool inIsIndeterminate, PRBool inIsHorizontal, - PRInt32 inValue, nsIFrame* aFrame) + PRInt32 inValue, PRInt32 inMaxValue, + nsIFrame* aFrame) { NS_OBJC_BEGIN_TRY_ABORT_BLOCK; @@ -863,7 +864,7 @@ nsNativeThemeCocoa::DrawProgress(CGContextRef cgContext, const HIRect& inBoxRect tdi.kind = inIsIndeterminate ? kThemeMediumIndeterminateBar: kThemeMediumProgressBar; tdi.bounds = inBoxRect; tdi.min = 0; - tdi.max = 100; + tdi.max = inMaxValue; tdi.value = inValue; tdi.attributes = inIsHorizontal ? kThemeTrackHorizontal : 0; tdi.enableState = FrameIsInActiveWindow(aFrame) ? kThemeTrackActive : kThemeTrackInactive; @@ -1431,12 +1432,14 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame case NS_THEME_PROGRESSBAR: DrawProgress(cgContext, macRect, IsIndeterminateProgress(aFrame), - PR_TRUE, GetProgressValue(aFrame), aFrame); + PR_TRUE, GetProgressValue(aFrame), + GetProgressMaxValue(aFrame), aFrame); break; case NS_THEME_PROGRESSBAR_VERTICAL: DrawProgress(cgContext, macRect, IsIndeterminateProgress(aFrame), - PR_FALSE, GetProgressValue(aFrame), aFrame); + PR_FALSE, GetProgressValue(aFrame), + GetProgressMaxValue(aFrame), aFrame); break; case NS_THEME_PROGRESSBAR_CHUNK: diff --git a/widget/src/xpwidgets/nsNativeTheme.h b/widget/src/xpwidgets/nsNativeTheme.h index 7ac02e53966b..3e5495a1fe73 100644 --- a/widget/src/xpwidgets/nsNativeTheme.h +++ b/widget/src/xpwidgets/nsNativeTheme.h @@ -133,6 +133,10 @@ class nsNativeTheme PRInt32 GetProgressValue(nsIFrame* aFrame) { return CheckIntAttr(aFrame, nsWidgetAtoms::value, 0); } + + PRInt32 GetProgressMaxValue(nsIFrame* aFrame) { + return PR_MAX(CheckIntAttr(aFrame, nsWidgetAtoms::max, 100), 1); + } // textfield: PRBool IsReadOnly(nsIFrame* aFrame) { diff --git a/widget/src/xpwidgets/nsWidgetAtomList.h b/widget/src/xpwidgets/nsWidgetAtomList.h index 0c3adb820acd..6f103a16ff5e 100644 --- a/widget/src/xpwidgets/nsWidgetAtomList.h +++ b/widget/src/xpwidgets/nsWidgetAtomList.h @@ -85,6 +85,7 @@ WIDGET_ATOM(input, "input") WIDGET_ATOM(key, "key") // The key element / attribute WIDGET_ATOM(label, "label") WIDGET_ATOM(lasttab, "last-tab") +WIDGET_ATOM(max, "max") WIDGET_ATOM(maxpos, "maxpos") WIDGET_ATOM(menu, "menu") // Represents an XP menu WIDGET_ATOM(menuitem, "menuitem") // Represents an XP menu item