1// Copyright (c) 2010 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_TRAY_H_
6#define CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_H_
7#pragma once
8
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/gtest_prod_util.h"
13
14class StatusIcon;
15
16// Provides a cross-platform interface to the system's status tray, and exposes
17// APIs to add/remove icons to the tray and attach context menus.
18class StatusTray {
19 public:
20  // Static factory method that is implemented separately for each platform to
21  // produce the appropriate platform-specific instance. Returns NULL if this
22  // platform does not support status icons.
23  static StatusTray* Create();
24
25  virtual ~StatusTray();
26
27  // Creates a new StatusIcon. The StatusTray retains ownership of the
28  // StatusIcon. Returns NULL if the StatusIcon could not be created.
29  StatusIcon* CreateStatusIcon();
30
31  // Removes the current status icon associated with this identifier, if any.
32  void RemoveStatusIcon(StatusIcon* icon);
33
34 protected:
35  StatusTray();
36  // Factory method for creating a status icon for this platform.
37  virtual StatusIcon* CreatePlatformStatusIcon() = 0;
38
39  // Removes all StatusIcons (used by derived classes to clean up in case they
40  // track external state used by the StatusIcons).
41  void RemoveAllIcons();
42
43  typedef std::vector<StatusIcon*> StatusIconList;
44  // Returns the list of active status icons so subclasses can operate on them.
45  const StatusIconList& status_icons() { return status_icons_; }
46
47 private:
48  FRIEND_TEST_ALL_PREFIXES(StatusTrayTest, CreateRemove);
49
50  // List containing all active StatusIcons.
51  StatusIconList status_icons_;
52
53  DISALLOW_COPY_AND_ASSIGN(StatusTray);
54};
55
56#endif  // CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_H_
57