tooltip_icon.h revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
1// Copyright 2013 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_UI_VIEWS_AUTOFILL_TOOLTIP_ICON_H_
6#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_TOOLTIP_ICON_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/scoped_observer.h"
12#include "base/strings/string16.h"
13#include "base/timer/timer.h"
14#include "ui/views/controls/image_view.h"
15#include "ui/views/mouse_watcher.h"
16#include "ui/views/widget/widget_observer.h"
17
18namespace autofill {
19
20class InfoBubble;
21
22// A tooltip icon that shows a bubble on hover. Looks like (?).
23class TooltipIcon : public views::ImageView,
24                    public views::MouseWatcherListener,
25                    public views::WidgetObserver {
26 public:
27  static const char kViewClassName[];
28
29  explicit TooltipIcon(const base::string16& tooltip);
30  virtual ~TooltipIcon();
31
32  // views::ImageView:
33  virtual const char* GetClassName() const OVERRIDE;
34  virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
35  virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
36  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
37  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
38
39  // views::MouseWatcherListener:
40  virtual void MouseMovedOutOfHost() OVERRIDE;
41
42  // views::WidgetObserver:
43  virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE;
44
45 private:
46  // Changes this view's image to the resource indicated by |idr|.
47  void ChangeImageTo(int idr);
48
49  // Creates and shows |bubble_|. If |bubble_| already exists, just cancels a
50  // potential close timer.
51  void ShowBubble();
52
53  // Hides |bubble_| if necessary.
54  void HideBubble();
55
56  // The text to show in a bubble when hovered.
57  base::string16 tooltip_;
58
59  // Whether the mouse is inside this tooltip.
60  bool mouse_inside_;
61
62  // A bubble shown on hover. Weak; owns itself. NULL while hiding.
63  InfoBubble* bubble_;
64
65  // A timer to delay showing |bubble_|.
66  base::OneShotTimer<TooltipIcon> show_timer_;
67
68  // A watcher that keeps |bubble_| open if the user's mouse enters it.
69  scoped_ptr<views::MouseWatcher> mouse_watcher_;
70
71  ScopedObserver<views::Widget, TooltipIcon> observer_;
72
73  DISALLOW_COPY_AND_ASSIGN(TooltipIcon);
74};
75
76}  // namespace autofill
77
78#endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_TOOLTIP_ICON_H_
79