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/bookmarks/bookmark_bar_view.h" | 5 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 virtual ~ButtonSeparatorView() {} | 388 virtual ~ButtonSeparatorView() {} |
389 | 389 |
390 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { | 390 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { |
391 DetachableToolbarView::PaintVerticalDivider( | 391 DetachableToolbarView::PaintVerticalDivider( |
392 canvas, kSeparatorStartX, height(), 1, | 392 canvas, kSeparatorStartX, height(), 1, |
393 DetachableToolbarView::kEdgeDividerColor, | 393 DetachableToolbarView::kEdgeDividerColor, |
394 DetachableToolbarView::kMiddleDividerColor, | 394 DetachableToolbarView::kMiddleDividerColor, |
395 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)); | 395 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)); |
396 } | 396 } |
397 | 397 |
398 virtual gfx::Size GetPreferredSize() OVERRIDE { | 398 virtual gfx::Size GetPreferredSize() const OVERRIDE { |
399 // We get the full height of the bookmark bar, so that the height returned | 399 // We get the full height of the bookmark bar, so that the height returned |
400 // here doesn't matter. | 400 // here doesn't matter. |
401 return gfx::Size(kSeparatorWidth, 1); | 401 return gfx::Size(kSeparatorWidth, 1); |
402 } | 402 } |
403 | 403 |
404 virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE { | 404 virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE { |
405 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_SEPARATOR); | 405 state->name = l10n_util::GetStringUTF16(IDS_ACCNAME_SEPARATOR); |
406 state->role = ui::AX_ROLE_SPLITTER; | 406 state->role = ui::AX_ROLE_SPLITTER; |
407 } | 407 } |
408 | 408 |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 if (infobar_visible_) | 657 if (infobar_visible_) |
658 return detached_overlap; | 658 return detached_overlap; |
659 | 659 |
660 // When detached with no infobar, animate the overlap between the attached and | 660 // When detached with no infobar, animate the overlap between the attached and |
661 // detached states. | 661 // detached states. |
662 return detached_overlap + static_cast<int>( | 662 return detached_overlap + static_cast<int>( |
663 (attached_overlap - detached_overlap) * | 663 (attached_overlap - detached_overlap) * |
664 size_animation_->GetCurrentValue()); | 664 size_animation_->GetCurrentValue()); |
665 } | 665 } |
666 | 666 |
667 gfx::Size BookmarkBarView::GetPreferredSize() { | 667 gfx::Size BookmarkBarView::GetPreferredSize() const { |
668 return LayoutItems(true); | 668 gfx::Size prefsize; |
| 669 if (IsDetached()) { |
| 670 prefsize.set_height( |
| 671 chrome::kBookmarkBarHeight + |
| 672 static_cast<int>( |
| 673 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * |
| 674 (1 - size_animation_->GetCurrentValue()))); |
| 675 } else { |
| 676 prefsize.set_height(static_cast<int>(chrome::kBookmarkBarHeight * |
| 677 size_animation_->GetCurrentValue())); |
| 678 } |
| 679 return prefsize; |
669 } | 680 } |
670 | 681 |
671 bool BookmarkBarView::HitTestRect(const gfx::Rect& rect) const { | 682 bool BookmarkBarView::HitTestRect(const gfx::Rect& rect) const { |
672 // If bookmark bar is attached and omnibox popup is open (on top of the bar), | 683 // If bookmark bar is attached and omnibox popup is open (on top of the bar), |
673 // force hit-testing to fail. This prevents hovers/clicks just above the | 684 // force hit-testing to fail. This prevents hovers/clicks just above the |
674 // omnibox popup from activating the top few pixels of items on the bookmark | 685 // omnibox popup from activating the top few pixels of items on the bookmark |
675 // bar. | 686 // bar. |
676 if (!IsDetached() && browser_view_ && | 687 if (!IsDetached() && browser_view_ && |
677 browser_view_->GetLocationBar()->GetOmniboxView()->model()-> | 688 browser_view_->GetLocationBar()->GetOmniboxView()->model()-> |
678 popup_model()->IsOpen()) { | 689 popup_model()->IsOpen()) { |
679 return false; | 690 return false; |
680 } | 691 } |
681 return DetachableToolbarView::HitTestRect(rect); | 692 return DetachableToolbarView::HitTestRect(rect); |
682 } | 693 } |
683 | 694 |
684 gfx::Size BookmarkBarView::GetMinimumSize() { | 695 gfx::Size BookmarkBarView::GetMinimumSize() const { |
685 // The minimum width of the bookmark bar should at least contain the overflow | 696 // The minimum width of the bookmark bar should at least contain the overflow |
686 // button, by which one can access all the Bookmark Bar items, and the "Other | 697 // button, by which one can access all the Bookmark Bar items, and the "Other |
687 // Bookmarks" folder, along with appropriate margins and button padding. | 698 // Bookmarks" folder, along with appropriate margins and button padding. |
688 int width = kLeftMargin; | 699 int width = kLeftMargin; |
689 | 700 |
690 int height = chrome::kBookmarkBarHeight; | 701 int height = chrome::kBookmarkBarHeight; |
691 if (IsDetached()) { | 702 if (IsDetached()) { |
692 double current_state = 1 - size_animation_->GetCurrentValue(); | 703 double current_state = 1 - size_animation_->GetCurrentValue(); |
693 width += 2 * static_cast<int>(kNewtabHorizontalPadding * current_state); | 704 width += 2 * static_cast<int>(kNewtabHorizontalPadding * current_state); |
694 height += static_cast<int>( | 705 height += static_cast<int>( |
(...skipping 16 matching lines...) Expand all Loading... |
711 apps_page_shortcut_pref = apps_page_shortcut_->GetPreferredSize(); | 722 apps_page_shortcut_pref = apps_page_shortcut_->GetPreferredSize(); |
712 width += other_bookmarked_pref.width() + kButtonPadding + | 723 width += other_bookmarked_pref.width() + kButtonPadding + |
713 apps_page_shortcut_pref.width() + kButtonPadding + | 724 apps_page_shortcut_pref.width() + kButtonPadding + |
714 overflow_pref.width() + kButtonPadding + | 725 overflow_pref.width() + kButtonPadding + |
715 bookmarks_separator_pref.width(); | 726 bookmarks_separator_pref.width(); |
716 | 727 |
717 return gfx::Size(width, height); | 728 return gfx::Size(width, height); |
718 } | 729 } |
719 | 730 |
720 void BookmarkBarView::Layout() { | 731 void BookmarkBarView::Layout() { |
721 LayoutItems(false); | 732 LayoutItems(); |
722 } | 733 } |
723 | 734 |
724 void BookmarkBarView::ViewHierarchyChanged( | 735 void BookmarkBarView::ViewHierarchyChanged( |
725 const ViewHierarchyChangedDetails& details) { | 736 const ViewHierarchyChangedDetails& details) { |
726 if (details.is_add && details.child == this) { | 737 if (details.is_add && details.child == this) { |
727 // We may get inserted into a hierarchy with a profile - this typically | 738 // We may get inserted into a hierarchy with a profile - this typically |
728 // occurs when the bar's contents get populated fast enough that the | 739 // occurs when the bar's contents get populated fast enough that the |
729 // buttons are created before the bar is attached to a frame. | 740 // buttons are created before the bar is attached to a frame. |
730 UpdateColors(); | 741 UpdateColors(); |
731 | 742 |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 model_ = BookmarkModelFactory::GetForProfile(browser_->profile()); | 1303 model_ = BookmarkModelFactory::GetForProfile(browser_->profile()); |
1293 if (model_) { | 1304 if (model_) { |
1294 model_->AddObserver(this); | 1305 model_->AddObserver(this); |
1295 if (model_->loaded()) | 1306 if (model_->loaded()) |
1296 BookmarkModelLoaded(model_, false); | 1307 BookmarkModelLoaded(model_, false); |
1297 // else case: we'll receive notification back from the BookmarkModel when | 1308 // else case: we'll receive notification back from the BookmarkModel when |
1298 // done loading, then we'll populate the bar. | 1309 // done loading, then we'll populate the bar. |
1299 } | 1310 } |
1300 } | 1311 } |
1301 | 1312 |
1302 int BookmarkBarView::GetBookmarkButtonCount() { | 1313 int BookmarkBarView::GetBookmarkButtonCount() const { |
1303 // We contain four non-bookmark button views: other bookmarks, bookmarks | 1314 // We contain four non-bookmark button views: other bookmarks, bookmarks |
1304 // separator, chevrons (for overflow), apps page, and the instruction label. | 1315 // separator, chevrons (for overflow), apps page, and the instruction label. |
1305 return child_count() - 5; | 1316 return child_count() - 5; |
1306 } | 1317 } |
1307 | 1318 |
1308 views::TextButton* BookmarkBarView::GetBookmarkButton(int index) { | 1319 views::TextButton* BookmarkBarView::GetBookmarkButton(int index) { |
1309 DCHECK(index >= 0 && index < GetBookmarkButtonCount()); | 1320 DCHECK(index >= 0 && index < GetBookmarkButtonCount()); |
1310 return static_cast<views::TextButton*>(child_at(index)); | 1321 return static_cast<views::TextButton*>(child_at(index)); |
1311 } | 1322 } |
1312 | 1323 |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1707 } | 1718 } |
1708 | 1719 |
1709 void BookmarkBarView::UpdateBookmarksSeparatorVisibility() { | 1720 void BookmarkBarView::UpdateBookmarksSeparatorVisibility() { |
1710 // Ash does not paint the bookmarks separator line because it looks odd on | 1721 // Ash does not paint the bookmarks separator line because it looks odd on |
1711 // the flat background. We keep it present for layout, but don't draw it. | 1722 // the flat background. We keep it present for layout, but don't draw it. |
1712 bookmarks_separator_view_->SetVisible( | 1723 bookmarks_separator_view_->SetVisible( |
1713 browser_->host_desktop_type() != chrome::HOST_DESKTOP_TYPE_ASH && | 1724 browser_->host_desktop_type() != chrome::HOST_DESKTOP_TYPE_ASH && |
1714 other_bookmarked_button_->visible()); | 1725 other_bookmarked_button_->visible()); |
1715 } | 1726 } |
1716 | 1727 |
1717 gfx::Size BookmarkBarView::LayoutItems(bool compute_bounds_only) { | 1728 void BookmarkBarView::LayoutItems() { |
1718 gfx::Size prefsize; | 1729 if (!parent()) |
1719 if (!parent() && !compute_bounds_only) | 1730 return; |
1720 return prefsize; | |
1721 | 1731 |
1722 int x = kLeftMargin; | 1732 int x = kLeftMargin; |
1723 int top_margin = IsDetached() ? kDetachedTopMargin : 0; | 1733 int top_margin = IsDetached() ? kDetachedTopMargin : 0; |
1724 int y = top_margin; | 1734 int y = top_margin; |
1725 int width = View::width() - kRightMargin - kLeftMargin; | 1735 int width = View::width() - kRightMargin - kLeftMargin; |
1726 int height = chrome::kBookmarkBarHeight - kBottomMargin; | 1736 int height = chrome::kBookmarkBarHeight - kBottomMargin; |
1727 int separator_margin = kSeparatorMargin; | 1737 int separator_margin = kSeparatorMargin; |
1728 | 1738 |
1729 if (IsDetached()) { | 1739 if (IsDetached()) { |
1730 double current_state = 1 - size_animation_->GetCurrentValue(); | 1740 double current_state = 1 - size_animation_->GetCurrentValue(); |
(...skipping 19 matching lines...) Expand all Loading... |
1750 int max_x = width - overflow_pref.width() - kButtonPadding - | 1760 int max_x = width - overflow_pref.width() - kButtonPadding - |
1751 bookmarks_separator_pref.width(); | 1761 bookmarks_separator_pref.width(); |
1752 if (other_bookmarked_button_->visible()) | 1762 if (other_bookmarked_button_->visible()) |
1753 max_x -= other_bookmarked_pref.width() + kButtonPadding; | 1763 max_x -= other_bookmarked_pref.width() + kButtonPadding; |
1754 | 1764 |
1755 // Next, layout out the buttons. Any buttons that are placed beyond the | 1765 // Next, layout out the buttons. Any buttons that are placed beyond the |
1756 // visible region and made invisible. | 1766 // visible region and made invisible. |
1757 | 1767 |
1758 // Start with the apps page shortcut button. | 1768 // Start with the apps page shortcut button. |
1759 if (apps_page_shortcut_->visible()) { | 1769 if (apps_page_shortcut_->visible()) { |
1760 if (!compute_bounds_only) { | 1770 apps_page_shortcut_->SetBounds(x, y, apps_page_shortcut_pref.width(), |
1761 apps_page_shortcut_->SetBounds(x, y, apps_page_shortcut_pref.width(), | 1771 height); |
1762 height); | |
1763 } | |
1764 x += apps_page_shortcut_pref.width() + kButtonPadding; | 1772 x += apps_page_shortcut_pref.width() + kButtonPadding; |
1765 } | 1773 } |
1766 | 1774 |
1767 // Then go through the bookmark buttons. | 1775 // Then go through the bookmark buttons. |
1768 if (GetBookmarkButtonCount() == 0 && model_ && model_->loaded()) { | 1776 if (GetBookmarkButtonCount() == 0 && model_ && model_->loaded()) { |
1769 gfx::Size pref = instructions_->GetPreferredSize(); | 1777 gfx::Size pref = instructions_->GetPreferredSize(); |
1770 if (!compute_bounds_only) { | 1778 instructions_->SetBounds( |
1771 instructions_->SetBounds( | 1779 x + kInstructionsPadding, y, |
1772 x + kInstructionsPadding, y, | 1780 std::min(static_cast<int>(pref.width()), |
1773 std::min(static_cast<int>(pref.width()), | 1781 max_x - x), |
1774 max_x - x), | 1782 height); |
1775 height); | 1783 instructions_->SetVisible(true); |
1776 instructions_->SetVisible(true); | |
1777 } | |
1778 } else { | 1784 } else { |
1779 if (!compute_bounds_only) | 1785 instructions_->SetVisible(false); |
1780 instructions_->SetVisible(false); | |
1781 | 1786 |
1782 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { | 1787 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { |
1783 views::View* child = child_at(i); | 1788 views::View* child = child_at(i); |
1784 gfx::Size pref = child->GetPreferredSize(); | 1789 gfx::Size pref = child->GetPreferredSize(); |
1785 int next_x = x + pref.width() + kButtonPadding; | 1790 int next_x = x + pref.width() + kButtonPadding; |
1786 if (!compute_bounds_only) { | 1791 child->SetVisible(next_x < max_x); |
1787 child->SetVisible(next_x < max_x); | 1792 child->SetBounds(x, y, pref.width(), height); |
1788 child->SetBounds(x, y, pref.width(), height); | |
1789 } | |
1790 x = next_x; | 1793 x = next_x; |
1791 } | 1794 } |
1792 } | 1795 } |
1793 | 1796 |
1794 // Layout the right side of the bar. | 1797 // Layout the right side of the bar. |
1795 const bool all_visible = (GetBookmarkButtonCount() == 0 || | 1798 const bool all_visible = (GetBookmarkButtonCount() == 0 || |
1796 child_at(GetBookmarkButtonCount() - 1)->visible()); | 1799 child_at(GetBookmarkButtonCount() - 1)->visible()); |
1797 | 1800 |
1798 // Layout the right side buttons. | 1801 // Layout the right side buttons. |
1799 if (!compute_bounds_only) | 1802 x = max_x + kButtonPadding; |
1800 x = max_x + kButtonPadding; | |
1801 else | |
1802 x += kButtonPadding; | |
1803 | 1803 |
1804 // The overflow button. | 1804 // The overflow button. |
1805 if (!compute_bounds_only) { | 1805 overflow_button_->SetBounds(x, y, overflow_pref.width(), height); |
1806 overflow_button_->SetBounds(x, y, overflow_pref.width(), height); | 1806 overflow_button_->SetVisible(!all_visible); |
1807 overflow_button_->SetVisible(!all_visible); | |
1808 } | |
1809 x += overflow_pref.width(); | 1807 x += overflow_pref.width(); |
1810 | 1808 |
1811 // Separator. | 1809 // Separator. |
1812 if (bookmarks_separator_view_->visible()) { | 1810 if (bookmarks_separator_view_->visible()) { |
1813 if (!compute_bounds_only) { | 1811 bookmarks_separator_view_->SetBounds(x, |
1814 bookmarks_separator_view_->SetBounds(x, | 1812 y - top_margin, |
1815 y - top_margin, | 1813 bookmarks_separator_pref.width(), |
1816 bookmarks_separator_pref.width(), | 1814 height + top_margin + kBottomMargin - |
1817 height + top_margin + kBottomMargin - | 1815 separator_margin); |
1818 separator_margin); | |
1819 } | |
1820 | 1816 |
1821 x += bookmarks_separator_pref.width(); | 1817 x += bookmarks_separator_pref.width(); |
1822 } | 1818 } |
1823 | 1819 |
1824 // The other bookmarks button. | 1820 // The other bookmarks button. |
1825 if (other_bookmarked_button_->visible()) { | 1821 if (other_bookmarked_button_->visible()) { |
1826 if (!compute_bounds_only) { | 1822 other_bookmarked_button_->SetBounds(x, y, other_bookmarked_pref.width(), |
1827 other_bookmarked_button_->SetBounds(x, y, other_bookmarked_pref.width(), | 1823 height); |
1828 height); | |
1829 } | |
1830 x += other_bookmarked_pref.width() + kButtonPadding; | 1824 x += other_bookmarked_pref.width() + kButtonPadding; |
1831 } | 1825 } |
1832 | |
1833 // Set the preferred size computed so far. | |
1834 if (compute_bounds_only) { | |
1835 x += kRightMargin; | |
1836 prefsize.set_width(x); | |
1837 if (IsDetached()) { | |
1838 x += static_cast<int>(kNewtabHorizontalPadding * | |
1839 (1 - size_animation_->GetCurrentValue())); | |
1840 prefsize.set_height( | |
1841 chrome::kBookmarkBarHeight + | |
1842 static_cast<int>( | |
1843 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * | |
1844 (1 - size_animation_->GetCurrentValue()))); | |
1845 } else { | |
1846 prefsize.set_height(static_cast<int>(chrome::kBookmarkBarHeight * | |
1847 size_animation_->GetCurrentValue())); | |
1848 } | |
1849 } | |
1850 return prefsize; | |
1851 } | 1826 } |
1852 | 1827 |
1853 void BookmarkBarView::OnAppsPageShortcutVisibilityPrefChanged() { | 1828 void BookmarkBarView::OnAppsPageShortcutVisibilityPrefChanged() { |
1854 DCHECK(apps_page_shortcut_); | 1829 DCHECK(apps_page_shortcut_); |
1855 // Only perform layout if required. | 1830 // Only perform layout if required. |
1856 bool visible = chrome::ShouldShowAppsShortcutInBookmarkBar( | 1831 bool visible = chrome::ShouldShowAppsShortcutInBookmarkBar( |
1857 browser_->profile(), browser_->host_desktop_type()); | 1832 browser_->profile(), browser_->host_desktop_type()); |
1858 if (apps_page_shortcut_->visible() == visible) | 1833 if (apps_page_shortcut_->visible() == visible) |
1859 return; | 1834 return; |
1860 apps_page_shortcut_->SetVisible(visible); | 1835 apps_page_shortcut_->SetVisible(visible); |
1861 UpdateBookmarksSeparatorVisibility(); | 1836 UpdateBookmarksSeparatorVisibility(); |
1862 Layout(); | 1837 Layout(); |
1863 } | 1838 } |
OLD | NEW |