OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/toolbar/browser_actions_container.h" | 5 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "chrome/browser/extensions/extension_action_manager.h" | 9 #include "chrome/browser/extensions/extension_action_manager.h" |
10 #include "chrome/browser/extensions/extension_util.h" | 10 #include "chrome/browser/extensions/extension_util.h" |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 StopShowFolderDropMenuTimer(); | 185 StopShowFolderDropMenuTimer(); |
186 HideActivePopup(); | 186 HideActivePopup(); |
187 DeleteBrowserActionViews(); | 187 DeleteBrowserActionViews(); |
188 } | 188 } |
189 | 189 |
190 void BrowserActionsContainer::Init() { | 190 void BrowserActionsContainer::Init() { |
191 LoadImages(); | 191 LoadImages(); |
192 | 192 |
193 // We wait to set the container width until now so that the chevron images | 193 // We wait to set the container width until now so that the chevron images |
194 // will be loaded. The width calculation needs to know the chevron size. | 194 // will be loaded. The width calculation needs to know the chevron size. |
195 if (model_ && model_->extensions_initialized()) | 195 if (model_ && model_->extensions_initialized()) { |
196 SetContainerWidth(); | 196 container_width_ = GetPreferredWidth(); |
| 197 SetChevronVisibility(); |
| 198 } |
197 } | 199 } |
198 | 200 |
199 BrowserActionView* BrowserActionsContainer::GetViewForExtension( | 201 BrowserActionView* BrowserActionsContainer::GetViewForExtension( |
200 const Extension* extension) { | 202 const Extension* extension) { |
201 for (BrowserActionViews::iterator view = browser_action_views_.begin(); | 203 for (BrowserActionViews::iterator view = browser_action_views_.begin(); |
202 view != browser_action_views_.end(); ++view) { | 204 view != browser_action_views_.end(); ++view) { |
203 if ((*view)->extension() == extension) | 205 if ((*view)->extension() == extension) |
204 return *view; | 206 return *view; |
205 } | 207 } |
206 return NULL; | 208 return NULL; |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 resize_amount_ = static_cast<int>(resize_animation_->GetCurrentValue() * | 635 resize_amount_ = static_cast<int>(resize_animation_->GetCurrentValue() * |
634 (container_width_ - animation_target_size_)); | 636 (container_width_ - animation_target_size_)); |
635 OnBrowserActionVisibilityChanged(); | 637 OnBrowserActionVisibilityChanged(); |
636 } | 638 } |
637 | 639 |
638 void BrowserActionsContainer::AnimationEnded(const gfx::Animation* animation) { | 640 void BrowserActionsContainer::AnimationEnded(const gfx::Animation* animation) { |
639 container_width_ = animation_target_size_; | 641 container_width_ = animation_target_size_; |
640 animation_target_size_ = 0; | 642 animation_target_size_ = 0; |
641 resize_amount_ = 0; | 643 resize_amount_ = 0; |
642 suppress_chevron_ = false; | 644 suppress_chevron_ = false; |
| 645 SetChevronVisibility(); |
643 OnBrowserActionVisibilityChanged(); | 646 OnBrowserActionVisibilityChanged(); |
644 | 647 |
645 FOR_EACH_OBSERVER(BrowserActionsContainerObserver, | 648 FOR_EACH_OBSERVER(BrowserActionsContainerObserver, |
646 observers_, | 649 observers_, |
647 OnBrowserActionsContainerAnimationEnded()); | 650 OnBrowserActionsContainerAnimationEnded()); |
648 } | 651 } |
649 | 652 |
650 void BrowserActionsContainer::NotifyMenuDeleted( | 653 void BrowserActionsContainer::NotifyMenuDeleted( |
651 BrowserActionOverflowMenuController* controller) { | 654 BrowserActionOverflowMenuController* controller) { |
652 DCHECK_EQ(overflow_menu_, controller); | 655 DCHECK_EQ(overflow_menu_, controller); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 GetExtensionAction(*extension), | 799 GetExtensionAction(*extension), |
797 browser_, | 800 browser_, |
798 this); | 801 this); |
799 browser_action_views_.insert(browser_action_views_.begin() + index, view); | 802 browser_action_views_.insert(browser_action_views_.begin() + index, view); |
800 AddChildViewAt(view, index); | 803 AddChildViewAt(view, index); |
801 | 804 |
802 // If we are still initializing the container, don't bother animating. | 805 // If we are still initializing the container, don't bother animating. |
803 if (!model_->extensions_initialized()) | 806 if (!model_->extensions_initialized()) |
804 return; | 807 return; |
805 | 808 |
806 // Enlarge the container if it was already at maximum size and we're not in | 809 // If this is just an upgrade, then don't worry about resizing. |
807 // the middle of upgrading. | 810 if (!extensions::ExtensionSystem::Get(profile_)->runtime_data()-> |
808 if ((model_->GetVisibleIconCount() < 0) && | |
809 !extensions::ExtensionSystem::Get(profile_)->runtime_data()-> | |
810 IsBeingUpgraded(extension)) { | 811 IsBeingUpgraded(extension)) { |
811 suppress_chevron_ = true; | 812 // We need to resize if either: |
812 Animate(gfx::Tween::LINEAR, browser_action_views_.size()); | 813 // - The container is set to display all icons (visible count = -1), or |
813 } else { | 814 // - The container will need to expand to include the chevron. This can |
814 // Just redraw the (possibly modified) visible icon set. | 815 // happen when the container is set to display <n> icons, where <n> is |
815 OnBrowserActionVisibilityChanged(); | 816 // the number of icons before the new icon. With the new icon, the chevron |
| 817 // will need to be displayed. |
| 818 int model_icon_count = model_->GetVisibleIconCount(); |
| 819 if (model_icon_count == -1 || |
| 820 (static_cast<size_t>(model_icon_count) < browser_action_views_.size() && |
| 821 (chevron_ && !chevron_->visible()))) { |
| 822 suppress_chevron_ = true; |
| 823 Animate(gfx::Tween::LINEAR, GetIconCount()); |
| 824 return; |
| 825 } |
816 } | 826 } |
| 827 |
| 828 // Otherwise, we don't have to resize, so just redraw the (possibly modified) |
| 829 // visible icon set. |
| 830 OnBrowserActionVisibilityChanged(); |
817 } | 831 } |
818 | 832 |
819 void BrowserActionsContainer::ToolbarExtensionRemoved( | 833 void BrowserActionsContainer::ToolbarExtensionRemoved( |
820 const Extension* extension) { | 834 const Extension* extension) { |
821 CloseOverflowMenu(); | 835 CloseOverflowMenu(); |
822 | 836 |
823 size_t visible_actions = VisibleBrowserActionsAfterAnimation(); | 837 size_t visible_actions = VisibleBrowserActionsAfterAnimation(); |
824 for (BrowserActionViews::iterator i(browser_action_views_.begin()); | 838 for (BrowserActionViews::iterator i(browser_action_views_.begin()); |
825 i != browser_action_views_.end(); ++i) { | 839 i != browser_action_views_.end(); ++i) { |
826 if ((*i)->extension() == extension) { | 840 if ((*i)->extension() == extension) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 // Don't override another popup, and only show in the active window. | 909 // Don't override another popup, and only show in the active window. |
896 if (popup_owner_ || !browser_->window()->IsActive()) | 910 if (popup_owner_ || !browser_->window()->IsActive()) |
897 return false; | 911 return false; |
898 | 912 |
899 BrowserActionView* view = GetViewForExtension(extension); | 913 BrowserActionView* view = GetViewForExtension(extension); |
900 return view && view->view_controller()->ExecuteAction(ExtensionPopup::SHOW, | 914 return view && view->view_controller()->ExecuteAction(ExtensionPopup::SHOW, |
901 grant_active_tab); | 915 grant_active_tab); |
902 } | 916 } |
903 | 917 |
904 void BrowserActionsContainer::ToolbarVisibleCountChanged() { | 918 void BrowserActionsContainer::ToolbarVisibleCountChanged() { |
905 int old_container_width = container_width_; | 919 if (GetPreferredWidth() != container_width_) |
906 SetContainerWidth(); | |
907 if (old_container_width != container_width_) | |
908 Animate(gfx::Tween::EASE_OUT, GetIconCount()); | 920 Animate(gfx::Tween::EASE_OUT, GetIconCount()); |
909 } | 921 } |
910 | 922 |
911 void BrowserActionsContainer::ToolbarHighlightModeChanged( | 923 void BrowserActionsContainer::ToolbarHighlightModeChanged( |
912 bool is_highlighting) { | 924 bool is_highlighting) { |
913 // The visual highlighting is done in OnPaint(). It's a bit of a pain that | 925 // The visual highlighting is done in OnPaint(). It's a bit of a pain that |
914 // we delete and recreate everything here, but given everything else going on | 926 // we delete and recreate everything here, but given everything else going on |
915 // (the lack of highlight, n more extensions appearing, etc), it's not worth | 927 // (the lack of highlight, n more extensions appearing, etc), it's not worth |
916 // the extra complexity to create and insert only the new extensions. | 928 // the extra complexity to create and insert only the new extensions. |
917 DeleteBrowserActionViews(); | 929 DeleteBrowserActionViews(); |
918 CreateBrowserActionViews(); | 930 CreateBrowserActionViews(); |
919 Animate(gfx::Tween::LINEAR, browser_action_views_.size()); | 931 Animate(gfx::Tween::LINEAR, GetIconCount()); |
920 } | 932 } |
921 | 933 |
922 Browser* BrowserActionsContainer::GetBrowser() { | 934 Browser* BrowserActionsContainer::GetBrowser() { |
923 return browser_; | 935 return browser_; |
924 } | 936 } |
925 | 937 |
926 void BrowserActionsContainer::LoadImages() { | 938 void BrowserActionsContainer::LoadImages() { |
927 ui::ThemeProvider* tp = GetThemeProvider(); | 939 ui::ThemeProvider* tp = GetThemeProvider(); |
928 if (!tp || !chevron_) | 940 if (!tp || !chevron_) |
929 return; | 941 return; |
930 | 942 |
931 chevron_->SetImage(views::Button::STATE_NORMAL, | 943 chevron_->SetImage(views::Button::STATE_NORMAL, |
932 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); | 944 *tp->GetImageSkiaNamed(IDR_BROWSER_ACTIONS_OVERFLOW)); |
933 | 945 |
934 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); | 946 const int kImages[] = IMAGE_GRID(IDR_DEVELOPER_MODE_HIGHLIGHT); |
935 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages)); | 947 highlight_painter_.reset(views::Painter::CreateImageGridPainter(kImages)); |
936 } | 948 } |
937 | 949 |
938 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { | 950 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { |
939 SetVisible(!browser_action_views_.empty()); | 951 SetVisible(!browser_action_views_.empty()); |
940 if (owner_view_) { | 952 if (owner_view_) { |
941 owner_view_->Layout(); | 953 owner_view_->Layout(); |
942 owner_view_->SchedulePaint(); | 954 owner_view_->SchedulePaint(); |
943 } | 955 } |
944 } | 956 } |
945 | 957 |
946 void BrowserActionsContainer::SetContainerWidth() { | 958 int BrowserActionsContainer::GetPreferredWidth() { |
947 int visible_actions = GetIconCount(); | 959 size_t visible_actions = GetIconCount(); |
948 if (chevron_) { | 960 return IconCountToWidth( |
949 chevron_->SetVisible( | 961 visible_actions, |
950 static_cast<size_t>(visible_actions) < model_->toolbar_items().size()); | 962 chevron_ && visible_actions < browser_action_views_.size()); |
951 } | 963 } |
952 container_width_ = | 964 |
953 IconCountToWidth(visible_actions, chevron_ && chevron_->visible()); | 965 void BrowserActionsContainer::SetChevronVisibility() { |
| 966 if (chevron_) |
| 967 chevron_->SetVisible(GetIconCount() < browser_action_views_.size()); |
954 } | 968 } |
955 | 969 |
956 void BrowserActionsContainer::CloseOverflowMenu() { | 970 void BrowserActionsContainer::CloseOverflowMenu() { |
957 if (overflow_menu_) | 971 if (overflow_menu_) |
958 overflow_menu_->CancelMenu(); | 972 overflow_menu_->CancelMenu(); |
959 } | 973 } |
960 | 974 |
961 void BrowserActionsContainer::StopShowFolderDropMenuTimer() { | 975 void BrowserActionsContainer::StopShowFolderDropMenuTimer() { |
962 show_menu_task_factory_.InvalidateWeakPtrs(); | 976 show_menu_task_factory_.InvalidateWeakPtrs(); |
963 } | 977 } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 size_t absolute_model_size = | 1074 size_t absolute_model_size = |
1061 model_size == -1 ? extensions.size() : model_size; | 1075 model_size == -1 ? extensions.size() : model_size; |
1062 | 1076 |
1063 // The main container will try to show |model_size| icons, but reduce if there | 1077 // The main container will try to show |model_size| icons, but reduce if there |
1064 // aren't enough displayable icons to do so. | 1078 // aren't enough displayable icons to do so. |
1065 size_t main_displayed = std::min(displayable_icon_count, absolute_model_size); | 1079 size_t main_displayed = std::min(displayable_icon_count, absolute_model_size); |
1066 // The overflow will display the extras, if any. | 1080 // The overflow will display the extras, if any. |
1067 return in_overflow_mode() ? | 1081 return in_overflow_mode() ? |
1068 displayable_icon_count - main_displayed : main_displayed; | 1082 displayable_icon_count - main_displayed : main_displayed; |
1069 } | 1083 } |
OLD | NEW |