diff options
Diffstat (limited to 'views/widget/tooltip_manager_win.cc')
-rw-r--r-- | views/widget/tooltip_manager_win.cc | 83 |
1 files changed, 5 insertions, 78 deletions
diff --git a/views/widget/tooltip_manager_win.cc b/views/widget/tooltip_manager_win.cc index 3c20da0..fed6c02 100644 --- a/views/widget/tooltip_manager_win.cc +++ b/views/widget/tooltip_manager_win.cc @@ -7,7 +7,7 @@ #include <windowsx.h> #include <limits> -#include "app/gfx/text_elider.h" +#include "app/gfx/font.h" #include "app/l10n_util.h" #include "app/l10n_util_win.h" #include "app/win_util.h" @@ -25,26 +25,6 @@ static int tooltip_height_ = 0; // Timeout is mentioned in milliseconds. static const int kDefaultTimeout = 4000; -// Maximum number of lines we allow in the tooltip. -static const int kMaxLines = 6; - -// Maximum number of characters we allow in a tooltip. -static const int kMaxTooltipLength = 1024; - -// Breaks |text| along line boundaries, placing each line of text into lines. -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(TooltipManagerWin::GetLineSeparator(), index)) - != std::wstring::npos && lines->size() < kMaxLines) { - lines->push_back(text.substr(index, next_index - index)); - index = next_index + TooltipManagerWin::GetLineSeparator().size(); - } - if (next_index != text.size() && lines->size() < kMaxLines) - lines->push_back(text.substr(index, text.size() - index)); -} - // static int TooltipManager::GetTooltipHeight() { DCHECK(tooltip_height_ > 0); @@ -181,8 +161,10 @@ LRESULT TooltipManagerWin::OnNotify(int w_param, !tooltip_text_.empty()) { // View has a valid tip, copy it into TOOLTIPINFO. clipped_text_ = tooltip_text_; + gfx::Point screen_loc(last_mouse_x_, last_mouse_y_); + View::ConvertPointToScreen(widget_->GetRootView(), &screen_loc); TrimTooltipToFit(&clipped_text_, &tooltip_width_, &line_count_, - last_mouse_x_, last_mouse_y_, tooltip_hwnd_); + screen_loc.x(), screen_loc.y()); // Adjust the clipped tooltip text for locale direction. l10n_util::AdjustStringForLocaleDirection(clipped_text_, &clipped_text_); @@ -279,58 +261,6 @@ int TooltipManagerWin::CalcTooltipHeight() { return height + tooltip_margin.top + tooltip_margin.bottom; } -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; - - // Clamp the tooltip length to kMaxTooltipLength so that we don't - // accidentally DOS the user with a mega tooltip (since Windows doesn't seem - // to do this itself). - if (text->length() > kMaxTooltipLength) - *text = text->substr(0, kMaxTooltipLength); - - // Determine the available width for the tooltip. - gfx::Point screen_loc(position_x, position_y); - View::ConvertPointToScreen(widget_->GetRootView(), &screen_loc); - gfx::Rect monitor_bounds = - win_util::GetMonitorBoundsForRect(gfx::Rect(screen_loc.x(), - screen_loc.y(), - 0, 0)); - RECT tooltip_margin; - SendMessage(window, TTM_GETMARGIN, 0, (LPARAM)&tooltip_margin); - const int available_width = monitor_bounds.width() - tooltip_margin.left - - tooltip_margin.right; - if (available_width <= 0) - return; - - // Split the string. - std::vector<std::wstring> lines; - SplitTooltipString(*text, &lines); - *line_count = static_cast<int>(lines.size()); - - // Format each line to fit. - gfx::Font font = GetDefaultFont(); - std::wstring result; - for (std::vector<std::wstring>::iterator i = lines.begin(); i != lines.end(); - ++i) { - std::wstring elided_text = gfx::ElideText(*i, font, available_width); - *max_width = std::max(*max_width, font.GetStringWidth(elided_text)); - if (i == lines.begin() && i + 1 == lines.end()) { - *text = elided_text; - return; - } - if (!result.empty()) - result.append(GetLineSeparator()); - result.append(elided_text); - } - *text = result; -} - void TooltipManagerWin::UpdateTooltip(int x, int y) { RootView* root_view = widget_->GetRootView(); View* view = root_view->GetViewForPoint(gfx::Point(x, y)); @@ -397,8 +327,6 @@ void TooltipManagerWin::ShowKeyboardTooltip(View* focused_view) { gfx::Rect focused_bounds = focused_view->bounds(); gfx::Point screen_point; focused_view->ConvertPointToScreen(focused_view, &screen_point); - gfx::Point relative_point_coordinates; - focused_view->ConvertPointToWidget(focused_view, &relative_point_coordinates); keyboard_tooltip_hwnd_ = CreateWindowEx( WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(), TOOLTIPS_CLASS, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); @@ -407,8 +335,7 @@ void TooltipManagerWin::ShowKeyboardTooltip(View* focused_view) { int tooltip_width; int line_count; TrimTooltipToFit(&tooltip_text, &tooltip_width, &line_count, - relative_point_coordinates.x(), - relative_point_coordinates.y(), keyboard_tooltip_hwnd_); + screen_point.x(), screen_point.y()); TOOLINFO keyboard_toolinfo; memset(&keyboard_toolinfo, 0, sizeof(keyboard_toolinfo)); keyboard_toolinfo.cbSize = sizeof(keyboard_toolinfo); |