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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <limits> | 10 #include <limits> |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 other_bookmarks_button_(NULL), | 540 other_bookmarks_button_(NULL), |
541 managed_bookmarks_button_(NULL), | 541 managed_bookmarks_button_(NULL), |
542 supervised_bookmarks_button_(NULL), | 542 supervised_bookmarks_button_(NULL), |
543 apps_page_shortcut_(NULL), | 543 apps_page_shortcut_(NULL), |
544 overflow_button_(NULL), | 544 overflow_button_(NULL), |
545 instructions_(NULL), | 545 instructions_(NULL), |
546 bookmarks_separator_view_(NULL), | 546 bookmarks_separator_view_(NULL), |
547 browser_(browser), | 547 browser_(browser), |
548 browser_view_(browser_view), | 548 browser_view_(browser_view), |
549 infobar_visible_(false), | 549 infobar_visible_(false), |
| 550 size_animation_(this), |
550 throbbing_view_(NULL), | 551 throbbing_view_(NULL), |
551 bookmark_bar_state_(BookmarkBar::SHOW), | 552 bookmark_bar_state_(BookmarkBar::SHOW), |
552 animating_detached_(false), | 553 animating_detached_(false), |
553 show_folder_method_factory_(this) { | 554 show_folder_method_factory_(this) { |
554 set_id(VIEW_ID_BOOKMARK_BAR); | 555 set_id(VIEW_ID_BOOKMARK_BAR); |
555 Init(); | 556 Init(); |
556 | 557 |
557 size_animation_->Reset(1); | 558 size_animation_.Reset(1); |
558 } | 559 } |
559 | 560 |
560 BookmarkBarView::~BookmarkBarView() { | 561 BookmarkBarView::~BookmarkBarView() { |
561 if (model_) | 562 if (model_) |
562 model_->RemoveObserver(this); | 563 model_->RemoveObserver(this); |
563 | 564 |
564 // It's possible for the menu to outlive us, reset the observer to make sure | 565 // It's possible for the menu to outlive us, reset the observer to make sure |
565 // it doesn't have a reference to us. | 566 // it doesn't have a reference to us. |
566 if (bookmark_menu_) { | 567 if (bookmark_menu_) { |
567 bookmark_menu_->set_observer(NULL); | 568 bookmark_menu_->set_observer(NULL); |
(...skipping 28 matching lines...) Expand all Loading... |
596 } | 597 } |
597 | 598 |
598 void BookmarkBarView::SetBookmarkBarState( | 599 void BookmarkBarView::SetBookmarkBarState( |
599 BookmarkBar::State state, | 600 BookmarkBar::State state, |
600 BookmarkBar::AnimateChangeType animate_type) { | 601 BookmarkBar::AnimateChangeType animate_type) { |
601 if (animate_type == BookmarkBar::ANIMATE_STATE_CHANGE && | 602 if (animate_type == BookmarkBar::ANIMATE_STATE_CHANGE && |
602 animations_enabled) { | 603 animations_enabled) { |
603 animating_detached_ = (state == BookmarkBar::DETACHED || | 604 animating_detached_ = (state == BookmarkBar::DETACHED || |
604 bookmark_bar_state_ == BookmarkBar::DETACHED); | 605 bookmark_bar_state_ == BookmarkBar::DETACHED); |
605 if (state == BookmarkBar::SHOW) | 606 if (state == BookmarkBar::SHOW) |
606 size_animation_->Show(); | 607 size_animation_.Show(); |
607 else | 608 else |
608 size_animation_->Hide(); | 609 size_animation_.Hide(); |
609 } else { | 610 } else { |
610 size_animation_->Reset(state == BookmarkBar::SHOW ? 1 : 0); | 611 size_animation_.Reset(state == BookmarkBar::SHOW ? 1 : 0); |
611 } | 612 } |
612 bookmark_bar_state_ = state; | 613 bookmark_bar_state_ = state; |
613 } | 614 } |
614 | 615 |
615 bool BookmarkBarView::is_animating() { | |
616 return size_animation_->is_animating(); | |
617 } | |
618 | |
619 const BookmarkNode* BookmarkBarView::GetNodeForButtonAtModelIndex( | 616 const BookmarkNode* BookmarkBarView::GetNodeForButtonAtModelIndex( |
620 const gfx::Point& loc, | 617 const gfx::Point& loc, |
621 int* model_start_index) { | 618 int* model_start_index) { |
622 *model_start_index = 0; | 619 *model_start_index = 0; |
623 | 620 |
624 if (loc.x() < 0 || loc.x() >= width() || loc.y() < 0 || loc.y() >= height()) | 621 if (loc.x() < 0 || loc.x() >= width() || loc.y() < 0 || loc.y() >= height()) |
625 return NULL; | 622 return NULL; |
626 | 623 |
627 gfx::Point adjusted_loc(GetMirroredXInView(loc.x()), loc.y()); | 624 gfx::Point adjusted_loc(GetMirroredXInView(loc.x()), loc.y()); |
628 | 625 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 base::string16 elided_url( | 743 base::string16 elided_url( |
747 url_formatter::ElideUrl(url, tt_fonts, max_width, languages)); | 744 url_formatter::ElideUrl(url, tt_fonts, max_width, languages)); |
748 elided_url = base::i18n::GetDisplayStringInLTRDirectionality(elided_url); | 745 elided_url = base::i18n::GetDisplayStringInLTRDirectionality(elided_url); |
749 result.append(elided_url); | 746 result.append(elided_url); |
750 } | 747 } |
751 return result; | 748 return result; |
752 } | 749 } |
753 | 750 |
754 bool BookmarkBarView::IsDetached() const { | 751 bool BookmarkBarView::IsDetached() const { |
755 return (bookmark_bar_state_ == BookmarkBar::DETACHED) || | 752 return (bookmark_bar_state_ == BookmarkBar::DETACHED) || |
756 (animating_detached_ && size_animation_->is_animating()); | 753 (animating_detached_ && size_animation_.is_animating()); |
757 } | |
758 | |
759 double BookmarkBarView::GetAnimationValue() const { | |
760 return size_animation_->GetCurrentValue(); | |
761 } | 754 } |
762 | 755 |
763 int BookmarkBarView::GetToolbarOverlap() const { | 756 int BookmarkBarView::GetToolbarOverlap() const { |
764 int attached_overlap = kToolbarAttachedBookmarkBarOverlap + | 757 int attached_overlap = kToolbarAttachedBookmarkBarOverlap + |
765 views::NonClientFrameView::kClientEdgeThickness; | 758 views::NonClientFrameView::kClientEdgeThickness; |
766 if (!IsDetached()) | 759 if (!IsDetached()) |
767 return attached_overlap; | 760 return attached_overlap; |
768 | 761 |
769 int detached_overlap = views::NonClientFrameView::kClientEdgeThickness; | 762 int detached_overlap = views::NonClientFrameView::kClientEdgeThickness; |
770 | 763 |
771 // Do not animate the overlap when the infobar is above us (i.e. when we're | 764 // Do not animate the overlap when the infobar is above us (i.e. when we're |
772 // detached), since drawing over the infobar looks weird. | 765 // detached), since drawing over the infobar looks weird. |
773 if (infobar_visible_) | 766 if (infobar_visible_) |
774 return detached_overlap; | 767 return detached_overlap; |
775 | 768 |
776 // When detached with no infobar, animate the overlap between the attached and | 769 // When detached with no infobar, animate the overlap between the attached and |
777 // detached states. | 770 // detached states. |
778 return detached_overlap + static_cast<int>( | 771 return detached_overlap + static_cast<int>( |
779 (attached_overlap - detached_overlap) * | 772 (attached_overlap - detached_overlap) * |
780 size_animation_->GetCurrentValue()); | 773 size_animation_.GetCurrentValue()); |
781 } | 774 } |
782 | 775 |
783 gfx::Size BookmarkBarView::GetPreferredSize() const { | 776 gfx::Size BookmarkBarView::GetPreferredSize() const { |
784 gfx::Size prefsize; | 777 gfx::Size prefsize; |
785 if (IsDetached()) { | 778 if (IsDetached()) { |
786 prefsize.set_height( | 779 prefsize.set_height( |
787 chrome::kBookmarkBarHeight + | 780 chrome::kBookmarkBarHeight + |
788 static_cast<int>( | 781 static_cast<int>( |
789 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * | 782 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * |
790 (1 - size_animation_->GetCurrentValue()))); | 783 (1 - size_animation_.GetCurrentValue()))); |
791 } else { | 784 } else { |
792 prefsize.set_height(static_cast<int>(chrome::kBookmarkBarHeight * | 785 prefsize.set_height(static_cast<int>(chrome::kBookmarkBarHeight * |
793 size_animation_->GetCurrentValue())); | 786 size_animation_.GetCurrentValue())); |
794 } | 787 } |
795 return prefsize; | 788 return prefsize; |
796 } | 789 } |
797 | 790 |
798 bool BookmarkBarView::CanProcessEventsWithinSubtree() const { | 791 bool BookmarkBarView::CanProcessEventsWithinSubtree() const { |
799 // If the bookmark bar is attached and the omnibox popup is open (on top of | 792 // If the bookmark bar is attached and the omnibox popup is open (on top of |
800 // the bar), prevent events from targeting the bookmark bar or any of its | 793 // the bar), prevent events from targeting the bookmark bar or any of its |
801 // descendants. This will prevent hovers/clicks just above the omnibox popup | 794 // descendants. This will prevent hovers/clicks just above the omnibox popup |
802 // from activating the top few pixels of items on the bookmark bar. | 795 // from activating the top few pixels of items on the bookmark bar. |
803 if (!IsDetached() && browser_view_ && | 796 if (!IsDetached() && browser_view_ && |
804 browser_view_->GetLocationBar()->GetOmniboxView()->model()-> | 797 browser_view_->GetLocationBar()->GetOmniboxView()->model()-> |
805 popup_model()->IsOpen()) { | 798 popup_model()->IsOpen()) { |
806 return false; | 799 return false; |
807 } | 800 } |
808 return true; | 801 return true; |
809 } | 802 } |
810 | 803 |
811 gfx::Size BookmarkBarView::GetMinimumSize() const { | 804 gfx::Size BookmarkBarView::GetMinimumSize() const { |
812 // The minimum width of the bookmark bar should at least contain the overflow | 805 // The minimum width of the bookmark bar should at least contain the overflow |
813 // button, by which one can access all the Bookmark Bar items, and the "Other | 806 // button, by which one can access all the Bookmark Bar items, and the "Other |
814 // Bookmarks" folder, along with appropriate margins and button padding. | 807 // Bookmarks" folder, along with appropriate margins and button padding. |
815 // It should also contain the Managed and/or Supervised Bookmarks folders, | 808 // It should also contain the Managed and/or Supervised Bookmarks folders, |
816 // if they are visible. | 809 // if they are visible. |
817 int width = GetHorizontalMargin(); | 810 int width = GetHorizontalMargin(); |
818 | 811 |
819 int height = chrome::kBookmarkBarHeight; | 812 int height = chrome::kBookmarkBarHeight; |
820 if (IsDetached()) { | 813 if (IsDetached()) { |
821 double current_state = 1 - size_animation_->GetCurrentValue(); | 814 double current_state = 1 - size_animation_.GetCurrentValue(); |
822 width += 2 * static_cast<int>(kNewTabHorizontalPadding * current_state); | 815 width += 2 * static_cast<int>(kNewTabHorizontalPadding * current_state); |
823 height += static_cast<int>( | 816 height += static_cast<int>( |
824 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * | 817 (chrome::kNTPBookmarkBarHeight - chrome::kBookmarkBarHeight) * |
825 current_state); | 818 current_state); |
826 } | 819 } |
827 | 820 |
828 if (managed_bookmarks_button_->visible()) { | 821 if (managed_bookmarks_button_->visible()) { |
829 gfx::Size size = managed_bookmarks_button_->GetPreferredSize(); | 822 gfx::Size size = managed_bookmarks_button_->GetPreferredSize(); |
830 width += size.width() + kButtonPadding; | 823 width += size.width() + kButtonPadding; |
831 } | 824 } |
(...skipping 27 matching lines...) Expand all Loading... |
859 return; | 852 return; |
860 | 853 |
861 int x = GetHorizontalMargin(); | 854 int x = GetHorizontalMargin(); |
862 int top_margin = IsDetached() ? kDetachedTopMargin : 0; | 855 int top_margin = IsDetached() ? kDetachedTopMargin : 0; |
863 int y = top_margin; | 856 int y = top_margin; |
864 int width = View::width() - 2 * GetHorizontalMargin(); | 857 int width = View::width() - 2 * GetHorizontalMargin(); |
865 int height = chrome::kBookmarkBarHeight - kBottomMargin; | 858 int height = chrome::kBookmarkBarHeight - kBottomMargin; |
866 int separator_margin = kSeparatorMargin; | 859 int separator_margin = kSeparatorMargin; |
867 | 860 |
868 if (IsDetached()) { | 861 if (IsDetached()) { |
869 double current_state = 1 - size_animation_->GetCurrentValue(); | 862 double current_state = 1 - size_animation_.GetCurrentValue(); |
870 x += static_cast<int>(kNewTabHorizontalPadding * current_state); | 863 x += static_cast<int>(kNewTabHorizontalPadding * current_state); |
871 y += (View::height() - chrome::kBookmarkBarHeight) / 2; | 864 y += (View::height() - chrome::kBookmarkBarHeight) / 2; |
872 width -= static_cast<int>(kNewTabHorizontalPadding * current_state); | 865 width -= static_cast<int>(kNewTabHorizontalPadding * current_state); |
873 separator_margin -= static_cast<int>(kSeparatorMargin * current_state); | 866 separator_margin -= static_cast<int>(kSeparatorMargin * current_state); |
874 } else { | 867 } else { |
875 // For the attached appearance, pin the content to the bottom of the bar | 868 // For the attached appearance, pin the content to the bottom of the bar |
876 // when animating in/out, as shrinking its height instead looks weird. This | 869 // when animating in/out, as shrinking its height instead looks weird. This |
877 // also matches how we layout infobars. | 870 // also matches how we layout infobars. |
878 y += View::height() - chrome::kBookmarkBarHeight; | 871 y += View::height() - chrome::kBookmarkBarHeight; |
879 } | 872 } |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1379 &press_pt, data, widget); | 1372 &press_pt, data, widget); |
1380 WriteBookmarkDragData(node, data); | 1373 WriteBookmarkDragData(node, data); |
1381 return; | 1374 return; |
1382 } | 1375 } |
1383 } | 1376 } |
1384 NOTREACHED(); | 1377 NOTREACHED(); |
1385 } | 1378 } |
1386 | 1379 |
1387 int BookmarkBarView::GetDragOperationsForView(View* sender, | 1380 int BookmarkBarView::GetDragOperationsForView(View* sender, |
1388 const gfx::Point& p) { | 1381 const gfx::Point& p) { |
1389 if (size_animation_->is_animating() || | 1382 if (size_animation_.is_animating() || |
1390 (size_animation_->GetCurrentValue() == 0 && | 1383 (size_animation_.GetCurrentValue() == 0 && |
1391 bookmark_bar_state_ != BookmarkBar::DETACHED)) { | 1384 bookmark_bar_state_ != BookmarkBar::DETACHED)) { |
1392 // Don't let the user drag while animating open or we're closed (and not | 1385 // Don't let the user drag while animating open or we're closed (and not |
1393 // detached, when detached size_animation_ is always 0). This typically is | 1386 // detached, when detached size_animation_ is always 0). This typically is |
1394 // only hit if the user does something to inadvertently trigger DnD such as | 1387 // only hit if the user does something to inadvertently trigger DnD such as |
1395 // pressing the mouse and hitting control-b. | 1388 // pressing the mouse and hitting control-b. |
1396 return ui::DragDropTypes::DRAG_NONE; | 1389 return ui::DragDropTypes::DRAG_NONE; |
1397 } | 1390 } |
1398 | 1391 |
1399 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { | 1392 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { |
1400 if (sender == GetBookmarkButton(i)) { | 1393 if (sender == GetBookmarkButton(i)) { |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 | 1585 |
1593 bookmarks_separator_view_ = new ButtonSeparatorView(); | 1586 bookmarks_separator_view_ = new ButtonSeparatorView(); |
1594 AddChildView(bookmarks_separator_view_); | 1587 AddChildView(bookmarks_separator_view_); |
1595 UpdateBookmarksSeparatorVisibility(); | 1588 UpdateBookmarksSeparatorVisibility(); |
1596 | 1589 |
1597 instructions_ = new BookmarkBarInstructionsView(this); | 1590 instructions_ = new BookmarkBarInstructionsView(this); |
1598 AddChildView(instructions_); | 1591 AddChildView(instructions_); |
1599 | 1592 |
1600 set_context_menu_controller(this); | 1593 set_context_menu_controller(this); |
1601 | 1594 |
1602 size_animation_.reset(new gfx::SlideAnimation(this)); | |
1603 | |
1604 model_ = BookmarkModelFactory::GetForProfile(browser_->profile()); | 1595 model_ = BookmarkModelFactory::GetForProfile(browser_->profile()); |
1605 managed_ = ManagedBookmarkServiceFactory::GetForProfile(browser_->profile()); | 1596 managed_ = ManagedBookmarkServiceFactory::GetForProfile(browser_->profile()); |
1606 if (model_) { | 1597 if (model_) { |
1607 model_->AddObserver(this); | 1598 model_->AddObserver(this); |
1608 if (model_->loaded()) | 1599 if (model_->loaded()) |
1609 BookmarkModelLoaded(model_, false); | 1600 BookmarkModelLoaded(model_, false); |
1610 // else case: we'll receive notification back from the BookmarkModel when | 1601 // else case: we'll receive notification back from the BookmarkModel when |
1611 // done loading, then we'll populate the bar. | 1602 // done loading, then we'll populate the bar. |
1612 } | 1603 } |
1613 } | 1604 } |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2104 return; | 2095 return; |
2105 apps_page_shortcut_->SetVisible(visible); | 2096 apps_page_shortcut_->SetVisible(visible); |
2106 UpdateBookmarksSeparatorVisibility(); | 2097 UpdateBookmarksSeparatorVisibility(); |
2107 LayoutAndPaint(); | 2098 LayoutAndPaint(); |
2108 } | 2099 } |
2109 | 2100 |
2110 void BookmarkBarView::OnShowManagedBookmarksPrefChanged() { | 2101 void BookmarkBarView::OnShowManagedBookmarksPrefChanged() { |
2111 if (UpdateOtherAndManagedButtonsVisibility()) | 2102 if (UpdateOtherAndManagedButtonsVisibility()) |
2112 LayoutAndPaint(); | 2103 LayoutAndPaint(); |
2113 } | 2104 } |
OLD | NEW |