Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Unified Diff: mojo/examples/window_manager/window_manager.cc

Issue 684543003: Move //mojo/examples to //examples (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/examples/window_manager/debug_panel.cc ('k') | mojo/examples/window_manager/window_manager.mojom » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/examples/window_manager/window_manager.cc
diff --git a/mojo/examples/window_manager/window_manager.cc b/mojo/examples/window_manager/window_manager.cc
deleted file mode 100644
index c36c82990529b0341be1c290f65706eb801d5450..0000000000000000000000000000000000000000
--- a/mojo/examples/window_manager/window_manager.cc
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright 2014 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 "base/bind.h"
-#include "base/macros.h"
-#include "mojo/application/application_runner_chromium.h"
-#include "mojo/converters/geometry/geometry_type_converters.h"
-#include "mojo/converters/input_events/input_events_type_converters.h"
-#include "mojo/examples/keyboard/keyboard.mojom.h"
-#include "mojo/examples/window_manager/debug_panel.h"
-#include "mojo/examples/window_manager/window_manager.mojom.h"
-#include "mojo/public/c/system/main.h"
-#include "mojo/public/cpp/application/application_connection.h"
-#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/interface_factory_impl.h"
-#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/services/public/cpp/view_manager/view.h"
-#include "mojo/services/public/cpp/view_manager/view_manager.h"
-#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h"
-#include "mojo/services/public/cpp/view_manager/view_observer.h"
-#include "mojo/services/public/interfaces/input_events/input_events.mojom.h"
-#include "mojo/services/public/interfaces/navigation/navigation.mojom.h"
-#include "mojo/services/window_manager/window_manager_app.h"
-#include "mojo/services/window_manager/window_manager_delegate.h"
-#include "mojo/views/views_init.h"
-#include "ui/aura/window.h"
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/wm/core/focus_rules.h"
-
-#if defined CreateWindow
-#undef CreateWindow
-#endif
-
-namespace mojo {
-namespace examples {
-
-class WindowManager;
-
-namespace {
-
-const int kBorderInset = 25;
-const int kControlPanelWidth = 200;
-const int kTextfieldHeight = 25;
-
-class WMFocusRules : public wm::FocusRules {
- public:
- WMFocusRules(mojo::WindowManagerApp* window_manager_app,
- mojo::View* window_container)
- : window_container_(window_container),
- window_manager_app_(window_manager_app) {}
- virtual ~WMFocusRules() {}
-
- private:
- // Overridden from wm::FocusRules:
- virtual bool IsToplevelWindow(aura::Window* window) const override {
- return mojo::WindowManagerApp::GetViewForWindow(window)->parent() ==
- window_container_;
- }
- virtual bool CanActivateWindow(aura::Window* window) const override {
- return mojo::WindowManagerApp::GetViewForWindow(window)->parent() ==
- window_container_;
- }
- virtual bool CanFocusWindow(aura::Window* window) const override {
- return true;
- }
- virtual aura::Window* GetToplevelWindow(aura::Window* window) const override {
- mojo::View* view = mojo::WindowManagerApp::GetViewForWindow(window);
- while (view->parent() != window_container_) {
- view = view->parent();
- // Unparented hierarchy, there is no "top level" window.
- if (!view)
- return NULL;
- }
-
- return window_manager_app_->GetWindowForViewId(view->id());
- }
- virtual aura::Window* GetActivatableWindow(
- aura::Window* window) const override {
- return GetToplevelWindow(window);
- }
- virtual aura::Window* GetFocusableWindow(
- aura::Window* window) const override {
- return window;
- }
- virtual aura::Window* GetNextActivatableWindow(
- aura::Window* ignore) const override {
- aura::Window* activatable = GetActivatableWindow(ignore);
- const aura::Window::Windows& children = activatable->parent()->children();
- for (aura::Window::Windows::const_reverse_iterator it = children.rbegin();
- it != children.rend(); ++it) {
- if (*it != ignore)
- return *it;
- }
- return NULL;
- }
-
- mojo::View* window_container_;
- mojo::WindowManagerApp* window_manager_app_;
-
- DISALLOW_COPY_AND_ASSIGN(WMFocusRules);
-};
-
-} // namespace
-
-class WindowManagerConnection : public InterfaceImpl<IWindowManager> {
- public:
- explicit WindowManagerConnection(WindowManager* window_manager)
- : window_manager_(window_manager) {}
- virtual ~WindowManagerConnection() {}
-
- private:
- // Overridden from IWindowManager:
- virtual void CloseWindow(Id view_id) override;
- virtual void ShowKeyboard(Id view_id, RectPtr bounds) override;
- virtual void HideKeyboard(Id view_id) override;
-
- WindowManager* window_manager_;
-
- DISALLOW_COPY_AND_ASSIGN(WindowManagerConnection);
-};
-
-class NavigatorHostImpl : public InterfaceImpl<NavigatorHost> {
- public:
- explicit NavigatorHostImpl(WindowManager* window_manager, Id view_id)
- : window_manager_(window_manager), view_id_(view_id) {}
- virtual ~NavigatorHostImpl() {
- }
-
- private:
- virtual void DidNavigateLocally(const mojo::String& url) override;
- virtual void RequestNavigate(Target target, URLRequestPtr request) override;
-
- WindowManager* window_manager_;
- Id view_id_;
-
- DISALLOW_COPY_AND_ASSIGN(NavigatorHostImpl);
-};
-
-class KeyboardManager : public KeyboardClient,
- public ViewObserver {
- public:
- KeyboardManager() : view_manager_(NULL), view_(NULL) {
- }
- virtual ~KeyboardManager() {
- if (view_)
- view_->parent()->RemoveObserver(this);
- }
-
- View* view() { return view_; }
-
- void Init(ApplicationImpl* application,
- ViewManager* view_manager,
- View* parent,
- const Rect& bounds) {
- view_manager_ = view_manager;
- view_ = View::Create(view_manager);
- view_->SetBounds(bounds);
- parent->AddChild(view_);
- view_->Embed("mojo:keyboard");
- application->ConnectToService("mojo:keyboard", &keyboard_service_);
- keyboard_service_.set_client(this);
- parent->AddObserver(this);
- }
-
- void Show(Id view_id, const Rect& bounds) {
- keyboard_service_->SetTarget(view_id);
- view_->SetVisible(true);
- }
-
- void Hide(Id view_id) {
- keyboard_service_->SetTarget(0);
- view_->SetVisible(false);
- }
-
- private:
- // KeyboardClient:
- virtual void OnKeyboardEvent(Id view_id,
- int32_t code,
- int32_t flags) override {
- // TODO(sky): figure this out. Code use to dispatch events, but that's a
- // hack. Instead strings should be passed through, or maybe a richer text
- // input interface.
- }
-
- // Overridden from ViewObserver:
- virtual void OnViewBoundsChanged(View* parent,
- const Rect& old_bounds,
- const Rect& new_bounds) override {
- Rect keyboard_bounds(view_->bounds());
- keyboard_bounds.y =
- new_bounds.y + new_bounds.height - keyboard_bounds.height;
- keyboard_bounds.width =
- keyboard_bounds.width + new_bounds.width - old_bounds.width;
- view_->SetBounds(keyboard_bounds);
- }
- virtual void OnViewDestroyed(View* parent) override {
- DCHECK_EQ(parent, view_->parent());
- parent->RemoveObserver(this);
- view_ = NULL;
- }
-
- KeyboardServicePtr keyboard_service_;
- ViewManager* view_manager_;
-
- // View the keyboard is attached to.
- View* view_;
-
- DISALLOW_COPY_AND_ASSIGN(KeyboardManager);
-};
-
-class RootLayoutManager : public ViewObserver {
- public:
- RootLayoutManager(ViewManager* view_manager,
- View* root,
- Id content_view_id,
- Id launcher_ui_view_id,
- Id control_panel_view_id)
- : root_(root),
- view_manager_(view_manager),
- content_view_id_(content_view_id),
- launcher_ui_view_id_(launcher_ui_view_id),
- control_panel_view_id_(control_panel_view_id) {}
- virtual ~RootLayoutManager() {
- if (root_)
- root_->RemoveObserver(this);
- }
-
- private:
- // Overridden from ViewObserver:
- virtual void OnViewBoundsChanged(View* view,
- const Rect& old_bounds,
- const Rect& new_bounds) override {
- DCHECK_EQ(view, root_);
-
- View* content_view = view_manager_->GetViewById(content_view_id_);
- content_view->SetBounds(new_bounds);
-
- int delta_width = new_bounds.width - old_bounds.width;
- int delta_height = new_bounds.height - old_bounds.height;
-
- View* launcher_ui_view =
- view_manager_->GetViewById(launcher_ui_view_id_);
- Rect launcher_ui_bounds(launcher_ui_view->bounds());
- launcher_ui_bounds.width += delta_width;
- launcher_ui_view->SetBounds(launcher_ui_bounds);
-
- View* control_panel_view =
- view_manager_->GetViewById(control_panel_view_id_);
- Rect control_panel_bounds(control_panel_view->bounds());
- control_panel_bounds.x += delta_width;
- control_panel_view->SetBounds(control_panel_bounds);
-
- const View::Children& content_views = content_view->children();
- View::Children::const_iterator iter = content_views.begin();
- for(; iter != content_views.end(); ++iter) {
- View* view = *iter;
- if (view->id() == control_panel_view->id() ||
- view->id() == launcher_ui_view->id())
- continue;
- Rect view_bounds(view->bounds());
- view_bounds.width += delta_width;
- view_bounds.height += delta_height;
- view->SetBounds(view_bounds);
- }
- }
- virtual void OnViewDestroyed(View* view) override {
- DCHECK_EQ(view, root_);
- root_->RemoveObserver(this);
- root_ = NULL;
- }
-
- View* root_;
- ViewManager* view_manager_;
- const Id content_view_id_;
- const Id launcher_ui_view_id_;
- const Id control_panel_view_id_;
-
- DISALLOW_COPY_AND_ASSIGN(RootLayoutManager);
-};
-
-class Window : public InterfaceFactory<NavigatorHost> {
- public:
- Window(WindowManager* window_manager, View* view)
- : window_manager_(window_manager), view_(view) {}
-
- virtual ~Window() {}
-
- View* view() const { return view_; }
-
- void Embed(const std::string& url) {
- scoped_ptr<ServiceProviderImpl> service_provider_impl(
- new ServiceProviderImpl());
- service_provider_impl->AddService<NavigatorHost>(this);
- view_->Embed(url, service_provider_impl.Pass());
- }
-
- private:
- // InterfaceFactory<NavigatorHost>
- virtual void Create(ApplicationConnection* connection,
- InterfaceRequest<NavigatorHost> request) override {
- BindToRequest(new NavigatorHostImpl(window_manager_, view_->id()),
- &request);
- }
-
- WindowManager* window_manager_;
- View* view_;
-};
-
-class WindowManager
- : public ApplicationDelegate,
- public DebugPanel::Delegate,
- public ViewManagerDelegate,
- public WindowManagerDelegate,
- public ui::EventHandler {
- public:
- WindowManager()
- : shell_(nullptr),
- window_manager_factory_(this),
- launcher_ui_(NULL),
- view_manager_(NULL),
- window_manager_app_(new WindowManagerApp(this, this)),
- app_(NULL) {}
-
- virtual ~WindowManager() {
- // host() may be destroyed by the time we get here.
- // TODO: figure out a way to always cleanly remove handler.
- if (window_manager_app_->host())
- window_manager_app_->host()->window()->RemovePreTargetHandler(this);
- }
-
- void CloseWindow(Id view_id) {
- WindowVector::iterator iter = GetWindowByViewId(view_id);
- DCHECK(iter != windows_.end());
- Window* window = *iter;
- windows_.erase(iter);
- window->view()->Destroy();
- }
-
- void ShowKeyboard(Id view_id, const Rect& bounds) {
- // TODO: this needs to validate |view_id|. That is, it shouldn't assume
- // |view_id| is valid and it also needs to make sure the client that sent
- // this really owns |view_id|.
- // TODO: honor |bounds|.
- if (!keyboard_manager_) {
- keyboard_manager_.reset(new KeyboardManager);
- View* parent = view_manager_->GetRoots().back();
- int ideal_height = 200;
- // TODO(sky): 10 is a bit of a hack here. There is a bug that causes
- // white strips to appear when 0 is used. Figure this out!
- Rect keyboard_bounds;
- keyboard_bounds.x = 10;
- keyboard_bounds.y = parent->bounds().height - ideal_height;
- keyboard_bounds.width = parent->bounds().width - 20;
- keyboard_bounds.height = ideal_height;
- keyboard_manager_->Init(app_, view_manager_, parent, keyboard_bounds);
- }
- keyboard_manager_->Show(view_id, bounds);
- }
-
- void HideKeyboard(Id view_id) {
- // See comment in ShowKeyboard() about validating args.
- if (keyboard_manager_)
- keyboard_manager_->Hide(view_id);
- }
-
- void DidNavigateLocally(uint32 source_view_id, const mojo::String& url) {
- LOG(ERROR) << "DidNavigateLocally: source_view_id: " << source_view_id
- << " url: " << url.To<std::string>();
- }
-
- // Overridden from DebugPanel::Delegate:
- virtual void CloseTopWindow() override {
- if (!windows_.empty())
- CloseWindow(windows_.back()->view()->id());
- }
-
- virtual void RequestNavigate(uint32 source_view_id,
- Target target,
- URLRequestPtr request) override {
- OnLaunch(source_view_id, target, request->url);
- }
-
- private:
- typedef std::vector<Window*> WindowVector;
-
- // Overridden from ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
- shell_ = app->shell();
- app_ = app;
- views_init_.reset(new ViewsInit);
- window_manager_app_->Initialize(app);
- }
-
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
- connection->AddService(&window_manager_factory_);
- window_manager_app_->ConfigureIncomingConnection(connection);
- return true;
- }
-
- // Overridden from ViewManagerDelegate:
- virtual void OnEmbed(ViewManager* view_manager,
- View* root,
- ServiceProviderImpl* exported_services,
- scoped_ptr<ServiceProvider> imported_services) override {
- DCHECK(!view_manager_);
- view_manager_ = view_manager;
-
- View* view = View::Create(view_manager_);
- root->AddChild(view);
- Rect rect;
- rect.width = root->bounds().width;
- rect.height = root->bounds().height;
- view->SetBounds(rect);
- content_view_id_ = view->id();
-
- Id launcher_ui_id = CreateLauncherUI();
- Id control_panel_id = CreateControlPanel(view);
-
- root_layout_manager_.reset(
- new RootLayoutManager(view_manager, root,
- content_view_id_,
- launcher_ui_id,
- control_panel_id));
- root->AddObserver(root_layout_manager_.get());
-
- window_manager_app_->host()->window()->AddPreTargetHandler(this);
-
- window_manager_app_->InitFocus(new WMFocusRules(window_manager_app_.get(),
- view));
- }
- virtual void OnViewManagerDisconnected(ViewManager* view_manager) override {
- DCHECK_EQ(view_manager_, view_manager);
- view_manager_ = NULL;
- base::MessageLoop::current()->Quit();
- }
-
- // Overridden from WindowManagerDelegate:
- virtual void Embed(
- const String& url,
- InterfaceRequest<ServiceProvider> service_provider) override {
- const Id kInvalidSourceViewId = 0;
- OnLaunch(kInvalidSourceViewId, TARGET_DEFAULT, url);
- }
-
- // Overridden from ui::EventHandler:
- virtual void OnEvent(ui::Event* event) override {
- View* view = WindowManagerApp::GetViewForWindow(
- static_cast<aura::Window*>(event->target()));
- if (event->type() == ui::ET_MOUSE_PRESSED &&
- !IsDescendantOfKeyboard(view)) {
- view->SetFocus();
- }
- }
-
- void OnLaunch(uint32 source_view_id,
- Target requested_target,
- const mojo::String& url) {
- Target target = debug_panel_->navigation_target();
- if (target == TARGET_DEFAULT) {
- if (requested_target != TARGET_DEFAULT) {
- target = requested_target;
- } else {
- // TODO(aa): Should be TARGET_NEW_NODE if source origin and dest origin
- // are different?
- target = TARGET_SOURCE_NODE;
- }
- }
-
- Window* dest_view = NULL;
- if (target == TARGET_SOURCE_NODE) {
- WindowVector::iterator source_view = GetWindowByViewId(source_view_id);
- bool app_initiated = source_view != windows_.end();
- if (app_initiated)
- dest_view = *source_view;
- else if (!windows_.empty())
- dest_view = windows_.back();
- }
-
- if (!dest_view) {
- dest_view = CreateWindow();
- windows_.push_back(dest_view);
- }
-
- dest_view->Embed(url);
- }
-
- // TODO(beng): proper layout manager!!
- Id CreateLauncherUI() {
- View* view = view_manager_->GetViewById(content_view_id_);
- Rect bounds = view->bounds();
- bounds.x += kBorderInset;
- bounds.y += kBorderInset;
- bounds.width -= 2 * kBorderInset;
- bounds.height = kTextfieldHeight;
- launcher_ui_ = CreateWindow(bounds);
- launcher_ui_->Embed("mojo:browser");
- return launcher_ui_->view()->id();
- }
-
- Window* CreateWindow() {
- View* view = view_manager_->GetViewById(content_view_id_);
- Rect bounds;
- bounds.x = kBorderInset;
- bounds.y = 2 * kBorderInset + kTextfieldHeight;
- bounds.width = view->bounds().width - 3 * kBorderInset - kControlPanelWidth;
- bounds.height =
- view->bounds().height - (3 * kBorderInset + kTextfieldHeight);
- if (!windows_.empty()) {
- bounds.x = windows_.back()->view()->bounds().x + 35;
- bounds.y = windows_.back()->view()->bounds().y + 35;
- }
- return CreateWindow(bounds);
- }
-
- Window* CreateWindow(const Rect& bounds) {
- View* content = view_manager_->GetViewById(content_view_id_);
- View* view = View::Create(view_manager_);
- content->AddChild(view);
- view->SetBounds(bounds);
- view->SetFocus();
- return new Window(this, view);
- }
-
- bool IsDescendantOfKeyboard(View* target) {
- return keyboard_manager_.get() &&
- keyboard_manager_->view()->Contains(target);
- }
-
- Id CreateControlPanel(View* root) {
- View* view = View::Create(view_manager_);
- root->AddChild(view);
-
- Rect bounds;
- bounds.x = root->bounds().width - kControlPanelWidth - kBorderInset;
- bounds.y = kBorderInset * 2 + kTextfieldHeight;
- bounds.width = kControlPanelWidth;
- bounds.height =
- root->bounds().height - kBorderInset * 3 - kTextfieldHeight;
- view->SetBounds(bounds);
-
- debug_panel_ = new DebugPanel(this, shell_, view);
- return view->id();
- }
-
- WindowVector::iterator GetWindowByViewId(Id view_id) {
- for (std::vector<Window*>::iterator iter = windows_.begin();
- iter != windows_.end();
- ++iter) {
- if ((*iter)->view()->id() == view_id) {
- return iter;
- }
- }
- return windows_.end();
- }
-
- Shell* shell_;
-
- InterfaceFactoryImplWithContext<WindowManagerConnection, WindowManager>
- window_manager_factory_;
-
- scoped_ptr<ViewsInit> views_init_;
- DebugPanel* debug_panel_;
- Window* launcher_ui_;
- WindowVector windows_;
- ViewManager* view_manager_;
- scoped_ptr<RootLayoutManager> root_layout_manager_;
-
- scoped_ptr<WindowManagerApp> window_manager_app_;
-
- // Id of the view most content is added to. The keyboard is NOT added here.
- Id content_view_id_;
-
- scoped_ptr<KeyboardManager> keyboard_manager_;
- ApplicationImpl* app_;
-
- DISALLOW_COPY_AND_ASSIGN(WindowManager);
-};
-
-void WindowManagerConnection::CloseWindow(Id view_id) {
- window_manager_->CloseWindow(view_id);
-}
-
-void WindowManagerConnection::ShowKeyboard(Id view_id, RectPtr bounds) {
- window_manager_->ShowKeyboard(view_id, *bounds);
-}
-
-void WindowManagerConnection::HideKeyboard(Id view_id) {
- window_manager_->HideKeyboard(view_id);
-}
-
-void NavigatorHostImpl::DidNavigateLocally(const mojo::String& url) {
- window_manager_->DidNavigateLocally(view_id_, url);
-}
-
-void NavigatorHostImpl::RequestNavigate(Target target, URLRequestPtr request) {
- window_manager_->RequestNavigate(view_id_, target, request.Pass());
-}
-
-} // namespace examples
-} // namespace mojo
-
-MojoResult MojoMain(MojoHandle shell_handle) {
- mojo::ApplicationRunnerChromium runner(new mojo::examples::WindowManager);
- return runner.Run(shell_handle);
-}
« no previous file with comments | « mojo/examples/window_manager/debug_panel.cc ('k') | mojo/examples/window_manager/window_manager.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698