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;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetToolTip(const base::string16& tool_tip) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DisplayBalloon(const gfx::ImageSkia& icon,
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& title,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& contents) OVERRIDE;
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void ForceVisible() OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from StatusIcon:
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void UpdatePlatformContextMenu(StatusIconMenuModel* menu) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitIconData(NOTIFYICONDATA* icon_data);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The tray that owns us.  Weak.
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  StatusTrayWin* tray_;
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique ID corresponding to this icon.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT icon_id_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window used for processing messages from this icon.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HWND window_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The message identifier used for status icon messages.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UINT message_id_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The currently-displayed icon for the window.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHICON icon_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The currently-displayed icon for the notification balloon.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHICON balloon_icon_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not owned.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::MenuModel* menu_model_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Context menu associated with this icon (if any).
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::MenuRunner> menu_runner_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(StatusIconWin);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_VIEWS_STATUS_ICONS_STATUS_ICON_WIN_H_
91