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 CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
6#define CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/observer_list.h"
11#include "base/strings/string16.h"
12#include "chrome/browser/status_icons/status_icon_menu_model.h"
13
14namespace gfx {
15class ImageSkia;
16}
17
18class StatusIconObserver;
19
20class StatusIcon {
21 public:
22  StatusIcon();
23  virtual ~StatusIcon();
24
25  // Sets the image associated with this status icon.
26  virtual void SetImage(const gfx::ImageSkia& image) = 0;
27
28  // Sets the hover text for this status icon. This is also used as the label
29  // for the menu item which is created as a replacement for the status icon
30  // click action on platforms that do not support custom click actions for the
31  // status icon (e.g. Ubuntu Unity).
32  virtual void SetToolTip(const base::string16& tool_tip) = 0;
33
34  // Displays a notification balloon with the specified contents.
35  // Depending on the platform it might not appear by the icon tray.
36  virtual void DisplayBalloon(const gfx::ImageSkia& icon,
37                              const base::string16& title,
38                              const base::string16& contents) = 0;
39
40  // Set the context menu for this icon. The icon takes ownership of the passed
41  // context menu. Passing NULL results in no menu at all.
42  void SetContextMenu(scoped_ptr<StatusIconMenuModel> menu);
43
44  // Adds/Removes an observer for clicks on the status icon. If an observer is
45  // registered, then left clicks on the status icon will result in the observer
46  // being called, otherwise, both left and right clicks will display the
47  // context menu (if any).
48  void AddObserver(StatusIconObserver* observer);
49  void RemoveObserver(StatusIconObserver* observer);
50
51  // Returns true if there are registered click observers.
52  bool HasObservers() const;
53
54  // Dispatches a click event to the observers.
55  void DispatchClickEvent();
56#if defined(OS_WIN)
57  void DispatchBalloonClickEvent();
58#endif
59
60  // Attempts to make the status icon directly visible on system UI.  Currently
61  // this only applies to Windows, where status icons are hidden by default
62  // inside an overflow window.
63  // WARNING: This currently uses undocumented Windows APIs and spawns a worker
64  // thread to do it.  Use sparingly.
65  virtual void ForceVisible();
66
67 protected:
68  // Invoked after a call to SetContextMenu() to let the platform-specific
69  // subclass update the native context menu based on the new model. If NULL is
70  // passed, subclass should destroy the native context menu.
71  virtual void UpdatePlatformContextMenu(StatusIconMenuModel* model) = 0;
72
73 private:
74  ObserverList<StatusIconObserver> observers_;
75
76  // Context menu, if any.
77  scoped_ptr<StatusIconMenuModel> context_menu_contents_;
78
79  DISALLOW_COPY_AND_ASSIGN(StatusIcon);
80};
81
82#endif  // CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
83