1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_
6#define ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_
7
8#include "ash/ash_export.h"
9#include "ash/shelf/background_animator.h"
10#include "ash/shelf/shelf_types.h"
11#include "ash/system/tray/actionable_view.h"
12#include "ui/compositor/layer_animation_observer.h"
13#include "ui/views/bubble/tray_bubble_view.h"
14
15namespace ash {
16class ShelfLayoutManager;
17class StatusAreaWidget;
18class TrayEventFilter;
19class TrayBackground;
20
21// Base class for children of StatusAreaWidget: SystemTray, WebNotificationTray,
22// LogoutButtonTray, OverviewButtonTray.
23// This class handles setting and animating the background when the Launcher
24// his shown/hidden. It also inherits from ActionableView so that the tray
25// items can override PerformAction when clicked on.
26class ASH_EXPORT TrayBackgroundView : public ActionableView,
27                                      public BackgroundAnimatorDelegate,
28                                      public ui::ImplicitAnimationObserver {
29 public:
30  static const char kViewClassName[];
31
32  // Base class for tray containers. Sets the border and layout. The container
33  // auto-resizes the widget when necessary.
34  class TrayContainer : public views::View {
35   public:
36    explicit TrayContainer(ShelfAlignment alignment);
37    virtual ~TrayContainer() {}
38
39    void SetAlignment(ShelfAlignment alignment);
40
41    void set_size(const gfx::Size& size) { size_ = size; }
42
43    // views::View:
44    virtual gfx::Size GetPreferredSize() const OVERRIDE;
45
46   protected:
47    // views::View:
48    virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
49    virtual void ChildVisibilityChanged(View* child) OVERRIDE;
50    virtual void ViewHierarchyChanged(
51        const ViewHierarchyChangedDetails& details) OVERRIDE;
52
53   private:
54    void UpdateLayout();
55
56    ShelfAlignment alignment_;
57    gfx::Size size_;
58
59    DISALLOW_COPY_AND_ASSIGN(TrayContainer);
60  };
61
62  explicit TrayBackgroundView(StatusAreaWidget* status_area_widget);
63  virtual ~TrayBackgroundView();
64
65  // Called after the tray has been added to the widget containing it.
66  virtual void Initialize();
67
68  // views::View:
69  virtual void SetVisible(bool visible) OVERRIDE;
70  virtual const char* GetClassName() const OVERRIDE;
71  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
72  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
73  virtual void ChildPreferredSizeChanged(views::View* child) OVERRIDE;
74  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
75  virtual void AboutToRequestFocusFromTabTraversal(bool reverse) OVERRIDE;
76
77  // ActionableView:
78  virtual bool PerformAction(const ui::Event& event) OVERRIDE;
79  virtual gfx::Rect GetFocusBounds() OVERRIDE;
80  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
81
82  // BackgroundAnimatorDelegate:
83  virtual void UpdateBackground(int alpha) OVERRIDE;
84
85  // Called whenever the shelf alignment changes.
86  virtual void SetShelfAlignment(ShelfAlignment alignment);
87
88  // Called when the anchor (tray or bubble) may have moved or changed.
89  virtual void AnchorUpdated() {}
90
91  // Called from GetAccessibleState, must return a valid accessible name.
92  virtual base::string16 GetAccessibleNameForTray() = 0;
93
94  // Called when the bubble is resized.
95  virtual void BubbleResized(const views::TrayBubbleView* bubble_view) {}
96
97  // Hides the bubble associated with |bubble_view|. Called when the widget
98  // is closed.
99  virtual void HideBubbleWithView(const views::TrayBubbleView* bubble_view) = 0;
100
101  // Called by the bubble wrapper when a click event occurs outside the bubble.
102  // May close the bubble. Returns true if the event is handled.
103  virtual bool ClickedOutsideBubble() = 0;
104
105  // Sets |contents| as a child.
106  void SetContents(views::View* contents);
107
108  // Creates and sets contents background to |background_|.
109  void SetContentsBackground();
110
111  // Sets whether the tray paints a background. Default is true, but is set to
112  // false if a window overlaps the shelf.
113  void SetPaintsBackground(bool value,
114                           BackgroundAnimatorChangeType change_type);
115
116  // Initializes animations for the bubble.
117  void InitializeBubbleAnimations(views::Widget* bubble_widget);
118
119  // Returns the window hosting the bubble.
120  aura::Window* GetBubbleWindowContainer() const;
121
122  // Returns the anchor rect for the bubble.
123  gfx::Rect GetBubbleAnchorRect(
124      views::Widget* anchor_widget,
125      views::TrayBubbleView::AnchorType anchor_type,
126      views::TrayBubbleView::AnchorAlignment anchor_alignment) const;
127
128  // Returns the bubble anchor alignment based on |shelf_alignment_|.
129  views::TrayBubbleView::AnchorAlignment GetAnchorAlignment() const;
130
131  // Forces the background to be drawn active if set to true.
132  void SetDrawBackgroundAsActive(bool visible);
133
134  // Returns true when the the background was overridden to be drawn as active.
135  bool draw_background_as_active() const {return draw_background_as_active_; }
136
137  StatusAreaWidget* status_area_widget() {
138    return status_area_widget_;
139  }
140  const StatusAreaWidget* status_area_widget() const {
141    return status_area_widget_;
142  }
143  TrayContainer* tray_container() const { return tray_container_; }
144  ShelfAlignment shelf_alignment() const { return shelf_alignment_; }
145  TrayEventFilter* tray_event_filter() { return tray_event_filter_.get(); }
146
147  ShelfLayoutManager* GetShelfLayoutManager();
148
149  // Updates the arrow visibility based on the launcher visibility.
150  void UpdateBubbleViewArrow(views::TrayBubbleView* bubble_view);
151
152 private:
153  class TrayWidgetObserver;
154
155  // Called from Initialize after all status area trays have been created.
156  // Sets the border based on the position of the view.
157  void SetTrayBorder();
158
159  // ui::ImplicitAnimationObserver:
160  virtual void OnImplicitAnimationsCompleted() OVERRIDE;
161
162  // Applies transformations to the |layer()| to animate the view when
163  // SetVisible(false) is called.
164  void HideTransformation();
165
166  // Unowned pointer to parent widget.
167  StatusAreaWidget* status_area_widget_;
168
169  // Convenience pointer to the contents view.
170  TrayContainer* tray_container_;
171
172  // Shelf alignment.
173  ShelfAlignment shelf_alignment_;
174
175  // Owned by the view passed to SetContents().
176  TrayBackground* background_;
177
178  // Animators for the background. They are only used for the old shelf layout.
179  BackgroundAnimator hide_background_animator_;
180  BackgroundAnimator hover_background_animator_;
181
182  // True if the background gets hovered.
183  bool hovered_;
184
185  // This variable stores the activation override which will tint the background
186  // differently if set to true.
187  bool draw_background_as_active_;
188
189  // True if touch view feedback command line flag has been enabled. When
190  // enabled touch gestures will toggle rendering the background as active.
191  bool touch_feedback_enabled_;
192
193  scoped_ptr<TrayWidgetObserver> widget_observer_;
194  scoped_ptr<TrayEventFilter> tray_event_filter_;
195
196  DISALLOW_COPY_AND_ASSIGN(TrayBackgroundView);
197};
198
199}  // namespace ash
200
201#endif  // ASH_SYSTEM_TRAY_TRAY_BACKGROUND_VIEW_H_
202