// 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.

#ifndef SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_
#define SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_

#include <set>

#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/interface_factory_impl.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/string.h"
#include "mojo/services/view_manager/public/cpp/types.h"
#include "mojo/services/view_manager/public/cpp/view_manager_client_factory.h"
#include "mojo/services/view_manager/public/cpp/view_manager_delegate.h"
#include "mojo/services/view_manager/public/cpp/view_observer.h"
#include "mojo/services/window_manager/public/interfaces/window_manager_internal.mojom.h"
#include "services/window_manager/focus_controller_observer.h"
#include "services/window_manager/native_viewport_event_dispatcher_impl.h"
#include "services/window_manager/view_target.h"
#include "services/window_manager/window_manager_impl.h"
#include "ui/events/event_handler.h"

namespace gfx {
class Size;
}

namespace window_manager {

class FocusController;
class FocusRules;
class ViewEventDispatcher;
class WindowManagerClient;
class WindowManagerDelegate;
class WindowManagerImpl;

// Implements core window manager functionality that could conceivably be shared
// across multiple window managers implementing superficially different user
// experiences. Establishes communication with the view manager.
// A window manager wishing to use this core should create and own an instance
// of this object. They may implement the associated ViewManager/WindowManager
// delegate interfaces exposed by the view manager, this object provides the
// canonical implementation of said interfaces but will call out to the wrapped
// instances.
class WindowManagerApp
    : public mojo::ApplicationDelegate,
      public mojo::ViewManagerDelegate,
      public mojo::ViewObserver,
      public ui::EventHandler,
      public FocusControllerObserver,
      public mojo::InterfaceFactory<mojo::WindowManager>,
      public mojo::InterfaceFactory<mojo::WindowManagerInternal>,
      public mojo::WindowManagerInternal {
 public:
  WindowManagerApp(ViewManagerDelegate* view_manager_delegate,
                   WindowManagerDelegate* window_manager_delegate);
  ~WindowManagerApp() override;

  ViewEventDispatcher* event_dispatcher() {
    return view_event_dispatcher_.get();
  }

  // Register/deregister new connections to the window manager service.
  void AddConnection(WindowManagerImpl* connection);
  void RemoveConnection(WindowManagerImpl* connection);

  // These are canonical implementations of the window manager API methods.
  void SetCapture(mojo::Id view);
  void FocusWindow(mojo::Id view);
  void ActivateWindow(mojo::Id view);

  void DispatchInputEventToView(mojo::View* view, mojo::EventPtr event);
  void SetViewportSize(const gfx::Size& size);

  bool IsReady() const;

  FocusController* focus_controller() { return focus_controller_.get(); }

  void InitFocus(scoped_ptr<FocusRules> rules);

  // WindowManagerImpl::Embed() forwards to this. If connected to ViewManager
  // then forwards to delegate, otherwise waits for connection to establish then
  // forwards.
  void Embed(const mojo::String& url,
             mojo::InterfaceRequest<mojo::ServiceProvider> service_provider);

  // Overridden from ApplicationDelegate:
  void Initialize(mojo::ApplicationImpl* impl) override;
  bool ConfigureIncomingConnection(
      mojo::ApplicationConnection* connection) override;

 private:
  // TODO(sky): rename this. Connections is ambiguous.
  typedef std::set<WindowManagerImpl*> Connections;
  typedef std::set<mojo::Id> RegisteredViewIdSet;

  struct PendingEmbed;
  class WindowManagerInternalImpl;

  // Creates an ViewTarget for every view in the hierarchy beneath |view|,
  // and adds to the registry so that it can be retrieved later via
  // GetViewTargetForViewId().
  // TODO(beng): perhaps View should have a property bag.
  void RegisterSubtree(mojo::View* view);

  // Recursively invokes Unregister() for |view| and all its descendants.
  void UnregisterSubtree(mojo::View* view);

  // Deletes the ViewTarget associated with the hierarchy beneath |id|,
  // and removes from the registry.
  void Unregister(mojo::View* view);

  // Overridden from ViewManagerDelegate:
  void OnEmbed(mojo::ViewManager* view_manager,
               mojo::View* root,
               mojo::ServiceProviderImpl* exported_services,
               scoped_ptr<mojo::ServiceProvider> imported_services) override;
  void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override;

  // Overridden from ViewObserver:
  void OnTreeChanged(const ViewObserver::TreeChangeParams& params) override;
  void OnViewDestroying(mojo::View* view) override;

  // Overridden from ui::EventHandler:
  void OnEvent(ui::Event* event) override;

  // Overridden from mojo::FocusControllerObserver:
  void OnViewFocused(mojo::View* gained_focus, mojo::View* lost_focus) override;
  void OnViewActivated(mojo::View* gained_active,
                       mojo::View* lost_active) override;

  // Creates the connection to the ViewManager.
  void LaunchViewManager(mojo::ApplicationImpl* app);

  // InterfaceFactory<WindowManagerInternal>:
  void Create(
      mojo::ApplicationConnection* connection,
      mojo::InterfaceRequest<mojo::WindowManagerInternal> request) override;

  // InterfaceFactory<WindowManager>:
  void Create(mojo::ApplicationConnection* connection,
              mojo::InterfaceRequest<mojo::WindowManager> request) override;

  // WindowManagerInternal:
  void CreateWindowManagerForViewManagerClient(
      uint16_t connection_id,
      mojo::ScopedMessagePipeHandle window_manager_pipe) override;

  mojo::Shell* shell_;

  mojo::InterfaceFactoryImplWithContext<NativeViewportEventDispatcherImpl,
                                        WindowManagerApp>
      native_viewport_event_dispatcher_factory_;

  ViewManagerDelegate* wrapped_view_manager_delegate_;
  WindowManagerDelegate* window_manager_delegate_;

  mojo::ViewManager* view_manager_;
  scoped_ptr<mojo::ViewManagerClientFactory> view_manager_client_factory_;
  mojo::View* root_;

  scoped_ptr<FocusController> focus_controller_;

  Connections connections_;
  RegisteredViewIdSet registered_view_id_set_;

  mojo::WindowManagerInternalClientPtr window_manager_client_;

  ScopedVector<PendingEmbed> pending_embeds_;

  scoped_ptr<mojo::ViewManagerClient> view_manager_client_;

  scoped_ptr<ViewEventDispatcher> view_event_dispatcher_;

  scoped_ptr<mojo::Binding<WindowManagerInternal>> wm_internal_binding_;

  DISALLOW_COPY_AND_ASSIGN(WindowManagerApp);
};

}  // namespace window_manager

#endif  // SERVICES_WINDOW_MANAGER_WINDOW_MANAGER_APP_H_
