From 0ce429724a521d8284b88e638457f4ab58bf3b3a Mon Sep 17 00:00:00 2001 From: "roc+%cs.cmu.edu" Date: Tue, 1 May 2007 23:54:55 +0000 Subject: [PATCH] Backing out patch since it broke 3 mochitests and no-one's around to babysit. --- browser/themes/pinstripe/browser/browser.css | 3 +- toolkit/themes/pinstripe/global/button.css | 2 - widget/src/cocoa/nsNativeThemeCocoa.mm | 147 +++++++------------ 3 files changed, 54 insertions(+), 98 deletions(-) diff --git a/browser/themes/pinstripe/browser/browser.css b/browser/themes/pinstripe/browser/browser.css index e3638523b54..38a2ed7d113 100755 --- a/browser/themes/pinstripe/browser/browser.css +++ b/browser/themes/pinstripe/browser/browser.css @@ -1121,8 +1121,7 @@ sidebarheader > .tabs-closebutton > .toolbarbutton-text { #feed-button { -moz-binding: url("chrome://global/content/bindings/button.xml#menu"); -moz-appearance: none; - min-width: 0; - min-height: 0; + min-width: 0px; margin-right: 1px !important; } diff --git a/toolkit/themes/pinstripe/global/button.css b/toolkit/themes/pinstripe/global/button.css index 5e180742c83..e69edea0397 100644 --- a/toolkit/themes/pinstripe/global/button.css +++ b/toolkit/themes/pinstripe/global/button.css @@ -50,8 +50,6 @@ button { /* The margin used here come from the Aqua Human Interface Guidelines, there should be 12 pixels between two buttons. */ margin: 6px; - min-width: 70px; - min-height: 22px; color: ButtonText; } diff --git a/widget/src/cocoa/nsNativeThemeCocoa.mm b/widget/src/cocoa/nsNativeThemeCocoa.mm index 90209762bdf..87733eb43cb 100644 --- a/widget/src/cocoa/nsNativeThemeCocoa.mm +++ b/widget/src/cocoa/nsNativeThemeCocoa.mm @@ -58,8 +58,6 @@ #include "gfxContext.h" #include "gfxQuartzSurface.h" -#import - #define DRAW_IN_FRAME_DEBUG 0 #define SCROLLBARS_VISUAL_DEBUG 0 @@ -113,15 +111,6 @@ nsNativeThemeCocoa::DrawCheckboxRadio(CGContextRef cgContext, ThemeButtonKind in HIThemeDrawButton(&inBoxRect, &bdi, cgContext, HITHEME_ORIENTATION, NULL); } -// We use an offscreen buffer and image scaling to make HITheme draw buttons at any size. -// Minimum size that HITheme will draw a normal push button: -#define MIN_UNSCALED_BUTTON_WIDTH 68 -#define MIN_UNSCALED_BUTTON_HEIGHT 22 -// Minimum size that we can create with scaling: -#define MIN_SCALED_BUTTON_WIDTH 20 -#define MIN_SCALED_BUTTON_HEIGHT 12 -// Difference between the height given to HITheme for a button and the button it actually draws: -#define NATIVE_BUTTON_HEIGHT_DIFF 2 void nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind, @@ -129,16 +118,13 @@ nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind, ThemeButtonValue inValue, ThemeButtonAdornment inAdornment, PRInt32 inState) { - if (inBoxRect.size.width < MIN_SCALED_BUTTON_WIDTH || - inBoxRect.size.height < MIN_SCALED_BUTTON_HEIGHT) - return; - HIThemeButtonDrawInfo bdi; + bdi.version = 0; bdi.kind = inKind; bdi.value = inValue; bdi.adornment = inAdornment; - + if (inDisabled) bdi.state = kThemeStateUnavailable; else if ((inState & NS_EVENT_STATE_ACTIVE) && (inState & NS_EVENT_STATE_HOVER)) @@ -152,89 +138,27 @@ nsNativeThemeCocoa::DrawButton(CGContextRef cgContext, ThemeButtonKind inKind, if (inIsDefault && !inDisabled) bdi.adornment |= kThemeAdornmentDefault; - // If any of the origin and size offset arithmatic seems strange here, check out the - // actual dimensions of an HITheme button compared to the rect you pass to HIThemeDrawButton. - if (inBoxRect.size.width < MIN_UNSCALED_BUTTON_WIDTH || inBoxRect.size.height < MIN_UNSCALED_BUTTON_HEIGHT) { - // We'll use these two values to size the button we draw offscreen, make sure it is - // big enough in both dimensions. - float offscreenWidth = MIN_UNSCALED_BUTTON_WIDTH; - float offscreenHeight = MIN_UNSCALED_BUTTON_HEIGHT; - if (inBoxRect.size.width > offscreenWidth) - offscreenWidth = inBoxRect.size.width; - if (inBoxRect.size.height > offscreenHeight) - offscreenHeight = inBoxRect.size.height; - - // create an offscreen image - NSImage* image = [[NSImage alloc] initWithSize:NSMakeSize(offscreenWidth, offscreenHeight)]; - NSImage* finalRenderImage = image; // we may create a second offscreen image later - [image setDataRetained:YES]; - [image setScalesWhenResized:YES]; - - // set up HITheme button to draw - HIRect drawFrame; - drawFrame.origin.x = 0; - drawFrame.origin.y = NATIVE_BUTTON_HEIGHT_DIFF; - drawFrame.size.width = offscreenWidth; - drawFrame.size.height = offscreenHeight - NATIVE_BUTTON_HEIGHT_DIFF; - - // draw into offscreen image - [image lockFocus]; - [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationLow]; - HIThemeDrawButton(&drawFrame, &bdi, (CGContext*)[[NSGraphicsContext currentContext] graphicsPort], kHIThemeOrientationInverted, NULL); - [image unlockFocus]; - - // only resize vertically, do not change the width yet as we don't want to distort the endcaps - [image setSize:NSMakeSize(offscreenWidth, inBoxRect.size.height)]; - - // now copy image half and half from each end if we need to shrink the width - if (inBoxRect.size.width < MIN_UNSCALED_BUTTON_WIDTH) { - // set up a second offscreen image that is the final size - NSImage* secondImage = [[NSImage alloc] initWithSize:NSMakeSize(inBoxRect.size.width, inBoxRect.size.height)]; - [secondImage setDataRetained:YES]; - [secondImage setScalesWhenResized:YES]; - - // this is tricky to do with floats, we don't want to risk drawing over the same pixel twice and darkening it - float widthFloor = floor(inBoxRect.size.width); - float copyFromLeft = floor(widthFloor / 2) + ((int)widthFloor % 2); - float copyFromRight = floor(widthFloor / 2); - - [secondImage lockFocus]; - [image drawInRect:NSMakeRect(0.0, 0.0, copyFromLeft, inBoxRect.size.height) - fromRect:NSMakeRect(0.0, 0.0, copyFromLeft, inBoxRect.size.height) - operation:NSCompositeSourceOver - fraction:1.0]; - [image drawInRect:NSMakeRect(copyFromLeft, 0.0, copyFromRight, inBoxRect.size.height) - fromRect:NSMakeRect(offscreenWidth - copyFromRight, 0.0, copyFromRight, inBoxRect.size.height) - operation:NSCompositeSourceOver - fraction:1.0]; - [secondImage unlockFocus]; - - [finalRenderImage release]; - finalRenderImage = secondImage; - } - - // render to the given CGContextRef - [NSGraphicsContext saveGraphicsState]; - [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:cgContext flipped:YES]]; - [finalRenderImage compositeToPoint:NSMakePoint(inBoxRect.origin.x, inBoxRect.origin.y + inBoxRect.size.height) - operation:NSCompositeSourceOver]; - [finalRenderImage release]; - [NSGraphicsContext restoreGraphicsState]; + // Certain buttons draw outside their frame with nsITheme, we adjust for that here. + HIRect drawRect = inBoxRect; + if (inKind == kThemePushButton || + inKind == kThemePopupButton) { + // These kinds of buttons draw 2 pixels too tall. + drawRect.size.height -= 2; } - else { - HIRect drawFrame; - drawFrame.origin.x = inBoxRect.origin.x; - drawFrame.origin.y = inBoxRect.origin.y; - drawFrame.size.width = inBoxRect.size.width; - drawFrame.size.height = inBoxRect.size.height - NATIVE_BUTTON_HEIGHT_DIFF; - - HIThemeDrawButton(&drawFrame, &bdi, cgContext, kHIThemeOrientationNormal, NULL); + else if (inKind == kThemePushButtonSmall) { + // These kinds of buttons draw 2 pixels too wide, one pixel too far down, and + // two pixels too tall. + drawRect.origin.x += 1; + drawRect.origin.y -= 1; + drawRect.size.width -= 2; } #if DRAW_IN_FRAME_DEBUG CGContextSetRGBFillColor(cgContext, 0.0, 0.0, 0.5, 0.8); CGContextFillRect(cgContext, inBoxRect); #endif + + HIThemeDrawButton(&drawRect, &bdi, cgContext, HITHEME_ORIENTATION, NULL); } @@ -670,7 +594,17 @@ nsNativeThemeCocoa::DrawWidgetBackground(nsIRenderingContext* aContext, nsIFrame case NS_THEME_BUTTON: case NS_THEME_BUTTON_SMALL: { - DrawButton(cgContext, kThemePushButton, macRect, + // Normal push buttons can only draw with a height of 20+ pixels. Small push + // buttons can only draw at a height of 17 pixels. We can't draw buttons with + // a height of 18 or 19 pixels, at least not with HITheme. So, we go down to + // 17 pixel buttons when asked to draw 18 or 19 so that we don't draw outside + // the frame. We just have to live with this until we switch to another API + // for control rendering. Remember that the frame for a 20 pixel tall button + // is 22 pixels because of the border and shadow. + ThemeButtonKind buttonKind = kThemePushButton; + if (macRect.size.height < 22) + buttonKind = kThemePushButtonSmall; + DrawButton(cgContext, buttonKind, macRect, IsDefaultButton(aFrame), IsDisabled(aFrame), kThemeButtonOn, kThemeAdornmentNone, eventState); } @@ -953,6 +887,20 @@ nsNativeThemeCocoa::GetWidgetPadding(nsIDeviceContext* aContext, aResult->SizeTo(nativePadding, nativePadding, nativePadding, nativePadding); return PR_TRUE; } + case NS_THEME_BUTTON: + case NS_THEME_DROPDOWN: + case NS_THEME_DROPDOWN_BUTTON: + { + // The border/shadow on the bottom of the button means we have to + // draw the text a little higher than normal. + aResult->SizeTo(0, -1, 0, 1); + return PR_TRUE; + } + case NS_THEME_BUTTON_SMALL: + { + aResult->SizeTo(0, 0, 0, 0); + return PR_TRUE; + } } return PR_FALSE; @@ -1006,9 +954,20 @@ nsNativeThemeCocoa::GetMinimumWidgetSize(nsIRenderingContext* aContext, switch (aWidgetType) { case NS_THEME_BUTTON: + { + // Height value is adjusted for shadow and border. + SInt32 buttonHeight = 0; + ::GetThemeMetric(kThemeMetricPushButtonHeight, &buttonHeight); + aResult->SizeTo(kAquaMinButtonWidth, buttonHeight + 2); + break; + } + case NS_THEME_BUTTON_SMALL: { - aResult->SizeTo(MIN_SCALED_BUTTON_WIDTH, MIN_SCALED_BUTTON_HEIGHT); + // Height value is adjusted for shadow and border. + SInt32 buttonHeight = 0; + ::GetThemeMetric(kThemeMetricSmallPushButtonHeight, &buttonHeight); + aResult->SizeTo(kAquaMinButtonWidth, buttonHeight + 2); break; }