Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h" | 5 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #import "chrome/browser/ui/cocoa/browser_window_layout.h" | 8 #import "chrome/browser/ui/cocoa/browser_window_layout.h" |
| 9 #import "chrome/browser/ui/cocoa/fast_resize_view.h" | 9 #import "chrome/browser/ui/cocoa/fast_resize_view.h" |
| 10 #import "chrome/browser/ui/cocoa/framed_browser_window.h" | 10 #import "chrome/browser/ui/cocoa/framed_browser_window.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 themeImagePositionForAlignment:alignment]; | 42 themeImagePositionForAlignment:alignment]; |
| 43 } | 43 } |
| 44 return NSZeroPoint; | 44 return NSZeroPoint; |
| 45 } | 45 } |
| 46 | 46 |
| 47 @end | 47 @end |
| 48 | 48 |
| 49 @implementation TabWindowController | 49 @implementation TabWindowController |
| 50 | 50 |
| 51 - (id)initTabWindowControllerWithTabStrip:(BOOL)hasTabStrip { | 51 - (id)initTabWindowControllerWithTabStrip:(BOOL)hasTabStrip { |
| 52 NSRect contentRect = NSMakeRect(60, 229, 750, 600); | 52 const CGFloat kDefaultWidth = 750; |
| 53 const CGFloat kDefaultHeight = 600; | |
| 54 | |
| 55 NSRect contentRect = NSMakeRect(60, 229, kDefaultWidth, kDefaultHeight); | |
| 53 base::scoped_nsobject<FramedBrowserWindow> window( | 56 base::scoped_nsobject<FramedBrowserWindow> window( |
| 54 [[FramedBrowserWindow alloc] initWithContentRect:contentRect | 57 [[FramedBrowserWindow alloc] initWithContentRect:contentRect |
| 55 hasTabStrip:hasTabStrip]); | 58 hasTabStrip:hasTabStrip]); |
| 56 [window setReleasedWhenClosed:YES]; | 59 [window setReleasedWhenClosed:YES]; |
| 57 [window setAutorecalculatesKeyViewLoop:YES]; | 60 [window setAutorecalculatesKeyViewLoop:YES]; |
| 58 | 61 |
| 59 if ((self = [super initWithWindow:window])) { | 62 if ((self = [super initWithWindow:window])) { |
| 60 [[self window] setDelegate:self]; | 63 [[self window] setDelegate:self]; |
| 61 | 64 |
| 62 tabContentArea_.reset([[FastResizeView alloc] initWithFrame: | 65 chromeContentView_.reset([[NSView alloc] |
| 63 NSMakeRect(0, 0, 750, 600)]); | 66 initWithFrame:NSMakeRect(0, 0, kDefaultWidth, kDefaultHeight)]); |
| 67 [chromeContentView_ | |
| 68 setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | |
| 69 [chromeContentView_ setWantsLayer:YES]; | |
| 70 [[[self window] contentView] addSubview:chromeContentView_]; | |
| 71 | |
| 72 tabContentArea_.reset( | |
| 73 [[FastResizeView alloc] initWithFrame:[chromeContentView_ bounds]]); | |
| 64 [tabContentArea_ setAutoresizingMask:NSViewWidthSizable | | 74 [tabContentArea_ setAutoresizingMask:NSViewWidthSizable | |
| 65 NSViewHeightSizable]; | 75 NSViewHeightSizable]; |
| 66 [[[self window] contentView] addSubview:tabContentArea_]; | 76 [chromeContentView_ addSubview:tabContentArea_]; |
| 67 | 77 |
| 68 // tabStripBackgroundView_ draws the theme image behind the tab strip area. | 78 // tabStripBackgroundView_ draws the theme image behind the tab strip area. |
| 69 // When making a tab dragging window (setUseOverlay:), this view stays in | 79 // When making a tab dragging window (setUseOverlay:), this view stays in |
| 70 // the parent window so that it can be translucent, while the tab strip view | 80 // the parent window so that it can be translucent, while the tab strip view |
| 71 // moves to the child window and stays opaque. | 81 // moves to the child window and stays opaque. |
| 72 NSView* windowView = [window cr_windowView]; | 82 NSView* windowView = [window cr_windowView]; |
| 73 tabStripBackgroundView_.reset([[TabStripBackgroundView alloc] | 83 tabStripBackgroundView_.reset([[TabStripBackgroundView alloc] |
| 74 initWithFrame:NSMakeRect(0, | 84 initWithFrame:NSMakeRect(0, |
| 75 NSMaxY([windowView bounds]) - | 85 NSMaxY([windowView bounds]) - |
| 76 kBrowserFrameViewPaintHeight, | 86 kBrowserFrameViewPaintHeight, |
| 77 NSWidth([windowView bounds]), | 87 NSWidth([windowView bounds]), |
| 78 kBrowserFrameViewPaintHeight)]); | 88 kBrowserFrameViewPaintHeight)]); |
| 79 [tabStripBackgroundView_ | 89 [tabStripBackgroundView_ |
| 80 setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; | 90 setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; |
| 81 [windowView addSubview:tabStripBackgroundView_ | 91 [self insertTabStripBackgroundViewIntoWindow:window]; |
|
erikchen
2014/10/09 21:24:39
It's unclear that tabStripBackgroundView should be
| |
| 82 positioned:NSWindowBelow | |
| 83 relativeTo:nil]; | |
| 84 | 92 |
| 85 [self moveContentViewToBack:[window contentView]]; | 93 [self moveContentViewToBack:[window contentView]]; |
| 86 | 94 |
| 87 tabStripView_.reset([[TabStripView alloc] | 95 tabStripView_.reset([[TabStripView alloc] |
| 88 initWithFrame:NSMakeRect(0, 0, 750, chrome::kTabStripHeight)]); | 96 initWithFrame:NSMakeRect( |
| 97 0, 0, kDefaultWidth, chrome::kTabStripHeight)]); | |
| 89 [tabStripView_ setAutoresizingMask:NSViewWidthSizable | | 98 [tabStripView_ setAutoresizingMask:NSViewWidthSizable | |
| 90 NSViewMinYMargin]; | 99 NSViewMinYMargin]; |
| 91 if (hasTabStrip) | 100 if (hasTabStrip) |
| 92 [self insertTabStripView:tabStripView_ intoWindow:[self window]]; | 101 [self insertTabStripView:tabStripView_ intoWindow:[self window]]; |
| 93 } | 102 } |
| 94 return self; | 103 return self; |
| 95 } | 104 } |
| 96 | 105 |
| 97 - (NSView*)tabStripBackgroundView { | 106 - (NSView*)tabStripBackgroundView { |
| 98 return tabStripBackgroundView_; | 107 return tabStripBackgroundView_; |
| 99 } | 108 } |
| 100 | 109 |
| 101 - (TabStripView*)tabStripView { | 110 - (TabStripView*)tabStripView { |
| 102 return tabStripView_; | 111 return tabStripView_; |
| 103 } | 112 } |
| 104 | 113 |
| 105 - (FastResizeView*)tabContentArea { | 114 - (FastResizeView*)tabContentArea { |
| 106 return tabContentArea_; | 115 return tabContentArea_; |
| 107 } | 116 } |
| 108 | 117 |
| 118 - (NSView*)chromeContentView { | |
| 119 return chromeContentView_; | |
| 120 } | |
| 121 | |
| 109 - (void)removeOverlay { | 122 - (void)removeOverlay { |
| 110 [self setUseOverlay:NO]; | 123 [self setUseOverlay:NO]; |
| 111 if (closeDeferred_) { | 124 if (closeDeferred_) { |
| 112 // See comment in BrowserWindowCocoa::Close() about orderOut:. | 125 // See comment in BrowserWindowCocoa::Close() about orderOut:. |
| 113 [[self window] orderOut:self]; | 126 [[self window] orderOut:self]; |
| 114 [[self window] performClose:self]; // Autoreleases the controller. | 127 [[self window] performClose:self]; // Autoreleases the controller. |
| 115 } | 128 } |
| 116 } | 129 } |
| 117 | 130 |
| 118 - (void)showOverlay { | 131 - (void)showOverlay { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 134 | 147 |
| 135 overlayWindow_ = [[TabWindowOverlayWindow alloc] | 148 overlayWindow_ = [[TabWindowOverlayWindow alloc] |
| 136 initWithContentRect:[window frame] | 149 initWithContentRect:[window frame] |
| 137 styleMask:NSBorderlessWindowMask | 150 styleMask:NSBorderlessWindowMask |
| 138 backing:NSBackingStoreBuffered | 151 backing:NSBackingStoreBuffered |
| 139 defer:YES]; | 152 defer:YES]; |
| 140 [overlayWindow_ setTitle:@"overlay"]; | 153 [overlayWindow_ setTitle:@"overlay"]; |
| 141 [overlayWindow_ setBackgroundColor:[NSColor clearColor]]; | 154 [overlayWindow_ setBackgroundColor:[NSColor clearColor]]; |
| 142 [overlayWindow_ setOpaque:NO]; | 155 [overlayWindow_ setOpaque:NO]; |
| 143 [overlayWindow_ setDelegate:self]; | 156 [overlayWindow_ setDelegate:self]; |
| 157 [[overlayWindow_ contentView] setWantsLayer:YES]; | |
| 144 | 158 |
| 145 originalContentView_ = [window contentView]; | 159 originalContentView_ = self.chromeContentView; |
| 146 [window addChildWindow:overlayWindow_ ordered:NSWindowAbove]; | 160 [window addChildWindow:overlayWindow_ ordered:NSWindowAbove]; |
| 147 | 161 |
| 148 // Explicitly set the responder to be nil here (for restoring later). | 162 // Explicitly set the responder to be nil here (for restoring later). |
| 149 // If the first responder were to be left non-nil here then | 163 // If the first responder were to be left non-nil here then |
| 150 // [RenderWidgethostViewCocoa resignFirstResponder] would be called, | 164 // [RenderWidgethostViewCocoa resignFirstResponder] would be called, |
| 151 // followed by RenderWidgetHost::Blur(), which would result in an unexpected | 165 // followed by RenderWidgetHost::Blur(), which would result in an unexpected |
| 152 // loss of focus. | 166 // loss of focus. |
| 153 focusBeforeOverlay_.reset([[FocusTracker alloc] initWithWindow:window]); | 167 focusBeforeOverlay_.reset([[FocusTracker alloc] initWithWindow:window]); |
| 154 [window makeFirstResponder:nil]; | 168 [window makeFirstResponder:nil]; |
| 155 | 169 |
| 156 // Move the original window's tab strip view and content view to the overlay | 170 // Move the original window's tab strip view and content view to the overlay |
| 157 // window. The content view is added as a subview of the overlay window's | 171 // window. The content view is added as a subview of the overlay window's |
| 158 // content view (rather than using setContentView:) because the overlay | 172 // content view (rather than using setContentView:) because the overlay |
| 159 // window has a different content size (due to it being borderless). | 173 // window has a different content size (due to it being borderless). |
| 160 [[overlayWindow_ cr_windowView] addSubview:[self tabStripView]]; | 174 [[overlayWindow_ cr_windowView] addSubview:[self tabStripView]]; |
| 161 [[overlayWindow_ contentView] addSubview:originalContentView_]; | 175 [[overlayWindow_ contentView] addSubview:originalContentView_]; |
| 162 | 176 |
| 163 [overlayWindow_ orderFront:nil]; | 177 [overlayWindow_ orderFront:nil]; |
| 164 } else if (!useOverlay && overlayWindow_) { | 178 } else if (!useOverlay && overlayWindow_) { |
| 165 DCHECK(originalContentView_); | 179 DCHECK(originalContentView_); |
| 166 | 180 |
| 167 // Return the original window's tab strip view and content view to their | 181 // Return the original window's tab strip view and content view to their |
| 168 // places. The TabStripView always needs to be in front of the window's | 182 // places. The TabStripView always needs to be in front of the window's |
| 169 // content view and therefore it should always be added after the content | 183 // content view and therefore it should always be added after the content |
| 170 // view is set. | 184 // view is set. |
| 171 [window setContentView:originalContentView_]; | 185 [[window contentView] addSubview:originalContentView_ |
| 172 [self moveContentViewToBack:originalContentView_]; | 186 positioned:NSWindowBelow |
| 187 relativeTo:nil]; | |
| 188 originalContentView_.frame = [[window contentView] bounds]; | |
| 173 [self insertTabStripView:[self tabStripView] intoWindow:window]; | 189 [self insertTabStripView:[self tabStripView] intoWindow:window]; |
| 174 [[window cr_windowView] updateTrackingAreas]; | 190 [[window cr_windowView] updateTrackingAreas]; |
| 175 | 191 |
| 176 [focusBeforeOverlay_ restoreFocusInWindow:window]; | 192 [focusBeforeOverlay_ restoreFocusInWindow:window]; |
| 177 focusBeforeOverlay_.reset(); | 193 focusBeforeOverlay_.reset(); |
| 178 | 194 |
| 179 [window display]; | 195 [window display]; |
| 180 [window removeChildWindow:overlayWindow_]; | 196 [window removeChildWindow:overlayWindow_]; |
| 181 | 197 |
| 182 [overlayWindow_ orderOut:nil]; | 198 [overlayWindow_ orderOut:nil]; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 327 if (contentParent == [[window contentView] superview]) { | 343 if (contentParent == [[window contentView] superview]) { |
| 328 // Add the tab strip directly above the content view, if they are siblings. | 344 // Add the tab strip directly above the content view, if they are siblings. |
| 329 [contentParent addSubview:tabStripView | 345 [contentParent addSubview:tabStripView |
| 330 positioned:NSWindowAbove | 346 positioned:NSWindowAbove |
| 331 relativeTo:[window contentView]]; | 347 relativeTo:[window contentView]]; |
| 332 } else { | 348 } else { |
| 333 [contentParent addSubview:tabStripView]; | 349 [contentParent addSubview:tabStripView]; |
| 334 } | 350 } |
| 335 } | 351 } |
| 336 | 352 |
| 353 - (void)insertTabStripBackgroundViewIntoWindow:(NSWindow*)window { | |
| 354 DCHECK(tabStripBackgroundView_); | |
| 355 NSView* rootView = [[window contentView] superview]; | |
| 356 [rootView addSubview:tabStripBackgroundView_ | |
| 357 positioned:NSWindowBelow | |
| 358 relativeTo:nil]; | |
| 359 } | |
| 360 | |
| 337 // Called when the size of the window content area has changed. Override to | 361 // Called when the size of the window content area has changed. Override to |
| 338 // position specific views. Base class implementation does nothing. | 362 // position specific views. Base class implementation does nothing. |
| 339 - (void)layoutSubviews { | 363 - (void)layoutSubviews { |
| 340 NOTIMPLEMENTED(); | 364 NOTIMPLEMENTED(); |
| 341 } | 365 } |
| 342 | 366 |
| 343 @end | 367 @end |
| OLD | NEW |