// 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 MOJO_SERVICES_VIEW_MANAGER_CPP_VIEW_H_ #define MOJO_SERVICES_VIEW_MANAGER_CPP_VIEW_H_ #include #include #include "base/observer_list.h" #include "geometry/interfaces/geometry.mojom.h" #include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/public/interfaces/application/service_provider.mojom.h" #include "surfaces/interfaces/surface_id.mojom.h" #include "view_manager/cpp/types.h" #include "view_manager/interfaces/view_manager.mojom.h" #include "view_manager/interfaces/view_manager_constants.mojom.h" namespace mojo { class ServiceProviderImpl; class View; class ViewManager; class ViewObserver; // Defined in view_property.h (which we do not include) template struct ViewProperty; // Views are owned by the ViewManager. // TODO(beng): Right now, you'll have to implement a ViewObserver to track // destruction and NULL any pointers you have. // Investigate some kind of smart pointer or weak pointer for these. class View { public: using Children = std::vector; using SharedProperties = std::map>; // Destroys this view and all its children. void Destroy(); ViewManager* view_manager() { return manager_; } // Configuration. Id id() const { return id_; } // Geometric disposition. const Rect& bounds() const { return bounds_; } void SetBounds(const Rect& bounds); // Visibility (also see IsDrawn()). When created views are hidden. bool visible() const { return visible_; } void SetVisible(bool value); const ViewportMetrics& viewport_metrics() { return *viewport_metrics_; } // Returns the set of string to bag of byte properties. These properties are // shared with the view manager. const SharedProperties& shared_properties() const { return properties_; } // Sets a property. If |data| is null, this property is deleted. void SetSharedProperty(const std::string& name, const std::vector* data); // Sets the |value| of the given window |property|. Setting to the default // value (e.g., NULL) removes the property. The caller is responsible for the // lifetime of any object set as a property on the View. // // These properties are not visible to the view manager. template void SetLocalProperty(const ViewProperty* property, T value); // Returns the value of the given window |property|. Returns the // property-specific default value if the property was not previously set. // // These properties are only visible in the current process and are not // shared with other mojo services. template T GetLocalProperty(const ViewProperty* property) const; // Sets the |property| to its default value. Useful for avoiding a cast when // setting to NULL. // // These properties are only visible in the current process and are not // shared with other mojo services. template void ClearLocalProperty(const ViewProperty* property); // Type of a function to delete a property that this view owns. typedef void (*PropertyDeallocator)(int64_t value); // A View is drawn if the View and all its ancestors are visible and the // View is attached to the root. bool IsDrawn() const; // Observation. void AddObserver(ViewObserver* observer); void RemoveObserver(ViewObserver* observer); // Tree. View* parent() { return parent_; } const View* parent() const { return parent_; } const Children& children() const { return children_; } View* GetRoot() { return const_cast(const_cast(this)->GetRoot()); } const View* GetRoot() const; void AddChild(View* child); void RemoveChild(View* child); void Reorder(View* relative, OrderDirection direction); void MoveToFront(); void MoveToBack(); bool Contains(View* child) const; View* GetChildById(Id id); void SetSurfaceId(SurfaceIdPtr id); // Focus. void SetFocus(); // Embedding. See view_manager.mojom for details. void Embed(const String& url); void Embed(const String& url, InterfaceRequest services, ServiceProviderPtr exposed_services); void Embed(ViewManagerClientPtr client); protected: // This class is subclassed only by test classes that provide a public ctor. View(); ~View(); private: friend class ViewPrivate; friend class ViewManagerClientImpl; View(ViewManager* manager, Id id); // Called by the public {Set,Get,Clear}Property functions. int64_t SetLocalPropertyInternal(const void* key, const char* name, PropertyDeallocator deallocator, int64_t value, int64_t default_value); int64_t GetLocalPropertyInternal(const void* key, int64_t default_value) const; void LocalDestroy(); void LocalAddChild(View* child); void LocalRemoveChild(View* child); // Returns true if the order actually changed. bool LocalReorder(View* relative, OrderDirection direction); void LocalSetBounds(const Rect& old_bounds, const Rect& new_bounds); void LocalSetViewportMetrics(const ViewportMetrics& old_metrics, const ViewportMetrics& new_metrics); void LocalSetDrawn(bool drawn); void LocalSetVisible(bool visible); // Methods implementing visibility change notifications. See ViewObserver // for more details. void NotifyViewVisibilityChanged(View* target); // Notifies this view's observers. Returns false if |this| was deleted during // the call (by an observer), otherwise true. bool NotifyViewVisibilityChangedAtReceiver(View* target); // Notifies this view and its child hierarchy. Returns false if |this| was // deleted during the call (by an observer), otherwise true. bool NotifyViewVisibilityChangedDown(View* target); // Notifies this view and its parent hierarchy. void NotifyViewVisibilityChangedUp(View* target); // Returns true if embed is allowed for this node. If embedding is allowed all // the children are removed. bool PrepareForEmbed(); ViewManager* manager_; Id id_; View* parent_; Children children_; base::ObserverList observers_; Rect bounds_; ViewportMetricsPtr viewport_metrics_; bool visible_; SharedProperties properties_; // Drawn state is derived from the visible state and the parent's visible // state. This field is only used if the view has no parent (eg it's a root). bool drawn_; // Value struct to keep the name and deallocator for this property. // Key cannot be used for this purpose because it can be char* or // WindowProperty<>. struct Value { const char* name; int64_t value; PropertyDeallocator deallocator; }; std::map prop_map_; MOJO_DISALLOW_COPY_AND_ASSIGN(View); }; } // namespace mojo #endif // MOJO_SERVICES_VIEW_MANAGER_CPP_VIEW_H_