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_NOTIFICATION_VIEW_H_
6#define ASH_SYSTEM_TRAY_TRAY_NOTIFICATION_VIEW_H_
7
8#include "base/timer/timer.h"
9#include "ui/views/controls/button/image_button.h"
10#include "ui/views/controls/slide_out_view.h"
11
12namespace gfx {
13class ImageSkia;
14}
15
16namespace views {
17class ImageView;
18}
19
20namespace ash {
21class SystemTrayItem;
22
23// A view for closable notification views, laid out like:
24//  -------------------
25// | icon  contents  x |
26//  ----------------v--
27// The close button will call OnClose() when clicked.
28class TrayNotificationView : public views::SlideOutView,
29                             public views::ButtonListener {
30 public:
31  // If icon_id is 0, no icon image will be set. SetIconImage can be called
32  // to later set the icon image.
33  TrayNotificationView(SystemTrayItem* owner, int icon_id);
34  virtual ~TrayNotificationView();
35
36  // InitView must be called once with the contents to be displayed.
37  void InitView(views::View* contents);
38
39  // Sets/updates the icon image.
40  void SetIconImage(const gfx::ImageSkia& image);
41
42  // Gets the icons image.
43  const gfx::ImageSkia& GetIconImage() const;
44
45  // Replaces the contents view.
46  void UpdateView(views::View* new_contents);
47
48  // Replaces the contents view and updates the icon image.
49  void UpdateViewAndImage(views::View* new_contents,
50                          const gfx::ImageSkia& image);
51
52  // Autoclose timer operations.
53  void StartAutoCloseTimer(int seconds);
54  void StopAutoCloseTimer();
55  void RestartAutoCloseTimer();
56
57  // Overridden from ButtonListener.
58  virtual void ButtonPressed(views::Button* sender,
59                             const ui::Event& event) OVERRIDE;
60
61  // Overridden from views::View.
62  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
63
64  // Overridden from ui::EventHandler.
65  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
66
67 protected:
68  // Called when the close button is pressed. Does nothing by default.
69  virtual void OnClose();
70  // Called when the notification is clicked on. Does nothing by default.
71  virtual void OnClickAction();
72
73  // Overridden from views::SlideOutView.
74  virtual void OnSlideOut() OVERRIDE;
75
76  SystemTrayItem* owner() { return owner_; }
77
78 private:
79  void HandleClose();
80  void HandleClickAction();
81
82  SystemTrayItem* owner_;
83  int icon_id_;
84  views::ImageView* icon_;
85
86  int autoclose_delay_;
87  base::OneShotTimer<TrayNotificationView> autoclose_;
88
89  DISALLOW_COPY_AND_ASSIGN(TrayNotificationView);
90};
91
92}  // namespace ash
93
94#endif  // ASH_SYSTEM_TRAY_TRAY_NOTIFICATION_VIEW_H_
95