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