Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ash / system / tray / tray_background_view.h
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
15 namespace ash {
16 class ShelfLayoutManager;
17 class StatusAreaWidget;
18 class TrayEventFilter;
19 class 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.
26 class 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_