diff options
Diffstat (limited to 'views/widget')
-rw-r--r-- | views/widget/aero_tooltip_manager.cc | 14 | ||||
-rw-r--r-- | views/widget/aero_tooltip_manager.h | 6 | ||||
-rw-r--r-- | views/widget/tooltip_manager.h | 143 | ||||
-rw-r--r-- | views/widget/tooltip_manager_gtk.cc | 51 | ||||
-rw-r--r-- | views/widget/tooltip_manager_gtk.h | 37 | ||||
-rw-r--r-- | views/widget/tooltip_manager_win.cc (renamed from views/widget/tooltip_manager.cc) | 72 | ||||
-rw-r--r-- | views/widget/tooltip_manager_win.h | 160 | ||||
-rw-r--r-- | views/widget/widget_gtk.cc | 6 | ||||
-rw-r--r-- | views/widget/widget_gtk.h | 3 | ||||
-rw-r--r-- | views/widget/widget_win.cc | 4 | ||||
-rw-r--r-- | views/widget/widget_win.h | 14 |
11 files changed, 330 insertions, 180 deletions
diff --git a/views/widget/aero_tooltip_manager.cc b/views/widget/aero_tooltip_manager.cc index ca58c24..aef9e65 100644 --- a/views/widget/aero_tooltip_manager.cc +++ b/views/widget/aero_tooltip_manager.cc @@ -18,8 +18,8 @@ namespace views { /////////////////////////////////////////////////////////////////////////////// // AeroTooltipManager, public: -AeroTooltipManager::AeroTooltipManager(Widget* widget, HWND parent) - : TooltipManager(widget, parent), +AeroTooltipManager::AeroTooltipManager(Widget* widget) + : TooltipManagerWin(widget), initial_delay_(0) { } @@ -71,7 +71,7 @@ void AeroTooltipManager::Init() { tooltip_hwnd_ = CreateWindowEx( WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), TOOLTIPS_CLASS, NULL, TTS_NOPREFIX, 0, 0, 0, 0, - parent_, NULL, NULL, NULL); + GetParent(), NULL, NULL, NULL); l10n_util::AdjustUIFontForWindow(tooltip_hwnd_); @@ -81,10 +81,10 @@ void AeroTooltipManager::Init() { // We use tracking tooltips on Vista to allow us to manually control the // visibility of the tooltip. toolinfo_.uFlags = TTF_TRANSPARENT | TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE; - toolinfo_.hwnd = parent_; - toolinfo_.uId = (UINT_PTR)parent_; + toolinfo_.hwnd = GetParent(); + toolinfo_.uId = (UINT_PTR)GetParent(); - // Setting this tells windows to call parent_ back (using a WM_NOTIFY + // Setting this tells windows to call GetParent() back (using a WM_NOTIFY // message) for the actual tooltip contents. toolinfo_.lpszText = LPSTR_TEXTCALLBACK; SetRectEmpty(&toolinfo_.rect); @@ -97,7 +97,7 @@ void AeroTooltipManager::OnTimer() { POINT pt; pt.x = last_mouse_x_; pt.y = last_mouse_y_; - ::ClientToScreen(parent_, &pt); + ::ClientToScreen(GetParent(), &pt); // Set the position and visibility. if (!tooltip_showing_) { diff --git a/views/widget/aero_tooltip_manager.h b/views/widget/aero_tooltip_manager.h index fe5856d..c81991c 100644 --- a/views/widget/aero_tooltip_manager.h +++ b/views/widget/aero_tooltip_manager.h @@ -7,7 +7,7 @@ #include "base/ref_counted.h" #include "base/task.h" -#include "views/widget/tooltip_manager.h" +#include "views/widget/tooltip_manager_win.h" namespace views { @@ -26,9 +26,9 @@ namespace views { // TTF_TRACKed tooltips. // // TODO(glen): Resolve this with Microsoft. -class AeroTooltipManager : public TooltipManager { +class AeroTooltipManager : public TooltipManagerWin { public: - AeroTooltipManager(Widget* widget, HWND parent); + explicit AeroTooltipManager(Widget* widget); virtual ~AeroTooltipManager(); virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param); diff --git a/views/widget/tooltip_manager.h b/views/widget/tooltip_manager.h index 5cfe2bf..cb48973 100644 --- a/views/widget/tooltip_manager.h +++ b/views/widget/tooltip_manager.h @@ -5,51 +5,21 @@ #ifndef VIEWS_WIDGET_TOOLTIP_MANAGER_H_ #define VIEWS_WIDGET_TOOLTIP_MANAGER_H_ -#include <windows.h> -#include <commctrl.h> - #include <string> + #include "base/basictypes.h" -#include "base/task.h" namespace gfx { class Font; -} +} // namespace gfx namespace views { class View; -class Widget; - -// TooltipManager takes care of the wiring to support tooltips for Views. -// This class is intended to be used by Widgets. To use this, you must -// do the following: -// Add the following to your MSG_MAP: -// -// MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) -// MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) -// MSG_WM_NOTIFY(OnNotify) -// -// With the following implementations: -// LRESULT XXX::OnMouseRange(UINT u_msg, WPARAM w_param, LPARAM l_param, -// BOOL& handled) { -// tooltip_manager_->OnMouse(u_msg, w_param, l_param); -// handled = FALSE; -// return 0; -// } -// -// LRESULT XXX::OnNotify(int w_param, NMHDR* l_param) { -// bool handled; -// LRESULT result = tooltip_manager_->OnNotify(w_param, l_param, &handled); -// SetMsgHandled(handled); -// return result; -// } -// -// And of course you'll need to create the TooltipManager! -// -// Lastly, you'll need to override GetTooltipManager. -// -// See XPFrame for an example of this in action. + +// TooltipManager takes care of the wiring to support tooltips for Views. You +// almost never need to interact directly with TooltipManager, rather look to +// the various tooltip methods on View. class TooltipManager { public: // Returns the height of tooltips. This should only be invoked from within @@ -62,109 +32,22 @@ class TooltipManager { // Returns the separator for lines of text in a tooltip. static const std::wstring& GetLineSeparator(); - // Creates a TooltipManager for the specified Widget and parent window. - TooltipManager(Widget* widget, HWND parent); - virtual ~TooltipManager(); + TooltipManager() {} + virtual ~TooltipManager() {} // Notification that the view hierarchy has changed in some way. - void UpdateTooltip(); + virtual void UpdateTooltip() = 0; // Invoked when the tooltip text changes for the specified views. - void TooltipTextChanged(View* view); + virtual void TooltipTextChanged(View* view) = 0; // Invoked when toolbar icon gets focus. - void ShowKeyboardTooltip(View* view); + virtual void ShowKeyboardTooltip(View* view) = 0; // Invoked when toolbar loses focus. - void HideKeyboardTooltip(); - - // Message handlers. These forward to the tooltip control. - virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param); - LRESULT OnNotify(int w_param, NMHDR* l_param, bool* handled); - // Not used directly by TooltipManager, but provided for AeroTooltipManager. - virtual void OnMouseLeave() {} - - protected: - virtual void Init(); - - // Updates the tooltip for the specified location. - void UpdateTooltip(int x, int y); - - // Parent window the tooltip is added to. - HWND parent_; - - // Tooltip control window. - HWND tooltip_hwnd_; - - // Tooltip information. - TOOLINFO toolinfo_; - - // Last location of the mouse. This is in the coordinates of the rootview. - int last_mouse_x_; - int last_mouse_y_; - - // Whether or not the tooltip is showing. - bool tooltip_showing_; - - private: - // Sets the tooltip position based on the x/y position of the text. If the - // tooltip fits, true is returned. - bool SetTooltipPosition(int text_x, int text_y); - - // Calculates the preferred height for tooltips. This always returns a - // positive value. - int CalcTooltipHeight(); - - // Trims the tooltip to fit, setting text to the clipped result, width to the - // width (in pixels) of the clipped text and line_count to the number of lines - // of text in the tooltip. - void TrimTooltipToFit(std::wstring* text, - int* width, - int* line_count, - int position_x, - int position_y, - HWND window); - - // Invoked when the timer elapses and tooltip has to be destroyed. - void DestroyKeyboardTooltipWindow(HWND window_to_destroy); - - // Hosting Widget. - Widget* widget_; - - // The View the mouse is under. This is null if the mouse isn't under a - // View. - View* last_tooltip_view_; - - // Whether or not the view under the mouse needs to be refreshed. If this - // is true, when the tooltip is asked for the view under the mouse is - // refreshed. - bool last_view_out_of_sync_; - - // Text for tooltip from the view. - std::wstring tooltip_text_; - - // The clipped tooltip. - std::wstring clipped_text_; - - // Number of lines in the tooltip. - int line_count_; - - // Width of the last tooltip. - int tooltip_width_; - - // Height for a tooltip; lazily calculated. - static int tooltip_height_; - - // control window for tooltip displayed using keyboard. - HWND keyboard_tooltip_hwnd_; - - // Used to register DestroyTooltipWindow function with PostDelayedTask - // function. - ScopedRunnableMethodFactory<TooltipManager> keyboard_tooltip_factory_; - - DISALLOW_EVIL_CONSTRUCTORS(TooltipManager); + virtual void HideKeyboardTooltip() = 0; }; } // namespace views -#endif // VIEWS_WIDGET_TOOLTIP_MANAGER_H_ +#endif // VIEWS_WIDGET_TOOLTIP_MANAGER_H_ diff --git a/views/widget/tooltip_manager_gtk.cc b/views/widget/tooltip_manager_gtk.cc new file mode 100644 index 0000000..702514a --- /dev/null +++ b/views/widget/tooltip_manager_gtk.cc @@ -0,0 +1,51 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "views/widget/tooltip_manager_gtk.h" + +#include "app/gfx/font.h" +#include "base/logging.h" + +namespace views { + +// static +int TooltipManager::GetTooltipHeight() { + NOTIMPLEMENTED(); + return 0; +} + +// static +gfx::Font TooltipManager::GetDefaultFont() { + NOTIMPLEMENTED(); + return gfx::Font(); +} + +// static +const std::wstring& TooltipManager::GetLineSeparator() { + static std::wstring* line_separator = NULL; + if (!line_separator) + line_separator = new std::wstring(L"\n"); + return *line_separator; +} + +TooltipManagerGtk::TooltipManagerGtk(Widget* widget) : widget_(widget) { +} + +void TooltipManagerGtk::UpdateTooltip() { + NOTIMPLEMENTED(); +} + +void TooltipManagerGtk::TooltipTextChanged(View* view) { + NOTIMPLEMENTED(); +} + +void TooltipManagerGtk::ShowKeyboardTooltip(View* view) { + NOTIMPLEMENTED(); +} + +void TooltipManagerGtk::HideKeyboardTooltip() { + NOTIMPLEMENTED(); +} + +} // namespace views diff --git a/views/widget/tooltip_manager_gtk.h b/views/widget/tooltip_manager_gtk.h new file mode 100644 index 0000000..447f6ce --- /dev/null +++ b/views/widget/tooltip_manager_gtk.h @@ -0,0 +1,37 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ +#define VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ + +#include "views/widget/tooltip_manager.h" + +namespace views { + +class Widget; + +// TooltipManager takes care of the wiring to support tooltips for Views. You +// almost never need to interact directly with TooltipManager, rather look to +// the various tooltip methods on View. +class TooltipManagerGtk : public TooltipManager { + public: + explicit TooltipManagerGtk(Widget* widget); + virtual ~TooltipManagerGtk() {} + + // TooltipManager. + virtual void UpdateTooltip(); + virtual void TooltipTextChanged(View* view); + virtual void ShowKeyboardTooltip(View* view); + virtual void HideKeyboardTooltip(); + + private: + // Our owner. + Widget* widget_; + + DISALLOW_COPY_AND_ASSIGN(TooltipManagerGtk); +}; + +} // namespace views + +#endif // VIEWS_WIDGET_TOOLTIP_MANAGER_GTK_H_ diff --git a/views/widget/tooltip_manager.cc b/views/widget/tooltip_manager_win.cc index 9ef9ff9..70aff1e 100644 --- a/views/widget/tooltip_manager.cc +++ b/views/widget/tooltip_manager_win.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "views/widget/tooltip_manager.h" +#include "views/widget/tooltip_manager_win.h" #include <windowsx.h> #include <limits> @@ -19,8 +19,7 @@ namespace views { -//static -int TooltipManager::tooltip_height_ = 0; +static int tooltip_height_ = 0; // Default timeout for the tooltip displayed using keyboard. // Timeout is mentioned in milliseconds. @@ -37,10 +36,10 @@ static void SplitTooltipString(const std::wstring& text, std::vector<std::wstring>* lines) { size_t index = 0; size_t next_index; - while ((next_index = text.find(TooltipManager::GetLineSeparator(), index)) + while ((next_index = text.find(TooltipManagerWin::GetLineSeparator(), index)) != std::wstring::npos && lines->size() < kMaxLines) { lines->push_back(text.substr(index, next_index - index)); - index = next_index + TooltipManager::GetLineSeparator().size(); + index = next_index + TooltipManagerWin::GetLineSeparator().size(); } if (next_index != text.size() && lines->size() < kMaxLines) lines->push_back(text.substr(index, text.size() - index)); @@ -78,9 +77,8 @@ const std::wstring& TooltipManager::GetLineSeparator() { return *separator; } -TooltipManager::TooltipManager(Widget* widget, HWND parent) +TooltipManagerWin::TooltipManagerWin(Widget* widget) : widget_(widget), - parent_(parent), last_mouse_x_(-1), last_mouse_y_(-1), tooltip_showing_(false), @@ -90,23 +88,24 @@ TooltipManager::TooltipManager(Widget* widget, HWND parent) keyboard_tooltip_hwnd_(NULL), #pragma warning(suppress: 4355) keyboard_tooltip_factory_(this) { - DCHECK(widget && parent); + DCHECK(widget); + DCHECK(widget->GetNativeView()); Init(); } -TooltipManager::~TooltipManager() { +TooltipManagerWin::~TooltipManagerWin() { if (tooltip_hwnd_) DestroyWindow(tooltip_hwnd_); if (keyboard_tooltip_hwnd_) DestroyWindow(keyboard_tooltip_hwnd_); } -void TooltipManager::Init() { +void TooltipManagerWin::Init() { // Create the tooltip control. tooltip_hwnd_ = CreateWindowEx( WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), TOOLTIPS_CLASS, NULL, TTS_NOPREFIX, 0, 0, 0, 0, - parent_, NULL, NULL, NULL); + GetParent(), NULL, NULL, NULL); l10n_util::AdjustUIFontForWindow(tooltip_hwnd_); @@ -120,16 +119,20 @@ void TooltipManager::Init() { // Add one tool that is used for all tooltips. toolinfo_.cbSize = sizeof(toolinfo_); toolinfo_.uFlags = TTF_TRANSPARENT | TTF_IDISHWND; - toolinfo_.hwnd = parent_; - toolinfo_.uId = reinterpret_cast<UINT_PTR>(parent_); - // Setting this tells windows to call parent_ back (using a WM_NOTIFY + toolinfo_.hwnd = GetParent(); + toolinfo_.uId = reinterpret_cast<UINT_PTR>(GetParent()); + // Setting this tells windows to call GetParent() back (using a WM_NOTIFY // message) for the actual tooltip contents. toolinfo_.lpszText = LPSTR_TEXTCALLBACK; SetRectEmpty(&toolinfo_.rect); SendMessage(tooltip_hwnd_, TTM_ADDTOOL, 0, (LPARAM)&toolinfo_); } -void TooltipManager::UpdateTooltip() { +gfx::NativeView TooltipManagerWin::GetParent() { + return widget_->GetNativeView(); +} + +void TooltipManagerWin::UpdateTooltip() { // Set last_view_out_of_sync_ to indicate the view is currently out of sync. // This doesn't update the view under the mouse immediately as it may cause // timing problems. @@ -139,12 +142,14 @@ void TooltipManager::UpdateTooltip() { SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); } -void TooltipManager::TooltipTextChanged(View* view) { +void TooltipManagerWin::TooltipTextChanged(View* view) { if (view == last_tooltip_view_) UpdateTooltip(last_mouse_x_, last_mouse_y_); } -LRESULT TooltipManager::OnNotify(int w_param, NMHDR* l_param, bool* handled) { +LRESULT TooltipManagerWin::OnNotify(int w_param, + NMHDR* l_param, + bool* handled) { *handled = false; if (l_param->hwndFrom == tooltip_hwnd_ && keyboard_tooltip_hwnd_ == NULL) { switch (l_param->code) { @@ -219,7 +224,7 @@ LRESULT TooltipManager::OnNotify(int w_param, NMHDR* l_param, bool* handled) { return 0; } -bool TooltipManager::SetTooltipPosition(int text_x, int text_y) { +bool TooltipManagerWin::SetTooltipPosition(int text_x, int text_y) { // NOTE: this really only tests that the y location fits on screen, but that // is good enough for our usage. @@ -247,7 +252,7 @@ bool TooltipManager::SetTooltipPosition(int text_x, int text_y) { return true; } -int TooltipManager::CalcTooltipHeight() { +int TooltipManagerWin::CalcTooltipHeight() { // Ask the tooltip for it's font. int height; HFONT hfont = reinterpret_cast<HFONT>( @@ -274,12 +279,12 @@ int TooltipManager::CalcTooltipHeight() { return height + tooltip_margin.top + tooltip_margin.bottom; } -void TooltipManager::TrimTooltipToFit(std::wstring* text, - int* max_width, - int* line_count, - int position_x, - int position_y, - HWND window) { +void TooltipManagerWin::TrimTooltipToFit(std::wstring* text, + int* max_width, + int* line_count, + int position_x, + int position_y, + HWND window) { *max_width = 0; *line_count = 0; @@ -326,7 +331,7 @@ void TooltipManager::TrimTooltipToFit(std::wstring* text, *text = result; } -void TooltipManager::UpdateTooltip(int x, int y) { +void TooltipManagerWin::UpdateTooltip(int x, int y) { RootView* root_view = widget_->GetRootView(); View* view = root_view->GetViewForPoint(gfx::Point(x, y)); if (view != last_tooltip_view_) { @@ -353,7 +358,7 @@ void TooltipManager::UpdateTooltip(int x, int y) { } } -void TooltipManager::OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param) { +void TooltipManagerWin::OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param) { int x = GET_X_LPARAM(l_param); int y = GET_Y_LPARAM(l_param); @@ -373,14 +378,14 @@ void TooltipManager::OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param) { } // Forward the message onto the tooltip. MSG msg; - msg.hwnd = parent_; + msg.hwnd = GetParent(); msg.message = u_msg; msg.wParam = w_param; msg.lParam = l_param; SendMessage(tooltip_hwnd_, TTM_RELAYEVENT, 0, (LPARAM)&msg); } -void TooltipManager::ShowKeyboardTooltip(View* focused_view) { +void TooltipManagerWin::ShowKeyboardTooltip(View* focused_view) { if (tooltip_showing_) { SendMessage(tooltip_hwnd_, TTM_POP, 0, 0); tooltip_text_.clear(); @@ -407,7 +412,7 @@ void TooltipManager::ShowKeyboardTooltip(View* focused_view) { TOOLINFO keyboard_toolinfo; memset(&keyboard_toolinfo, 0, sizeof(keyboard_toolinfo)); keyboard_toolinfo.cbSize = sizeof(keyboard_toolinfo); - keyboard_toolinfo.hwnd = parent_; + keyboard_toolinfo.hwnd = GetParent(); keyboard_toolinfo.uFlags = TTF_TRACK | TTF_TRANSPARENT | TTF_IDISHWND ; keyboard_toolinfo.lpszText = const_cast<WCHAR*>(tooltip_text.c_str()); SendMessage(keyboard_tooltip_hwnd_, TTM_ADDTOOL, 0, @@ -429,18 +434,19 @@ void TooltipManager::ShowKeyboardTooltip(View* focused_view) { SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); MessageLoop::current()->PostDelayedTask(FROM_HERE, keyboard_tooltip_factory_.NewRunnableMethod( - &TooltipManager::DestroyKeyboardTooltipWindow, keyboard_tooltip_hwnd_), + &TooltipManagerWin::DestroyKeyboardTooltipWindow, + keyboard_tooltip_hwnd_), kDefaultTimeout); } -void TooltipManager::HideKeyboardTooltip() { +void TooltipManagerWin::HideKeyboardTooltip() { if (keyboard_tooltip_hwnd_ != NULL) { SendMessage(keyboard_tooltip_hwnd_, WM_CLOSE, 0, 0); keyboard_tooltip_hwnd_ = NULL; } } -void TooltipManager::DestroyKeyboardTooltipWindow(HWND window_to_destroy) { +void TooltipManagerWin::DestroyKeyboardTooltipWindow(HWND window_to_destroy) { if (keyboard_tooltip_hwnd_ == window_to_destroy) HideKeyboardTooltip(); } diff --git a/views/widget/tooltip_manager_win.h b/views/widget/tooltip_manager_win.h new file mode 100644 index 0000000..b2213c3 --- /dev/null +++ b/views/widget/tooltip_manager_win.h @@ -0,0 +1,160 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ +#define VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ + +#include <windows.h> +#include <commctrl.h> +#include <string> + +#include "base/basictypes.h" +#include "base/gfx/native_widget_types.h" +#include "base/task.h" +#include "views/widget/tooltip_manager.h" + +namespace gfx { +class Font; +} + +namespace views { + +class View; +class Widget; + +// TooltipManager implementation for Windows. +// +// This class is intended to be used by WidgetWin. To use this, you must +// do the following: +// Add the following to your MSG_MAP: +// +// MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) +// MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) +// MSG_WM_NOTIFY(OnNotify) +// +// With the following implementations: +// LRESULT XXX::OnMouseRange(UINT u_msg, WPARAM w_param, LPARAM l_param, +// BOOL& handled) { +// tooltip_manager_->OnMouse(u_msg, w_param, l_param); +// handled = FALSE; +// return 0; +// } +// +// LRESULT XXX::OnNotify(int w_param, NMHDR* l_param) { +// bool handled; +// LRESULT result = tooltip_manager_->OnNotify(w_param, l_param, &handled); +// SetMsgHandled(handled); +// return result; +// } +// +// And of course you'll need to create the TooltipManager! +// +// Lastly, you'll need to override GetTooltipManager. +// +// See WidgetWin for an example of this in action. +class TooltipManagerWin : public TooltipManager { + public: + // Creates a TooltipManager for the specified Widget and parent window. + explicit TooltipManagerWin(Widget* widget); + virtual ~TooltipManagerWin(); + + // Notification that the view hierarchy has changed in some way. + virtual void UpdateTooltip(); + + // Invoked when the tooltip text changes for the specified views. + virtual void TooltipTextChanged(View* view); + + // Invoked when toolbar icon gets focus. + virtual void ShowKeyboardTooltip(View* view); + + // Invoked when toolbar loses focus. + virtual void HideKeyboardTooltip(); + + // Message handlers. These forward to the tooltip control. + virtual void OnMouse(UINT u_msg, WPARAM w_param, LPARAM l_param); + LRESULT OnNotify(int w_param, NMHDR* l_param, bool* handled); + // Not used directly by TooltipManager, but provided for AeroTooltipManager. + virtual void OnMouseLeave() {} + + protected: + virtual void Init(); + + // Returns the Widget we're showing tooltips for. + gfx::NativeView GetParent(); + + // Updates the tooltip for the specified location. + void UpdateTooltip(int x, int y); + + // Tooltip control window. + HWND tooltip_hwnd_; + + // Tooltip information. + TOOLINFO toolinfo_; + + // Last location of the mouse. This is in the coordinates of the rootview. + int last_mouse_x_; + int last_mouse_y_; + + // Whether or not the tooltip is showing. + bool tooltip_showing_; + + private: + // Sets the tooltip position based on the x/y position of the text. If the + // tooltip fits, true is returned. + bool SetTooltipPosition(int text_x, int text_y); + + // Calculates the preferred height for tooltips. This always returns a + // positive value. + int CalcTooltipHeight(); + + // Trims the tooltip to fit, setting text to the clipped result, width to the + // width (in pixels) of the clipped text and line_count to the number of lines + // of text in the tooltip. + void TrimTooltipToFit(std::wstring* text, + int* width, + int* line_count, + int position_x, + int position_y, + HWND window); + + // Invoked when the timer elapses and tooltip has to be destroyed. + void DestroyKeyboardTooltipWindow(HWND window_to_destroy); + + // Hosting Widget. + Widget* widget_; + + // The View the mouse is under. This is null if the mouse isn't under a + // View. + View* last_tooltip_view_; + + // Whether or not the view under the mouse needs to be refreshed. If this + // is true, when the tooltip is asked for the view under the mouse is + // refreshed. + bool last_view_out_of_sync_; + + // Text for tooltip from the view. + std::wstring tooltip_text_; + + // The clipped tooltip. + std::wstring clipped_text_; + + // Number of lines in the tooltip. + int line_count_; + + // Width of the last tooltip. + int tooltip_width_; + + // control window for tooltip displayed using keyboard. + HWND keyboard_tooltip_hwnd_; + + // Used to register DestroyTooltipWindow function with PostDelayedTask + // function. + ScopedRunnableMethodFactory<TooltipManagerWin> keyboard_tooltip_factory_; + + DISALLOW_COPY_AND_ASSIGN(TooltipManagerWin); +}; + +} // namespace views + +#endif // VIEWS_WIDGET_TOOLTIP_MANAGER_WIN_H_ diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc index 96a2ad3..a1d30f6 100644 --- a/views/widget/widget_gtk.cc +++ b/views/widget/widget_gtk.cc @@ -7,6 +7,7 @@ #include "base/compiler_specific.h" #include "views/fill_layout.h" #include "views/widget/root_view.h" +#include "views/widget/tooltip_manager_gtk.h" #include "views/window/window_gtk.h" namespace views { @@ -152,6 +153,8 @@ void WidgetGtk::Init(GtkWidget* parent, // g_signal_connect(G_OBJECT(widget_), "drag_data_received", // G_CALLBACK(drag_data_received_event_cb), NULL); + tooltip_manager_.reset(new TooltipManagerGtk(this)); + if (type_ == TYPE_CHILD) { WidgetGtk* parent_widget = GetViewForNative(parent); parent_widget->AddChild(widget_); @@ -301,8 +304,7 @@ bool WidgetGtk::IsActive() const { } TooltipManager* WidgetGtk::GetTooltipManager() { - NOTIMPLEMENTED(); - return NULL; + return tooltip_manager_.get(); } bool WidgetGtk::GetAccelerator(int cmd_id, Accelerator* accelerator) { diff --git a/views/widget/widget_gtk.h b/views/widget/widget_gtk.h index 7cbc87e..3d57e4f 100644 --- a/views/widget/widget_gtk.h +++ b/views/widget/widget_gtk.h @@ -16,6 +16,7 @@ class Rect; namespace views { +class TooltipManagerGtk; class View; class WindowGtk; @@ -172,6 +173,8 @@ class WidgetGtk : public Widget, public MessageLoopForUI::Observer { // The root of the View hierarchy attached to this window. scoped_ptr<RootView> root_view_; + scoped_ptr<TooltipManagerGtk> tooltip_manager_; + // If true, the mouse is currently down. bool is_mouse_down_; diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc index 039ab36..516b771 100644 --- a/views/widget/widget_win.cc +++ b/views/widget/widget_win.cc @@ -203,9 +203,9 @@ void WidgetWin::Init(HWND parent, const gfx::Rect& bounds, // that window controls in Chrome windows don't flicker when you move your // mouse over them. See comment in aero_tooltip_manager.h. if (win_util::ShouldUseVistaFrame()) { - tooltip_manager_.reset(new AeroTooltipManager(this, GetNativeView())); + tooltip_manager_.reset(new AeroTooltipManager(this)); } else { - tooltip_manager_.reset(new TooltipManager(this, GetNativeView())); + tooltip_manager_.reset(new TooltipManagerWin(this)); } // This message initializes the window so that focus border are shown for diff --git a/views/widget/widget_win.h b/views/widget/widget_win.h index ebf6bfa..fa6bab6 100644 --- a/views/widget/widget_win.h +++ b/views/widget/widget_win.h @@ -24,7 +24,7 @@ class Rect; namespace views { class RootView; -class TooltipManager; +class TooltipManagerWin; class DefaultThemeProvider; class Window; @@ -506,7 +506,17 @@ class WidgetWin : public Widget, // Returns true if this WidgetWin is opaque. bool opaque() const { return opaque_; } + // The TooltipManager. + // WARNING: RootView's destructor calls into the TooltipManager. As such, this + // must be destroyed AFTER root_view_. This really only matters during + // WM_SESSIONEND, as normally the hwnd is destroyed which tiggers unsetting + // the widget in the RootView so that RootView's destructor doesn't call into + // the TooltipManager. + scoped_ptr<TooltipManagerWin> tooltip_manager_; + // The root of the View hierarchy attached to this window. + // WARNING: see warning in tooltip_manager_ for ordering dependencies with + // this and tooltip_manager_. scoped_ptr<RootView> root_view_; // Whether or not we have capture the mouse. @@ -515,8 +525,6 @@ class WidgetWin : public Widget, // If true, the mouse is currently down. bool is_mouse_down_; - scoped_ptr<TooltipManager> tooltip_manager_; - // Are a subclass of WindowWin? bool is_window_; |