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
3// found in the LICENSE file.
4
5#include "ash/test/test_shelf_delegate.h"
6
7#include "ash/shelf/shelf_item_delegate_manager.h"
8#include "ash/shelf/shelf_model.h"
9#include "ash/shelf/shelf_util.h"
10#include "ash/shell.h"
11#include "ash/test/test_shelf_item_delegate.h"
12#include "base/strings/string_util.h"
13#include "base/strings/utf_string_conversions.h"
14#include "grit/ash_resources.h"
15#include "ui/aura/window.h"
16
17namespace ash {
18namespace test {
19
20TestShelfDelegate* TestShelfDelegate::instance_ = NULL;
21
22TestShelfDelegate::TestShelfDelegate(ShelfModel* model)
23    : model_(model) {
24  CHECK(!instance_);
25  instance_ = this;
26}
27
28TestShelfDelegate::~TestShelfDelegate() {
29  instance_ = NULL;
30}
31
32void TestShelfDelegate::AddShelfItem(aura::Window* window) {
33  AddShelfItem(window, STATUS_CLOSED);
34}
35
36void TestShelfDelegate::AddShelfItem(aura::Window* window,
37                                     ShelfItemStatus status) {
38  ShelfItem item;
39  if (window->type() == ui::wm::WINDOW_TYPE_PANEL)
40    item.type = TYPE_APP_PANEL;
41  else
42    item.type = TYPE_PLATFORM_APP;
43  ShelfID id = model_->next_id();
44  item.status = status;
45  model_->Add(item);
46  window->AddObserver(this);
47
48  ShelfItemDelegateManager* manager =
49      Shell::GetInstance()->shelf_item_delegate_manager();
50  // |manager| owns TestShelfItemDelegate.
51  scoped_ptr<ShelfItemDelegate> delegate(new TestShelfItemDelegate(window));
52  manager->SetShelfItemDelegate(id, delegate.Pass());
53  SetShelfIDForWindow(id, window);
54}
55
56void TestShelfDelegate::RemoveShelfItemForWindow(aura::Window* window) {
57  ShelfID id = GetShelfIDForWindow(window);
58  if (id == 0)
59    return;
60  int index = model_->ItemIndexByID(id);
61  DCHECK_NE(-1, index);
62  model_->RemoveItemAt(index);
63  window->RemoveObserver(this);
64}
65
66void TestShelfDelegate::OnWindowDestroying(aura::Window* window) {
67  RemoveShelfItemForWindow(window);
68}
69
70void TestShelfDelegate::OnWindowHierarchyChanging(
71      const HierarchyChangeParams& params) {
72  // The window may be legitimately reparented while staying open if it moves
73  // to another display or container. If the window does not have a new parent
74  // then remove the shelf item.
75  if (!params.new_parent)
76    RemoveShelfItemForWindow(params.target);
77}
78
79void TestShelfDelegate::OnShelfCreated(Shelf* shelf) {
80}
81
82void TestShelfDelegate::OnShelfDestroyed(Shelf* shelf) {
83}
84
85ShelfID TestShelfDelegate::GetShelfIDForAppID(const std::string& app_id) {
86  return 0;
87}
88
89const std::string& TestShelfDelegate::GetAppIDForShelfID(ShelfID id) {
90  return base::EmptyString();
91}
92
93void TestShelfDelegate::PinAppWithID(const std::string& app_id) {
94}
95
96bool TestShelfDelegate::CanPin() const {
97  return true;
98}
99
100bool TestShelfDelegate::IsAppPinned(const std::string& app_id) {
101  return false;
102}
103
104void TestShelfDelegate::UnpinAppWithID(const std::string& app_id) {
105}
106
107}  // namespace test
108}  // namespace ash
109