| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/views/frame/browser_view_layout.h" | 5 #include "chrome/browser/views/frame/browser_view_layout.h" |
| 6 | 6 |
| 7 #include "chrome/browser/find_bar.h" | 7 #include "chrome/browser/find_bar.h" |
| 8 #include "chrome/browser/find_bar_controller.h" | 8 #include "chrome/browser/find_bar_controller.h" |
| 9 #include "chrome/browser/sidebar/sidebar_manager.h" | 9 #include "chrome/browser/sidebar/sidebar_manager.h" |
| 10 #include "chrome/browser/view_ids.h" | 10 #include "chrome/browser/view_ids.h" |
| 11 #include "chrome/browser/views/bookmark_bar_view.h" | 11 #include "chrome/browser/views/bookmark_bar_view.h" |
| 12 #include "chrome/browser/views/download_shelf_view.h" | 12 #include "chrome/browser/views/download_shelf_view.h" |
| 13 #include "chrome/browser/views/frame/browser_frame.h" | 13 #include "chrome/browser/views/frame/browser_frame.h" |
| 14 #include "chrome/browser/views/frame/browser_view.h" | 14 #include "chrome/browser/views/frame/browser_view.h" |
| 15 #include "chrome/browser/views/frame/contents_container.h" |
| 15 #include "chrome/browser/views/tabs/side_tab_strip.h" | 16 #include "chrome/browser/views/tabs/side_tab_strip.h" |
| 16 #include "chrome/browser/views/tabs/tab_strip.h" | 17 #include "chrome/browser/views/tabs/tab_strip.h" |
| 17 #include "chrome/browser/views/toolbar_view.h" | 18 #include "chrome/browser/views/toolbar_view.h" |
| 18 #include "gfx/scrollbar_size.h" | 19 #include "gfx/scrollbar_size.h" |
| 19 #include "views/window/window.h" | 20 #include "views/window/window.h" |
| 20 | 21 |
| 21 #if defined(OS_LINUX) | 22 #if defined(OS_LINUX) |
| 22 #include "views/window/hit_test.h" | 23 #include "views/window/hit_test.h" |
| 23 #endif | 24 #endif |
| 24 | 25 |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 active_bookmark_bar_ = NULL; | 200 active_bookmark_bar_ = NULL; |
| 200 tabstrip_ = NULL; | 201 tabstrip_ = NULL; |
| 201 browser_view_ = static_cast<BrowserView*>(host); | 202 browser_view_ = static_cast<BrowserView*>(host); |
| 202 } | 203 } |
| 203 | 204 |
| 204 void BrowserViewLayout::Uninstalled(views::View* host) {} | 205 void BrowserViewLayout::Uninstalled(views::View* host) {} |
| 205 | 206 |
| 206 void BrowserViewLayout::ViewAdded(views::View* host, views::View* view) { | 207 void BrowserViewLayout::ViewAdded(views::View* host, views::View* view) { |
| 207 switch (view->GetID()) { | 208 switch (view->GetID()) { |
| 208 case VIEW_ID_CONTENTS_SPLIT: { | 209 case VIEW_ID_CONTENTS_SPLIT: { |
| 209 contents_split_ = view; | 210 contents_split_ = view; |
| 210 if (SidebarManager::IsSidebarAllowed()) { | 211 // TODO: this is fragile, fix. |
| 211 views::View* sidebar_split = contents_split_->GetChildViewAt(0); | 212 if (SidebarManager::IsSidebarAllowed()) { |
| 212 contents_container_ = sidebar_split->GetChildViewAt(0); | 213 views::View* sidebar_split = contents_split_->GetChildViewAt(0); |
| 213 } else { | 214 contents_container_ = static_cast<ContentsContainer*>( |
| 214 contents_container_ = contents_split_->GetChildViewAt(0); | 215 sidebar_split->GetChildViewAt(0)); |
| 215 } | 216 } else { |
| 217 contents_container_ = static_cast<ContentsContainer*>( |
| 218 contents_split_->GetChildViewAt(0)); |
| 216 } | 219 } |
| 217 break; | 220 break; |
| 221 } |
| 218 case VIEW_ID_INFO_BAR_CONTAINER: | 222 case VIEW_ID_INFO_BAR_CONTAINER: |
| 219 infobar_container_ = view; | 223 infobar_container_ = view; |
| 220 break; | 224 break; |
| 221 case VIEW_ID_DOWNLOAD_SHELF: | 225 case VIEW_ID_DOWNLOAD_SHELF: |
| 222 download_shelf_ = static_cast<DownloadShelfView*>(view); | 226 download_shelf_ = static_cast<DownloadShelfView*>(view); |
| 223 break; | 227 break; |
| 224 case VIEW_ID_BOOKMARK_BAR: | 228 case VIEW_ID_BOOKMARK_BAR: |
| 225 active_bookmark_bar_ = static_cast<BookmarkBarView*>(view); | 229 active_bookmark_bar_ = static_cast<BookmarkBarView*>(view); |
| 226 break; | 230 break; |
| 227 case VIEW_ID_TOOLBAR: | 231 case VIEW_ID_TOOLBAR: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 245 vertical_layout_rect_ = browser_view_->GetLocalBounds(true); | 249 vertical_layout_rect_ = browser_view_->GetLocalBounds(true); |
| 246 int top = LayoutTabStrip(); | 250 int top = LayoutTabStrip(); |
| 247 if (browser_view_->IsTabStripVisible() && !browser_view_->UseVerticalTabs()) { | 251 if (browser_view_->IsTabStripVisible() && !browser_view_->UseVerticalTabs()) { |
| 248 tabstrip_->SetBackgroundOffset(gfx::Point( | 252 tabstrip_->SetBackgroundOffset(gfx::Point( |
| 249 tabstrip_->MirroredX() + browser_view_->MirroredX(), | 253 tabstrip_->MirroredX() + browser_view_->MirroredX(), |
| 250 browser_view_->frame()->GetHorizontalTabStripVerticalOffset(false))); | 254 browser_view_->frame()->GetHorizontalTabStripVerticalOffset(false))); |
| 251 } | 255 } |
| 252 top = LayoutToolbar(top); | 256 top = LayoutToolbar(top); |
| 253 top = LayoutBookmarkAndInfoBars(top); | 257 top = LayoutBookmarkAndInfoBars(top); |
| 254 int bottom = LayoutDownloadShelf(browser_view_->height()); | 258 int bottom = LayoutDownloadShelf(browser_view_->height()); |
| 259 int active_top_margin = GetTopMarginForActiveContent(); |
| 260 top -= active_top_margin; |
| 261 bottom += active_top_margin; |
| 262 contents_container_->SetActiveTopMargin(active_top_margin); |
| 255 LayoutTabContents(top, bottom); | 263 LayoutTabContents(top, bottom); |
| 256 // This must be done _after_ we lay out the TabContents since this | 264 // This must be done _after_ we lay out the TabContents since this |
| 257 // code calls back into us to find the bounding box the find bar | 265 // code calls back into us to find the bounding box the find bar |
| 258 // must be laid out within, and that code depends on the | 266 // must be laid out within, and that code depends on the |
| 259 // TabContentsContainer's bounds being up to date. | 267 // TabContentsContainer's bounds being up to date. |
| 260 if (browser()->HasFindBarController()) { | 268 if (browser()->HasFindBarController()) { |
| 261 browser()->GetFindBarController()->find_bar()->MoveWindowIfNecessary( | 269 browser()->GetFindBarController()->find_bar()->MoveWindowIfNecessary( |
| 262 gfx::Rect(), true); | 270 gfx::Rect(), true); |
| 263 } | 271 } |
| 264 // Align status bubble with the bottom of the contents_container. | 272 // Align status bubble with the bottom of the contents_container. |
| 265 browser_view_->LayoutStatusBubble( | 273 browser_view_->LayoutStatusBubble( |
| 266 top + contents_container_->bounds().height()); | 274 top + contents_container_->bounds().height()); |
| 267 browser_view_->SchedulePaint(); | 275 browser_view_->SchedulePaint(); |
| 268 } | 276 } |
| 269 | 277 |
| 270 // Return the preferred size which is the size required to give each | 278 // Return the preferred size which is the size required to give each |
| 271 // children their respective preferred size. | 279 // children their respective preferred size. |
| 272 gfx::Size BrowserViewLayout::GetPreferredSize(views::View* host) { | 280 gfx::Size BrowserViewLayout::GetPreferredSize(views::View* host) { |
| 273 return gfx::Size(); | 281 return gfx::Size(); |
| 274 } | 282 } |
| 275 | 283 |
| 276 ////////////////////////////////////////////////////////////////////////////// | 284 ////////////////////////////////////////////////////////////////////////////// |
| 277 // BrowserViewLayout, private: | 285 // BrowserViewLayout, private: |
| 278 | 286 |
| 287 Browser* BrowserViewLayout::browser() { |
| 288 return browser_view_->browser(); |
| 289 } |
| 290 |
| 291 const Browser* BrowserViewLayout::browser() const { |
| 292 return browser_view_->browser(); |
| 293 } |
| 294 |
| 279 int BrowserViewLayout::LayoutTabStrip() { | 295 int BrowserViewLayout::LayoutTabStrip() { |
| 280 if (!browser_view_->IsTabStripVisible()) { | 296 if (!browser_view_->IsTabStripVisible()) { |
| 281 tabstrip_->SetVisible(false); | 297 tabstrip_->SetVisible(false); |
| 282 tabstrip_->SetBounds(0, 0, 0, 0); | 298 tabstrip_->SetBounds(0, 0, 0, 0); |
| 283 return 0; | 299 return 0; |
| 284 } | 300 } |
| 285 | 301 |
| 286 gfx::Rect tabstrip_bounds( | 302 gfx::Rect tabstrip_bounds( |
| 287 browser_view_->frame()->GetBoundsForTabStrip(tabstrip_)); | 303 browser_view_->frame()->GetBoundsForTabStrip(tabstrip_)); |
| 288 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); | 304 gfx::Point tabstrip_origin(tabstrip_bounds.origin()); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 | 366 |
| 351 int BrowserViewLayout::LayoutInfoBar(int top) { | 367 int BrowserViewLayout::LayoutInfoBar(int top) { |
| 352 bool visible = InfobarVisible(); | 368 bool visible = InfobarVisible(); |
| 353 int height = visible ? infobar_container_->GetPreferredSize().height() : 0; | 369 int height = visible ? infobar_container_->GetPreferredSize().height() : 0; |
| 354 infobar_container_->SetVisible(visible); | 370 infobar_container_->SetVisible(visible); |
| 355 infobar_container_->SetBounds(vertical_layout_rect_.x(), top, | 371 infobar_container_->SetBounds(vertical_layout_rect_.x(), top, |
| 356 vertical_layout_rect_.width(), height); | 372 vertical_layout_rect_.width(), height); |
| 357 return top + height; | 373 return top + height; |
| 358 } | 374 } |
| 359 | 375 |
| 360 // Layout the TabContents container, between the coordinates |top| and | |
| 361 // |bottom|. | |
| 362 void BrowserViewLayout::LayoutTabContents(int top, int bottom) { | 376 void BrowserViewLayout::LayoutTabContents(int top, int bottom) { |
| 363 contents_split_->SetBounds(vertical_layout_rect_.x(), top, | 377 contents_split_->SetBounds(vertical_layout_rect_.x(), top, |
| 364 vertical_layout_rect_.width(), bottom - top); | 378 vertical_layout_rect_.width(), bottom - top); |
| 365 } | 379 } |
| 366 | 380 |
| 381 int BrowserViewLayout::GetTopMarginForActiveContent() { |
| 382 if (!active_bookmark_bar_ || !browser_view_->IsBookmarkBarVisible() || |
| 383 !active_bookmark_bar_->IsDetached()) { |
| 384 return 0; |
| 385 } |
| 386 |
| 387 if (contents_split_->GetChildViewAt(1) && |
| 388 contents_split_->GetChildViewAt(1)->IsVisible()) |
| 389 return 0; |
| 390 |
| 391 if (SidebarManager::IsSidebarAllowed()) { |
| 392 views::View* sidebar_split = contents_split_->GetChildViewAt(0); |
| 393 if (sidebar_split->GetChildViewAt(1) && |
| 394 sidebar_split->GetChildViewAt(1)->IsVisible()) |
| 395 return 0; |
| 396 } |
| 397 |
| 398 return active_bookmark_bar_->height(); |
| 399 } |
| 400 |
| 367 int BrowserViewLayout::LayoutDownloadShelf(int bottom) { | 401 int BrowserViewLayout::LayoutDownloadShelf(int bottom) { |
| 368 // Re-layout the shelf either if it is visible or if it's close animation | 402 // Re-layout the shelf either if it is visible or if it's close animation |
| 369 // is currently running. | 403 // is currently running. |
| 370 if (browser_view_->IsDownloadShelfVisible() || | 404 if (browser_view_->IsDownloadShelfVisible() || |
| 371 (download_shelf_ && download_shelf_->IsClosing())) { | 405 (download_shelf_ && download_shelf_->IsClosing())) { |
| 372 bool visible = browser()->SupportsWindowFeature( | 406 bool visible = browser()->SupportsWindowFeature( |
| 373 Browser::FEATURE_DOWNLOADSHELF); | 407 Browser::FEATURE_DOWNLOADSHELF); |
| 374 DCHECK(download_shelf_); | 408 DCHECK(download_shelf_); |
| 375 int height = visible ? download_shelf_->GetPreferredSize().height() : 0; | 409 int height = visible ? download_shelf_->GetPreferredSize().height() : 0; |
| 376 download_shelf_->SetVisible(visible); | 410 download_shelf_->SetVisible(visible); |
| 377 download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, | 411 download_shelf_->SetBounds(vertical_layout_rect_.x(), bottom - height, |
| 378 vertical_layout_rect_.width(), height); | 412 vertical_layout_rect_.width(), height); |
| 379 download_shelf_->Layout(); | 413 download_shelf_->Layout(); |
| 380 bottom -= height; | 414 bottom -= height; |
| 381 } | 415 } |
| 382 return bottom; | 416 return bottom; |
| 383 } | 417 } |
| 384 | 418 |
| 385 bool BrowserViewLayout::InfobarVisible() const { | 419 bool BrowserViewLayout::InfobarVisible() const { |
| 386 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. | 420 // NOTE: Can't check if the size IsEmpty() since it's always 0-width. |
| 387 return browser()->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && | 421 return browser()->SupportsWindowFeature(Browser::FEATURE_INFOBAR) && |
| 388 (infobar_container_->GetPreferredSize().height() != 0); | 422 (infobar_container_->GetPreferredSize().height() != 0); |
| 389 } | 423 } |
| OLD | NEW |