Index: ash/mus/shelf_delegate_mus.cc |
diff --git a/ash/mus/shelf_delegate_mus.cc b/ash/mus/shelf_delegate_mus.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..65dc48820a37ac0661c89ea5814c0c16b9f7ceeb |
--- /dev/null |
+++ b/ash/mus/shelf_delegate_mus.cc |
@@ -0,0 +1,200 @@ |
+// 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 "ash/mus/shelf_delegate_mus.h" |
+ |
+#include "ash/shelf/shelf_item_delegate.h" |
+#include "ash/shelf/shelf_item_delegate_manager.h" |
+#include "ash/shelf/shelf_model.h" |
+#include "ash/shell.h" |
+#include "base/strings/string_util.h" |
+#include "mojo/common/common_type_converters.h" |
+#include "mojo/shell/public/cpp/shell.h" |
+#include "ui/base/resource/resource_bundle.h" |
+#include "ui/resources/grit/ui_resources.h" |
+#include "ui/views/mus/window_manager_connection.h" |
+ |
+using mash::wm::mojom::UserWindowController; |
+ |
+namespace ash { |
+namespace sysui { |
+ |
+namespace { |
+ |
+class ShelfItemDelegateMus : public ShelfItemDelegate { |
+ public: |
+ ShelfItemDelegateMus(uint32_t window_id, |
+ const base::string16& title, |
+ UserWindowController* user_window_controller) |
+ : window_id_(window_id), |
+ title_(title), |
+ user_window_controller_(user_window_controller) {} |
+ ~ShelfItemDelegateMus() override {} |
+ |
+ void UpdateTitle(const base::string16& new_title) { title_ = new_title; } |
+ |
+ private: |
+ // ShelfItemDelegate: |
+ ShelfItemDelegate::PerformedAction ItemSelected( |
+ const ui::Event& event) override { |
+ user_window_controller_->FocusUserWindow(window_id_); |
+ return kExistingWindowActivated; |
+ } |
+ |
+ base::string16 GetTitle() override { return title_; } |
+ |
+ ui::MenuModel* CreateContextMenu(aura::Window* root_window) override { |
+ NOTIMPLEMENTED(); |
+ return nullptr; |
+ } |
+ |
+ bool CanPin() const override { |
+ NOTIMPLEMENTED(); |
+ return false; |
+ } |
+ |
+ ShelfMenuModel* CreateApplicationMenu(int event_flags) override { |
+ NOTIMPLEMENTED(); |
+ return nullptr; |
+ } |
+ |
+ bool IsDraggable() override { |
+ NOTIMPLEMENTED(); |
+ return false; |
+ } |
+ |
+ bool ShouldShowTooltip() override { |
+ // NOTIMPLEMENTED(); very noisy |
+ return false; |
+ } |
+ |
+ void Close() override { NOTIMPLEMENTED(); } |
+ |
+ // TODO(msw): Support multiple open windows per button. |
+ uint32_t window_id_; |
+ base::string16 title_; |
+ UserWindowController* user_window_controller_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShelfItemDelegateMus); |
+}; |
+ |
+} // namespace |
+ |
+ShelfDelegateMus::ShelfDelegateMus(ShelfModel* model) |
+ : model_(model), binding_(this) { |
+ mojo::Shell* shell = views::WindowManagerConnection::Get()->shell(); |
+ shell->ConnectToInterface("mojo:desktop_wm", &user_window_controller_); |
+ user_window_controller_->AddUserWindowObserver( |
+ binding_.CreateInterfacePtrAndBind()); |
+} |
+ |
+ShelfDelegateMus::~ShelfDelegateMus() {} |
+ |
+void ShelfDelegateMus::OnShelfCreated(Shelf* shelf) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void ShelfDelegateMus::OnShelfDestroyed(Shelf* shelf) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+ShelfID ShelfDelegateMus::GetShelfIDForAppID(const std::string& app_id) { |
+ NOTIMPLEMENTED(); |
+ return 0; |
+} |
+ |
+bool ShelfDelegateMus::HasShelfIDToAppIDMapping(ShelfID id) const { |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+const std::string& ShelfDelegateMus::GetAppIDForShelfID(ShelfID id) { |
+ NOTIMPLEMENTED(); |
+ return base::EmptyString(); |
+} |
+ |
+void ShelfDelegateMus::PinAppWithID(const std::string& app_id) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool ShelfDelegateMus::IsAppPinned(const std::string& app_id) { |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+void ShelfDelegateMus::UnpinAppWithID(const std::string& app_id) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void ShelfDelegateMus::OnUserWindowObserverAdded( |
+ mojo::Array<mash::wm::mojom::UserWindowPtr> user_windows) { |
+ for (size_t i = 0; i < user_windows.size(); ++i) |
+ OnUserWindowAdded(std::move(user_windows[i])); |
+} |
+ |
+void ShelfDelegateMus::OnUserWindowAdded( |
+ mash::wm::mojom::UserWindowPtr user_window) { |
+ ShelfItem item; |
+ item.type = TYPE_PLATFORM_APP; |
+ item.status = user_window->window_has_focus ? STATUS_ACTIVE : STATUS_RUNNING; |
+ // TODO(msw): Support actual window icons. |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ item.image = *rb.GetImageSkiaNamed(IDR_DEFAULT_FAVICON); |
+ |
+ ShelfID shelf_id = model_->next_id(); |
+ window_id_to_shelf_id_.insert( |
+ std::make_pair(user_window->window_id, shelf_id)); |
+ model_->Add(item); |
+ |
+ ShelfItemDelegateManager* manager = |
+ Shell::GetInstance()->shelf_item_delegate_manager(); |
+ scoped_ptr<ShelfItemDelegate> delegate(new ShelfItemDelegateMus( |
+ user_window->window_id, user_window->window_title.To<base::string16>(), |
+ user_window_controller_.get())); |
+ manager->SetShelfItemDelegate(shelf_id, std::move(delegate)); |
+} |
+ |
+void ShelfDelegateMus::OnUserWindowRemoved(uint32_t window_id) { |
+ DCHECK(window_id_to_shelf_id_.count(window_id)); |
+ model_->RemoveItemAt( |
+ model_->ItemIndexByID(window_id_to_shelf_id_[window_id])); |
+} |
+ |
+void ShelfDelegateMus::OnUserWindowTitleChanged( |
+ uint32_t window_id, |
+ const mojo::String& window_title) { |
+ DCHECK(window_id_to_shelf_id_.count(window_id)); |
+ ShelfID shelf_id = window_id_to_shelf_id_[window_id]; |
+ ShelfItemDelegateManager* manager = |
+ Shell::GetInstance()->shelf_item_delegate_manager(); |
+ ShelfItemDelegate* delegate = manager->GetShelfItemDelegate(shelf_id); |
+ DCHECK(delegate); |
+ static_cast<ShelfItemDelegateMus*>(delegate)->UpdateTitle( |
+ window_title.To<base::string16>()); |
+ |
+ // There's nothing in the ShelfItem that needs to be updated. But we still |
+ // need to update the ShelfModel so that the observers can pick up any |
+ // changes. |
+ int index = model_->ItemIndexByID(shelf_id); |
+ DCHECK_GE(index, 0); |
+ ShelfItems::const_iterator iter = model_->ItemByID(shelf_id); |
+ DCHECK(iter != model_->items().end()); |
+ model_->Set(index, *iter); |
+} |
+ |
+void ShelfDelegateMus::OnUserWindowFocusChanged(uint32_t window_id, |
+ bool has_focus) { |
+ DCHECK(window_id_to_shelf_id_.count(window_id)); |
+ ShelfID shelf_id = window_id_to_shelf_id_[window_id]; |
+ int index = model_->ItemIndexByID(shelf_id); |
+ DCHECK_GE(index, 0); |
+ ShelfItems::const_iterator iter = model_->ItemByID(shelf_id); |
+ DCHECK(iter != model_->items().end()); |
+ ShelfItem item = *iter; |
+ item.status = has_focus ? STATUS_ACTIVE : STATUS_RUNNING; |
+ model_->Set(index, item); |
+} |
+ |
+} // namespace sysui |
+} // namespace ash |