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_UI_VIEWS_STATUS_ICONS_STATUS_ICON_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_ICON_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shellapi.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_gdi_object.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Point;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuRunner;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass StatusTrayWin;
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusIconWin : public StatusIcon {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructor which provides this icon's unique ID and messaging window.
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  StatusIconWin(StatusTrayWin* tray, UINT id, HWND window, UINT message);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~StatusIconWin();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles a click event from the user - if |left_button_click| is true and
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there is a registered observer, passes the click event to the observer,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise displays the context menu if there is one.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleClickEvent(const gfx::Point& cursor_pos, bool left_button_click);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Handles a click on the balloon from the user.
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void HandleBalloonClickEvent();
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-creates the status tray icon now after the taskbar has been created.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetIcon();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT icon_id() const { return icon_id_; }
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  HWND window() const { return window_; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT message_id() const { return message_id_; }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from StatusIcon:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetImage(const gfx::ImageSkia& image) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPressedImage(const gfx::ImageSkia& image) OVERRIDE;
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetToolTip(const base::string16& tool_tip) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DisplayBalloon(const gfx::ImageSkia& icon,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& title,
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& contents) OVERRIDE;
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void ForceVisible() OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from StatusIcon:
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void UpdatePlatformContextMenu(StatusIconMenuModel* menu) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitIconData(NOTIFYICONDATA* icon_data);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The tray that owns us.  Weak.
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  StatusTrayWin* tray_;
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique ID corresponding to this icon.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT icon_id_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window used for processing messages from this icon.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND window_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The message identifier used for status icon messages.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT message_id_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The currently-displayed icon for the window.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHICON icon_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The currently-displayed icon for the notification balloon.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHICON balloon_icon_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not owned.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::MenuModel* menu_model_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Context menu associated with this icon (if any).
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::MenuRunner> menu_runner_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StatusIconWin);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_ICON_WIN_H_
92