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 #include "chrome/browser/ui/views/frame/browser_view_layout.h" | 5 #include "chrome/browser/ui/views/frame/browser_view_layout.h" |
6 | 6 |
7 #include "chrome/browser/ui/browser_finder.h" | 7 #include "chrome/browser/ui/browser_finder.h" |
8 #include "chrome/browser/ui/find_bar/find_bar.h" | 8 #include "chrome/browser/ui/find_bar/find_bar.h" |
9 #include "chrome/browser/ui/find_bar/find_bar_controller.h" | 9 #include "chrome/browser/ui/find_bar/find_bar_controller.h" |
10 #include "chrome/browser/ui/search/search_model.h" | 10 #include "chrome/browser/ui/search/search_model.h" |
11 #include "chrome/browser/ui/search/search_ui.h" | 11 #include "chrome/browser/ui/search/search_ui.h" |
12 #include "chrome/browser/ui/view_ids.h" | 12 #include "chrome/browser/ui/view_ids.h" |
13 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 13 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" |
14 #include "chrome/browser/ui/views/download/download_shelf_view.h" | 14 #include "chrome/browser/ui/views/download/download_shelf_view.h" |
15 #include "chrome/browser/ui/views/frame/browser_frame.h" | 15 #include "chrome/browser/ui/views/frame/browser_frame.h" |
16 #include "chrome/browser/ui/views/frame/browser_view.h" | 16 #include "chrome/browser/ui/views/frame/browser_view.h" |
17 #include "chrome/browser/ui/views/frame/contents_container.h" | 17 #include "chrome/browser/ui/views/frame/contents_container.h" |
| 18 #include "chrome/browser/ui/views/immersive_mode_controller.h" |
18 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" | 19 #include "chrome/browser/ui/views/infobars/infobar_container_view.h" |
19 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 20 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
20 #include "chrome/browser/ui/views/toolbar_view.h" | 21 #include "chrome/browser/ui/views/toolbar_view.h" |
21 #include "ui/base/hit_test.h" | 22 #include "ui/base/hit_test.h" |
22 #include "ui/gfx/point.h" | 23 #include "ui/gfx/point.h" |
23 #include "ui/gfx/scrollbar_size.h" | 24 #include "ui/gfx/scrollbar_size.h" |
24 #include "ui/gfx/size.h" | 25 #include "ui/gfx/size.h" |
25 #include "ui/views/controls/single_split_view.h" | 26 #include "ui/views/controls/single_split_view.h" |
26 #include "ui/views/controls/webview/webview.h" | 27 #include "ui/views/controls/webview/webview.h" |
27 | 28 |
(...skipping 23 matching lines...) Expand all Loading... |
51 views::View::ConvertPointToTarget(src, dst, point); | 52 views::View::ConvertPointToTarget(src, dst, point); |
52 return dst->HitTestPoint(*point); | 53 return dst->HitTestPoint(*point); |
53 } | 54 } |
54 | 55 |
55 } // namespace | 56 } // namespace |
56 | 57 |
57 //////////////////////////////////////////////////////////////////////////////// | 58 //////////////////////////////////////////////////////////////////////////////// |
58 // BrowserViewLayout, public: | 59 // BrowserViewLayout, public: |
59 | 60 |
60 BrowserViewLayout::BrowserViewLayout() | 61 BrowserViewLayout::BrowserViewLayout() |
61 : tabstrip_(NULL), | 62 : contents_split_(NULL), |
62 toolbar_(NULL), | |
63 contents_split_(NULL), | |
64 contents_container_(NULL), | 63 contents_container_(NULL), |
65 infobar_container_(NULL), | |
66 download_shelf_(NULL), | 64 download_shelf_(NULL), |
67 active_bookmark_bar_(NULL), | 65 active_bookmark_bar_(NULL), |
68 browser_view_(NULL), | 66 browser_view_(NULL), |
69 find_bar_y_(0), | 67 find_bar_y_(0), |
70 constrained_window_top_y_(-1) { | 68 constrained_window_top_y_(-1) { |
71 } | 69 } |
72 | 70 |
73 BrowserViewLayout::~BrowserViewLayout() { | 71 BrowserViewLayout::~BrowserViewLayout() { |
74 } | 72 } |
75 | 73 |
76 bool BrowserViewLayout::GetConstrainedWindowTopY(int* top_y) { | 74 bool BrowserViewLayout::GetConstrainedWindowTopY(int* top_y) { |
77 DCHECK(top_y); | 75 DCHECK(top_y); |
78 *top_y = constrained_window_top_y_; | 76 *top_y = constrained_window_top_y_; |
79 return (constrained_window_top_y_ >= 0); | 77 return (constrained_window_top_y_ >= 0); |
80 } | 78 } |
81 | 79 |
82 gfx::Size BrowserViewLayout::GetMinimumSize() { | 80 gfx::Size BrowserViewLayout::GetMinimumSize() { |
83 gfx::Size tabstrip_size( | 81 gfx::Size tabstrip_size( |
84 browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ? | 82 browser()->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ? |
85 tabstrip_->GetMinimumSize() : gfx::Size()); | 83 browser_view_->tabstrip_->GetMinimumSize() : gfx::Size()); |
86 BrowserNonClientFrameView::TabStripInsets tab_strip_insets( | 84 BrowserNonClientFrameView::TabStripInsets tab_strip_insets( |
87 browser_view_->frame()->GetTabStripInsets(false)); | 85 browser_view_->frame()->GetTabStripInsets(false)); |
88 gfx::Size toolbar_size( | 86 gfx::Size toolbar_size( |
89 (browser()->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) || | 87 (browser()->SupportsWindowFeature(Browser::FEATURE_TOOLBAR) || |
90 browser()->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ? | 88 browser()->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) ? |
91 toolbar_->GetMinimumSize() : gfx::Size()); | 89 browser_view_->toolbar_->GetMinimumSize() : gfx::Size()); |
92 if (tabstrip_size.height() && toolbar_size.height()) | 90 if (tabstrip_size.height() && toolbar_size.height()) |
93 toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap); | 91 toolbar_size.Enlarge(0, -kToolbarTabStripVerticalOverlap); |
94 gfx::Size bookmark_bar_size; | 92 gfx::Size bookmark_bar_size; |
95 if (active_bookmark_bar_ && | 93 if (active_bookmark_bar_ && |
96 browser()->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) { | 94 browser()->SupportsWindowFeature(Browser::FEATURE_BOOKMARKBAR)) { |
97 bookmark_bar_size = active_bookmark_bar_->GetMinimumSize(); | 95 bookmark_bar_size = active_bookmark_bar_->GetMinimumSize(); |
98 bookmark_bar_size.Enlarge(0, | 96 bookmark_bar_size.Enlarge(0, |
99 -(views::NonClientFrameView::kClientEdgeThickness + | 97 -(views::NonClientFrameView::kClientEdgeThickness + |
100 active_bookmark_bar_->GetToolbarOverlap(true))); | 98 active_bookmark_bar_->GetToolbarOverlap(true))); |
101 } | 99 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 int scrollbar_width = gfx::scrollbar_size(); | 136 int scrollbar_width = gfx::scrollbar_size(); |
139 bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width)); | 137 bounding_box.set_width(std::max(0, bounding_box.width() - scrollbar_width)); |
140 if (base::i18n::IsRTL()) | 138 if (base::i18n::IsRTL()) |
141 bounding_box.set_x(bounding_box.x() + scrollbar_width); | 139 bounding_box.set_x(bounding_box.x() + scrollbar_width); |
142 | 140 |
143 return bounding_box; | 141 return bounding_box; |
144 } | 142 } |
145 | 143 |
146 bool BrowserViewLayout::IsPositionInWindowCaption( | 144 bool BrowserViewLayout::IsPositionInWindowCaption( |
147 const gfx::Point& point) { | 145 const gfx::Point& point) { |
| 146 TabStrip* tabstrip = browser_view_->tabstrip_; |
| 147 // Tab strip may transiently have no parent between the RemoveChildView() and |
| 148 // AddChildView() caused by reparenting during an immersive mode reveal. |
| 149 // During this window report that the point didn't hit a tab. |
| 150 if (!tabstrip->parent()) |
| 151 return true; |
148 gfx::Point tabstrip_point(point); | 152 gfx::Point tabstrip_point(point); |
149 views::View::ConvertPointToTarget(browser_view_, tabstrip_, &tabstrip_point); | 153 views::View::ConvertPointToTarget(browser_view_, tabstrip, &tabstrip_point); |
150 return tabstrip_->IsPositionInWindowCaption(tabstrip_point); | 154 return tabstrip->IsPositionInWindowCaption(tabstrip_point); |
151 } | 155 } |
152 | 156 |
153 int BrowserViewLayout::NonClientHitTest( | 157 int BrowserViewLayout::NonClientHitTest( |
154 const gfx::Point& point) { | 158 const gfx::Point& point) { |
155 // Since the TabStrip only renders in some parts of the top of the window, | 159 // Since the TabStrip only renders in some parts of the top of the window, |
156 // the un-obscured area is considered to be part of the non-client caption | 160 // the un-obscured area is considered to be part of the non-client caption |
157 // area of the window. So we need to treat hit-tests in these regions as | 161 // area of the window. So we need to treat hit-tests in these regions as |
158 // hit-tests of the titlebar. | 162 // hit-tests of the titlebar. |
159 | 163 |
160 views::View* parent = browser_view_->parent(); | 164 views::View* parent = browser_view_->parent(); |
161 | 165 |
162 gfx::Point point_in_browser_view_coords(point); | 166 gfx::Point point_in_browser_view_coords(point); |
163 views::View::ConvertPointToTarget( | 167 views::View::ConvertPointToTarget( |
164 parent, browser_view_, &point_in_browser_view_coords); | 168 parent, browser_view_, &point_in_browser_view_coords); |
165 gfx::Point test_point(point); | 169 gfx::Point test_point(point); |
166 | 170 |
167 // Determine if the TabStrip exists and is capable of being clicked on. We | 171 // Determine if the TabStrip exists and is capable of being clicked on. We |
168 // might be a popup window without a TabStrip. | 172 // might be a popup window without a TabStrip. |
169 if (browser_view_->IsTabStripVisible()) { | 173 if (browser_view_->IsTabStripVisible()) { |
170 // See if the mouse pointer is within the bounds of the TabStrip. | 174 // See if the mouse pointer is within the bounds of the TabStrip. |
171 if (ConvertedHitTest(parent, tabstrip_, &test_point)) { | 175 if (ConvertedHitTest(parent, browser_view_->tabstrip_, &test_point)) { |
172 if (tabstrip_->IsPositionInWindowCaption(test_point)) | 176 if (browser_view_->tabstrip_->IsPositionInWindowCaption(test_point)) |
173 return HTCAPTION; | 177 return HTCAPTION; |
174 return HTCLIENT; | 178 return HTCLIENT; |
175 } | 179 } |
176 | 180 |
177 // The top few pixels of the TabStrip are a drop-shadow - as we're pretty | 181 // The top few pixels of the TabStrip are a drop-shadow - as we're pretty |
178 // starved of dragable area, let's give it to window dragging (this also | 182 // starved of dragable area, let's give it to window dragging (this also |
179 // makes sense visually). | 183 // makes sense visually). |
180 if (!browser_view_->IsMaximized() && | 184 if (!browser_view_->IsMaximized() && |
181 (point_in_browser_view_coords.y() < | 185 (point_in_browser_view_coords.y() < |
182 (tabstrip_->y() + kTabShadowSize))) { | 186 (browser_view_->tabstrip_->y() + kTabShadowSize))) { |
183 // We return HTNOWHERE as this is a signal to our containing | 187 // We return HTNOWHERE as this is a signal to our containing |
184 // NonClientView that it should figure out what the correct hit-test | 188 // NonClientView that it should figure out what the correct hit-test |
185 // code is given the mouse position... | 189 // code is given the mouse position... |
186 return HTNOWHERE; | 190 return HTNOWHERE; |
187 } | 191 } |
188 } | 192 } |
189 | 193 |
190 // If the point's y coordinate is below the top of the toolbar and otherwise | 194 // If the point's y coordinate is below the top of the toolbar and otherwise |
191 // within the bounds of this view, the point is considered to be within the | 195 // within the bounds of this view, the point is considered to be within the |
192 // client area. | 196 // client area. |
193 gfx::Rect bv_bounds = browser_view_->bounds(); | 197 gfx::Rect bv_bounds = browser_view_->bounds(); |
194 bv_bounds.Offset(0, toolbar_->y()); | 198 bv_bounds.Offset(0, browser_view_->toolbar_->y()); |
195 bv_bounds.set_height(bv_bounds.height() - toolbar_->y()); | 199 bv_bounds.set_height(bv_bounds.height() - browser_view_->toolbar_->y()); |
196 if (bv_bounds.Contains(point)) | 200 if (bv_bounds.Contains(point)) |
197 return HTCLIENT; | 201 return HTCLIENT; |
198 | 202 |
199 // If the point's y coordinate is above the top of the toolbar, but not in | 203 // If the point's y coordinate is above the top of the toolbar, but not in |
200 // the tabstrip (per previous checking in this function), then we consider it | 204 // the tabstrip (per previous checking in this function), then we consider it |
201 // in the window caption (e.g. the area to the right of the tabstrip | 205 // in the window caption (e.g. the area to the right of the tabstrip |
202 // underneath the window controls). However, note that we DO NOT return | 206 // underneath the window controls). However, note that we DO NOT return |
203 // HTCAPTION here, because when the window is maximized the window controls | 207 // HTCAPTION here, because when the window is maximized the window controls |
204 // will fall into this space (since the BrowserView is sized to entire size | 208 // will fall into this space (since the BrowserView is sized to entire size |
205 // of the window at that point), and the HTCAPTION value will cause the | 209 // of the window at that point), and the HTCAPTION value will cause the |
206 // window controls not to work. So we return HTNOWHERE so that the caller | 210 // window controls not to work. So we return HTNOWHERE so that the caller |
207 // will hit-test the window controls before finally falling back to | 211 // will hit-test the window controls before finally falling back to |
208 // HTCAPTION. | 212 // HTCAPTION. |
209 bv_bounds = browser_view_->bounds(); | 213 bv_bounds = browser_view_->bounds(); |
210 bv_bounds.set_height(toolbar_->y()); | 214 bv_bounds.set_height(browser_view_->toolbar_->y()); |
211 if (bv_bounds.Contains(point)) | 215 if (bv_bounds.Contains(point)) |
212 return HTNOWHERE; | 216 return HTNOWHERE; |
213 | 217 |
214 // If the point is somewhere else, delegate to the default implementation. | 218 // If the point is somewhere else, delegate to the default implementation. |
215 return browser_view_->views::ClientView::NonClientHitTest(point); | 219 return browser_view_->views::ClientView::NonClientHitTest(point); |
216 } | 220 } |
217 | 221 |
218 ////////////////////////////////////////////////////////////////////////////// | 222 ////////////////////////////////////////////////////////////////////////////// |
219 // BrowserViewLayout, views::LayoutManager implementation: | 223 // BrowserViewLayout, views::LayoutManager implementation: |
220 | 224 |
221 void BrowserViewLayout::Installed(views::View* host) { | 225 void BrowserViewLayout::Installed(views::View* host) { |
222 toolbar_ = NULL; | |
223 contents_split_ = NULL; | 226 contents_split_ = NULL; |
224 contents_container_ = NULL; | 227 contents_container_ = NULL; |
225 infobar_container_ = NULL; | |
226 download_shelf_ = NULL; | 228 download_shelf_ = NULL; |
227 active_bookmark_bar_ = NULL; | 229 active_bookmark_bar_ = NULL; |
228 tabstrip_ = NULL; | |
229 browser_view_ = static_cast<BrowserView*>(host); | 230 browser_view_ = static_cast<BrowserView*>(host); |
230 } | 231 } |
231 | 232 |
232 void BrowserViewLayout::Uninstalled(views::View* host) {} | 233 void BrowserViewLayout::Uninstalled(views::View* host) {} |
233 | 234 |
234 void BrowserViewLayout::ViewAdded(views::View* host, views::View* view) { | 235 void BrowserViewLayout::ViewAdded(views::View* host, views::View* view) { |
235 switch (view->id()) { | 236 switch (view->id()) { |
236 case VIEW_ID_CONTENTS_SPLIT: { | 237 case VIEW_ID_CONTENTS_SPLIT: { |
237 contents_split_ = static_cast<views::SingleSplitView*>(view); | 238 contents_split_ = static_cast<views::SingleSplitView*>(view); |
238 // We're installed as the LayoutManager before BrowserView creates the | 239 // We're installed as the LayoutManager before BrowserView creates the |
239 // contents, so we have to set contents_container_ here rather than in | 240 // contents, so we have to set contents_container_ here rather than in |
240 // Installed. | 241 // Installed. |
241 contents_container_ = browser_view_->contents_; | 242 contents_container_ = browser_view_->contents_; |
242 break; | 243 break; |
243 } | 244 } |
244 case VIEW_ID_INFO_BAR_CONTAINER: | |
245 infobar_container_ = view; | |
246 break; | |
247 case VIEW_ID_DOWNLOAD_SHELF: | 245 case VIEW_ID_DOWNLOAD_SHELF: |
248 download_shelf_ = static_cast<DownloadShelfView*>(view); | 246 download_shelf_ = static_cast<DownloadShelfView*>(view); |
249 break; | 247 break; |
250 case VIEW_ID_BOOKMARK_BAR: | 248 case VIEW_ID_BOOKMARK_BAR: |
251 active_bookmark_bar_ = static_cast<BookmarkBarView*>(view); | 249 active_bookmark_bar_ = static_cast<BookmarkBarView*>(view); |
252 break; | 250 break; |
253 case VIEW_ID_TOOLBAR: | |
254 toolbar_ = static_cast<ToolbarView*>(view); | |
255 break; | |
256 case VIEW_ID_TAB_STRIP: | |
257 tabstrip_ = static_cast<TabStrip*>(view); | |
258 break; | |
259 } | 251 } |
260 } | 252 } |
261 | 253 |
262 void BrowserViewLayout::ViewRemoved(views::View* host, views::View* view) { | 254 void BrowserViewLayout::ViewRemoved(views::View* host, views::View* view) { |
263 switch (view->id()) { | 255 switch (view->id()) { |
264 case VIEW_ID_BOOKMARK_BAR: | 256 case VIEW_ID_BOOKMARK_BAR: |
265 active_bookmark_bar_ = NULL; | 257 active_bookmark_bar_ = NULL; |
266 break; | 258 break; |
267 } | 259 } |
268 } | 260 } |
269 | 261 |
270 void BrowserViewLayout::Layout(views::View* host) { | 262 void BrowserViewLayout::Layout(views::View* host) { |
271 vertical_layout_rect_ = browser_view_->GetLocalBounds(); | 263 vertical_layout_rect_ = browser_view_->GetLocalBounds(); |
272 int top = LayoutTabStripRegion(); | 264 int top = LayoutTabStripRegion(); |
273 if (browser_view_->IsTabStripVisible()) { | 265 if (browser_view_->IsTabStripVisible()) { |
274 int x = tabstrip_->GetMirroredX() + browser_view_->GetMirroredX() + | 266 int x = browser_view_->tabstrip_->GetMirroredX() + |
| 267 browser_view_->GetMirroredX() + |
275 browser_view_->frame()->GetThemeBackgroundXInset(); | 268 browser_view_->frame()->GetThemeBackgroundXInset(); |
276 tabstrip_->SetBackgroundOffset(gfx::Point(x, | 269 browser_view_->tabstrip_->SetBackgroundOffset(gfx::Point(x, |
277 browser_view_->frame()->GetTabStripInsets(false).top)); | 270 browser_view_->frame()->GetTabStripInsets(false).top)); |
278 } | 271 } |
279 top = LayoutToolbar(top); | 272 top = LayoutToolbar(top); |
280 top = LayoutBookmarkAndInfoBars(top); | 273 top = LayoutBookmarkAndInfoBars(top); |
| 274 // During immersive mode reveal the content stays near the top of the view. |
| 275 if (browser_view_->immersive_mode_controller()->IsRevealed()) |
| 276 top = browser_view_->tabstrip_->x() + TabStrip::GetImmersiveHeight(); |
| 277 |
281 int bottom = LayoutDownloadShelf(browser_view_->height()); | 278 int bottom = LayoutDownloadShelf(browser_view_->height()); |
282 int active_top_margin = GetTopMarginForActiveContent(); | 279 int active_top_margin = GetTopMarginForActiveContent(); |
283 top -= active_top_margin; | 280 top -= active_top_margin; |
284 contents_container_->SetActiveTopMargin(active_top_margin); | 281 contents_container_->SetActiveTopMargin(active_top_margin); |
285 LayoutTabContents(top, bottom); | 282 LayoutTabContents(top, bottom); |
286 // This must be done _after_ we lay out the WebContents since this | 283 // This must be done _after_ we lay out the WebContents since this |
287 // code calls back into us to find the bounding box the find bar | 284 // code calls back into us to find the bounding box the find bar |
288 // must be laid out within, and that code depends on the | 285 // must be laid out within, and that code depends on the |
289 // TabContentsContainer's bounds being up to date. | 286 // TabContentsContainer's bounds being up to date. |
290 if (browser()->HasFindBarController()) { | 287 if (browser()->HasFindBarController()) { |
(...skipping 23 matching lines...) Expand all Loading... |
314 | 311 |
315 Browser* BrowserViewLayout::browser() { | 312 Browser* BrowserViewLayout::browser() { |
316 return browser_view_->browser(); | 313 return browser_view_->browser(); |
317 } | 314 } |
318 | 315 |
319 const Browser* BrowserViewLayout::browser() const { | 316 const Browser* BrowserViewLayout::browser() const { |
320 return browser_view_->browser(); | 317 return browser_view_->browser(); |
321 } | 318 } |
322 | 319 |
323 int BrowserViewLayout::LayoutTabStripRegion() { | 320 int BrowserViewLayout::LayoutTabStripRegion() { |
| 321 TabStrip* tabstrip = browser_view_->tabstrip_; |
324 if (!browser_view_->IsTabStripVisible()) { | 322 if (!browser_view_->IsTabStripVisible()) { |
325 tabstrip_->SetVisible(false); | 323 tabstrip->SetVisible(false); |
326 tabstrip_->SetBounds(0, 0, 0, 0); | 324 tabstrip->SetBounds(0, 0, 0, 0); |
327 return 0; | 325 return 0; |
328 } | 326 } |
329 // This retrieves the bounds for the tab strip based on whether or not we show | 327 // This retrieves the bounds for the tab strip based on whether or not we show |
330 // anything to the left of it, like the incognito avatar. | 328 // anything to the left of it, like the incognito avatar. |
331 gfx::Rect tabstrip_bounds( | 329 gfx::Rect tabstrip_bounds( |
332 browser_view_->frame()->GetBoundsForTabStrip(tabstrip_)); | 330 browser_view_->frame()->GetBoundsForTabStrip(tabstrip)); |
333 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); | 331 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); |
334 views::View::ConvertPointToTarget(browser_view_->parent(), browser_view_, | 332 views::View::ConvertPointToTarget(browser_view_->parent(), browser_view_, |
335 &tabstrip_origin); | 333 &tabstrip_origin); |
336 tabstrip_bounds.set_origin(tabstrip_origin); | 334 tabstrip_bounds.set_origin(tabstrip_origin); |
337 | 335 |
338 tabstrip_->SetVisible(true); | 336 tabstrip->SetVisible(true); |
339 tabstrip_->SetBoundsRect(tabstrip_bounds); | 337 tabstrip->SetBoundsRect(tabstrip_bounds); |
340 int bottom = tabstrip_bounds.bottom(); | 338 int bottom = tabstrip_bounds.bottom(); |
341 | 339 |
342 // The metro window switcher sits at the far right edge of the tabstrip | 340 // The metro window switcher sits at the far right edge of the tabstrip |
343 // a |kWindowSwitcherOffsetX| pixels from the right edge. | 341 // a |kWindowSwitcherOffsetX| pixels from the right edge. |
344 // Only visible if there is more than one type of window to switch between. | 342 // Only visible if there is more than one type of window to switch between. |
345 // TODO(mad): update this code when more window types than just incognito | 343 // TODO(mad): update this code when more window types than just incognito |
346 // and regular are available. | 344 // and regular are available. |
347 views::Button* switcher_button = browser_view_->window_switcher_button_; | 345 views::Button* switcher_button = browser_view_->window_switcher_button_; |
348 if (switcher_button) { | 346 if (switcher_button) { |
349 if (browser()->profile()->HasOffTheRecordProfile() && | 347 if (browser()->profile()->HasOffTheRecordProfile() && |
(...skipping 16 matching lines...) Expand all Loading... |
366 // ::SetWindowPos( , .. SWP_SHOWWINDOW) which causes this function to | 364 // ::SetWindowPos( , .. SWP_SHOWWINDOW) which causes this function to |
367 // be called again. This works both in showing or hidding the button. | 365 // be called again. This works both in showing or hidding the button. |
368 switcher_button->SetVisible(false); | 366 switcher_button->SetVisible(false); |
369 } | 367 } |
370 } | 368 } |
371 | 369 |
372 return bottom; | 370 return bottom; |
373 } | 371 } |
374 | 372 |
375 int BrowserViewLayout::LayoutToolbar(int top) { | 373 int BrowserViewLayout::LayoutToolbar(int top) { |
| 374 ToolbarView* toolbar = browser_view_->toolbar_; |
376 int browser_view_width = vertical_layout_rect_.width(); | 375 int browser_view_width = vertical_layout_rect_.width(); |
377 bool toolbar_visible = browser_view_->IsToolbarVisible(); | 376 bool toolbar_visible = browser_view_->IsToolbarVisible(); |
378 toolbar_->location_bar()->SetLocationEntryFocusable(toolbar_visible); | 377 toolbar->location_bar()->SetLocationEntryFocusable(toolbar_visible); |
379 int y = top; | 378 int y = top; |
380 y -= (toolbar_visible && browser_view_->IsTabStripVisible()) ? | 379 y -= (toolbar_visible && browser_view_->IsTabStripVisible()) ? |
381 kToolbarTabStripVerticalOverlap : 0; | 380 kToolbarTabStripVerticalOverlap : 0; |
382 int height = toolbar_visible ? toolbar_->GetPreferredSize().height() : 0; | 381 int height = toolbar_visible ? toolbar->GetPreferredSize().height() : 0; |
383 toolbar_->SetVisible(toolbar_visible); | 382 toolbar->SetVisible(toolbar_visible); |
384 toolbar_->SetBounds(vertical_layout_rect_.x(), y, browser_view_width, height); | 383 toolbar->SetBounds(vertical_layout_rect_.x(), y, browser_view_width, height); |
385 | 384 |
386 return y + height; | 385 return y + height; |
387 } | 386 } |
388 | 387 |
389 int BrowserViewLayout::LayoutBookmarkAndInfoBars(int top) { | 388 int BrowserViewLayout::LayoutBookmarkAndInfoBars(int top) { |
390 constrained_window_top_y_ = | 389 constrained_window_top_y_ = |
391 top + browser_view_->y() - kConstrainedWindowOverlap; | 390 top + browser_view_->y() - kConstrainedWindowOverlap; |
392 find_bar_y_ = top + browser_view_->y() - 1; | 391 find_bar_y_ = top + browser_view_->y() - 1; |
393 if (active_bookmark_bar_) { | 392 if (active_bookmark_bar_) { |
394 // If the bookmark bar is showing in detached style: | 393 // If the bookmark bar is showing in detached style: |
395 // - for non-NTP mode, show any Info bar _above_ the bookmark bar, since the | 394 // - for non-NTP mode, show any Info bar _above_ the bookmark bar, since the |
396 // bookmark bar is styled to look like it's part of the page. | 395 // bookmark bar is styled to look like it's part of the page. |
397 // - otherwise, show the bookmark bar at the bottom of content view, so just | 396 // - otherwise, show the bookmark bar at the bottom of content view, so just |
398 // lay out infobar here; bottom bookmark bar is laid out in | 397 // lay out infobar here; bottom bookmark bar is laid out in |
399 // |LayoutBookmarkBarAtBottom|. | 398 // |LayoutBookmarkBarAtBottom|. |
400 if (active_bookmark_bar_->IsDetached()) { | 399 if (active_bookmark_bar_->IsDetached()) { |
401 int infobar_top = LayoutInfoBar(top); | 400 int infobar_top = LayoutInfoBar(top); |
402 return browser()->search_model()->mode().is_ntp() ? | 401 return browser()->search_model()->mode().is_ntp() ? |
403 infobar_top : LayoutBookmarkBarAtTop(infobar_top); | 402 infobar_top : LayoutBookmarkBarAtTop(infobar_top); |
404 } | 403 } |
405 // Otherwise, Bookmark bar first, Info bar second. | 404 // Otherwise, Bookmark bar first, Info bar second. |
406 top = std::max(toolbar_->bounds().bottom(), LayoutBookmarkBarAtTop(top)); | 405 top = std::max(browser_view_->toolbar_->bounds().bottom(), |
| 406 LayoutBookmarkBarAtTop(top)); |
407 } | 407 } |
408 find_bar_y_ = top + browser_view_->y() - 1; | 408 find_bar_y_ = top + browser_view_->y() - 1; |
409 return LayoutInfoBar(top); | 409 return LayoutInfoBar(top); |
410 } | 410 } |
411 | 411 |
412 int BrowserViewLayout::LayoutBookmarkBarAtTop(int top) { | 412 int BrowserViewLayout::LayoutBookmarkBarAtTop(int top) { |
413 DCHECK(active_bookmark_bar_); | 413 DCHECK(active_bookmark_bar_); |
414 int y = top; | 414 int y = top; |
415 if (!browser_view_->IsBookmarkBarVisible()) { | 415 if (!browser_view_->IsBookmarkBarVisible()) { |
416 active_bookmark_bar_->SetVisible(false); | 416 active_bookmark_bar_->SetVisible(false); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 // contents_container_ allows it to tell its child view that it's bigger, | 472 // contents_container_ allows it to tell its child view that it's bigger, |
473 // and clip it so that a theme background aligned to the bottom | 473 // and clip it so that a theme background aligned to the bottom |
474 // or vertically centered is properly aligned whith the bookmark bar view | 474 // or vertically centered is properly aligned whith the bookmark bar view |
475 // drawing of the bottom of the bitmap. | 475 // drawing of the bottom of the bitmap. |
476 contents_container_->SetExtraContentHeight(height); | 476 contents_container_->SetExtraContentHeight(height); |
477 contents_split_->SetLeadingBottomOffset(height); | 477 contents_split_->SetLeadingBottomOffset(height); |
478 #endif // !USE_AURA | 478 #endif // !USE_AURA |
479 } | 479 } |
480 | 480 |
481 int BrowserViewLayout::LayoutInfoBar(int top) { | 481 int BrowserViewLayout::LayoutInfoBar(int top) { |
482 // Raise the |infobar_container_| by its vertical overlap. | 482 InfoBarContainerView* infobar_container = browser_view_->infobar_container_; |
483 infobar_container_->SetVisible(InfobarVisible()); | 483 // Raise the |infobar_container| by its vertical overlap. |
| 484 infobar_container->SetVisible(InfobarVisible()); |
484 int height; | 485 int height; |
485 int overlapped_top = top - | 486 int overlapped_top = top - infobar_container->GetVerticalOverlap(&height); |
486 static_cast<InfoBarContainerView*>(infobar_container_)-> | 487 infobar_container->SetBounds(vertical_layout_rect_.x(), |
487 GetVerticalOverlap(&height); | 488 overlapped_top, |
488 infobar_container_->SetBounds(vertical_layout_rect_.x(), | 489 vertical_layout_rect_.width(), |
489 overlapped_top, | 490 height); |
490 vertical_layout_rect_.width(), | |
491 height); | |
492 return overlapped_top + height; | 491 return overlapped_top + height; |
493 } | 492 } |
494 | 493 |
495 void BrowserViewLayout::LayoutTabContents(int top, int bottom) { | 494 void BrowserViewLayout::LayoutTabContents(int top, int bottom) { |
496 // The ultimate idea is to calculate bounds and reserved areas for all | 495 // The ultimate idea is to calculate bounds and reserved areas for all |
497 // contents views first and then resize them all, so every view | 496 // contents views first and then resize them all, so every view |
498 // (and its contents) is resized and laid out only once. | 497 // (and its contents) is resized and laid out only once. |
499 | 498 |
500 // The views hierarcy (see browser_view.h for more details): | 499 // The views hierarcy (see browser_view.h for more details): |
501 // contents_split_ -> [contents_container_ | devtools] | 500 // contents_split_ -> [contents_container_ | devtools] |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 download_shelf_->SetVisible(visible); | 537 download_shelf_->SetVisible(visible); |
539 download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, | 538 download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, |
540 vertical_layout_rect_.width(), height); | 539 vertical_layout_rect_.width(), height); |
541 download_shelf_->Layout(); | 540 download_shelf_->Layout(); |
542 bottom -= height; | 541 bottom -= height; |
543 } | 542 } |
544 return bottom; | 543 return bottom; |
545 } | 544 } |
546 | 545 |
547 bool BrowserViewLayout::InfobarVisible() const { | 546 bool BrowserViewLayout::InfobarVisible() const { |
| 547 views::View* infobar_container = browser_view_->infobar_container_; |
548 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. | 548 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. |
549 return browser()->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && | 549 return browser()->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && |
550 (infobar_container_->GetPreferredSize().height() != 0); | 550 (infobar_container->GetPreferredSize().height() != 0); |
551 } | 551 } |
OLD | NEW |