| 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/browser_actions_container.h" | 5 #include "chrome/browser/views/browser_actions_container.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
| 9 #include "app/slide_animation.h" | 9 #include "app/slide_animation.h" |
| 10 #include "base/stl_util-inl.h" | 10 #include "base/stl_util-inl.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 // The padding above and below the divider. | 69 // The padding above and below the divider. |
| 70 static const int kDividerVerticalPadding = 9; | 70 static const int kDividerVerticalPadding = 9; |
| 71 | 71 |
| 72 // The margin above the chevron. | 72 // The margin above the chevron. |
| 73 static const int kChevronTopMargin = 9; | 73 static const int kChevronTopMargin = 9; |
| 74 | 74 |
| 75 // The margin to the right of the chevron. | 75 // The margin to the right of the chevron. |
| 76 static const int kChevronRightMargin = 4; | 76 static const int kChevronRightMargin = 4; |
| 77 | 77 |
| 78 // Extra hit-area for the resize gripper. | 78 // Width for the resize area. |
| 79 static const int kExtraResizeArea = 4; | 79 static const int kResizeAreaWidth = 4; |
| 80 | 80 |
| 81 // Width of the drop indicator. | 81 // Width of the drop indicator. |
| 82 static const int kDropIndicatorWidth = 2; | 82 static const int kDropIndicatorWidth = 2; |
| 83 | 83 |
| 84 // Color of the drop indicator. | 84 // Color of the drop indicator. |
| 85 static const SkColor kDropIndicatorColor = SK_ColorBLACK; | 85 static const SkColor kDropIndicatorColor = SK_ColorBLACK; |
| 86 | 86 |
| 87 // The x offset for the drop indicator (how much we shift it by). | 87 // The x offset for the drop indicator (how much we shift it by). |
| 88 static const int kDropIndicatorOffsetLtr = 3; | 88 static const int kDropIndicatorOffsetLtr = 3; |
| 89 static const int kDropIndicatorOffsetRtl = 9; | 89 static const int kDropIndicatorOffsetRtl = 9; |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 // BrowserActionsContainer | 360 // BrowserActionsContainer |
| 361 | 361 |
| 362 BrowserActionsContainer::BrowserActionsContainer( | 362 BrowserActionsContainer::BrowserActionsContainer( |
| 363 Browser* browser, View* owner_view) | 363 Browser* browser, View* owner_view) |
| 364 : profile_(browser->profile()), | 364 : profile_(browser->profile()), |
| 365 browser_(browser), | 365 browser_(browser), |
| 366 owner_view_(owner_view), | 366 owner_view_(owner_view), |
| 367 popup_(NULL), | 367 popup_(NULL), |
| 368 popup_button_(NULL), | 368 popup_button_(NULL), |
| 369 model_(NULL), | 369 model_(NULL), |
| 370 resize_gripper_(NULL), | |
| 371 chevron_(NULL), | 370 chevron_(NULL), |
| 372 overflow_menu_(NULL), | 371 overflow_menu_(NULL), |
| 373 suppress_chevron_(false), | 372 suppress_chevron_(false), |
| 374 resize_amount_(0), | 373 resize_amount_(0), |
| 375 animation_target_size_(0), | 374 animation_target_size_(0), |
| 376 drop_indicator_position_(-1), | 375 drop_indicator_position_(-1), |
| 377 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 376 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
| 378 ALLOW_THIS_IN_INITIALIZER_LIST(show_menu_task_factory_(this)) { | 377 ALLOW_THIS_IN_INITIALIZER_LIST(show_menu_task_factory_(this)) { |
| 379 SetID(VIEW_ID_BROWSER_ACTION_TOOLBAR); | 378 SetID(VIEW_ID_BROWSER_ACTION_TOOLBAR); |
| 380 | 379 |
| 381 if (profile_->GetExtensionsService()) { | 380 if (profile_->GetExtensionsService()) { |
| 382 model_ = profile_->GetExtensionsService()->toolbar_model(); | 381 model_ = profile_->GetExtensionsService()->toolbar_model(); |
| 383 model_->AddObserver(this); | 382 model_->AddObserver(this); |
| 384 } | 383 } |
| 385 resize_animation_.reset(new SlideAnimation(this)); | 384 resize_animation_.reset(new SlideAnimation(this)); |
| 386 resize_gripper_ = new views::ResizeGripper(this); | 385 resize_area_ = new views::ResizeArea(this); |
| 387 resize_gripper_->SetAccessibleName( | 386 resize_area_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_SEPARATOR)); |
| 388 l10n_util::GetString(IDS_ACCNAME_SEPARATOR)); | 387 AddChildView(resize_area_); |
| 389 resize_gripper_->SetVisible(false); | |
| 390 AddChildView(resize_gripper_); | |
| 391 | 388 |
| 392 // TODO(glen): Come up with a new bitmap for the chevron. | 389 // TODO(glen): Come up with a new bitmap for the chevron. |
| 393 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 390 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 394 SkBitmap* chevron_image = rb.GetBitmapNamed(IDR_BOOKMARK_BAR_CHEVRONS); | 391 SkBitmap* chevron_image = rb.GetBitmapNamed(IDR_BOOKMARK_BAR_CHEVRONS); |
| 395 chevron_ = new views::MenuButton(NULL, std::wstring(), this, false); | 392 chevron_ = new views::MenuButton(NULL, std::wstring(), this, false); |
| 396 chevron_->SetVisible(false); | 393 chevron_->SetVisible(false); |
| 397 chevron_->SetIcon(*chevron_image); | 394 chevron_->SetIcon(*chevron_image); |
| 398 chevron_->SetAccessibleName( | 395 chevron_->SetAccessibleName( |
| 399 l10n_util::GetString(IDS_ACCNAME_EXTENSIONS_CHEVRON)); | 396 l10n_util::GetString(IDS_ACCNAME_EXTENSIONS_CHEVRON)); |
| 400 // Chevron contains >> that should point left in LTR locales. | 397 // Chevron contains >> that should point left in LTR locales. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 for (size_t i = 0; i < browser_action_views_.size(); ++i) | 510 for (size_t i = 0; i < browser_action_views_.size(); ++i) |
| 514 RemoveChildView(browser_action_views_[i]); | 511 RemoveChildView(browser_action_views_[i]); |
| 515 STLDeleteContainerPointers(browser_action_views_.begin(), | 512 STLDeleteContainerPointers(browser_action_views_.begin(), |
| 516 browser_action_views_.end()); | 513 browser_action_views_.end()); |
| 517 browser_action_views_.clear(); | 514 browser_action_views_.clear(); |
| 518 } | 515 } |
| 519 } | 516 } |
| 520 | 517 |
| 521 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { | 518 void BrowserActionsContainer::OnBrowserActionVisibilityChanged() { |
| 522 SetVisible(browser_action_views_.size() > 0); | 519 SetVisible(browser_action_views_.size() > 0); |
| 523 resize_gripper_->SetVisible(browser_action_views_.size() > 0); | |
| 524 | |
| 525 owner_view_->Layout(); | 520 owner_view_->Layout(); |
| 526 owner_view_->SchedulePaint(); | 521 owner_view_->SchedulePaint(); |
| 527 } | 522 } |
| 528 | 523 |
| 529 void BrowserActionsContainer::HidePopup() { | 524 void BrowserActionsContainer::HidePopup() { |
| 530 if (popup_) | 525 if (popup_) |
| 531 popup_->Close(); | 526 popup_->Close(); |
| 532 } | 527 } |
| 533 | 528 |
| 534 void BrowserActionsContainer::TestExecuteBrowserAction(int index) { | 529 void BrowserActionsContainer::TestExecuteBrowserAction(int index) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 container_size_.width() - resize_amount_); | 601 container_size_.width() - resize_amount_); |
| 607 int max_width = ClampToNearestIconCount(-1, false); // -1 gives max width. | 602 int max_width = ClampToNearestIconCount(-1, false); // -1 gives max width. |
| 608 width = std::min(width, max_width); | 603 width = std::min(width, max_width); |
| 609 | 604 |
| 610 return gfx::Size(width, kButtonSize); | 605 return gfx::Size(width, kButtonSize); |
| 611 } | 606 } |
| 612 | 607 |
| 613 void BrowserActionsContainer::Layout() { | 608 void BrowserActionsContainer::Layout() { |
| 614 if (browser_action_views_.size() == 0) { | 609 if (browser_action_views_.size() == 0) { |
| 615 SetVisible(false); | 610 SetVisible(false); |
| 616 resize_gripper_->SetVisible(false); | |
| 617 chevron_->SetVisible(false); | 611 chevron_->SetVisible(false); |
| 618 return; | 612 return; |
| 619 } else { | 613 } else { |
| 620 SetVisible(true); | 614 SetVisible(true); |
| 621 resize_gripper_->SetVisible(true); | |
| 622 } | 615 } |
| 623 | 616 |
| 624 int x = 0; | 617 resize_area_->SetBounds(0, 0, kResizeAreaWidth, height()); |
| 625 if (resize_gripper_->IsVisible()) { | 618 int x = kResizeAreaWidth; |
| 626 // We'll draw the resize gripper a little wider, to add some invisible hit | |
| 627 // target area - but we don't account for it anywhere. | |
| 628 gfx::Size sz = resize_gripper_->GetPreferredSize(); | |
| 629 resize_gripper_->SetBounds(x, (height() - sz.height()) / 2 + 1, | |
| 630 sz.width() + kExtraResizeArea, sz.height()); | |
| 631 x += sz.width(); | |
| 632 } | |
| 633 | 619 |
| 634 x += base::i18n::IsRTL() ? kHorizontalPaddingRtl : kHorizontalPadding; | 620 x += base::i18n::IsRTL() ? kHorizontalPaddingRtl : kHorizontalPadding; |
| 635 | 621 |
| 636 // Calculate if all icons fit without showing the chevron. We need to know | 622 // Calculate if all icons fit without showing the chevron. We need to know |
| 637 // this beforehand, because showing the chevron will decrease the space that | 623 // this beforehand, because showing the chevron will decrease the space that |
| 638 // we have to draw the visible ones (ie. if one icon is visible and another | 624 // we have to draw the visible ones (ie. if one icon is visible and another |
| 639 // doesn't have enough room). | 625 // doesn't have enough room). |
| 640 int last_x_of_icons = x + | 626 int last_x_of_icons = x + |
| 641 (browser_action_views_.size() * kButtonSize) + | 627 (browser_action_views_.size() * kButtonSize) + |
| 642 ((browser_action_views_.size() - 1) * | 628 ((browser_action_views_.size() - 1) * |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 int pixelWidth, bool allow_shrink_to_minimum) const { | 877 int pixelWidth, bool allow_shrink_to_minimum) const { |
| 892 // Calculate the width of one icon. | 878 // Calculate the width of one icon. |
| 893 int icon_width = (kButtonSize + kBrowserActionButtonPadding); | 879 int icon_width = (kButtonSize + kBrowserActionButtonPadding); |
| 894 | 880 |
| 895 // Calculate pixel count for the area not used by the icons. | 881 // Calculate pixel count for the area not used by the icons. |
| 896 int extras = WidthOfNonIconArea(); | 882 int extras = WidthOfNonIconArea(); |
| 897 | 883 |
| 898 size_t icon_count = 0u; | 884 size_t icon_count = 0u; |
| 899 if (pixelWidth >= 0) { | 885 if (pixelWidth >= 0) { |
| 900 // Caller wants to know how many icons fit within a given space so we start | 886 // Caller wants to know how many icons fit within a given space so we start |
| 901 // by subtracting the padding, gripper and dividers. | 887 // by subtracting the padding, resize area and dividers. |
| 902 int icon_area = pixelWidth - extras; | 888 int icon_area = pixelWidth - extras; |
| 903 icon_area = std::max(0, icon_area); | 889 icon_area = std::max(0, icon_area); |
| 904 | 890 |
| 905 // Make sure we never throw an icon into the chevron menu just because | 891 // Make sure we never throw an icon into the chevron menu just because |
| 906 // there isn't enough enough space for the invisible padding around buttons. | 892 // there isn't enough enough space for the invisible padding around buttons. |
| 907 icon_area += kBrowserActionButtonPadding - 1; | 893 icon_area += kBrowserActionButtonPadding - 1; |
| 908 | 894 |
| 909 // Count the number of icons that fit within that area. | 895 // Count the number of icons that fit within that area. |
| 910 icon_count = icon_area / icon_width; | 896 icon_count = icon_area / icon_width; |
| 911 | 897 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 else | 1026 else |
| 1041 chevron_->SetVisible(true); | 1027 chevron_->SetVisible(true); |
| 1042 container_size_ = gfx::Size(IconCountToWidth(visible_actions), kButtonSize); | 1028 container_size_ = gfx::Size(IconCountToWidth(visible_actions), kButtonSize); |
| 1043 } | 1029 } |
| 1044 | 1030 |
| 1045 int BrowserActionsContainer::WidthOfNonIconArea() const { | 1031 int BrowserActionsContainer::WidthOfNonIconArea() const { |
| 1046 int chevron_size = (chevron_->IsVisible()) ? | 1032 int chevron_size = (chevron_->IsVisible()) ? |
| 1047 chevron_->GetPreferredSize().width() : 0; | 1033 chevron_->GetPreferredSize().width() : 0; |
| 1048 int padding = base::i18n::IsRTL() ? | 1034 int padding = base::i18n::IsRTL() ? |
| 1049 kHorizontalPaddingRtl : kHorizontalPadding; | 1035 kHorizontalPaddingRtl : kHorizontalPadding; |
| 1050 return resize_gripper_->GetPreferredSize().width() + padding + | 1036 return kResizeAreaWidth + padding + chevron_size + kChevronRightMargin + |
| 1051 chevron_size + kChevronRightMargin + kDividerHorizontalMargin; | 1037 kDividerHorizontalMargin; |
| 1052 } | 1038 } |
| 1053 | 1039 |
| 1054 int BrowserActionsContainer::IconCountToWidth(int icons) const { | 1040 int BrowserActionsContainer::IconCountToWidth(int icons) const { |
| 1055 DCHECK_GE(icons, 0); | 1041 DCHECK_GE(icons, 0); |
| 1056 if (icons == 0) | 1042 if (icons == 0) |
| 1057 return ContainerMinSize(); | 1043 return ContainerMinSize(); |
| 1058 | 1044 |
| 1059 int icon_width = kButtonSize + kBrowserActionButtonPadding; | 1045 int icon_width = kButtonSize + kBrowserActionButtonPadding; |
| 1060 | 1046 |
| 1061 return WidthOfNonIconArea() + (icons * icon_width); | 1047 return WidthOfNonIconArea() + (icons * icon_width); |
| 1062 } | 1048 } |
| 1063 | 1049 |
| 1064 int BrowserActionsContainer::ContainerMinSize() const { | 1050 int BrowserActionsContainer::ContainerMinSize() const { |
| 1065 return resize_gripper_->width() + chevron_->width() + kChevronRightMargin; | 1051 return kResizeAreaWidth + chevron_->width() + kChevronRightMargin; |
| 1066 } | 1052 } |
| 1067 | 1053 |
| 1068 void BrowserActionsContainer::Animate(Tween::Type tween_type, int target_size) { | 1054 void BrowserActionsContainer::Animate(Tween::Type tween_type, int target_size) { |
| 1069 if (!disable_animations_during_testing_) { | 1055 if (!disable_animations_during_testing_) { |
| 1070 // Animate! We have to set the animation_target_size_ after calling Reset(), | 1056 // Animate! We have to set the animation_target_size_ after calling Reset(), |
| 1071 // because that could end up calling AnimationEnded which clears the value. | 1057 // because that could end up calling AnimationEnded which clears the value. |
| 1072 resize_animation_->Reset(); | 1058 resize_animation_->Reset(); |
| 1073 resize_animation_->SetTweenType(tween_type); | 1059 resize_animation_->SetTweenType(tween_type); |
| 1074 animation_target_size_ = target_size; | 1060 animation_target_size_ = target_size; |
| 1075 resize_animation_->Show(); | 1061 resize_animation_->Show(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 popup_ = NULL; | 1143 popup_ = NULL; |
| 1158 popup_button_->SetButtonNotPushed(); | 1144 popup_button_->SetButtonNotPushed(); |
| 1159 popup_button_ = NULL; | 1145 popup_button_ = NULL; |
| 1160 } | 1146 } |
| 1161 | 1147 |
| 1162 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) { | 1148 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) { |
| 1163 // Only display incognito-enabled extensions while in incognito mode. | 1149 // Only display incognito-enabled extensions while in incognito mode. |
| 1164 return (!profile_->IsOffTheRecord() || | 1150 return (!profile_->IsOffTheRecord() || |
| 1165 profile_->GetExtensionsService()->IsIncognitoEnabled(extension)); | 1151 profile_->GetExtensionsService()->IsIncognitoEnabled(extension)); |
| 1166 } | 1152 } |
| OLD | NEW |