OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/views/corewm/tooltip_controller.h" | 5 #include "ui/views/corewm/tooltip_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "ui/aura/client/capture_client.h" | 11 #include "ui/aura/client/capture_client.h" |
12 #include "ui/aura/client/cursor_client.h" | 12 #include "ui/aura/client/cursor_client.h" |
13 #include "ui/aura/client/screen_position_client.h" | 13 #include "ui/aura/client/screen_position_client.h" |
14 #include "ui/aura/env.h" | 14 #include "ui/aura/env.h" |
15 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
16 #include "ui/events/event.h" | 16 #include "ui/events/event.h" |
17 #include "ui/gfx/font.h" | 17 #include "ui/gfx/font.h" |
18 #include "ui/gfx/geometry/rect.h" | 18 #include "ui/gfx/geometry/rect.h" |
19 #include "ui/gfx/screen.h" | 19 #include "ui/gfx/screen.h" |
| 20 #include "ui/gfx/text_elider.h" |
20 #include "ui/views/corewm/tooltip.h" | 21 #include "ui/views/corewm/tooltip.h" |
21 #include "ui/views/widget/tooltip_manager.h" | 22 #include "ui/views/widget/tooltip_manager.h" |
22 #include "ui/wm/public/drag_drop_client.h" | 23 #include "ui/wm/public/drag_drop_client.h" |
23 | 24 |
24 namespace views { | 25 namespace views { |
25 namespace corewm { | 26 namespace corewm { |
26 namespace { | 27 namespace { |
27 | 28 |
28 const int kTooltipTimeoutMs = 500; | 29 const int kTooltipTimeoutMs = 500; |
29 const int kDefaultTooltipShownTimeoutMs = 10000; | 30 const int kDefaultTooltipShownTimeoutMs = 10000; |
| 31 const size_t kMaxTooltipLength = 1024; |
30 | 32 |
31 // Returns true if |target| is a valid window to get the tooltip from. | 33 // Returns true if |target| is a valid window to get the tooltip from. |
32 // |event_target| is the original target from the event and |target| the window | 34 // |event_target| is the original target from the event and |target| the window |
33 // at the same location. | 35 // at the same location. |
34 bool IsValidTarget(aura::Window* event_target, aura::Window* target) { | 36 bool IsValidTarget(aura::Window* event_target, aura::Window* target) { |
35 if (!target || (event_target == target)) | 37 if (!target || (event_target == target)) |
36 return true; | 38 return true; |
37 | 39 |
38 void* event_target_grouping_id = event_target->GetNativeWindowProperty( | 40 void* event_target_grouping_id = event_target->GetNativeWindowProperty( |
39 TooltipManager::kGroupingPropertyKey); | 41 TooltipManager::kGroupingPropertyKey); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 tooltip_timer_.Start(FROM_HERE, | 124 tooltip_timer_.Start(FROM_HERE, |
123 base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), | 125 base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), |
124 this, &TooltipController::TooltipTimerFired); | 126 this, &TooltipController::TooltipTimerFired); |
125 } | 127 } |
126 | 128 |
127 TooltipController::~TooltipController() { | 129 TooltipController::~TooltipController() { |
128 if (tooltip_window_) | 130 if (tooltip_window_) |
129 tooltip_window_->RemoveObserver(this); | 131 tooltip_window_->RemoveObserver(this); |
130 } | 132 } |
131 | 133 |
| 134 int TooltipController::GetMaxWidth(const gfx::Point& location, |
| 135 gfx::NativeView context) const { |
| 136 return tooltip_->GetMaxWidth(location, context); |
| 137 } |
| 138 |
132 void TooltipController::UpdateTooltip(aura::Window* target) { | 139 void TooltipController::UpdateTooltip(aura::Window* target) { |
133 // If tooltip is visible, we may want to hide it. If it is not, we are ok. | 140 // If tooltip is visible, we may want to hide it. If it is not, we are ok. |
134 if (tooltip_window_ == target && tooltip_->IsVisible()) | 141 if (tooltip_window_ == target && tooltip_->IsVisible()) |
135 UpdateIfRequired(); | 142 UpdateIfRequired(); |
136 | 143 |
137 // Reset |tooltip_window_at_mouse_press_| if the moving within the same window | 144 // Reset |tooltip_window_at_mouse_press_| if the moving within the same window |
138 // but over a region that has different tooltip text. By resetting | 145 // but over a region that has different tooltip text. By resetting |
139 // |tooltip_window_at_mouse_press_| we ensure the next time the timer fires | 146 // |tooltip_window_at_mouse_press_| we ensure the next time the timer fires |
140 // we'll requery for the tooltip text. | 147 // we'll requery for the tooltip text. |
141 // This handles the case of clicking on a view, moving within the same window | 148 // This handles the case of clicking on a view, moving within the same window |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 tooltip_id_ = tooltip_id; | 298 tooltip_id_ = tooltip_id; |
292 | 299 |
293 // We add the !tooltip_->IsVisible() below because when we come here from | 300 // We add the !tooltip_->IsVisible() below because when we come here from |
294 // TooltipTimerFired(), the tooltip_text may not have changed but we still | 301 // TooltipTimerFired(), the tooltip_text may not have changed but we still |
295 // want to update the tooltip because the timer has fired. | 302 // want to update the tooltip because the timer has fired. |
296 // If we come here from UpdateTooltip(), we have already checked for tooltip | 303 // If we come here from UpdateTooltip(), we have already checked for tooltip |
297 // visibility and this check below will have no effect. | 304 // visibility and this check below will have no effect. |
298 if (tooltip_text_ != tooltip_text || !tooltip_->IsVisible() || ids_differ) { | 305 if (tooltip_text_ != tooltip_text || !tooltip_->IsVisible() || ids_differ) { |
299 tooltip_shown_timer_.Stop(); | 306 tooltip_shown_timer_.Stop(); |
300 tooltip_text_ = tooltip_text; | 307 tooltip_text_ = tooltip_text; |
301 base::string16 trimmed_text(tooltip_text_); | 308 base::string16 trimmed_text = |
302 views::TooltipManager::TrimTooltipText(&trimmed_text); | 309 gfx::TruncateString(tooltip_text_, kMaxTooltipLength, gfx::WORD_BREAK); |
303 // If the string consists entirely of whitespace, then don't both showing it | 310 // If the string consists entirely of whitespace, then don't both showing it |
304 // (an empty tooltip is useless). | 311 // (an empty tooltip is useless). |
305 base::string16 whitespace_removed_text; | 312 base::string16 whitespace_removed_text; |
306 base::TrimWhitespace(trimmed_text, base::TRIM_ALL, | 313 base::TrimWhitespace(trimmed_text, base::TRIM_ALL, |
307 &whitespace_removed_text); | 314 &whitespace_removed_text); |
308 if (whitespace_removed_text.empty()) { | 315 if (whitespace_removed_text.empty()) { |
309 tooltip_->Hide(); | 316 tooltip_->Hide(); |
310 } else { | 317 } else { |
311 gfx::Point widget_loc = curr_mouse_loc_ + | 318 gfx::Point widget_loc = curr_mouse_loc_ + |
312 tooltip_window_->GetBoundsInScreen().OffsetFromOrigin(); | 319 tooltip_window_->GetBoundsInScreen().OffsetFromOrigin(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 return; | 366 return; |
360 if (tooltip_window_) | 367 if (tooltip_window_) |
361 tooltip_window_->RemoveObserver(this); | 368 tooltip_window_->RemoveObserver(this); |
362 tooltip_window_ = target; | 369 tooltip_window_ = target; |
363 if (tooltip_window_) | 370 if (tooltip_window_) |
364 tooltip_window_->AddObserver(this); | 371 tooltip_window_->AddObserver(this); |
365 } | 372 } |
366 | 373 |
367 } // namespace corewm | 374 } // namespace corewm |
368 } // namespace views | 375 } // namespace views |
OLD | NEW |