summaryrefslogtreecommitdiffstats
path: root/ui/aura_shell/launcher/launcher.cc
blob: 7dddc9402230fa0769092e9790ad03f8bef0ea07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright (c) 2011 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 "ui/aura_shell/launcher/launcher.h"

#include "ui/aura/window.h"
#include "ui/aura_shell/launcher/launcher_model.h"
#include "ui/aura_shell/launcher/launcher_view.h"
#include "ui/aura_shell/shell.h"
#include "ui/aura_shell/shell_delegate.h"
#include "ui/aura_shell/shell_window_ids.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/views/widget/widget.h"

namespace aura_shell {

Launcher::Launcher(aura::Window* window_container)
    : widget_(NULL),
      window_container_(window_container) {
  window_container->AddObserver(this);

  model_.reset(new LauncherModel);

  widget_ = new views::Widget;
  views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
  params.create_texture_for_layer = true;
  params.transparent = true;
  params.parent = Shell::GetInstance()->GetContainer(
      aura_shell::internal::kShellWindowId_LauncherContainer);
  internal::LauncherView* launcher_view =
      new internal::LauncherView(model_.get());
  launcher_view->Init();
  params.delegate = launcher_view;
  widget_->Init(params);
  gfx::Size pref = static_cast<views::View*>(launcher_view)->GetPreferredSize();
  widget_->SetBounds(gfx::Rect(0, 0, pref.width(), pref.height()));
  widget_->SetContentsView(launcher_view);
  widget_->Show();
  widget_->GetNativeView()->SetName("LauncherView");
}

Launcher::~Launcher() {
  widget_->CloseNow();
  window_container_->RemoveObserver(this);
  for (WindowMap::iterator i = known_windows_.begin();
       i != known_windows_.end(); ++i) {
    i->first->RemoveObserver(this);
  }
}

void Launcher::MaybeAdd(aura::Window* window) {
  if (known_windows_[window] == true)
    return;  // We already tried to add this window.

  known_windows_[window] = true;
  ShellDelegate* delegate = Shell::GetInstance()->delegate();
  if (!delegate)
    return;
  LauncherItem item;
  item.window = window;
  if (!delegate->ConfigureLauncherItem(&item))
    return;  // The delegate doesn't want to show this item in the launcher.
  model_->Add(model_->items().size(), item);
}

void Launcher::OnWindowAdded(aura::Window* new_window) {
  if (new_window->parent() != window_container_)
    return;

  DCHECK(known_windows_.find(new_window) == known_windows_.end());
  known_windows_[new_window] = false;
  new_window->AddObserver(this);
  // Windows are created initially invisible. Wait until the window is made
  // visible before asking, as othewise the delegate likely doesn't know about
  // window (it's still creating it).
  if (new_window->IsVisible())
    MaybeAdd(new_window);
}

void Launcher::OnWillRemoveWindow(aura::Window* window) {
  if (window->parent() != window_container_)
    return;

  window->RemoveObserver(this);
  known_windows_.erase(window);
  LauncherItems::const_iterator i = model_->ItemByWindow(window);
  if (i != model_->items().end())
    model_->RemoveItemAt(i - model_->items().begin());
}

void Launcher::OnWindowVisibilityChanged(aura::Window* window,
                                         bool visibile) {
  if (visibile && !known_windows_[window])
    MaybeAdd(window);
}

}  // namespace aura_shell