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 14 namespace gfx { 15 class ImageSkia; 16 } 17 18 class StatusIconObserver; 19 20 class 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