Index: chrome/browser/ui/views/browser_action_view.cc |
diff --git a/chrome/browser/ui/views/browser_action_view.cc b/chrome/browser/ui/views/browser_action_view.cc |
deleted file mode 100644 |
index 51e059889721fccc19abeb392613d3547d17deb8..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/browser_action_view.cc |
+++ /dev/null |
@@ -1,428 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/ui/views/browser_action_view.h" |
- |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/extensions/api/commands/command_service.h" |
-#include "chrome/browser/extensions/extension_action.h" |
-#include "chrome/browser/extensions/extension_action_manager.h" |
-#include "chrome/browser/extensions/extension_context_menu_model.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/themes/theme_service.h" |
-#include "chrome/browser/themes/theme_service_factory.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/views/browser_actions_container.h" |
-#include "chrome/browser/ui/views/toolbar_view.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/manifest_constants.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/accessibility/accessible_view_state.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/events/event.h" |
-#include "ui/gfx/image/image_skia.h" |
-#include "ui/gfx/image/image_skia_operations.h" |
-#include "ui/gfx/image/image_skia_source.h" |
-#include "ui/views/controls/menu/menu_runner.h" |
- |
-using extensions::Extension; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserActionView |
- |
-bool BrowserActionView::Delegate::NeedToShowMultipleIconStates() const { |
- return true; |
-} |
- |
-bool BrowserActionView::Delegate::NeedToShowTooltip() const { |
- return true; |
-} |
- |
-BrowserActionView::BrowserActionView(const Extension* extension, |
- Browser* browser, |
- BrowserActionView::Delegate* delegate) |
- : browser_(browser), |
- delegate_(delegate), |
- button_(NULL), |
- extension_(extension) { |
- button_ = new BrowserActionButton(extension_, browser_, delegate_); |
- button_->set_drag_controller(delegate_); |
- button_->set_owned_by_client(); |
- AddChildView(button_); |
- button_->UpdateState(); |
-} |
- |
-BrowserActionView::~BrowserActionView() { |
- button_->Destroy(); |
-} |
- |
-gfx::ImageSkia BrowserActionView::GetIconWithBadge() { |
- int tab_id = delegate_->GetCurrentTabId(); |
- |
- const ExtensionAction* action = |
- extensions::ExtensionActionManager::Get(browser_->profile())-> |
- GetBrowserAction(*button_->extension()); |
- gfx::Size spacing(0, ToolbarView::kVertSpacing); |
- gfx::ImageSkia icon = *button_->icon_factory().GetIcon(tab_id).ToImageSkia(); |
- if (!button_->IsEnabled(tab_id)) |
- icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25); |
- return action->GetIconWithBadge(icon, tab_id, spacing); |
-} |
- |
-void BrowserActionView::Layout() { |
- // We can't rely on button_->GetPreferredSize() here because that's not set |
- // correctly until the first call to |
- // BrowserActionsContainer::RefreshBrowserActionViews(), whereas this can be |
- // called before that when the initial bounds are set (and then not after, |
- // since the bounds don't change). So instead of setting the height from the |
- // button's preferred size, we use IconHeight(), since that's how big the |
- // button should be regardless of what it's displaying. |
- gfx::Point offset = delegate_->GetViewContentOffset(); |
- button_->SetBounds(offset.x(), offset.y(), width() - offset.x(), |
- BrowserActionsContainer::IconHeight()); |
-} |
- |
-void BrowserActionView::GetAccessibleState(ui::AccessibleViewState* state) { |
- state->name = l10n_util::GetStringUTF16( |
- IDS_ACCNAME_EXTENSIONS_BROWSER_ACTION); |
- state->role = ui::AccessibilityTypes::ROLE_GROUPING; |
-} |
- |
-gfx::Size BrowserActionView::GetPreferredSize() { |
- return gfx::Size(BrowserActionsContainer::IconWidth(false), |
- BrowserActionsContainer::IconHeight()); |
-} |
- |
-void BrowserActionView::PaintChildren(gfx::Canvas* canvas) { |
- View::PaintChildren(canvas); |
- ExtensionAction* action = button()->browser_action(); |
- int tab_id = delegate_->GetCurrentTabId(); |
- if (tab_id >= 0) |
- action->PaintBadge(canvas, GetLocalBounds(), tab_id); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BrowserActionButton |
- |
-BrowserActionButton::BrowserActionButton(const Extension* extension, |
- Browser* browser, |
- BrowserActionView::Delegate* delegate) |
- : MenuButton(this, string16(), NULL, false), |
- browser_(browser), |
- browser_action_( |
- extensions::ExtensionActionManager::Get(browser->profile())-> |
- GetBrowserAction(*extension)), |
- extension_(extension), |
- icon_factory_(browser->profile(), extension, browser_action_, this), |
- delegate_(delegate), |
- context_menu_(NULL), |
- called_registered_extension_command_(false) { |
- set_border(NULL); |
- set_alignment(TextButton::ALIGN_CENTER); |
- set_context_menu_controller(this); |
- |
- // No UpdateState() here because View hierarchy not setup yet. Our parent |
- // should call UpdateState() after creation. |
- |
- content::NotificationSource notification_source = |
- content::Source<Profile>(browser_->profile()->GetOriginalProfile()); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, |
- content::Source<ExtensionAction>(browser_action_)); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED, |
- notification_source); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED, |
- notification_source); |
- |
- // We also listen for browser theme changes on linux because a switch from or |
- // to GTK requires that we regrab our browser action images. |
- registrar_.Add( |
- this, |
- chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
- content::Source<ThemeService>( |
- ThemeServiceFactory::GetForProfile(browser->profile()))); |
-} |
- |
-void BrowserActionButton::Destroy() { |
- MaybeUnregisterExtensionCommand(false); |
- |
- if (context_menu_) { |
- context_menu_->Cancel(); |
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
- } else { |
- delete this; |
- } |
-} |
- |
-void BrowserActionButton::ViewHierarchyChanged( |
- const ViewHierarchyChangedDetails& details) { |
- if (details.is_add && !called_registered_extension_command_ && |
- GetFocusManager()) { |
- MaybeRegisterExtensionCommand(); |
- called_registered_extension_command_ = true; |
- } |
- |
- MenuButton::ViewHierarchyChanged(details); |
-} |
- |
-bool BrowserActionButton::CanHandleAccelerators() const { |
- // View::CanHandleAccelerators() checks to see if the view is visible before |
- // allowing it to process accelerators. This is not appropriate for browser |
- // actions buttons, which can be hidden inside the overflow area. |
- return true; |
-} |
- |
-void BrowserActionButton::GetAccessibleState(ui::AccessibleViewState* state) { |
- views::MenuButton::GetAccessibleState(state); |
- state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; |
-} |
- |
-void BrowserActionButton::ButtonPressed(views::Button* sender, |
- const ui::Event& event) { |
- delegate_->OnBrowserActionExecuted(this); |
-} |
- |
-void BrowserActionButton::ShowContextMenuForView( |
- View* source, |
- const gfx::Point& point, |
- ui::MenuSourceType source_type) { |
- if (!extension()->ShowConfigureContextMenus()) |
- return; |
- |
- SetButtonPushed(); |
- |
- // Reconstructs the menu every time because the menu's contents are dynamic. |
- scoped_refptr<ExtensionContextMenuModel> context_menu_contents_( |
- new ExtensionContextMenuModel(extension(), browser_, delegate_)); |
- menu_runner_.reset(new views::MenuRunner(context_menu_contents_.get())); |
- |
- context_menu_ = menu_runner_->GetMenu(); |
- gfx::Point screen_loc; |
- views::View::ConvertPointToScreen(this, &screen_loc); |
- if (menu_runner_->RunMenuAt(GetWidget(), NULL, gfx::Rect(screen_loc, size()), |
- views::MenuItemView::TOPLEFT, source_type, |
- views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::CONTEXT_MENU) == |
- views::MenuRunner::MENU_DELETED) { |
- return; |
- } |
- |
- menu_runner_.reset(); |
- SetButtonNotPushed(); |
- context_menu_ = NULL; |
-} |
- |
-void BrowserActionButton::UpdateState() { |
- int tab_id = delegate_->GetCurrentTabId(); |
- if (tab_id < 0) |
- return; |
- |
- SetShowMultipleIconStates(delegate_->NeedToShowMultipleIconStates()); |
- |
- if (!IsEnabled(tab_id)) { |
- SetState(views::CustomButton::STATE_DISABLED); |
- } else { |
- SetState(menu_visible_ ? |
- views::CustomButton::STATE_PRESSED : |
- views::CustomButton::STATE_NORMAL); |
- } |
- |
- gfx::ImageSkia icon = *icon_factory_.GetIcon(tab_id).ToImageSkia(); |
- |
- if (!icon.isNull()) { |
- if (!browser_action()->GetIsVisible(tab_id)) |
- icon = gfx::ImageSkiaOperations::CreateTransparentImage(icon, .25); |
- |
- ThemeService* theme = |
- ThemeServiceFactory::GetForProfile(browser_->profile()); |
- |
- gfx::ImageSkia bg = *theme->GetImageSkiaNamed(IDR_BROWSER_ACTION); |
- SetIcon(gfx::ImageSkiaOperations::CreateSuperimposedImage(bg, icon)); |
- |
- gfx::ImageSkia bg_h = *theme->GetImageSkiaNamed(IDR_BROWSER_ACTION_H); |
- SetHoverIcon(gfx::ImageSkiaOperations::CreateSuperimposedImage(bg_h, icon)); |
- |
- gfx::ImageSkia bg_p = *theme->GetImageSkiaNamed(IDR_BROWSER_ACTION_P); |
- SetPushedIcon( |
- gfx::ImageSkiaOperations::CreateSuperimposedImage(bg_p, icon)); |
- } |
- |
- // If the browser action name is empty, show the extension name instead. |
- std::string title = browser_action()->GetTitle(tab_id); |
- string16 name = UTF8ToUTF16(title.empty() ? extension()->name() : title); |
- SetTooltipText(delegate_->NeedToShowTooltip() ? name : string16()); |
- SetAccessibleName(name); |
- |
- parent()->SchedulePaint(); |
-} |
- |
-bool BrowserActionButton::IsPopup() { |
- int tab_id = delegate_->GetCurrentTabId(); |
- return (tab_id < 0) ? false : browser_action_->HasPopup(tab_id); |
-} |
- |
-GURL BrowserActionButton::GetPopupUrl() { |
- int tab_id = delegate_->GetCurrentTabId(); |
- return (tab_id < 0) ? GURL() : browser_action_->GetPopupUrl(tab_id); |
-} |
- |
-void BrowserActionButton::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- switch (type) { |
- case chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED: |
- UpdateState(); |
- // The browser action may have become visible/hidden so we need to make |
- // sure the state gets updated. |
- delegate_->OnBrowserActionVisibilityChanged(); |
- break; |
- case chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED: |
- case chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED: { |
- std::pair<const std::string, const std::string>* payload = |
- content::Details<std::pair<const std::string, const std::string> >( |
- details).ptr(); |
- if (extension_->id() == payload->first && |
- payload->second == |
- extensions::manifest_values::kBrowserActionCommandEvent) { |
- if (type == chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED) |
- MaybeRegisterExtensionCommand(); |
- else |
- MaybeUnregisterExtensionCommand(true); |
- } |
- break; |
- } |
- case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: |
- UpdateState(); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-void BrowserActionButton::OnIconUpdated() { |
- UpdateState(); |
-} |
- |
-bool BrowserActionButton::Activate() { |
- if (!IsPopup()) |
- return true; |
- |
- delegate_->OnBrowserActionExecuted(this); |
- |
- // TODO(erikkay): Run a nested modal loop while the mouse is down to |
- // enable menu-like drag-select behavior. |
- |
- // The return value of this method is returned via OnMousePressed. |
- // We need to return false here since we're handing off focus to another |
- // widget/view, and true will grab it right back and try to send events |
- // to us. |
- return false; |
-} |
- |
-bool BrowserActionButton::OnMousePressed(const ui::MouseEvent& event) { |
- if (!event.IsRightMouseButton()) { |
- return IsPopup() ? MenuButton::OnMousePressed(event) : |
- TextButton::OnMousePressed(event); |
- } |
- |
- if (!views::View::ShouldShowContextMenuOnMousePress()) { |
- // See comments in MenuButton::Activate() as to why this is needed. |
- SetMouseHandler(NULL); |
- |
- ShowContextMenu(gfx::Point(), ui::MENU_SOURCE_MOUSE); |
- } |
- return false; |
-} |
- |
-void BrowserActionButton::OnMouseReleased(const ui::MouseEvent& event) { |
- if (IsPopup() || context_menu_) { |
- // TODO(erikkay) this never actually gets called (probably because of the |
- // loss of focus). |
- MenuButton::OnMouseReleased(event); |
- } else { |
- TextButton::OnMouseReleased(event); |
- } |
-} |
- |
-void BrowserActionButton::OnMouseExited(const ui::MouseEvent& event) { |
- if (IsPopup() || context_menu_) |
- MenuButton::OnMouseExited(event); |
- else |
- TextButton::OnMouseExited(event); |
-} |
- |
-bool BrowserActionButton::OnKeyReleased(const ui::KeyEvent& event) { |
- return IsPopup() ? MenuButton::OnKeyReleased(event) : |
- TextButton::OnKeyReleased(event); |
-} |
- |
-void BrowserActionButton::OnGestureEvent(ui::GestureEvent* event) { |
- if (IsPopup()) |
- MenuButton::OnGestureEvent(event); |
- else |
- TextButton::OnGestureEvent(event); |
-} |
- |
-bool BrowserActionButton::AcceleratorPressed( |
- const ui::Accelerator& accelerator) { |
- delegate_->OnBrowserActionExecuted(this); |
- return true; |
-} |
- |
-void BrowserActionButton::SetButtonPushed() { |
- SetState(views::CustomButton::STATE_PRESSED); |
- menu_visible_ = true; |
-} |
- |
-void BrowserActionButton::SetButtonNotPushed() { |
- SetState(views::CustomButton::STATE_NORMAL); |
- menu_visible_ = false; |
-} |
- |
-bool BrowserActionButton::IsEnabled(int tab_id) const { |
- return browser_action_->GetIsVisible(tab_id); |
-} |
- |
-gfx::ImageSkia BrowserActionButton::GetIconForTest() { |
- return icon(); |
-} |
- |
-BrowserActionButton::~BrowserActionButton() { |
-} |
- |
-void BrowserActionButton::MaybeRegisterExtensionCommand() { |
- extensions::CommandService* command_service = |
- extensions::CommandService::Get(browser_->profile()); |
- extensions::Command browser_action_command; |
- if (command_service->GetBrowserActionCommand( |
- extension_->id(), |
- extensions::CommandService::ACTIVE_ONLY, |
- &browser_action_command, |
- NULL)) { |
- keybinding_.reset(new ui::Accelerator( |
- browser_action_command.accelerator())); |
- GetFocusManager()->RegisterAccelerator( |
- *keybinding_.get(), ui::AcceleratorManager::kHighPriority, this); |
- } |
-} |
- |
-void BrowserActionButton::MaybeUnregisterExtensionCommand(bool only_if_active) { |
- if (!keybinding_.get() || !GetFocusManager()) |
- return; |
- |
- extensions::CommandService* command_service = |
- extensions::CommandService::Get(browser_->profile()); |
- |
- extensions::Command browser_action_command; |
- if (!only_if_active || !command_service->GetBrowserActionCommand( |
- extension_->id(), |
- extensions::CommandService::ACTIVE_ONLY, |
- &browser_action_command, |
- NULL)) { |
- GetFocusManager()->UnregisterAccelerator(*keybinding_.get(), this); |
- keybinding_.reset(NULL); |
- } |
-} |