| Index: chrome/browser/ui/cocoa/tab_window_controller.mm
|
| ===================================================================
|
| --- chrome/browser/ui/cocoa/tab_window_controller.mm (revision 71805)
|
| +++ chrome/browser/ui/cocoa/tab_window_controller.mm (working copy)
|
| @@ -1,356 +0,0 @@
|
| -// Copyright (c) 2010 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/ui/cocoa/tab_window_controller.h"
|
| -
|
| -#include "app/theme_provider.h"
|
| -#include "base/logging.h"
|
| -#import "chrome/browser/ui/cocoa/focus_tracker.h"
|
| -#import "chrome/browser/ui/cocoa/tab_strip_view.h"
|
| -#import "chrome/browser/ui/cocoa/themed_window.h"
|
| -
|
| -@interface TabWindowController(PRIVATE)
|
| -- (void)setUseOverlay:(BOOL)useOverlay;
|
| -@end
|
| -
|
| -@interface TabWindowOverlayWindow : NSWindow
|
| -@end
|
| -
|
| -@implementation TabWindowOverlayWindow
|
| -
|
| -- (ThemeProvider*)themeProvider {
|
| - if ([self parentWindow])
|
| - return [[[self parentWindow] windowController] themeProvider];
|
| - return NULL;
|
| -}
|
| -
|
| -- (ThemedWindowStyle)themedWindowStyle {
|
| - if ([self parentWindow])
|
| - return [[[self parentWindow] windowController] themedWindowStyle];
|
| - return NO;
|
| -}
|
| -
|
| -- (NSPoint)themePatternPhase {
|
| - if ([self parentWindow])
|
| - return [[[self parentWindow] windowController] themePatternPhase];
|
| - return NSZeroPoint;
|
| -}
|
| -
|
| -@end
|
| -
|
| -@implementation TabWindowController
|
| -@synthesize tabContentArea = tabContentArea_;
|
| -
|
| -- (id)initWithWindow:(NSWindow*)window {
|
| - if ((self = [super initWithWindow:window]) != nil) {
|
| - lockedTabs_.reset([[NSMutableSet alloc] initWithCapacity:10]);
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -// Add the side tab strip to the left side of the window's content area,
|
| -// making it fill the full height of the content area.
|
| -- (void)addSideTabStripToWindow {
|
| - NSView* contentView = [[self window] contentView];
|
| - NSRect contentFrame = [contentView frame];
|
| - NSRect sideStripFrame =
|
| - NSMakeRect(0, 0,
|
| - NSWidth([sideTabStripView_ frame]),
|
| - NSHeight(contentFrame));
|
| - [sideTabStripView_ setFrame:sideStripFrame];
|
| - [contentView addSubview:sideTabStripView_];
|
| -}
|
| -
|
| -// Add the top tab strop to the window, above the content box and add it to the
|
| -// view hierarchy as a sibling of the content view so it can overlap with the
|
| -// window frame.
|
| -- (void)addTopTabStripToWindow {
|
| - NSRect contentFrame = [tabContentArea_ frame];
|
| - NSRect tabFrame =
|
| - NSMakeRect(0, NSMaxY(contentFrame),
|
| - NSWidth(contentFrame),
|
| - NSHeight([topTabStripView_ frame]));
|
| - [topTabStripView_ setFrame:tabFrame];
|
| - NSView* contentParent = [[[self window] contentView] superview];
|
| - [contentParent addSubview:topTabStripView_];
|
| -}
|
| -
|
| -- (void)windowDidLoad {
|
| - // Cache the difference in height between the window content area and the
|
| - // tab content area.
|
| - NSRect tabFrame = [tabContentArea_ frame];
|
| - NSRect contentFrame = [[[self window] contentView] frame];
|
| - contentAreaHeightDelta_ = NSHeight(contentFrame) - NSHeight(tabFrame);
|
| -
|
| - if ([self hasTabStrip]) {
|
| - if ([self useVerticalTabs]) {
|
| - // No top tabstrip so remove the tabContentArea offset.
|
| - tabFrame.size.height = contentFrame.size.height;
|
| - [tabContentArea_ setFrame:tabFrame];
|
| - [self addSideTabStripToWindow];
|
| - } else {
|
| - [self addTopTabStripToWindow];
|
| - }
|
| - } else {
|
| - // No top tabstrip so remove the tabContentArea offset.
|
| - tabFrame.size.height = contentFrame.size.height;
|
| - [tabContentArea_ setFrame:tabFrame];
|
| - }
|
| -}
|
| -
|
| -// Toggles from one display mode of the tab strip to another. Will automatically
|
| -// call -layoutSubviews to reposition other content.
|
| -- (void)toggleTabStripDisplayMode {
|
| - // Adjust the size of the tab contents to either use more or less space,
|
| - // depending on the direction of the toggle. This needs to be done prior to
|
| - // adding back in the top tab strip as its position is based off the MaxY
|
| - // of the tab content area.
|
| - BOOL useVertical = [self useVerticalTabs];
|
| - NSRect tabContentsFrame = [tabContentArea_ frame];
|
| - tabContentsFrame.size.height += useVertical ?
|
| - contentAreaHeightDelta_ : -contentAreaHeightDelta_;
|
| - [tabContentArea_ setFrame:tabContentsFrame];
|
| -
|
| - if (useVertical) {
|
| - // Remove the top tab strip and add the sidebar in.
|
| - [topTabStripView_ removeFromSuperview];
|
| - [self addSideTabStripToWindow];
|
| - } else {
|
| - // Remove the side tab strip and add the top tab strip as a sibling of the
|
| - // window's content area.
|
| - [sideTabStripView_ removeFromSuperview];
|
| - NSRect tabContentsFrame = [tabContentArea_ frame];
|
| - tabContentsFrame.size.height -= contentAreaHeightDelta_;
|
| - [tabContentArea_ setFrame:tabContentsFrame];
|
| - [self addTopTabStripToWindow];
|
| - }
|
| -
|
| - [self layoutSubviews];
|
| -}
|
| -
|
| -// Return the appropriate tab strip based on whether or not side tabs are
|
| -// enabled.
|
| -- (TabStripView*)tabStripView {
|
| - if ([self useVerticalTabs])
|
| - return sideTabStripView_;
|
| - return topTabStripView_;
|
| -}
|
| -
|
| -- (void)removeOverlay {
|
| - [self setUseOverlay:NO];
|
| - if (closeDeferred_) {
|
| - // See comment in BrowserWindowCocoa::Close() about orderOut:.
|
| - [[self window] orderOut:self];
|
| - [[self window] performClose:self]; // Autoreleases the controller.
|
| - }
|
| -}
|
| -
|
| -- (void)showOverlay {
|
| - [self setUseOverlay:YES];
|
| -}
|
| -
|
| -// if |useOverlay| is true, we're moving views into the overlay's content
|
| -// area. If false, we're moving out of the overlay back into the window's
|
| -// content.
|
| -- (void)moveViewsBetweenWindowAndOverlay:(BOOL)useOverlay {
|
| - if (useOverlay) {
|
| - [[[overlayWindow_ contentView] superview] addSubview:[self tabStripView]];
|
| - // Add the original window's content view as a subview of the overlay
|
| - // window's content view. We cannot simply use setContentView: here because
|
| - // the overlay window has a different content size (due to it being
|
| - // borderless).
|
| - [[overlayWindow_ contentView] addSubview:cachedContentView_];
|
| - } else {
|
| - [[self window] setContentView:cachedContentView_];
|
| - // The TabStripView always needs to be in front of the window's content
|
| - // view and therefore it should always be added after the content view is
|
| - // set.
|
| - [[[[self window] contentView] superview] addSubview:[self tabStripView]];
|
| - [[[[self window] contentView] superview] updateTrackingAreas];
|
| - }
|
| -}
|
| -
|
| -// If |useOverlay| is YES, creates a new overlay window and puts the tab strip
|
| -// and the content area inside of it. This allows it to have a different opacity
|
| -// from the title bar. If NO, returns everything to the previous state and
|
| -// destroys the overlay window until it's needed again. The tab strip and window
|
| -// contents are returned to the original window.
|
| -- (void)setUseOverlay:(BOOL)useOverlay {
|
| - [NSObject cancelPreviousPerformRequestsWithTarget:self
|
| - selector:@selector(removeOverlay)
|
| - object:nil];
|
| - NSWindow* window = [self window];
|
| - if (useOverlay && !overlayWindow_) {
|
| - DCHECK(!cachedContentView_);
|
| - overlayWindow_ = [[TabWindowOverlayWindow alloc]
|
| - initWithContentRect:[window frame]
|
| - styleMask:NSBorderlessWindowMask
|
| - backing:NSBackingStoreBuffered
|
| - defer:YES];
|
| - [overlayWindow_ setTitle:@"overlay"];
|
| - [overlayWindow_ setBackgroundColor:[NSColor clearColor]];
|
| - [overlayWindow_ setOpaque:NO];
|
| - [overlayWindow_ setDelegate:self];
|
| - cachedContentView_ = [window contentView];
|
| - [window addChildWindow:overlayWindow_ ordered:NSWindowAbove];
|
| - // Sets explictly nil to the responder and then restores it.
|
| - // Leaving the first responder non-null here
|
| - // causes [RenderWidgethostViewCocoa resignFirstResponder] and
|
| - // following RenderWidgetHost::Blur(), which results unexpected
|
| - // focus lost.
|
| - focusBeforeOverlay_.reset([[FocusTracker alloc] initWithWindow:window]);
|
| - [window makeFirstResponder:nil];
|
| - [self moveViewsBetweenWindowAndOverlay:useOverlay];
|
| - [overlayWindow_ orderFront:nil];
|
| - } else if (!useOverlay && overlayWindow_) {
|
| - DCHECK(cachedContentView_);
|
| - [window setContentView:cachedContentView_];
|
| - [self moveViewsBetweenWindowAndOverlay:useOverlay];
|
| - [focusBeforeOverlay_ restoreFocusInWindow:window];
|
| - focusBeforeOverlay_.reset(nil);
|
| - [window display];
|
| - [window removeChildWindow:overlayWindow_];
|
| - [overlayWindow_ orderOut:nil];
|
| - [overlayWindow_ release];
|
| - overlayWindow_ = nil;
|
| - cachedContentView_ = nil;
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -- (NSWindow*)overlayWindow {
|
| - return overlayWindow_;
|
| -}
|
| -
|
| -- (BOOL)shouldConstrainFrameRect {
|
| - // If we currently have an overlay window, do not attempt to change the
|
| - // window's size, as our overlay window doesn't know how to resize properly.
|
| - return overlayWindow_ == nil;
|
| -}
|
| -
|
| -- (BOOL)canReceiveFrom:(TabWindowController*)source {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| - return NO;
|
| -}
|
| -
|
| -- (void)moveTabView:(NSView*)view
|
| - fromController:(TabWindowController*)dragController {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -- (NSView*)selectedTabView {
|
| - NOTIMPLEMENTED();
|
| - return nil;
|
| -}
|
| -
|
| -- (void)layoutTabs {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -- (TabWindowController*)detachTabToNewWindow:(TabView*)tabView {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| - return NULL;
|
| -}
|
| -
|
| -- (void)insertPlaceholderForTab:(TabView*)tab
|
| - frame:(NSRect)frame
|
| - yStretchiness:(CGFloat)yStretchiness {
|
| - [self showNewTabButton:NO];
|
| -}
|
| -
|
| -- (void)removePlaceholder {
|
| - [self showNewTabButton:YES];
|
| -}
|
| -
|
| -- (BOOL)isDragSessionActive {
|
| - NOTIMPLEMENTED();
|
| - return NO;
|
| -}
|
| -
|
| -- (BOOL)tabDraggingAllowed {
|
| - return YES;
|
| -}
|
| -
|
| -- (BOOL)tabTearingAllowed {
|
| - return YES;
|
| -}
|
| -
|
| -- (BOOL)windowMovementAllowed {
|
| - return YES;
|
| -}
|
| -
|
| -- (BOOL)isTabFullyVisible:(TabView*)tab {
|
| - // Subclasses should implement this, but it's not necessary.
|
| - return YES;
|
| -}
|
| -
|
| -- (void)showNewTabButton:(BOOL)show {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -- (void)detachTabView:(NSView*)view {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -- (NSInteger)numberOfTabs {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| - return 0;
|
| -}
|
| -
|
| -- (BOOL)hasLiveTabs {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| - return NO;
|
| -}
|
| -
|
| -- (NSString*)selectedTabTitle {
|
| - // subclass must implement
|
| - NOTIMPLEMENTED();
|
| - return @"";
|
| -}
|
| -
|
| -- (BOOL)hasTabStrip {
|
| - // Subclasses should implement this.
|
| - NOTIMPLEMENTED();
|
| - return YES;
|
| -}
|
| -
|
| -- (BOOL)useVerticalTabs {
|
| - // Subclasses should implement this.
|
| - NOTIMPLEMENTED();
|
| - return NO;
|
| -}
|
| -
|
| -- (BOOL)isTabDraggable:(NSView*)tabView {
|
| - return ![lockedTabs_ containsObject:tabView];
|
| -}
|
| -
|
| -- (void)setTab:(NSView*)tabView isDraggable:(BOOL)draggable {
|
| - if (draggable)
|
| - [lockedTabs_ removeObject:tabView];
|
| - else
|
| - [lockedTabs_ addObject:tabView];
|
| -}
|
| -
|
| -// Tell the window that it needs to call performClose: as soon as the current
|
| -// drag is complete. This prevents a window (and its overlay) from going away
|
| -// during a drag.
|
| -- (void)deferPerformClose {
|
| - closeDeferred_ = YES;
|
| -}
|
| -
|
| -// Called when the size of the window content area has changed. Override to
|
| -// position specific views. Base class implementation does nothing.
|
| -- (void)layoutSubviews {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -@end
|
|
|