• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_
6 #define UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_
7 
8 #include <windows.h>
9 #include <commctrl.h>
10 #include <string>
11 
12 #include "base/basictypes.h"
13 #include "base/compiler_specific.h"
14 #include "base/strings/string16.h"
15 #include "ui/gfx/native_widget_types.h"
16 #include "ui/gfx/point.h"
17 #include "ui/views/widget/tooltip_manager.h"
18 
19 namespace gfx {
20 class Point;
21 }
22 
23 namespace views {
24 
25 class View;
26 class Widget;
27 
28 // TooltipManager implementation for Windows.
29 //
30 // This class is intended to be used by NativeWidgetWin. To use this, you must
31 // do the following:
32 // Add the following to your MSG_MAP:
33 //
34 //   MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange)
35 //   MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange)
36 //   MSG_WM_NOTIFY(OnNotify)
37 //
38 // With the following implementations:
39 //   LRESULT XXX::OnMouseRange(UINT u_msg, WPARAM w_param, LPARAM l_param,
40 //                             BOOL& handled) {
41 //     tooltip_manager_->OnMouse(u_msg, w_param, l_param);
42 //     handled = FALSE;
43 //     return 0;
44 //   }
45 //
46 //   LRESULT XXX::OnNotify(int w_param, NMHDR* l_param) {
47 //     bool handled;
48 //     LRESULT result = tooltip_manager_->OnNotify(w_param, l_param, &handled);
49 //     SetMsgHandled(handled);
50 //     return result;
51 //   }
52 //
53 // And of course you'll need to create the TooltipManager!
54 //
55 // Lastly, you'll need to override GetTooltipManager.
56 //
57 // See NativeWidgetWin for an example of this in action.
58 class TooltipManagerWin : public TooltipManager {
59  public:
60   // Creates a TooltipManager for the specified Widget and parent window.
61   explicit TooltipManagerWin(Widget* widget);
62   virtual ~TooltipManagerWin();
63 
64   // Initializes the TooltipManager returning whether initialization was
65   // successful. If this returns false the TooltipManager should be destroyed
66   // and not used.
67   bool Init();
68 
69   // TooltipManager:
70   virtual const gfx::FontList& TooltipManagerWin::GetFontList() const OVERRIDE;
71   virtual void UpdateTooltip() OVERRIDE;
72   virtual void TooltipTextChanged(View* view) OVERRIDE;
73 
74   // Message handlers. These forward to the tooltip control.
75   virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param);
76   LRESULT OnNotify(int w_param, NMHDR* l_param, bool* handled);
77 
78  protected:
79   // Returns the Widget we're showing tooltips for.
80   gfx::NativeView GetParent();
81 
82   // Updates the tooltip for the specified location.
83   void UpdateTooltip(const gfx::Point& location);
84 
85   // Tooltip control window.
86   HWND tooltip_hwnd_;
87 
88   // Tooltip information.
89   TOOLINFO toolinfo_;
90 
91   // Last location of the mouse. This is in the coordinates of the rootview.
92   gfx::Point last_mouse_pos_;
93 
94   // Whether or not the tooltip is showing.
95   bool tooltip_showing_;
96 
97  private:
98   // Sets the tooltip position based on the x/y position of the text. If the
99   // tooltip fits, true is returned.
100   bool SetTooltipPosition(int text_x, int text_y);
101 
102   // Calculates the preferred height for tooltips. This always returns a
103   // positive value.
104   int CalcTooltipHeight();
105 
106   // Hosting Widget.
107   Widget* widget_;
108 
109   // The View the mouse is under. This is null if the mouse isn't under a
110   // View.
111   View* last_tooltip_view_;
112 
113   // Whether or not the view under the mouse needs to be refreshed. If this
114   // is true, when the tooltip is asked for the view under the mouse is
115   // refreshed.
116   bool last_view_out_of_sync_;
117 
118   // Text for tooltip from the view.
119   string16 tooltip_text_;
120 
121   // The clipped tooltip.
122   string16 clipped_text_;
123 
124   // Number of lines in the tooltip.
125   int line_count_;
126 
127   // Width of the last tooltip.
128   int tooltip_width_;
129 
130   DISALLOW_COPY_AND_ASSIGN(TooltipManagerWin);
131 };
132 
133 }  // namespace views
134 
135 #endif  // UI_VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_
136