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