Chromium Code Reviews| Index: chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_controller.cc |
| diff --git a/chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_controller.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..84c7b53d03eaf99b85335c74c7f577bbc07ad9cf |
| --- /dev/null |
| +++ b/chrome/browser/ui/ash/launcher/extension_app_window_launcher_item_controller.cc |
| @@ -0,0 +1,166 @@ |
| +// Copyright 2016 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/ash/launcher/extension_app_window_launcher_item_controller.h" |
| + |
| +#include "ash/wm/window_state.h" |
| +#include "ash/wm/window_util.h" |
| +#include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h" |
| +#include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item_v2app.h" |
| +#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
| +#include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h" |
| +#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h" |
| +#include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" |
| +#include "components/favicon/content/content_favicon_driver.h" |
| +#include "content/public/browser/web_contents.h" |
| +#include "extensions/browser/app_window/app_window.h" |
| +#include "extensions/browser/app_window/native_app_window.h" |
| +#include "skia/ext/image_operations.h" |
| +#include "ui/aura/client/aura_constants.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/events/event.h" |
| +#include "ui/gfx/image/image_skia.h" |
| +#include "ui/wm/core/window_animations.h" |
| + |
| +namespace { |
| + |
| +// Size of the icon in the shelf launcher in display-independent pixels. |
| +const int kAppListIconSize = 24; |
| + |
| +// This will return a slightly smaller icon than the app icon to be used in |
| +// the application list menu. |
| +gfx::Image GetAppListIcon(extensions::AppWindow* app_window) { |
| + // TODO(skuhne): We instead might want to use LoadImages in |
| + // AppWindow::UpdateExtensionAppIcon() to let the extension give us |
| + // pre-defined icons in the launcher and the launcher list sizes. Since there |
| + // is no mock yet, doing this now seems a bit premature and we scale for the |
| + // time being. |
| + if (app_window->app_icon().IsEmpty()) |
| + return gfx::Image(); |
| + |
| + SkBitmap bmp = skia::ImageOperations::Resize( |
| + *app_window->app_icon().ToSkBitmap(), skia::ImageOperations::RESIZE_BEST, |
| + kAppListIconSize, kAppListIconSize); |
| + return gfx::Image(gfx::ImageSkia::CreateFrom1xBitmap(bmp)); |
| +} |
| + |
| +} // namespace |
| + |
| +ExtensionAppWindowLauncherItemController:: |
| + ExtensionAppWindowLauncherItemController( |
| + Type type, |
| + const std::string& app_shelf_id, |
| + const std::string& app_id, |
| + ChromeLauncherController* controller) |
| + : AppWindowLauncherItemController(type, app_shelf_id, app_id, controller) {} |
| + |
| +ExtensionAppWindowLauncherItemController:: |
| + ~ExtensionAppWindowLauncherItemController() {} |
| + |
| +void ExtensionAppWindowLauncherItemController::AddAppWindow( |
| + extensions::AppWindow* app_window) { |
| + if (app_window->window_type_is_panel() && type() != TYPE_APP_PANEL) |
| + LOG(ERROR) << "AppWindow of type Panel added to non-panel launcher item"; |
| + DCHECK(window_to_app_window_.find(app_window->GetBaseWindow()) == |
| + window_to_app_window_.end()); |
| + AddWindow(app_window->GetBaseWindow()); |
| + window_to_app_window_[app_window->GetBaseWindow()] = app_window; |
| +} |
| + |
| +void ExtensionAppWindowLauncherItemController::OnWindowRemoved( |
| + ui::BaseWindow* window) { |
| + WindowToAppWindow::iterator it = window_to_app_window_.find(window); |
| + if (it == window_to_app_window_.end()) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + window_to_app_window_.erase(it); |
| +} |
| + |
| +ChromeLauncherAppMenuItems |
| +ExtensionAppWindowLauncherItemController::GetApplicationList(int event_flags) { |
| + ChromeLauncherAppMenuItems items = |
| + AppWindowLauncherItemController::GetApplicationList(event_flags); |
| + int index = 0; |
| + for (const auto& window : windows()) { |
|
dcheng
2016/03/26 09:02:31
Nit: const auto*
khmel
2016/03/28 17:17:31
Done.
|
| + extensions::AppWindow* app_window = window_to_app_window_[window]; |
| + DCHECK(app_window); |
| + |
| + // If the app's web contents provides a favicon, use it. Otherwise, use a |
| + // scaled down app icon. |
| + favicon::FaviconDriver* favicon_driver = |
| + favicon::ContentFaviconDriver::FromWebContents( |
| + app_window->web_contents()); |
| + gfx::Image result = favicon_driver->GetFavicon(); |
| + if (result.IsEmpty()) |
| + result = GetAppListIcon(app_window); |
| + |
| + items.push_back(new ChromeLauncherAppMenuItemV2App( |
| + app_window->GetTitle(), |
| + &result, // Will be copied |
| + app_id(), launcher_controller(), index, |
| + index == 0 /* has_leading_separator */)); |
| + ++index; |
| + } |
| + return items; |
| +} |
| + |
| +ash::ShelfItemDelegate::PerformedAction |
| +ExtensionAppWindowLauncherItemController::ItemSelected(const ui::Event& event) { |
| + if (windows().empty()) |
| + return kNoAction; |
| + |
| + if (type() == TYPE_APP_PANEL) { |
| + DCHECK_EQ(windows().size(), 1u); |
| + ui::BaseWindow* panel = windows().front(); |
| + aura::Window* panel_window = panel->GetNativeWindow(); |
| + // If the panel is attached on another display, move it to the current |
| + // display and activate it. |
| + if (ash::wm::GetWindowState(panel_window)->panel_attached() && |
| + ash::wm::MoveWindowToEventRoot(panel_window, event)) { |
| + if (!panel->IsActive()) |
| + return ShowAndActivateOrMinimize(panel); |
| + } else { |
| + return ShowAndActivateOrMinimize(panel); |
| + } |
| + } else { |
| + return AppWindowLauncherItemController::ItemSelected(event); |
| + } |
| + return kNoAction; |
| +} |
| + |
| +base::string16 ExtensionAppWindowLauncherItemController::GetTitle() { |
| + // For panels return the title of the contents if set. |
| + // Otherwise return the title of the app. |
| + if (type() == TYPE_APP_PANEL && !windows().empty()) { |
| + extensions::AppWindow* app_window = |
| + window_to_app_window_[windows().front()]; |
| + DCHECK(app_window); |
| + if (app_window->web_contents()) { |
| + base::string16 title = app_window->web_contents()->GetTitle(); |
| + if (!title.empty()) |
| + return title; |
| + } |
| + } |
| + return AppWindowLauncherItemController::GetTitle(); |
| +} |
| + |
| +ash::ShelfMenuModel* |
| +ExtensionAppWindowLauncherItemController::CreateApplicationMenu( |
| + int event_flags) { |
| + return new LauncherApplicationMenuItemModel(GetApplicationList(event_flags)); |
| +} |
| + |
| +bool ExtensionAppWindowLauncherItemController::IsDraggable() { |
| + if (type() == TYPE_APP_PANEL) |
| + return true; |
| + return AppWindowLauncherItemController::IsDraggable(); |
| +} |
| + |
| +bool ExtensionAppWindowLauncherItemController::ShouldShowTooltip() { |
| + if (type() == TYPE_APP_PANEL && IsVisible()) |
| + return false; |
| + return AppWindowLauncherItemController::ShouldShowTooltip(); |
| +} |