| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/tab_contents/overlayable_contents_controller.h" | 5 #import "chrome/browser/ui/cocoa/tab_contents/overlayable_contents_controller.h" |
| 6 | 6 |
| 7 #include "base/mac/bundle_locations.h" | 7 #include "base/mac/bundle_locations.h" |
| 8 #include "chrome/browser/ui/cocoa/browser_window_controller.h" | 8 #include "chrome/browser/ui/cocoa/browser_window_controller.h" |
| 9 #include "chrome/browser/ui/cocoa/tab_contents/instant_overlay_controller_mac.h" | 9 #include "chrome/browser/ui/cocoa/tab_contents/instant_overlay_controller_mac.h" |
| 10 #include "chrome/browser/ui/cocoa/tab_contents/overlay_drop_shadow_view.h" | 10 #include "chrome/browser/ui/cocoa/tab_contents/overlay_separator_view.h" |
| 11 #include "content/public/browser/web_contents.h" | 11 #include "content/public/browser/web_contents.h" |
| 12 #include "content/public/browser/web_contents_view.h" | 12 #include "content/public/browser/web_contents_view.h" |
| 13 | 13 |
| 14 @interface OverlayableContentsController() | 14 @interface OverlayableContentsController() |
| 15 - (void)viewDidResize:(NSNotification*)note; | 15 - (void)viewDidResize:(NSNotification*)note; |
| 16 - (void)layoutViews; | 16 - (void)layoutViews; |
| 17 - (CGFloat)overlayHeightInPixels; | 17 - (CGFloat)overlayHeightInPixels; |
| 18 - (BOOL)shouldShowTopSeparator; |
| 18 @end | 19 @end |
| 19 | 20 |
| 20 @implementation OverlayableContentsController | 21 @implementation OverlayableContentsController |
| 21 | 22 |
| 22 @synthesize drawDropShadow = drawDropShadow_; | 23 @synthesize drawDropShadow = drawDropShadow_; |
| 23 @synthesize activeContainerOffset = activeContainerOffset_; | 24 @synthesize activeContainerOffset = activeContainerOffset_; |
| 24 | 25 |
| 25 - (id)initWithBrowser:(Browser*)browser | 26 - (id)initWithBrowser:(Browser*)browser |
| 26 windowController:(BrowserWindowController*)windowController { | 27 windowController:(BrowserWindowController*)windowController { |
| 27 if ((self = [super init])) { | 28 if ((self = [super init])) { |
| 28 windowController_ = windowController; | 29 windowController_ = windowController; |
| 29 scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]); | 30 scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]); |
| 30 [view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; | 31 [view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; |
| 31 [view setAutoresizesSubviews:NO]; | 32 [view setAutoresizesSubviews:NO]; |
| 32 [[NSNotificationCenter defaultCenter] | 33 [[NSNotificationCenter defaultCenter] |
| 33 addObserver:self | 34 addObserver:self |
| 34 selector:@selector(viewDidResize:) | 35 selector:@selector(viewDidResize:) |
| 35 name:NSViewFrameDidChangeNotification | 36 name:NSViewFrameDidChangeNotification |
| 36 object:view]; | 37 object:view]; |
| 37 [self setView:view]; | 38 [self setView:view]; |
| 38 | 39 |
| 39 activeContainer_.reset([[NSView alloc] initWithFrame:NSZeroRect]); | 40 activeContainer_.reset([[NSView alloc] initWithFrame:NSZeroRect]); |
| 40 [view addSubview:activeContainer_]; | 41 [view addSubview:activeContainer_]; |
| 41 | 42 |
| 42 instantOverlayController_.reset( | 43 instantOverlayController_.reset( |
| 43 new InstantOverlayControllerMac(browser, windowController, self)); | 44 new InstantOverlayControllerMac(browser, windowController, self)); |
| 45 topSeparatorView_.reset( |
| 46 [[OverlayTopSeparatorView alloc] initWithFrame:NSZeroRect]); |
| 47 [[self view] addSubview:topSeparatorView_]; |
| 44 } | 48 } |
| 45 return self; | 49 return self; |
| 46 } | 50 } |
| 47 | 51 |
| 48 - (void)dealloc { | 52 - (void)dealloc { |
| 49 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 53 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 50 [super dealloc]; | 54 [super dealloc]; |
| 51 } | 55 } |
| 52 | 56 |
| 53 - (void)setOverlay:(content::WebContents*)overlay | 57 - (void)setOverlay:(content::WebContents*)overlay |
| (...skipping 29 matching lines...) Expand all Loading... |
| 83 // Add the overlay contents. | 87 // Add the overlay contents. |
| 84 if (overlayContents_) { | 88 if (overlayContents_) { |
| 85 [[[self view] window] disableScreenUpdatesUntilFlush]; | 89 [[[self view] window] disableScreenUpdatesUntilFlush]; |
| 86 overlayContents_->GetView()->SetAllowOverlappingViews(true); | 90 overlayContents_->GetView()->SetAllowOverlappingViews(true); |
| 87 [[self view] addSubview:overlayContents_->GetView()->GetNativeView()]; | 91 [[self view] addSubview:overlayContents_->GetView()->GetNativeView()]; |
| 88 } | 92 } |
| 89 | 93 |
| 90 if (drawDropShadow_) { | 94 if (drawDropShadow_) { |
| 91 if (!dropShadowView_) { | 95 if (!dropShadowView_) { |
| 92 dropShadowView_.reset( | 96 dropShadowView_.reset( |
| 93 [[OverlayDropShadowView alloc] initWithFrame:NSZeroRect]); | 97 [[OverlayBottomSeparatorView alloc] initWithFrame:NSZeroRect]); |
| 94 [[self view] addSubview:dropShadowView_]; | 98 [[self view] addSubview:dropShadowView_]; |
| 95 } | 99 } |
| 96 } else { | 100 } else { |
| 97 [dropShadowView_ removeFromSuperview]; | 101 [dropShadowView_ removeFromSuperview]; |
| 98 dropShadowView_.reset(); | 102 dropShadowView_.reset(); |
| 99 } | 103 } |
| 100 | 104 |
| 101 [self layoutViews]; | 105 [self layoutViews]; |
| 102 | 106 |
| 103 if (overlayContents_) | 107 if (overlayContents_) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 [self layoutViews]; | 145 [self layoutViews]; |
| 142 } | 146 } |
| 143 | 147 |
| 144 - (void)viewDidResize:(NSNotification*)note { | 148 - (void)viewDidResize:(NSNotification*)note { |
| 145 [self layoutViews]; | 149 [self layoutViews]; |
| 146 } | 150 } |
| 147 | 151 |
| 148 - (void)layoutViews { | 152 - (void)layoutViews { |
| 149 NSRect bounds = [[self view] bounds]; | 153 NSRect bounds = [[self view] bounds]; |
| 150 | 154 |
| 155 // Layout the separator at the top of the view. |
| 156 NSRect separatorRect = bounds; |
| 157 if ([self shouldShowTopSeparator]) |
| 158 separatorRect.size.height = [OverlayTopSeparatorView preferredHeight]; |
| 159 else |
| 160 separatorRect.size.height = 0; |
| 161 separatorRect.origin.y = NSMaxY(bounds) - NSHeight(separatorRect); |
| 162 [topSeparatorView_ setFrame:separatorRect]; |
| 163 |
| 164 // Layout the overlay. |
| 151 if (overlayContents_) { | 165 if (overlayContents_) { |
| 152 NSRect overlayFrame = bounds; | 166 NSRect overlayFrame = bounds; |
| 153 overlayFrame.size.height = [self overlayHeightInPixels]; | 167 overlayFrame.size.height = [self overlayHeightInPixels]; |
| 154 overlayFrame.origin.y = NSMaxY(bounds) - NSHeight(overlayFrame); | 168 overlayFrame.origin.y = |
| 169 NSMinY([topSeparatorView_ frame]) - NSHeight(overlayFrame); |
| 155 [overlayContents_->GetView()->GetNativeView() setFrame:overlayFrame]; | 170 [overlayContents_->GetView()->GetNativeView() setFrame:overlayFrame]; |
| 156 | 171 |
| 157 if (dropShadowView_) { | 172 if (dropShadowView_) { |
| 158 NSRect dropShadowFrame = bounds; | 173 NSRect dropShadowFrame = bounds; |
| 159 dropShadowFrame.size.height = [OverlayDropShadowView preferredHeight]; | 174 dropShadowFrame.size.height = |
| 175 [OverlayBottomSeparatorView preferredHeight]; |
| 160 dropShadowFrame.origin.y = | 176 dropShadowFrame.origin.y = |
| 161 NSMinY(overlayFrame) - NSHeight(dropShadowFrame); | 177 NSMinY(overlayFrame) - NSHeight(dropShadowFrame); |
| 162 [dropShadowView_ setFrame:dropShadowFrame]; | 178 [dropShadowView_ setFrame:dropShadowFrame]; |
| 163 } | 179 } |
| 164 } | 180 } |
| 165 | 181 |
| 182 // Layout the active tab contents. |
| 166 NSRect activeFrame = bounds; | 183 NSRect activeFrame = bounds; |
| 167 activeFrame.size.height -= activeContainerOffset_; | 184 if (activeContainerOffset_) |
| 185 activeFrame.size.height -= activeContainerOffset_; |
| 186 else |
| 187 activeFrame.size.height -= NSHeight([topSeparatorView_ frame]); |
| 168 if (!NSEqualRects(activeFrame, [activeContainer_ frame])) { | 188 if (!NSEqualRects(activeFrame, [activeContainer_ frame])) { |
| 169 [[activeContainer_ window] disableScreenUpdatesUntilFlush]; | 189 [[activeContainer_ window] disableScreenUpdatesUntilFlush]; |
| 170 [activeContainer_ setFrame:activeFrame]; | 190 [activeContainer_ setFrame:activeFrame]; |
| 171 } | 191 } |
| 172 } | 192 } |
| 173 | 193 |
| 174 - (CGFloat)overlayHeightInPixels { | 194 - (CGFloat)overlayHeightInPixels { |
| 175 CGFloat height = NSHeight([[self view] bounds]); | 195 CGFloat height = |
| 196 NSHeight([[self view] bounds]) - NSHeight([topSeparatorView_ frame]); |
| 176 switch (overlayHeightUnits_) { | 197 switch (overlayHeightUnits_) { |
| 177 case INSTANT_SIZE_PERCENT: | 198 case INSTANT_SIZE_PERCENT: |
| 178 return std::min(height, (height * overlayHeight_) / 100); | 199 return std::min(height, (height * overlayHeight_) / 100); |
| 179 case INSTANT_SIZE_PIXELS: | 200 case INSTANT_SIZE_PIXELS: |
| 180 return std::min(height, overlayHeight_); | 201 return std::min(height, overlayHeight_); |
| 181 } | 202 } |
| 182 } | 203 } |
| 183 | 204 |
| 205 - (BOOL)shouldShowTopSeparator { |
| 206 // In presentation mode tab contents are flush with the top of the screen |
| 207 // so there's no need for a separator. |
| 208 if ([windowController_ inPresentationMode]) |
| 209 return NO; |
| 210 |
| 211 if (![windowController_ hasToolbar]) |
| 212 return NO; |
| 213 |
| 214 // Show a separator is the overlay or the tab contents will be shown right |
| 215 // next to the omnibox. |
| 216 return activeContainerOffset_ == 0 || overlayContents_; |
| 217 } |
| 218 |
| 184 @end | 219 @end |
| OLD | NEW |