diff options
author | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-26 17:21:11 +0000 |
---|---|---|
committer | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-26 17:21:11 +0000 |
commit | f59cdf7bf45ed21cf70c8d2bc43ef4cc70cc94c0 (patch) | |
tree | 400d7f06be1466d0ba4b6b71272b412ae41a292a /chrome/browser/cocoa/chrome_browser_window.mm | |
parent | ee8f30e6d53fc657305af0bd074066f5bca1b63c (diff) | |
download | chromium_src-f59cdf7bf45ed21cf70c8d2bc43ef4cc70cc94c0.zip chromium_src-f59cdf7bf45ed21cf70c8d2bc43ef4cc70cc94c0.tar.gz chromium_src-f59cdf7bf45ed21cf70c8d2bc43ef4cc70cc94c0.tar.bz2 |
[Mac] Rename ChromeBrowserWindow to FramedBrowserWindow.
BUG=53449
TEST=No visible impact. Everything should still work.
Review URL: http://codereview.chromium.org/3189026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57542 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/chrome_browser_window.mm')
-rw-r--r-- | chrome/browser/cocoa/chrome_browser_window.mm | 389 |
1 files changed, 0 insertions, 389 deletions
diff --git a/chrome/browser/cocoa/chrome_browser_window.mm b/chrome/browser/cocoa/chrome_browser_window.mm deleted file mode 100644 index 9e0df76..0000000 --- a/chrome/browser/cocoa/chrome_browser_window.mm +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "chrome/browser/cocoa/chrome_browser_window.h" - -#include "base/logging.h" -#import "chrome/browser/cocoa/browser_frame_view.h" -#import "chrome/browser/cocoa/browser_window_controller.h" -#import "chrome/browser/cocoa/tab_strip_controller.h" -#import "chrome/browser/cocoa/themed_window.h" -#include "chrome/browser/global_keyboard_shortcuts_mac.h" -#import "chrome/browser/renderer_host/render_widget_host_view_mac.h" -#include "chrome/browser/themes/browser_theme_provider.h" - -namespace { - // Size of the gradient. Empirically determined so that the gradient looks - // like what the heuristic does when there are just a few tabs. - const CGFloat kWindowGradientHeight = 24.0; -} - -// Our browser window does some interesting things to get the behaviors that -// we want. We replace the standard window controls (zoom, close, miniaturize) -// with our own versions, so that we can position them slightly differently than -// the default window has them. To do this, we hide the ones that Apple provides -// us with, and create our own. This requires us to handle tracking for the -// buttons (so that they highlight and activate correctly) as well as implement -// the private method _mouseInGroup in our frame view class which is required -// to get the rollover highlight drawing to draw correctly. -@interface ChromeBrowserWindow(ChromeBrowserWindowPrivateMethods) -// Return the view that does the "frame" drawing. -- (NSView*)frameView; -@end - -@implementation ChromeBrowserWindow - -- (id)initWithContentRect:(NSRect)contentRect - styleMask:(NSUInteger)aStyle - backing:(NSBackingStoreType)bufferingType - defer:(BOOL)flag { - if ((self = [super initWithContentRect:contentRect - styleMask:aStyle - backing:bufferingType - defer:flag])) { - if (aStyle & NSTexturedBackgroundWindowMask) { - // The following two calls fix http://www.crbug.com/25684 by preventing - // the window from recalculating the border thickness as the window is - // resized. - // This was causing the window tint to change for the default system theme - // when the window was being resized. - [self setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; - [self setContentBorderThickness:kWindowGradientHeight forEdge:NSMaxYEdge]; - } - } - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[NSDistributedNotificationCenter defaultCenter] removeObserver:self]; - if (widgetTrackingArea_) { - [[self frameView] removeTrackingArea:widgetTrackingArea_]; - widgetTrackingArea_.reset(); - } - [super dealloc]; -} - -- (void)setWindowController:(NSWindowController*)controller { - if (controller == [self windowController]) { - return; - } - // Clean up our old stuff. - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [[NSDistributedNotificationCenter defaultCenter] removeObserver:self]; - [closeButton_ removeFromSuperview]; - closeButton_ = nil; - [miniaturizeButton_ removeFromSuperview]; - miniaturizeButton_ = nil; - [zoomButton_ removeFromSuperview]; - zoomButton_ = nil; - - [super setWindowController:controller]; - - BrowserWindowController* browserController - = static_cast<BrowserWindowController*>(controller); - if ([browserController isKindOfClass:[BrowserWindowController class]]) { - NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter addObserver:self - selector:@selector(themeDidChangeNotification:) - name:kBrowserThemeDidChangeNotification - object:nil]; - - // Hook ourselves up to get notified if the user changes the system - // theme on us. - NSDistributedNotificationCenter* distCenter = - [NSDistributedNotificationCenter defaultCenter]; - [distCenter addObserver:self - selector:@selector(systemThemeDidChangeNotification:) - name:@"AppleAquaColorVariantChanged" - object:nil]; - // Set up our buttons how we like them. - NSView* frameView = [self frameView]; - NSRect frameViewBounds = [frameView bounds]; - - // Find all the "original" buttons, and hide them. We can't use the original - // buttons because the OS likes to move them around when we resize windows - // and will put them back in what it considers to be their "preferred" - // locations. - NSButton* oldButton = [self standardWindowButton:NSWindowCloseButton]; - [oldButton setHidden:YES]; - oldButton = [self standardWindowButton:NSWindowMiniaturizeButton]; - [oldButton setHidden:YES]; - oldButton = [self standardWindowButton:NSWindowZoomButton]; - [oldButton setHidden:YES]; - - // Create and position our new buttons. - NSUInteger aStyle = [self styleMask]; - closeButton_ = [NSWindow standardWindowButton:NSWindowCloseButton - forStyleMask:aStyle]; - NSRect closeButtonFrame = [closeButton_ frame]; - CGFloat yOffset = [browserController hasTabStrip] ? - kChromeWindowButtonsWithTabStripOffsetFromTop : - kChromeWindowButtonsWithoutTabStripOffsetFromTop; - closeButtonFrame.origin = - NSMakePoint(kChromeWindowButtonsOffsetFromLeft, - (NSHeight(frameViewBounds) - - NSHeight(closeButtonFrame) - yOffset)); - - [closeButton_ setFrame:closeButtonFrame]; - [closeButton_ setTarget:self]; - [closeButton_ setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin]; - [frameView addSubview:closeButton_]; - - miniaturizeButton_ = - [NSWindow standardWindowButton:NSWindowMiniaturizeButton - forStyleMask:aStyle]; - NSRect miniaturizeButtonFrame = [miniaturizeButton_ frame]; - miniaturizeButtonFrame.origin = - NSMakePoint((NSMaxX(closeButtonFrame) + - kChromeWindowButtonsInterButtonSpacing), - NSMinY(closeButtonFrame)); - [miniaturizeButton_ setFrame:miniaturizeButtonFrame]; - [miniaturizeButton_ setTarget:self]; - [miniaturizeButton_ setAutoresizingMask:(NSViewMaxXMargin | - NSViewMinYMargin)]; - [frameView addSubview:miniaturizeButton_]; - - zoomButton_ = [NSWindow standardWindowButton:NSWindowZoomButton - forStyleMask:aStyle]; - NSRect zoomButtonFrame = [zoomButton_ frame]; - zoomButtonFrame.origin = - NSMakePoint((NSMaxX(miniaturizeButtonFrame) + - kChromeWindowButtonsInterButtonSpacing), - NSMinY(miniaturizeButtonFrame)); - [zoomButton_ setFrame:zoomButtonFrame]; - [zoomButton_ setTarget:self]; - [zoomButton_ setAutoresizingMask:(NSViewMaxXMargin | - NSViewMinYMargin)]; - - [frameView addSubview:zoomButton_]; - } - - // Update our tracking areas. We want to update them even if we haven't - // added buttons above as we need to remove the old tracking area. If the - // buttons aren't to be shown, updateTrackingAreas won't add new ones. - [self updateTrackingAreas]; -} - -- (NSView*)frameView { - return [[self contentView] superview]; -} - -// The tab strip view covers our window buttons. So we add hit testing here -// to find them properly and return them to the accessibility system. -- (id)accessibilityHitTest:(NSPoint)point { - NSPoint windowPoint = [self convertScreenToBase:point]; - NSControl* controls[] = { closeButton_, zoomButton_, miniaturizeButton_ }; - id value = nil; - for (size_t i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) { - if (NSPointInRect(windowPoint, [controls[i] frame])) { - value = [controls[i] accessibilityHitTest:point]; - break; - } - } - if (!value) { - value = [super accessibilityHitTest:point]; - } - return value; -} - -// Map our custom buttons into the accessibility hierarchy correctly. -- (id)accessibilityAttributeValue:(NSString*)attribute { - id value = nil; - struct { - NSString* attribute_; - id value_; - } attributeMap[] = { - { NSAccessibilityCloseButtonAttribute, [closeButton_ cell]}, - { NSAccessibilityZoomButtonAttribute, [zoomButton_ cell]}, - { NSAccessibilityMinimizeButtonAttribute, [miniaturizeButton_ cell]}, - }; - - for (size_t i = 0; i < sizeof(attributeMap) / sizeof(attributeMap[0]); ++i) { - if ([attributeMap[i].attribute_ isEqualToString:attribute]) { - value = attributeMap[i].value_; - break; - } - } - if (!value) { - value = [super accessibilityAttributeValue:attribute]; - } - return value; -} - -- (void)updateTrackingAreas { - NSView* frameView = [self frameView]; - if (widgetTrackingArea_) { - [frameView removeTrackingArea:widgetTrackingArea_]; - } - if (closeButton_) { - NSRect trackingRect = [closeButton_ frame]; - trackingRect.size.width = NSMaxX([zoomButton_ frame]) - - NSMinX(trackingRect); - widgetTrackingArea_.reset( - [[NSTrackingArea alloc] initWithRect:trackingRect - options:(NSTrackingMouseEnteredAndExited | - NSTrackingActiveAlways) - owner:self - userInfo:nil]); - [frameView addTrackingArea:widgetTrackingArea_]; - - // Check to see if the cursor is still in trackingRect. - NSPoint point = [self mouseLocationOutsideOfEventStream]; - point = [[self contentView] convertPoint:point fromView:nil]; - BOOL newEntered = NSPointInRect (point, trackingRect); - if (newEntered != entered_) { - // Buttons have moved, so update button state. - entered_ = newEntered; - [closeButton_ setNeedsDisplay]; - [zoomButton_ setNeedsDisplay]; - [miniaturizeButton_ setNeedsDisplay]; - } - } -} - -- (void)underlaySurfaceAdded { - DCHECK_GE(underlaySurfaceCount_, 0); - ++underlaySurfaceCount_; - - // We're having the OpenGL surface render under the window, so the window - // needs to be not opaque. - if (underlaySurfaceCount_ == 1) - [self setOpaque:NO]; -} - -- (void)underlaySurfaceRemoved { - --underlaySurfaceCount_; - DCHECK_GE(underlaySurfaceCount_, 0); - - if (underlaySurfaceCount_ == 0) - [self setOpaque:YES]; -} - -- (void)windowMainStatusChanged { - [closeButton_ setNeedsDisplay]; - [zoomButton_ setNeedsDisplay]; - [miniaturizeButton_ setNeedsDisplay]; - NSView* frameView = [self frameView]; - NSView* contentView = [self contentView]; - NSRect updateRect = [frameView frame]; - NSRect contentRect = [contentView frame]; - CGFloat tabStripHeight = [TabStripController defaultTabHeight]; - updateRect.size.height -= NSHeight(contentRect) - tabStripHeight; - updateRect.origin.y = NSMaxY(contentRect) - tabStripHeight; - [[self frameView] setNeedsDisplayInRect:updateRect]; -} - -- (void)becomeMainWindow { - [self windowMainStatusChanged]; - [super becomeMainWindow]; -} - -- (void)resignMainWindow { - [self windowMainStatusChanged]; - [super resignMainWindow]; -} - -// Called after the current theme has changed. -- (void)themeDidChangeNotification:(NSNotification*)aNotification { - [[self frameView] setNeedsDisplay:YES]; -} - -- (void)systemThemeDidChangeNotification:(NSNotification*)aNotification { - [closeButton_ setNeedsDisplay]; - [zoomButton_ setNeedsDisplay]; - [miniaturizeButton_ setNeedsDisplay]; -} - -- (void)sendEvent:(NSEvent*)event { - // For cocoa windows, clicking on the close and the miniaturize (but not the - // zoom buttons) while a window is in the background does NOT bring that - // window to the front. We don't get that behavior for free, so we handle - // it here. Zoom buttons do bring the window to the front. Note that - // Finder windows (in Leopard) behave differently in this regard in that - // zoom buttons don't bring the window to the foreground. - BOOL eventHandled = NO; - if (![self isMainWindow]) { - if ([event type] == NSLeftMouseDown) { - NSView* frameView = [self frameView]; - NSPoint mouse = [frameView convertPoint:[event locationInWindow] - fromView:nil]; - if (NSPointInRect(mouse, [closeButton_ frame])) { - [closeButton_ mouseDown:event]; - eventHandled = YES; - } else if (NSPointInRect(mouse, [miniaturizeButton_ frame])) { - [miniaturizeButton_ mouseDown:event]; - eventHandled = YES; - } - } - } - if (!eventHandled) { - [super sendEvent:event]; - } -} - -// Update our buttons so that they highlight correctly. -- (void)mouseEntered:(NSEvent*)event { - entered_ = YES; - [closeButton_ setNeedsDisplay]; - [zoomButton_ setNeedsDisplay]; - [miniaturizeButton_ setNeedsDisplay]; -} - -// Update our buttons so that they highlight correctly. -- (void)mouseExited:(NSEvent*)event { - entered_ = NO; - [closeButton_ setNeedsDisplay]; - [zoomButton_ setNeedsDisplay]; - [miniaturizeButton_ setNeedsDisplay]; -} - -- (BOOL)mouseInGroup:(NSButton*)widget { - return entered_; -} - -- (void)setShouldHideTitle:(BOOL)flag { - shouldHideTitle_ = flag; -} - --(BOOL)_isTitleHidden { - return shouldHideTitle_; -} - -// This method is called whenever a window is moved in order to ensure it fits -// on the screen. We cannot always handle resizes without breaking, so we -// prevent frame constraining in those cases. -- (NSRect)constrainFrameRect:(NSRect)frame toScreen:(NSScreen*)screen { - // Do not constrain the frame rect if our delegate says no. In this case, - // return the original (unconstrained) frame. - id delegate = [self delegate]; - if ([delegate respondsToSelector:@selector(shouldConstrainFrameRect)] && - ![delegate shouldConstrainFrameRect]) - return frame; - - return [super constrainFrameRect:frame toScreen:screen]; -} - -- (ThemeProvider*)themeProvider { - id delegate = [self delegate]; - if (![delegate respondsToSelector:@selector(themeProvider)]) - return NULL; - return [delegate themeProvider]; -} - -- (ThemedWindowStyle)themedWindowStyle { - id delegate = [self delegate]; - if (![delegate respondsToSelector:@selector(themedWindowStyle)]) - return THEMED_NORMAL; - return [delegate themedWindowStyle]; -} - -- (NSPoint)themePatternPhase { - id delegate = [self delegate]; - if (![delegate respondsToSelector:@selector(themePatternPhase)]) - return NSMakePoint(0, 0); - return [delegate themePatternPhase]; -} - -@end |