From d240c30efee84ed1f96c040f8a26d8953e7b6bc8 Mon Sep 17 00:00:00 2001 From: "smfr%smfr.org" Date: Tue, 28 Jun 2005 00:18:33 +0000 Subject: [PATCH] Fix bug 274036: makes sure Mac native controls (Carbon & Cocoa) look disabled when there is nowhere to scroll by removing arbitrary hardcoded limits. r=josh, sr=bryner, a=chofmann. git-svn-id: svn://10.0.0.236/trunk@175189 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/cocoa/nsNativeScrollbar.h | 9 ++- mozilla/widget/src/cocoa/nsNativeScrollbar.mm | 56 ++++++++++++------- mozilla/widget/src/mac/nsMacControl.cpp | 29 +++++++--- mozilla/widget/src/mac/nsMacControl.h | 2 + mozilla/widget/src/mac/nsNativeScrollbar.cpp | 47 +++++++++++----- mozilla/widget/src/mac/nsNativeScrollbar.h | 4 +- 6 files changed, 101 insertions(+), 46 deletions(-) diff --git a/mozilla/widget/src/cocoa/nsNativeScrollbar.h b/mozilla/widget/src/cocoa/nsNativeScrollbar.h index adcc16bb246..b48dfb226e4 100644 --- a/mozilla/widget/src/cocoa/nsNativeScrollbar.h +++ b/mozilla/widget/src/cocoa/nsNativeScrollbar.h @@ -88,9 +88,11 @@ protected: void RecreateHorizontalScrollbar(); - virtual NSView* CreateCocoaView() ; - virtual GrafPtr GetQuickDrawPort() ; + virtual NSView* CreateCocoaView(); + virtual GrafPtr GetQuickDrawPort(); + void UpdateScroller(); + // DATA private: @@ -101,7 +103,8 @@ private: PRUint32 mValue; PRUint32 mMaxValue; PRUint32 mVisibleImageSize; - PRUint32 mLineIncrement; + PRUint32 mLineIncrement; + PRBool mIsEnabled; }; diff --git a/mozilla/widget/src/cocoa/nsNativeScrollbar.mm b/mozilla/widget/src/cocoa/nsNativeScrollbar.mm index edbad7e33c7..9a7921aa4a6 100644 --- a/mozilla/widget/src/cocoa/nsNativeScrollbar.mm +++ b/mozilla/widget/src/cocoa/nsNativeScrollbar.mm @@ -67,6 +67,7 @@ nsNativeScrollbar::nsNativeScrollbar() , mMaxValue(0) , mVisibleImageSize(0) , mLineIncrement(0) + , mIsEnabled(PR_TRUE) { WIDGET_SET_CLASSNAME("nsNativeScrollbar"); } @@ -145,7 +146,7 @@ nsNativeScrollbar::DoScroll(NSScrollerPart inPart) // to check if one is greater than the other to indicate direction. // - case NSScrollerDecrementLine: // scroll up/left + case NSScrollerDecrementLine: // scroll up/left newPos = oldPos - (mLineIncrement ? mLineIncrement : 1); if ( mMediator ) { BoundsCheck(0, newPos, mMaxValue); @@ -155,7 +156,7 @@ nsNativeScrollbar::DoScroll(NSScrollerPart inPart) } break; - case NSScrollerIncrementLine: // scroll down/right + case NSScrollerIncrementLine: // scroll down/right newPos = oldPos + (mLineIncrement ? mLineIncrement : 1); if ( mMediator ) { BoundsCheck(0, newPos, mMaxValue); @@ -173,7 +174,7 @@ nsNativeScrollbar::DoScroll(NSScrollerPart inPart) // signed values first. // - case NSScrollerDecrementPage: // scroll up a page + case NSScrollerDecrementPage: // scroll up a page newPos = oldPos - visibleImageSize; UpdateContentPosition(newPos); if ( mMediator ) { @@ -184,7 +185,7 @@ nsNativeScrollbar::DoScroll(NSScrollerPart inPart) } break; - case NSScrollerIncrementPage: // scroll down a page + case NSScrollerIncrementPage: // scroll down a page newPos = oldPos + visibleImageSize; UpdateContentPosition(newPos); if ( mMediator ) { @@ -265,14 +266,11 @@ nsNativeScrollbar::DispatchMouseEvent(nsMouseEvent &aEvent) NS_IMETHODIMP nsNativeScrollbar::SetMaxRange(PRUint32 aEndRange) { - mMaxValue = ((int)aEndRange) > 0 ? aEndRange : 10; - if ( GetControl() ) { - // Update the current value based on the new range. We need to recompute the - // float value in case we had to set the value to 0 because gecko cheated - // and set the position before it set the max value. - PRInt32 fullVisibleArea = mVisibleImageSize + mMaxValue; - [mView setFloatValue:(mValue / (float)mMaxValue) knobProportion:(mVisibleImageSize / (float)fullVisibleArea)]; - } + if ((PRInt32)aEndRange < 0) + aEndRange = 0; + + mMaxValue = aEndRange; + UpdateScroller(); return NS_OK; } @@ -343,13 +341,12 @@ nsNativeScrollbar::GetPosition(PRUint32* aPos) NS_IMETHODIMP nsNativeScrollbar::SetViewSize(PRUint32 aSize) { - mVisibleImageSize = ((int)aSize) > 0 ? aSize : 1; + if ((PRInt32)aSize < 0) + aSize = 0; + + mVisibleImageSize = aSize; - // Update the current value based on the new range. We need to recompute the - // float value in case we had to set the value to 0 because gecko cheated - // and set the position before it set the max value. - PRInt32 fullVisibleArea = mVisibleImageSize + mMaxValue; - [mView setFloatValue:(mValue / (float)mMaxValue) knobProportion:(mVisibleImageSize / (float)fullVisibleArea)]; + UpdateScroller(); return NS_OK; } @@ -461,7 +458,7 @@ nsNativeScrollbar::RecreateHorizontalScrollbar() NSRect oldBounds = [mView bounds]; float oldValue = [mView floatValue]; float oldProportion = [mView knobProportion]; - mVisible = PR_TRUE; // ensure that hide does the work + mVisible = PR_TRUE; // ensure that hide does the work Show(PR_FALSE); [mView release]; @@ -509,7 +506,8 @@ nsNativeScrollbar::Show(PRBool bState) NS_IMETHODIMP nsNativeScrollbar::Enable(PRBool bState) { - [mView setEnabled:(bState ? YES : NO)]; + mIsEnabled = bState; + UpdateScroller(); return NS_OK; } @@ -518,11 +516,27 @@ NS_IMETHODIMP nsNativeScrollbar::IsEnabled(PRBool *aState) { if (aState) - *aState = [mView isEnabled] ? PR_TRUE : PR_FALSE; + *aState = mIsEnabled; return NS_OK; } +void +nsNativeScrollbar::UpdateScroller() +{ + // Update the current value based on the new range. We need to recompute the + // float value in case we had to set the value to 0 because gecko cheated + // and set the position before it set the max value. + float knobProp = 1.0f; + if ((mVisibleImageSize + mMaxValue) > 0) + knobProp = (float)mVisibleImageSize / (float)(mVisibleImageSize + mMaxValue); + [mView setFloatValue:(mValue / (float)mMaxValue) knobProportion:knobProp]; + + BOOL enableScrollbar = (mIsEnabled && (mMaxValue > 0)); + [mView setEnabled:enableScrollbar]; +} + + #pragma mark - diff --git a/mozilla/widget/src/mac/nsMacControl.cpp b/mozilla/widget/src/mac/nsMacControl.cpp index fd4e281296a..dd5f6e771af 100644 --- a/mozilla/widget/src/mac/nsMacControl.cpp +++ b/mozilla/widget/src/mac/nsMacControl.cpp @@ -174,15 +174,11 @@ PRBool nsMacControl::OnPaint(nsPaintEvent &aEvent) } // update hilite - PRInt16 hilite; - if (mEnabled) - hilite = (mWidgetArmed && mMouseInButton ? 1 : 0); - else - hilite = kControlInactivePart; - if (hilite != mLastHilite) + PRInt16 curHilite = GetControlHiliteState(); + if (curHilite != mLastHilite) { - mLastHilite = hilite; - ::HiliteControl(mControl, hilite); + mLastHilite = curHilite; + ::HiliteControl(mControl, curHilite); } ::SetControlVisibility(mControl, isVisible, false); @@ -321,6 +317,23 @@ void nsMacControl::GetRectForMacControl(nsRect &outRect) outRect.x = outRect.y = 0; } +//------------------------------------------------------------------------- +// +// Get the current hilite state of the control +// +//------------------------------------------------------------------------- +ControlPartCode nsMacControl::GetControlHiliteState() +{ + // update hilite + PRInt16 curHilite; + if (mEnabled) + curHilite = (mWidgetArmed && mMouseInButton ? 1 : 0); + else + curHilite = kControlInactivePart; + + return curHilite; +} + //------------------------------------------------------------------------- // // diff --git a/mozilla/widget/src/mac/nsMacControl.h b/mozilla/widget/src/mac/nsMacControl.h index d36c7229c43..c7f4054b35f 100644 --- a/mozilla/widget/src/mac/nsMacControl.h +++ b/mozilla/widget/src/mac/nsMacControl.h @@ -81,6 +81,8 @@ protected: NS_METHOD CreateOrReplaceMacControl(short inControlType); virtual void GetRectForMacControl(nsRect &outRect); + virtual ControlPartCode GetControlHiliteState(); + void SetupMacControlFont(); void ControlChanged(PRInt32 aNewValue); void NSStringSetControlTitle(ControlHandle theControl, nsString title); diff --git a/mozilla/widget/src/mac/nsNativeScrollbar.cpp b/mozilla/widget/src/mac/nsNativeScrollbar.cpp index b7e00b27bb5..bafb669d143 100644 --- a/mozilla/widget/src/mac/nsNativeScrollbar.cpp +++ b/mozilla/widget/src/mac/nsNativeScrollbar.cpp @@ -84,10 +84,8 @@ private: }; -static ControlActionUPP ScrollbarActionProc ( ); - static ControlActionUPP -ScrollbarActionProc ( ) +ScrollbarActionProc( ) { static StNativeControlActionProcOwner sActionProcOwner; return sActionProcOwner.ActionProc(); @@ -107,6 +105,8 @@ nsNativeScrollbar::nsNativeScrollbar() , mMouseDownInScroll(PR_FALSE) , mClickedPartCode(0) { + mMax = 0; // override the base class default + WIDGET_SET_CLASSNAME("nsNativeScrollbar"); SetControlType(kControlScrollBarLiveProc); } @@ -224,13 +224,13 @@ nsNativeScrollbar::DoScrollAction(ControlPartCode part) } EndDraw(); - // update the area of the parent uncovered by the scrolling. Since - // we may be in a tight loop, we need to manually validate the area - // we just updated so the update rect doesn't continue to get bigger - // and bigger the more we scroll. - nsCOMPtr parent ( dont_AddRef(GetParent()) ); - parent->Update(); - parent->Validate(); + // update the area of the parent uncovered by the scrolling. Since + // we may be in a tight loop, we need to manually validate the area + // we just updated so the update rect doesn't continue to get bigger + // and bigger the more we scroll. + nsCOMPtr parent ( dont_AddRef(GetParent()) ); + parent->Update(); + parent->Validate(); StartDraw(); } @@ -259,6 +259,20 @@ nsNativeScrollbar::UpdateContentPosition(PRUint32 inNewPos) SetPosition(inNewPos); } +//------------------------------------------------------------------------- +// +// Get the current hilite state of the control (disables the scrollbar +// if there is nowhere to scroll) +// +//------------------------------------------------------------------------- +ControlPartCode +nsNativeScrollbar::GetControlHiliteState() +{ + if (mMaxValue == 0) + return kControlInactivePart; + + return Inherited::GetControlHiliteState(); +} /**------------------------------------------------------------------------------- * DispatchMouseEvent handle an event for this scrollbar @@ -352,7 +366,11 @@ nsNativeScrollbar::DispatchMouseEvent(nsMouseEvent &aEvent) NS_IMETHODIMP nsNativeScrollbar::SetMaxRange(PRUint32 aEndRange) { - mMaxValue = ((int)aEndRange) > 0 ? aEndRange : 10; + if ((PRInt32)aEndRange < 0) + aEndRange = 0; + + mMaxValue = aEndRange; + if ( GetControl() ) { StartDraw(); ::SetControl32BitMaximum(GetControl(), mMaxValue); @@ -430,8 +448,11 @@ nsNativeScrollbar::GetPosition(PRUint32* aPos) NS_IMETHODIMP nsNativeScrollbar::SetViewSize(PRUint32 aSize) { - mVisibleImageSize = ((int)aSize) > 0 ? aSize : 1; - + if ((PRInt32)aSize < 0) + aSize = 0; + + mVisibleImageSize = aSize; + if ( GetControl() ) { StartDraw(); SetControlViewSize(GetControl(), mVisibleImageSize); diff --git a/mozilla/widget/src/mac/nsNativeScrollbar.h b/mozilla/widget/src/mac/nsNativeScrollbar.h index 532d222930f..e7a1526f7d7 100644 --- a/mozilla/widget/src/mac/nsNativeScrollbar.h +++ b/mozilla/widget/src/mac/nsNativeScrollbar.h @@ -72,8 +72,10 @@ protected: // nsWindow Interface virtual PRBool DispatchMouseEvent(nsMouseEvent &aEvent); - ControlHandle GetControl() { return mControl; } + virtual ControlPartCode GetControlHiliteState(); + ControlHandle GetControl() { return mControl; } + void UpdateContentPosition(PRUint32 inNewPos); private: