1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map>
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/application/application_runner_chromium.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/examples/media_viewer/media_viewer.mojom.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/c/system/main.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_delegate.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/interface_factory_impl.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/bindings/interface_impl.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/view_manager/view.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/view_manager/view_manager.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_client_factory.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_observer.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/public/interfaces/navigation/navigation.mojom.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/views/native_widget_view_manager.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/views/views_init.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "skia/ext/platform_canvas.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "skia/ext/refptr.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h"
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkCanvas.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkColor.h"
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkPaint.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/skia/include/core/SkRect.h"
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/canvas.h"
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/insets.h"
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/rect.h"
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/background.h"
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/border.h"
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/button/button.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/button/label_button.h"
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/layout/box_layout.h"
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/painter.h"
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget.h"
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/widget/widget_delegate.h"
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace examples {
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MediaViewer;
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CustomButtonBorder: public views::Border {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CustomButtonBorder()
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : normal_painter_(CreatePainter(SkColorSetRGB(0x80, 0x80, 0x80),
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      SkColorSetRGB(0xC0, 0xC0, 0xC0))),
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        hot_painter_(CreatePainter(SkColorSetRGB(0xA0, 0xA0, 0xA0),
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   SkColorSetRGB(0xD0, 0xD0, 0xD0))),
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pushed_painter_(CreatePainter(SkColorSetRGB(0x80, 0x80, 0x80),
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      SkColorSetRGB(0x90, 0x90, 0x90))),
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        insets_(2, 6, 2, 6) {
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~CustomButtonBorder() {}
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from views::Border:
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Paint(const views::View& view, gfx::Canvas* canvas) OVERRIDE {
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const views::LabelButton* button =
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        static_cast<const views::LabelButton*>(&view);
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::Button::ButtonState state = button->state();
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::Painter* painter = normal_painter_.get();
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (state == views::Button::STATE_HOVERED) {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      painter = hot_painter_.get();
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else if (state == views::Button::STATE_PRESSED) {
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      painter = pushed_painter_.get();
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    painter->Paint(canvas, view.size());
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual gfx::Insets GetInsets() const OVERRIDE {
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return insets_;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual gfx::Size GetMinimumSize() const OVERRIDE {
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Size size;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (normal_painter_)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      size.SetToMax(normal_painter_->GetMinimumSize());
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (hot_painter_)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      size.SetToMax(hot_painter_->GetMinimumSize());
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (pushed_painter_)
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      size.SetToMax(pushed_painter_->GetMinimumSize());
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return size;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<views::Painter> CreatePainter(SkColor border, SkColor background) {
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    skia::RefPtr<SkCanvas> canvas(skia::AdoptRef(skia::CreatePlatformCanvas(
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        64, 64, false)));
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SkPaint paint;
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    paint.setColor(background);
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    canvas->drawRoundRect(SkRect::MakeWH(63, 63), 2, 2, paint);
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    paint.setStyle(SkPaint::kStroke_Style);
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    paint.setColor(border);
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    canvas->drawRoundRect(SkRect::MakeWH(63, 63), 2, 2, paint);
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<views::Painter>(
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        views::Painter::CreateImagePainter(
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            gfx::ImageSkia::CreateFrom1xBitmap(
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                skia::GetTopDevice(*canvas)->accessBitmap(true)),
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            gfx::Insets(5, 5, 5, 5)));
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<views::Painter> normal_painter_;
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<views::Painter> hot_painter_;
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<views::Painter> pushed_painter_;
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Insets insets_;
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(CustomButtonBorder);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ControlPanel : public views::ButtonListener {
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  enum ControlType {
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CONTROL_ZOOM_IN,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CONTROL_ACTUAL_SIZE,
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CONTROL_ZOOM_OUT,
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CONTROL_COUNT,
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class Delegate {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   public:
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual ~Delegate() {}
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual void ButtonPressed(ControlType type) = 0;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ControlPanel(Delegate* delegate) : delegate_(delegate), buttons_() {}
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ControlPanel() {}
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Initialize(View* view) {
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const char* kNames[] = { "Zoom In", "Actual Size", "Zoom Out" };
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::WidgetDelegateView* widget_delegate = new views::WidgetDelegateView;
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    widget_delegate->GetContentsView()->SetLayoutManager(
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new views::BoxLayout(views::BoxLayout::kHorizontal, 5, 2, 5));
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    widget_delegate->GetContentsView()->set_background(
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        views::Background::CreateSolidBackground(SK_ColorLTGRAY));
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (int type = 0; type < CONTROL_COUNT; ++type) {
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      views::Button* button = new views::LabelButton(
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          this, base::ASCIIToUTF16(kNames[type]));
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      button->SetBorder(scoped_ptr<views::Border>(new CustomButtonBorder));
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      buttons_[type] = button;
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      widget_delegate->GetContentsView()->AddChildView(button);
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::Widget* widget = new views::Widget;
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::Widget::InitParams params(
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    params.native_widget = new NativeWidgetViewManager(widget, view);
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    params.delegate = widget_delegate;
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    params.bounds = gfx::Rect(view->bounds().width(), view->bounds().height());
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    params.opacity = views::Widget::InitParams::OPAQUE_WINDOW;
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    widget->Init(params);
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    widget->Show();
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from views::ButtonListener:
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ButtonPressed(views::Button* sender,
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             const ui::Event& event) OVERRIDE {
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (int i = 0; i < CONTROL_COUNT; ++i) {
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (sender == buttons_[i]) {
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        delegate_->ButtonPressed(static_cast<ControlType>(i));
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return;
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      }
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Delegate* delegate_;
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::Button* buttons_[CONTROL_COUNT];
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ControlPanel);
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MediaViewer
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : public ApplicationDelegate,
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      public ViewManagerDelegate,
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      public ControlPanel::Delegate,
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      public ViewObserver {
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MediaViewer()
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : app_(NULL),
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        view_manager_(NULL),
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        root_view_(NULL),
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        control_view_(NULL),
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        content_view_(NULL),
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        control_panel_(this) {
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    handler_map_["image/png"] = "mojo:mojo_png_viewer";
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MediaViewer() {
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (root_view_)
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      root_view_->RemoveObserver(this);
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  typedef std::map<std::string, std::string> HandlerMap;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from ApplicationDelegate:
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void Initialize(ApplicationImpl* app) OVERRIDE {
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_manager_client_factory_.reset(
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new ViewManagerClientFactory(app->shell(), this));
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    app_ = app;
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views_init_.reset(new ViewsInit);
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OVERRIDE {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection->AddService(view_manager_client_factory_.get());
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void LayoutViews() {
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    View* root = content_view_->parent();
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Rect control_bounds(root->bounds().width(), 28);
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    control_view_->SetBounds(control_bounds);
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Rect content_bounds(0, control_bounds.height(), root->bounds().width(),
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             root->bounds().height() - control_bounds.height());
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content_view_->SetBounds(content_bounds);
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Overridden from ViewManagerDelegate:
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnEmbed(ViewManager* view_manager,
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       View* root,
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       ServiceProviderImpl* exported_services,
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       scoped_ptr<ServiceProvider> imported_services) OVERRIDE {
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_view_ = root;
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    view_manager_ = view_manager;
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    control_view_ = View::Create(view_manager_);
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_view_->AddChild(control_view_);
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content_view_ = View::Create(view_manager_);
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_view_->AddChild(content_view_);
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    control_panel_.Initialize(control_view_);
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LayoutViews();
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_view_->AddObserver(this);
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content_view_->Embed("TODO");
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnViewManagerDisconnected(
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ViewManager* view_manager) OVERRIDE {
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK_EQ(view_manager_, view_manager);
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    view_manager_ = NULL;
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoop::current()->Quit();
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Overridden from ControlPanel::Delegate:
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void ButtonPressed(ControlPanel::ControlType type) OVERRIDE {
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (type) {
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ControlPanel::CONTROL_ZOOM_IN:
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        zoomable_media_->ZoomIn();
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ControlPanel::CONTROL_ACTUAL_SIZE:
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       zoomable_media_->ZoomToActualSize();
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case ControlPanel::CONTROL_ZOOM_OUT:
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        zoomable_media_->ZoomOut();
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        NOTIMPLEMENTED();
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ViewObserver:
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewBoundsChanged(View* view,
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   const gfx::Rect& old_bounds,
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   const gfx::Rect& new_bounds) OVERRIDE {
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LayoutViews();
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewDestroyed(View* view) OVERRIDE {
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK_EQ(view, root_view_);
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    view->RemoveObserver(this);
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    root_view_ = NULL;
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string GetHandlerForContentType(const std::string& content_type) {
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HandlerMap::const_iterator it = handler_map_.find(content_type);
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return it != handler_map_.end() ? it->second : std::string();
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ApplicationImpl* app_;
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ViewsInit> views_init_;
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ViewManager* view_manager_;
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  View* root_view_;
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  View* control_view_;
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  View* content_view_;
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ControlPanel control_panel_;
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ZoomableMediaPtr zoomable_media_;
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HandlerMap handler_map_;
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(MediaViewer);
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace examples
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace mojo
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)MojoResult MojoMain(MojoHandle shell_handle) {
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mojo::ApplicationRunnerChromium runner(new mojo::examples::MediaViewer);
32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return runner.Run(shell_handle);
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
322