Index: ash/system/tray/tray_background_view.h |
diff --git a/ash/system/tray/tray_background_view.h b/ash/system/tray/tray_background_view.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92fd9b21f9df28a0c43451e35e651a81c42edf5d |
--- /dev/null |
+++ b/ash/system/tray/tray_background_view.h |
@@ -0,0 +1,186 @@ |
+// Copyright (c) 2012 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 ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_ |
+#define ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_ |
+ |
+#include <memory> |
+ |
+#include "ash/ash_export.h" |
+#include "ash/common/shelf/shelf_types.h" |
+#include "ash/common/system/tray/actionable_view.h" |
+#include "ash/common/wm/background_animator.h" |
+#include "base/macros.h" |
+#include "ui/compositor/layer_animation_observer.h" |
+#include "ui/views/bubble/tray_bubble_view.h" |
+ |
+namespace ash { |
+class ShelfLayoutManager; |
+class StatusAreaWidget; |
+class TrayEventFilter; |
+class TrayBackground; |
+class WmShelf; |
+ |
+// Base class for children of StatusAreaWidget: SystemTray, WebNotificationTray, |
+// LogoutButtonTray, OverviewButtonTray. |
+// This class handles setting and animating the background when the Launcher |
+// his shown/hidden. It also inherits from ActionableView so that the tray |
+// items can override PerformAction when clicked on. |
+class ASH_EXPORT TrayBackgroundView : public ActionableView, |
+ public BackgroundAnimatorDelegate, |
+ public ui::ImplicitAnimationObserver { |
+ public: |
+ static const char kViewClassName[]; |
+ |
+ // Base class for tray containers. Sets the border and layout. The container |
+ // auto-resizes the widget when necessary. |
+ class TrayContainer : public views::View { |
+ public: |
+ explicit TrayContainer(ShelfAlignment alignment); |
+ ~TrayContainer() override {} |
+ |
+ void SetAlignment(ShelfAlignment alignment); |
+ |
+ void set_size(const gfx::Size& size) { size_ = size; } |
+ |
+ // views::View: |
+ gfx::Size GetPreferredSize() const override; |
+ |
+ protected: |
+ // views::View: |
+ void ChildPreferredSizeChanged(views::View* child) override; |
+ void ChildVisibilityChanged(View* child) override; |
+ void ViewHierarchyChanged( |
+ const ViewHierarchyChangedDetails& details) override; |
+ |
+ private: |
+ void UpdateLayout(); |
+ |
+ ShelfAlignment alignment_; |
+ gfx::Size size_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TrayContainer); |
+ }; |
+ |
+ explicit TrayBackgroundView(StatusAreaWidget* status_area_widget); |
+ ~TrayBackgroundView() override; |
+ |
+ // Called after the tray has been added to the widget containing it. |
+ virtual void Initialize(); |
+ |
+ // Initializes animations for the bubble. |
+ static void InitializeBubbleAnimations(views::Widget* bubble_widget); |
+ |
+ // views::View: |
+ void SetVisible(bool visible) override; |
+ const char* GetClassName() const override; |
+ void ChildPreferredSizeChanged(views::View* child) override; |
+ void GetAccessibleState(ui::AXViewState* state) override; |
+ void AboutToRequestFocusFromTabTraversal(bool reverse) override; |
+ |
+ // ActionableView: |
+ bool PerformAction(const ui::Event& event) override; |
+ gfx::Rect GetFocusBounds() override; |
+ void OnGestureEvent(ui::GestureEvent* event) override; |
+ |
+ // BackgroundAnimatorDelegate: |
+ void UpdateBackground(int alpha) override; |
+ |
+ // Called whenever the shelf alignment changes. |
+ virtual void SetShelfAlignment(ShelfAlignment alignment); |
+ |
+ // Called when the anchor (tray or bubble) may have moved or changed. |
+ virtual void AnchorUpdated() {} |
+ |
+ // Called from GetAccessibleState, must return a valid accessible name. |
+ virtual base::string16 GetAccessibleNameForTray() = 0; |
+ |
+ // Called when the bubble is resized. |
+ virtual void BubbleResized(const views::TrayBubbleView* bubble_view) {} |
+ |
+ // Hides the bubble associated with |bubble_view|. Called when the widget |
+ // is closed. |
+ virtual void HideBubbleWithView(const views::TrayBubbleView* bubble_view) = 0; |
+ |
+ // Called by the bubble wrapper when a click event occurs outside the bubble. |
+ // May close the bubble. |
+ virtual void ClickedOutsideBubble() = 0; |
+ |
+ // Sets |contents| as a child. |
+ void SetContents(views::View* contents); |
+ |
+ // Creates and sets contents background to |background_|. |
+ void SetContentsBackground(); |
+ |
+ // Returns the anchor rect for the bubble. |
+ gfx::Rect GetBubbleAnchorRect( |
+ views::Widget* anchor_widget, |
+ views::TrayBubbleView::AnchorType anchor_type, |
+ views::TrayBubbleView::AnchorAlignment anchor_alignment) const; |
+ |
+ // Returns the bubble anchor alignment based on |shelf_alignment_|. |
+ views::TrayBubbleView::AnchorAlignment GetAnchorAlignment() const; |
+ |
+ // Forces the background to be drawn active if set to true. |
+ void SetDrawBackgroundAsActive(bool visible); |
+ |
+ // Returns true when the the background was overridden to be drawn as active. |
+ bool draw_background_as_active() const {return draw_background_as_active_; } |
+ |
+ StatusAreaWidget* status_area_widget() { |
+ return status_area_widget_; |
+ } |
+ const StatusAreaWidget* status_area_widget() const { |
+ return status_area_widget_; |
+ } |
+ TrayContainer* tray_container() const { return tray_container_; } |
+ ShelfAlignment shelf_alignment() const { return shelf_alignment_; } |
+ TrayEventFilter* tray_event_filter() { return tray_event_filter_.get(); } |
+ |
+ WmShelf* GetShelf(); |
+ |
+ // Updates the arrow visibility based on the launcher visibility. |
+ void UpdateBubbleViewArrow(views::TrayBubbleView* bubble_view); |
+ |
+ private: |
+ class TrayWidgetObserver; |
+ |
+ // Called from Initialize after all status area trays have been created. |
+ // Sets the border based on the position of the view. |
+ void SetTrayBorder(); |
+ |
+ // ui::ImplicitAnimationObserver: |
+ void OnImplicitAnimationsCompleted() override; |
+ bool RequiresNotificationWhenAnimatorDestroyed() const override; |
+ |
+ // Applies transformations to the |layer()| to animate the view when |
+ // SetVisible(false) is called. |
+ void HideTransformation(); |
+ |
+ // Unowned pointer to parent widget. |
+ StatusAreaWidget* status_area_widget_; |
+ |
+ // Convenience pointer to the contents view. |
+ TrayContainer* tray_container_; |
+ |
+ // Shelf alignment. |
+ // TODO(jamescook): Don't cache this, get it from WmShelf. |
+ ShelfAlignment shelf_alignment_; |
+ |
+ // Owned by the view passed to SetContents(). |
+ TrayBackground* background_; |
+ |
+ // This variable stores the activation override which will tint the background |
+ // differently if set to true. |
+ bool draw_background_as_active_; |
+ |
+ std::unique_ptr<TrayWidgetObserver> widget_observer_; |
+ std::unique_ptr<TrayEventFilter> tray_event_filter_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TrayBackgroundView); |
+}; |
+ |
+} // namespace ash |
+ |
+#endif // ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_ |