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_separator_view.h" | 10 #include "chrome/browser/ui/cocoa/tab_contents/overlay_drop_shadow_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; | |
19 @end | 18 @end |
20 | 19 |
21 @implementation OverlayableContentsController | 20 @implementation OverlayableContentsController |
22 | 21 |
23 @synthesize drawDropShadow = drawDropShadow_; | 22 @synthesize drawDropShadow = drawDropShadow_; |
24 @synthesize activeContainerOffset = activeContainerOffset_; | 23 @synthesize activeContainerOffset = activeContainerOffset_; |
25 | 24 |
26 - (id)initWithBrowser:(Browser*)browser | 25 - (id)initWithBrowser:(Browser*)browser |
27 windowController:(BrowserWindowController*)windowController { | 26 windowController:(BrowserWindowController*)windowController { |
28 if ((self = [super init])) { | 27 if ((self = [super init])) { |
29 windowController_ = windowController; | 28 windowController_ = windowController; |
30 scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]); | 29 scoped_nsobject<NSView> view([[NSView alloc] initWithFrame:NSZeroRect]); |
31 [view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; | 30 [view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; |
32 [view setAutoresizesSubviews:NO]; | 31 [view setAutoresizesSubviews:NO]; |
33 [[NSNotificationCenter defaultCenter] | 32 [[NSNotificationCenter defaultCenter] |
34 addObserver:self | 33 addObserver:self |
35 selector:@selector(viewDidResize:) | 34 selector:@selector(viewDidResize:) |
36 name:NSViewFrameDidChangeNotification | 35 name:NSViewFrameDidChangeNotification |
37 object:view]; | 36 object:view]; |
38 [self setView:view]; | 37 [self setView:view]; |
39 | 38 |
40 activeContainer_.reset([[NSView alloc] initWithFrame:NSZeroRect]); | 39 activeContainer_.reset([[NSView alloc] initWithFrame:NSZeroRect]); |
41 [view addSubview:activeContainer_]; | 40 [view addSubview:activeContainer_]; |
42 | 41 |
43 instantOverlayController_.reset( | 42 instantOverlayController_.reset( |
44 new InstantOverlayControllerMac(browser, windowController, self)); | 43 new InstantOverlayControllerMac(browser, windowController, self)); |
45 topSeparatorView_.reset( | |
46 [[OverlayTopSeparatorView alloc] initWithFrame:NSZeroRect]); | |
47 [[self view] addSubview:topSeparatorView_]; | |
48 } | 44 } |
49 return self; | 45 return self; |
50 } | 46 } |
51 | 47 |
52 - (void)dealloc { | 48 - (void)dealloc { |
53 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 49 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
54 [super dealloc]; | 50 [super dealloc]; |
55 } | 51 } |
56 | 52 |
57 - (void)setOverlay:(content::WebContents*)overlay | 53 - (void)setOverlay:(content::WebContents*)overlay |
(...skipping 29 matching lines...) Expand all Loading... |
87 // Add the overlay contents. | 83 // Add the overlay contents. |
88 if (overlayContents_) { | 84 if (overlayContents_) { |
89 [[[self view] window] disableScreenUpdatesUntilFlush]; | 85 [[[self view] window] disableScreenUpdatesUntilFlush]; |
90 overlayContents_->GetView()->SetAllowOverlappingViews(true); | 86 overlayContents_->GetView()->SetAllowOverlappingViews(true); |
91 [[self view] addSubview:overlayContents_->GetView()->GetNativeView()]; | 87 [[self view] addSubview:overlayContents_->GetView()->GetNativeView()]; |
92 } | 88 } |
93 | 89 |
94 if (drawDropShadow_) { | 90 if (drawDropShadow_) { |
95 if (!dropShadowView_) { | 91 if (!dropShadowView_) { |
96 dropShadowView_.reset( | 92 dropShadowView_.reset( |
97 [[OverlayBottomSeparatorView alloc] initWithFrame:NSZeroRect]); | 93 [[OverlayDropShadowView alloc] initWithFrame:NSZeroRect]); |
98 [[self view] addSubview:dropShadowView_]; | 94 [[self view] addSubview:dropShadowView_]; |
99 } | 95 } |
100 } else { | 96 } else { |
101 [dropShadowView_ removeFromSuperview]; | 97 [dropShadowView_ removeFromSuperview]; |
102 dropShadowView_.reset(); | 98 dropShadowView_.reset(); |
103 } | 99 } |
104 | 100 |
105 [self layoutViews]; | 101 [self layoutViews]; |
106 | 102 |
107 if (overlayContents_) | 103 if (overlayContents_) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 [self layoutViews]; | 141 [self layoutViews]; |
146 } | 142 } |
147 | 143 |
148 - (void)viewDidResize:(NSNotification*)note { | 144 - (void)viewDidResize:(NSNotification*)note { |
149 [self layoutViews]; | 145 [self layoutViews]; |
150 } | 146 } |
151 | 147 |
152 - (void)layoutViews { | 148 - (void)layoutViews { |
153 NSRect bounds = [[self view] bounds]; | 149 NSRect bounds = [[self view] bounds]; |
154 | 150 |
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. | |
165 if (overlayContents_) { | 151 if (overlayContents_) { |
166 NSRect overlayFrame = bounds; | 152 NSRect overlayFrame = bounds; |
167 overlayFrame.size.height = [self overlayHeightInPixels]; | 153 overlayFrame.size.height = [self overlayHeightInPixels]; |
168 overlayFrame.origin.y = | 154 overlayFrame.origin.y = NSMaxY(bounds) - NSHeight(overlayFrame); |
169 NSMinY([topSeparatorView_ frame]) - NSHeight(overlayFrame); | |
170 [overlayContents_->GetView()->GetNativeView() setFrame:overlayFrame]; | 155 [overlayContents_->GetView()->GetNativeView() setFrame:overlayFrame]; |
171 | 156 |
172 if (dropShadowView_) { | 157 if (dropShadowView_) { |
173 NSRect dropShadowFrame = bounds; | 158 NSRect dropShadowFrame = bounds; |
174 dropShadowFrame.size.height = | 159 dropShadowFrame.size.height = [OverlayDropShadowView preferredHeight]; |
175 [OverlayBottomSeparatorView preferredHeight]; | |
176 dropShadowFrame.origin.y = | 160 dropShadowFrame.origin.y = |
177 NSMinY(overlayFrame) - NSHeight(dropShadowFrame); | 161 NSMinY(overlayFrame) - NSHeight(dropShadowFrame); |
178 [dropShadowView_ setFrame:dropShadowFrame]; | 162 [dropShadowView_ setFrame:dropShadowFrame]; |
179 } | 163 } |
180 } | 164 } |
181 | 165 |
182 // Layout the active tab contents. | |
183 NSRect activeFrame = bounds; | 166 NSRect activeFrame = bounds; |
184 if (activeContainerOffset_) | 167 activeFrame.size.height -= activeContainerOffset_; |
185 activeFrame.size.height -= activeContainerOffset_; | |
186 else | |
187 activeFrame.size.height -= NSHeight([topSeparatorView_ frame]); | |
188 if (!NSEqualRects(activeFrame, [activeContainer_ frame])) { | 168 if (!NSEqualRects(activeFrame, [activeContainer_ frame])) { |
189 [[activeContainer_ window] disableScreenUpdatesUntilFlush]; | 169 [[activeContainer_ window] disableScreenUpdatesUntilFlush]; |
190 [activeContainer_ setFrame:activeFrame]; | 170 [activeContainer_ setFrame:activeFrame]; |
191 } | 171 } |
192 } | 172 } |
193 | 173 |
194 - (CGFloat)overlayHeightInPixels { | 174 - (CGFloat)overlayHeightInPixels { |
195 CGFloat height = | 175 CGFloat height = NSHeight([[self view] bounds]); |
196 NSHeight([[self view] bounds]) - NSHeight([topSeparatorView_ frame]); | |
197 switch (overlayHeightUnits_) { | 176 switch (overlayHeightUnits_) { |
198 case INSTANT_SIZE_PERCENT: | 177 case INSTANT_SIZE_PERCENT: |
199 return std::min(height, (height * overlayHeight_) / 100); | 178 return std::min(height, (height * overlayHeight_) / 100); |
200 case INSTANT_SIZE_PIXELS: | 179 case INSTANT_SIZE_PIXELS: |
201 return std::min(height, overlayHeight_); | 180 return std::min(height, overlayHeight_); |
202 } | 181 } |
203 } | 182 } |
204 | 183 |
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 | |
219 @end | 184 @end |
OLD | NEW |