1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_CLIENT_IMPL_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_CLIENT_IMPL_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_vector.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/weak_ptr.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/types.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/services/public/interfaces/window_manager/window_manager.mojom.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SkBitmap;
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo {
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ViewManager;
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ViewManagerDelegate;
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ViewManagerTransaction;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Shell;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Manages the connection with the View Manager service.
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ViewManagerClientImpl : public ViewManager,
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              public InterfaceImpl<ViewManagerClient>,
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              public WindowManagerClient {
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ViewManagerClientImpl(ViewManagerDelegate* delegate, Shell* shell);
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~ViewManagerClientImpl();
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool connected() const { return connected_; }
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ConnectionSpecificId connection_id() const { return connection_id_; }
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // API exposed to the view implementations that pushes local changes to the
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // service.
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Id CreateView();
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DestroyView(Id view_id);
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // These methods take TransportIds. For views owned by the current connection,
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the connection id high word can be zero. In all cases, the TransportId 0x1
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // refers to the root view.
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AddChild(Id child_id, Id parent_id);
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RemoveChild(Id child_id, Id parent_id);
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Reorder(Id view_id, Id relative_view_id, OrderDirection direction);
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Returns true if the specified view was created by this connection.
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool OwnsView(Id id) const;
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetBounds(Id view_id, const gfx::Rect& bounds);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetSurfaceId(Id view_id, SurfaceIdPtr surface_id);
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetFocus(Id view_id);
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetVisible(Id view_id, bool visible);
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Embed(const String& url, Id view_id);
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void Embed(const String& url,
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             Id view_id,
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)             ServiceProviderPtr service_provider);
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_change_acked_callback(const base::Callback<void(void)>& callback) {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_acked_callback_ = callback;
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ClearChangeAckedCallback() {
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    change_acked_callback_ = base::Callback<void(void)>();
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Start/stop tracking views. While tracked, they can be retrieved via
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ViewManager::GetViewById.
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AddView(View* view);
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RemoveView(Id view_id);
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell* shell() { return shell_; }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  friend class RootObserver;
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef std::map<Id, View*> IdToViewMap;
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from ViewManager:
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetWindowManagerDelegate(
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      WindowManagerDelegate* delegate) OVERRIDE;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DispatchEvent(View* target, EventPtr event) OVERRIDE;
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual const std::string& GetEmbedderURL() const OVERRIDE;
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual const std::vector<View*>& GetRoots() const OVERRIDE;
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual View* GetViewById(Id id) OVERRIDE;
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from InterfaceImpl:
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnConnectionEstablished() OVERRIDE;
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Overridden from ViewManagerClient:
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnEmbed(ConnectionSpecificId connection_id,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       const String& creator_url,
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       ViewDataPtr root,
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       InterfaceRequest<ServiceProvider> services) OVERRIDE;
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewBoundsChanged(Id view_id,
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                   RectPtr old_bounds,
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                   RectPtr new_bounds) OVERRIDE;
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewHierarchyChanged(Id view_id,
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      Id new_parent_id,
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      Id old_parent_id,
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      Array<ViewDataPtr> views) OVERRIDE;
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnViewReordered(Id view_id,
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               Id relative_view_id,
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               OrderDirection direction) OVERRIDE;
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnViewDeleted(Id view_id) OVERRIDE;
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnViewVisibilityChanged(Id view_id, bool visible) OVERRIDE;
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnViewDrawnStateChanged(Id view_id, bool drawn) OVERRIDE;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnViewInputEvent(Id view_id,
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                EventPtr event,
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                const Callback<void()>& callback) OVERRIDE;
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void Embed(
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const String& url,
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      InterfaceRequest<ServiceProvider> service_provider) OVERRIDE;
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void DispatchOnViewInputEvent(EventPtr event) OVERRIDE;
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Overridden from WindowManagerClient:
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnWindowManagerReady() OVERRIDE;
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnCaptureChanged(Id old_capture_view_id,
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                Id new_capture_view_id) OVERRIDE;
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnFocusChanged(Id old_focused_view_id,
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              Id new_focused_view_id) OVERRIDE;
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnActiveWindowChanged(Id old_focused_window,
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     Id new_focused_window) OVERRIDE;
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void RemoveRoot(View* root);
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnActionCompleted(bool success);
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnActionCompletedWithErrorCode(ErrorCode code);
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BitmapUploader* BitmapUploaderForView(Id view_id);
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Callback<void(bool)> ActionCompletedCallback();
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Callback<void(ErrorCode)> ActionCompletedCallbackWithErrorCode();
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool connected_;
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ConnectionSpecificId connection_id_;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ConnectionSpecificId next_id_;
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string creator_url_;
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::Callback<void(void)> change_acked_callback_;
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ViewManagerDelegate* delegate_;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  WindowManagerDelegate* window_manager_delegate_;
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::vector<View*> roots_;
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IdToViewMap views_;
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ViewManagerService* service_;
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  WindowManagerServicePtr window_manager_;
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jamesr): Remove once all callers switch from SetContents to
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // SetSurfaceId.
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shell* shell_;
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ViewManagerClientImpl);
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace mojo
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_CLIENT_IMPL_H_
168