15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageSkia;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuModel;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusIconObserver;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusIcon {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusIcon();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~StatusIcon();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the image associated with this status icon.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetImage(const gfx::ImageSkia& image) = 0;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the image associated with this status icon when pressed.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPressedImage(const gfx::ImageSkia& image) = 0;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Sets the hover text for this status icon. This is also used as the label
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // for the menu item which is created as a replacement for the status icon
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // click action on platforms that do not support custom click actions for the
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // status icon (e.g. Ubuntu Unity).
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetToolTip(const string16& tool_tip) = 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Displays a notification balloon with the specified contents.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Depending on the platform it might not appear by the icon tray.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DisplayBalloon(const gfx::ImageSkia& icon,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const string16& title,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const string16& contents) = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the context menu for this icon. The icon takes ownership of the passed
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // context menu. Passing NULL results in no menu at all.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetContextMenu(ui::MenuModel* menu);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds/Removes an observer for clicks on the status icon. If an observer is
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // registered, then left clicks on the status icon will result in the observer
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being called, otherwise, both left and right clicks will display the
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // context menu (if any).
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddObserver(StatusIconObserver* observer);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveObserver(StatusIconObserver* observer);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if there are registered click observers.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasObservers() const;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dispatches a click event to the observers.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DispatchClickEvent();
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN)
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void DispatchBalloonClickEvent();
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked after a call to SetContextMenu() to let the platform-specific
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subclass update the native context menu based on the new model. If NULL is
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passed, subclass should destroy the native context menu.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdatePlatformContextMenu(ui::MenuModel* model) = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<StatusIconObserver> observers_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Context menu, if any.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ui::MenuModel> context_menu_contents_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StatusIcon);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_STATUS_ICONS_STATUS_ICON_H_
82