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 <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 } | 776 } |
777 if (apps_page_shortcut_->visible()) { | 777 if (apps_page_shortcut_->visible()) { |
778 gfx::Size size = apps_page_shortcut_->GetPreferredSize(); | 778 gfx::Size size = apps_page_shortcut_->GetPreferredSize(); |
779 width += size.width() + kButtonPadding; | 779 width += size.width() + kButtonPadding; |
780 } | 780 } |
781 | 781 |
782 return gfx::Size(width, height); | 782 return gfx::Size(width, height); |
783 } | 783 } |
784 | 784 |
785 void BookmarkBarView::Layout() { | 785 void BookmarkBarView::Layout() { |
| 786 // Skip layout during destruction, when no model exists. |
| 787 if (!model_) |
| 788 return; |
| 789 |
786 int x = kLeftMargin; | 790 int x = kLeftMargin; |
787 int top_margin = IsDetached() ? kDetachedTopMargin : 0; | 791 int top_margin = IsDetached() ? kDetachedTopMargin : 0; |
788 int y = top_margin; | 792 int y = top_margin; |
789 int width = View::width() - kRightMargin - kLeftMargin; | 793 int width = View::width() - kRightMargin - kLeftMargin; |
790 int height = chrome::kBookmarkBarHeight - kBottomMargin; | 794 int height = chrome::kBookmarkBarHeight - kBottomMargin; |
791 int separator_margin = kSeparatorMargin; | 795 int separator_margin = kSeparatorMargin; |
792 | 796 |
793 if (IsDetached()) { | 797 if (IsDetached()) { |
794 double current_state = 1 - size_animation_->GetCurrentValue(); | 798 double current_state = 1 - size_animation_->GetCurrentValue(); |
795 x += static_cast<int>(kNewtabHorizontalPadding * current_state); | 799 x += static_cast<int>(kNewtabHorizontalPadding * current_state); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 model_->bookmark_bar_node()->child_count() == 0; | 841 model_->bookmark_bar_node()->child_count() == 0; |
838 instructions_->SetVisible(show_instructions); | 842 instructions_->SetVisible(show_instructions); |
839 if (show_instructions) { | 843 if (show_instructions) { |
840 gfx::Size pref = instructions_->GetPreferredSize(); | 844 gfx::Size pref = instructions_->GetPreferredSize(); |
841 instructions_->SetBounds( | 845 instructions_->SetBounds( |
842 x + kInstructionsPadding, y, | 846 x + kInstructionsPadding, y, |
843 std::min(static_cast<int>(pref.width()), | 847 std::min(static_cast<int>(pref.width()), |
844 max_x - x), | 848 max_x - x), |
845 height); | 849 height); |
846 } else { | 850 } else { |
847 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { | 851 bool last_visible = x < max_x; |
| 852 int button_count = GetBookmarkButtonCount(); |
| 853 for (int i = 0; i <= button_count; ++i) { |
| 854 if (i == button_count) { |
| 855 // Add another button if there is room for it (and there is another |
| 856 // button to load). |
| 857 if (!last_visible || !model_->loaded() || |
| 858 model_->bookmark_bar_node()->child_count() <= button_count) |
| 859 break; |
| 860 AddChildViewAt( |
| 861 CreateBookmarkButton(model_->bookmark_bar_node()->GetChild(i)), i); |
| 862 button_count = GetBookmarkButtonCount(); |
| 863 } |
848 views::View* child = child_at(i); | 864 views::View* child = child_at(i); |
849 gfx::Size pref = child->GetPreferredSize(); | 865 gfx::Size pref = child->GetPreferredSize(); |
850 int next_x = x + pref.width() + kButtonPadding; | 866 int next_x = x + pref.width() + kButtonPadding; |
851 child->SetVisible(next_x < max_x); | 867 last_visible = next_x < max_x; |
852 child->SetBounds(x, y, pref.width(), height); | 868 child->SetVisible(last_visible); |
| 869 // Only need to set bounds if the view is actually visible. |
| 870 if (last_visible) |
| 871 child->SetBounds(x, y, pref.width(), height); |
853 x = next_x; | 872 x = next_x; |
854 } | 873 } |
855 } | 874 } |
856 | 875 |
857 // Layout the right side of the bar. | |
858 const bool all_visible = (GetBookmarkButtonCount() == 0 || | |
859 child_at(GetBookmarkButtonCount() - 1)->visible()); | |
860 | |
861 // Layout the right side buttons. | 876 // Layout the right side buttons. |
862 x = max_x + kButtonPadding; | 877 x = max_x + kButtonPadding; |
863 | 878 |
864 // The overflow button. | 879 // The overflow button. |
865 overflow_button_->SetBounds(x, y, overflow_pref.width(), height); | 880 overflow_button_->SetBounds(x, y, overflow_pref.width(), height); |
866 overflow_button_->SetVisible(!all_visible); | 881 const bool show_overflow = |
| 882 model_->loaded() && |
| 883 (model_->bookmark_bar_node()->child_count() > GetBookmarkButtonCount() || |
| 884 (GetBookmarkButtonCount() > 0 && |
| 885 !GetBookmarkButton(GetBookmarkButtonCount() - 1)->visible())); |
| 886 overflow_button_->SetVisible(show_overflow); |
867 x += overflow_pref.width(); | 887 x += overflow_pref.width(); |
868 | 888 |
869 // Separator. | 889 // Separator. |
870 if (bookmarks_separator_view_->visible()) { | 890 if (bookmarks_separator_view_->visible()) { |
871 bookmarks_separator_view_->SetBounds(x, | 891 bookmarks_separator_view_->SetBounds(x, |
872 y - top_margin, | 892 y - top_margin, |
873 bookmarks_separator_pref.width(), | 893 bookmarks_separator_pref.width(), |
874 height + top_margin + kBottomMargin - | 894 height + top_margin + kBottomMargin - |
875 separator_margin); | 895 separator_margin); |
876 | 896 |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 } | 1164 } |
1145 | 1165 |
1146 void BookmarkBarView::OnBookmarkBubbleHidden() { | 1166 void BookmarkBarView::OnBookmarkBubbleHidden() { |
1147 StopThrobbing(false); | 1167 StopThrobbing(false); |
1148 } | 1168 } |
1149 | 1169 |
1150 void BookmarkBarView::BookmarkModelLoaded(BookmarkModel* model, | 1170 void BookmarkBarView::BookmarkModelLoaded(BookmarkModel* model, |
1151 bool ids_reassigned) { | 1171 bool ids_reassigned) { |
1152 // There should be no buttons. If non-zero it means Load was invoked more than | 1172 // There should be no buttons. If non-zero it means Load was invoked more than |
1153 // once, or we didn't properly clear things. Either of which shouldn't happen. | 1173 // once, or we didn't properly clear things. Either of which shouldn't happen. |
| 1174 // The actual bookmark buttons are added from Layout(). |
1154 DCHECK_EQ(0, GetBookmarkButtonCount()); | 1175 DCHECK_EQ(0, GetBookmarkButtonCount()); |
1155 const BookmarkNode* node = model->bookmark_bar_node(); | |
1156 DCHECK(node); | |
1157 // Create a button for each of the children on the bookmark bar. | |
1158 for (int i = 0, child_count = node->child_count(); i < child_count; ++i) | |
1159 AddChildViewAt(CreateBookmarkButton(node->GetChild(i)), i); | |
1160 DCHECK(model->other_node()); | 1176 DCHECK(model->other_node()); |
1161 other_bookmarked_button_->SetAccessibleName(model->other_node()->GetTitle()); | 1177 other_bookmarked_button_->SetAccessibleName(model->other_node()->GetTitle()); |
1162 other_bookmarked_button_->SetText(model->other_node()->GetTitle()); | 1178 other_bookmarked_button_->SetText(model->other_node()->GetTitle()); |
1163 managed_bookmarks_button_->SetAccessibleName( | 1179 managed_bookmarks_button_->SetAccessibleName( |
1164 client_->managed_node()->GetTitle()); | 1180 client_->managed_node()->GetTitle()); |
1165 managed_bookmarks_button_->SetText(client_->managed_node()->GetTitle()); | 1181 managed_bookmarks_button_->SetText(client_->managed_node()->GetTitle()); |
1166 UpdateColors(); | 1182 UpdateColors(); |
1167 UpdateOtherAndManagedButtonsVisibility(); | 1183 UpdateOtherAndManagedButtonsVisibility(); |
1168 other_bookmarked_button_->SetEnabled(true); | 1184 other_bookmarked_button_->SetEnabled(true); |
1169 managed_bookmarks_button_->SetEnabled(true); | 1185 managed_bookmarks_button_->SetEnabled(true); |
(...skipping 13 matching lines...) Expand all Loading... |
1183 const BookmarkNode* new_parent, | 1199 const BookmarkNode* new_parent, |
1184 int new_index) { | 1200 int new_index) { |
1185 bool was_throbbing = throbbing_view_ && | 1201 bool was_throbbing = throbbing_view_ && |
1186 throbbing_view_ == DetermineViewToThrobFromRemove(old_parent, old_index); | 1202 throbbing_view_ == DetermineViewToThrobFromRemove(old_parent, old_index); |
1187 if (was_throbbing) | 1203 if (was_throbbing) |
1188 throbbing_view_->StopThrobbing(); | 1204 throbbing_view_->StopThrobbing(); |
1189 bool needs_layout_and_paint = | 1205 bool needs_layout_and_paint = |
1190 BookmarkNodeRemovedImpl(model, old_parent, old_index); | 1206 BookmarkNodeRemovedImpl(model, old_parent, old_index); |
1191 if (BookmarkNodeAddedImpl(model, new_parent, new_index)) | 1207 if (BookmarkNodeAddedImpl(model, new_parent, new_index)) |
1192 needs_layout_and_paint = true; | 1208 needs_layout_and_paint = true; |
1193 if (was_throbbing) | 1209 if (was_throbbing && new_index < GetBookmarkButtonCount()) |
1194 StartThrobbing(new_parent->GetChild(new_index), false); | 1210 StartThrobbing(new_parent->GetChild(new_index), false); |
1195 if (needs_layout_and_paint) | 1211 if (needs_layout_and_paint) |
1196 LayoutAndPaint(); | 1212 LayoutAndPaint(); |
1197 } | 1213 } |
1198 | 1214 |
1199 void BookmarkBarView::BookmarkNodeAdded(BookmarkModel* model, | 1215 void BookmarkBarView::BookmarkNodeAdded(BookmarkModel* model, |
1200 const BookmarkNode* parent, | 1216 const BookmarkNode* parent, |
1201 int index) { | 1217 int index) { |
1202 if (BookmarkNodeAddedImpl(model, parent, index)) | 1218 if (BookmarkNodeAddedImpl(model, parent, index)) |
1203 LayoutAndPaint(); | 1219 LayoutAndPaint(); |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 } | 1516 } |
1501 | 1517 |
1502 int BookmarkBarView::GetBookmarkButtonCount() const { | 1518 int BookmarkBarView::GetBookmarkButtonCount() const { |
1503 // We contain six non-bookmark button views: managed bookmarks, | 1519 // We contain six non-bookmark button views: managed bookmarks, |
1504 // other bookmarks, bookmarks separator, chevrons (for overflow), apps page, | 1520 // other bookmarks, bookmarks separator, chevrons (for overflow), apps page, |
1505 // and the instruction label. | 1521 // and the instruction label. |
1506 return child_count() - 6; | 1522 return child_count() - 6; |
1507 } | 1523 } |
1508 | 1524 |
1509 views::LabelButton* BookmarkBarView::GetBookmarkButton(int index) { | 1525 views::LabelButton* BookmarkBarView::GetBookmarkButton(int index) { |
1510 DCHECK(index >= 0 && index < GetBookmarkButtonCount()); | 1526 // CHECK as otherwise we may do the wrong cast. |
| 1527 CHECK(index >= 0 && index < GetBookmarkButtonCount()); |
1511 return static_cast<views::LabelButton*>(child_at(index)); | 1528 return static_cast<views::LabelButton*>(child_at(index)); |
1512 } | 1529 } |
1513 | 1530 |
1514 BookmarkLaunchLocation BookmarkBarView::GetBookmarkLaunchLocation() const { | 1531 BookmarkLaunchLocation BookmarkBarView::GetBookmarkLaunchLocation() const { |
1515 return IsDetached() ? BOOKMARK_LAUNCH_LOCATION_DETACHED_BAR : | 1532 return IsDetached() ? BOOKMARK_LAUNCH_LOCATION_DETACHED_BAR : |
1516 BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR; | 1533 BOOKMARK_LAUNCH_LOCATION_ATTACHED_BAR; |
1517 } | 1534 } |
1518 | 1535 |
1519 int BookmarkBarView::GetFirstHiddenNodeIndex() { | 1536 int BookmarkBarView::GetFirstHiddenNodeIndex() { |
1520 const int bb_count = GetBookmarkButtonCount(); | 1537 const int bb_count = GetBookmarkButtonCount(); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 else | 1640 else |
1624 button->SetImage(views::Button::STATE_NORMAL, GetDefaultFavicon()); | 1641 button->SetImage(views::Button::STATE_NORMAL, GetDefaultFavicon()); |
1625 } | 1642 } |
1626 button->SetMaxSize(gfx::Size(kMaxButtonWidth, 0)); | 1643 button->SetMaxSize(gfx::Size(kMaxButtonWidth, 0)); |
1627 } | 1644 } |
1628 | 1645 |
1629 bool BookmarkBarView::BookmarkNodeAddedImpl(BookmarkModel* model, | 1646 bool BookmarkBarView::BookmarkNodeAddedImpl(BookmarkModel* model, |
1630 const BookmarkNode* parent, | 1647 const BookmarkNode* parent, |
1631 int index) { | 1648 int index) { |
1632 const bool needs_layout_and_paint = UpdateOtherAndManagedButtonsVisibility(); | 1649 const bool needs_layout_and_paint = UpdateOtherAndManagedButtonsVisibility(); |
1633 if (parent != model->bookmark_bar_node()) { | 1650 if (parent != model->bookmark_bar_node()) |
1634 // Only children of the bookmark_bar_node get buttons. | |
1635 return needs_layout_and_paint; | 1651 return needs_layout_and_paint; |
| 1652 if (index < GetBookmarkButtonCount()) { |
| 1653 const BookmarkNode* node = parent->GetChild(index); |
| 1654 AddChildViewAt(CreateBookmarkButton(node), index); |
| 1655 return true; |
1636 } | 1656 } |
1637 DCHECK(index >= 0 && index <= GetBookmarkButtonCount()); | 1657 // If the new node was added after the last button we've created we may be |
1638 const BookmarkNode* node = parent->GetChild(index); | 1658 // able to fit it. Assume we can by returning true, which forces a Layout() |
1639 ProfileSyncService* sync_service(ProfileSyncServiceFactory:: | 1659 // and creation of the button (if it fits). |
1640 GetInstance()->GetForProfile(browser_->profile())); | 1660 return index == GetBookmarkButtonCount(); |
1641 if (!throbbing_view_ && sync_service && sync_service->FirstSetupInProgress()) | |
1642 StartThrobbing(node, true); | |
1643 AddChildViewAt(CreateBookmarkButton(node), index); | |
1644 return true; | |
1645 } | 1661 } |
1646 | 1662 |
1647 bool BookmarkBarView::BookmarkNodeRemovedImpl(BookmarkModel* model, | 1663 bool BookmarkBarView::BookmarkNodeRemovedImpl(BookmarkModel* model, |
1648 const BookmarkNode* parent, | 1664 const BookmarkNode* parent, |
1649 int index) { | 1665 int index) { |
1650 const bool needs_layout = UpdateOtherAndManagedButtonsVisibility(); | 1666 const bool needs_layout = UpdateOtherAndManagedButtonsVisibility(); |
1651 | 1667 |
1652 StopThrobbing(true); | 1668 StopThrobbing(true); |
1653 // No need to start throbbing again as the bookmark bubble can't be up at | 1669 // No need to start throbbing again as the bookmark bubble can't be up at |
1654 // the same time as the user reorders. | 1670 // the same time as the user reorders. |
1655 | 1671 |
1656 if (parent != model->bookmark_bar_node()) { | 1672 if (parent != model->bookmark_bar_node()) { |
1657 // Only children of the bookmark_bar_node get buttons. | 1673 // Only children of the bookmark_bar_node get buttons. |
1658 return needs_layout; | 1674 return needs_layout; |
1659 } | 1675 } |
| 1676 if (index >= GetBookmarkButtonCount()) |
| 1677 return needs_layout; |
| 1678 |
1660 delete child_at(index); | 1679 delete child_at(index); |
1661 return true; | 1680 return true; |
1662 } | 1681 } |
1663 | 1682 |
1664 void BookmarkBarView::BookmarkNodeChangedImpl(BookmarkModel* model, | 1683 void BookmarkBarView::BookmarkNodeChangedImpl(BookmarkModel* model, |
1665 const BookmarkNode* node) { | 1684 const BookmarkNode* node) { |
1666 if (node == client_->managed_node()) { | 1685 if (node == client_->managed_node()) { |
1667 // The managed node may have its title updated. | 1686 // The managed node may have its title updated. |
1668 managed_bookmarks_button_->SetAccessibleName( | 1687 managed_bookmarks_button_->SetAccessibleName( |
1669 client_->managed_node()->GetTitle()); | 1688 client_->managed_node()->GetTitle()); |
1670 managed_bookmarks_button_->SetText(client_->managed_node()->GetTitle()); | 1689 managed_bookmarks_button_->SetText(client_->managed_node()->GetTitle()); |
1671 return; | 1690 return; |
1672 } | 1691 } |
1673 | 1692 |
1674 if (node->parent() != model->bookmark_bar_node()) { | 1693 if (node->parent() != model->bookmark_bar_node()) { |
1675 // We only care about nodes on the bookmark bar. | 1694 // We only care about nodes on the bookmark bar. |
1676 return; | 1695 return; |
1677 } | 1696 } |
1678 int index = model->bookmark_bar_node()->GetIndexOf(node); | 1697 int index = model->bookmark_bar_node()->GetIndexOf(node); |
1679 DCHECK_NE(-1, index); | 1698 DCHECK_NE(-1, index); |
| 1699 if (index >= GetBookmarkButtonCount()) |
| 1700 return; // Buttons are created as needed. |
1680 views::LabelButton* button = GetBookmarkButton(index); | 1701 views::LabelButton* button = GetBookmarkButton(index); |
1681 gfx::Size old_pref = button->GetPreferredSize(); | 1702 const int old_pref_width = button->GetPreferredSize().width(); |
1682 ConfigureButton(node, button); | 1703 ConfigureButton(node, button); |
1683 gfx::Size new_pref = button->GetPreferredSize(); | 1704 if (old_pref_width != button->GetPreferredSize().width()) |
1684 if (old_pref.width() != new_pref.width()) { | |
1685 LayoutAndPaint(); | 1705 LayoutAndPaint(); |
1686 } else if (button->visible()) { | |
1687 button->SchedulePaint(); | |
1688 } | |
1689 } | 1706 } |
1690 | 1707 |
1691 void BookmarkBarView::ShowDropFolderForNode(const BookmarkNode* node) { | 1708 void BookmarkBarView::ShowDropFolderForNode(const BookmarkNode* node) { |
1692 if (bookmark_drop_menu_) { | 1709 if (bookmark_drop_menu_) { |
1693 if (bookmark_drop_menu_->node() == node) { | 1710 if (bookmark_drop_menu_->node() == node) { |
1694 // Already showing for the specified node. | 1711 // Already showing for the specified node. |
1695 return; | 1712 return; |
1696 } | 1713 } |
1697 bookmark_drop_menu_->Cancel(); | 1714 bookmark_drop_menu_->Cancel(); |
1698 } | 1715 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1955 return; | 1972 return; |
1956 apps_page_shortcut_->SetVisible(visible); | 1973 apps_page_shortcut_->SetVisible(visible); |
1957 UpdateBookmarksSeparatorVisibility(); | 1974 UpdateBookmarksSeparatorVisibility(); |
1958 LayoutAndPaint(); | 1975 LayoutAndPaint(); |
1959 } | 1976 } |
1960 | 1977 |
1961 void BookmarkBarView::OnShowManagedBookmarksPrefChanged() { | 1978 void BookmarkBarView::OnShowManagedBookmarksPrefChanged() { |
1962 if (UpdateOtherAndManagedButtonsVisibility()) | 1979 if (UpdateOtherAndManagedButtonsVisibility()) |
1963 LayoutAndPaint(); | 1980 LayoutAndPaint(); |
1964 } | 1981 } |
OLD | NEW |