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 "ash/tooltips/tooltip_controller.h" | 5 #include "ash/tooltips/tooltip_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 const int kTooltipMaxWidthPixels = 400; | 41 const int kTooltipMaxWidthPixels = 400; |
42 | 42 |
43 // Maximum number of lines we allow in the tooltip. | 43 // Maximum number of lines we allow in the tooltip. |
44 const size_t kMaxLines = 10; | 44 const size_t kMaxLines = 10; |
45 | 45 |
46 // TODO(derat): This padding is needed on Chrome OS devices but seems excessive | 46 // TODO(derat): This padding is needed on Chrome OS devices but seems excessive |
47 // when running the same binary on a Linux workstation; presumably there's a | 47 // when running the same binary on a Linux workstation; presumably there's a |
48 // difference in font metrics. Rationalize this. | 48 // difference in font metrics. Rationalize this. |
49 const int kTooltipVerticalPadding = 2; | 49 const int kTooltipVerticalPadding = 2; |
50 const int kTooltipTimeoutMs = 500; | 50 const int kTooltipTimeoutMs = 500; |
| 51 const int kTooltipShownTimeoutMs = 10000; |
51 | 52 |
52 // FIXME: get cursor offset from actual cursor size. | 53 // FIXME: get cursor offset from actual cursor size. |
53 const int kCursorOffsetX = 10; | 54 const int kCursorOffsetX = 10; |
54 const int kCursorOffsetY = 15; | 55 const int kCursorOffsetY = 15; |
55 | 56 |
56 // Maximum number of characters we allow in a tooltip. | 57 // Maximum number of characters we allow in a tooltip. |
57 const size_t kMaxTooltipLength = 1024; | 58 const size_t kMaxTooltipLength = 1024; |
58 | 59 |
59 gfx::Font GetDefaultFont() { | 60 gfx::Font GetDefaultFont() { |
60 // TODO(varunjain): implementation duplicated in tooltip_manager_aura. Figure | 61 // TODO(varunjain): implementation duplicated in tooltip_manager_aura. Figure |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 195 |
195 TooltipController::~TooltipController() { | 196 TooltipController::~TooltipController() { |
196 if (tooltip_window_) | 197 if (tooltip_window_) |
197 tooltip_window_->RemoveObserver(this); | 198 tooltip_window_->RemoveObserver(this); |
198 } | 199 } |
199 | 200 |
200 void TooltipController::UpdateTooltip(aura::Window* target) { | 201 void TooltipController::UpdateTooltip(aura::Window* target) { |
201 // If tooltip is visible, we may want to hide it. If it is not, we are ok. | 202 // If tooltip is visible, we may want to hide it. If it is not, we are ok. |
202 if (tooltip_window_ == target && tooltip_->IsVisible()) | 203 if (tooltip_window_ == target && tooltip_->IsVisible()) |
203 UpdateIfRequired(); | 204 UpdateIfRequired(); |
| 205 |
| 206 // If we had stopped the tooltip timer for some reason, we must restart it if |
| 207 // there is a change in the tooltip. |
| 208 if (!tooltip_timer_.IsRunning()) { |
| 209 if (tooltip_window_ != target || (tooltip_window_ && |
| 210 tooltip_text_ != aura::client::GetTooltipText(tooltip_window_))) { |
| 211 tooltip_timer_.Start(FROM_HERE, |
| 212 base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), |
| 213 this, &TooltipController::TooltipTimerFired); |
| 214 } |
| 215 } |
204 } | 216 } |
205 | 217 |
206 void TooltipController::SetTooltipsEnabled(bool enable) { | 218 void TooltipController::SetTooltipsEnabled(bool enable) { |
207 if (tooltips_enabled_ == enable) | 219 if (tooltips_enabled_ == enable) |
208 return; | 220 return; |
209 tooltips_enabled_ = enable; | 221 tooltips_enabled_ = enable; |
210 UpdateTooltip(tooltip_window_); | 222 UpdateTooltip(tooltip_window_); |
211 } | 223 } |
212 | 224 |
213 bool TooltipController::PreHandleKeyEvent(aura::Window* target, | 225 bool TooltipController::PreHandleKeyEvent(aura::Window* target, |
214 aura::KeyEvent* event) { | 226 aura::KeyEvent* event) { |
| 227 // On key press, we want to hide the tooltip and not show it until change. |
| 228 // This is the same behavior as hiding tooltips on timeout. Hence, we can |
| 229 // simply simulate a timeout. |
| 230 if (tooltip_shown_timer_.IsRunning()) { |
| 231 tooltip_shown_timer_.Stop(); |
| 232 TooltipShownTimerFired(); |
| 233 } |
215 return false; | 234 return false; |
216 } | 235 } |
217 | 236 |
218 bool TooltipController::PreHandleMouseEvent(aura::Window* target, | 237 bool TooltipController::PreHandleMouseEvent(aura::Window* target, |
219 aura::MouseEvent* event) { | 238 aura::MouseEvent* event) { |
220 switch (event->type()) { | 239 switch (event->type()) { |
221 case ui::ET_MOUSE_MOVED: | 240 case ui::ET_MOUSE_MOVED: |
222 case ui::ET_MOUSE_DRAGGED: | 241 case ui::ET_MOUSE_DRAGGED: |
223 if (tooltip_window_ != target) { | 242 if (tooltip_window_ != target) { |
224 if (tooltip_window_) | 243 if (tooltip_window_) |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 result.append(*l); | 386 result.append(*l); |
368 } | 387 } |
369 } | 388 } |
370 *text = result; | 389 *text = result; |
371 } | 390 } |
372 | 391 |
373 void TooltipController::TooltipTimerFired() { | 392 void TooltipController::TooltipTimerFired() { |
374 UpdateIfRequired(); | 393 UpdateIfRequired(); |
375 } | 394 } |
376 | 395 |
| 396 void TooltipController::TooltipShownTimerFired() { |
| 397 tooltip_->Hide(); |
| 398 |
| 399 // Since the user presumably no longer needs the tooltip, we also stop the |
| 400 // tooltip timer so that tooltip does not pop back up. We will restart this |
| 401 // timer if the tooltip changes (see UpdateTooltip()). |
| 402 tooltip_timer_.Stop(); |
| 403 } |
| 404 |
377 void TooltipController::UpdateIfRequired() { | 405 void TooltipController::UpdateIfRequired() { |
378 if (!tooltips_enabled_ || mouse_pressed_ || IsDragDropInProgress() || | 406 if (!tooltips_enabled_ || mouse_pressed_ || IsDragDropInProgress() || |
379 !aura::Env::GetInstance()->cursor_manager()->cursor_visible()) { | 407 !aura::Env::GetInstance()->cursor_manager()->cursor_visible()) { |
380 tooltip_->Hide(); | 408 tooltip_->Hide(); |
381 return; | 409 return; |
382 } | 410 } |
383 | 411 |
384 string16 tooltip_text; | 412 string16 tooltip_text; |
385 if (tooltip_window_) | 413 if (tooltip_window_) |
386 tooltip_text = aura::client::GetTooltipText(tooltip_window_); | 414 tooltip_text = aura::client::GetTooltipText(tooltip_window_); |
387 | 415 |
388 // If the user pressed a mouse button. We will hide the tooltip and not show | 416 // If the user pressed a mouse button. We will hide the tooltip and not show |
389 // it until there is a change in the tooltip. | 417 // it until there is a change in the tooltip. |
390 if (tooltip_window_at_mouse_press_) { | 418 if (tooltip_window_at_mouse_press_) { |
391 if (tooltip_window_ == tooltip_window_at_mouse_press_ && | 419 if (tooltip_window_ == tooltip_window_at_mouse_press_ && |
392 tooltip_text == tooltip_text_at_mouse_press_) { | 420 tooltip_text == tooltip_text_at_mouse_press_) { |
393 tooltip_->Hide(); | 421 tooltip_->Hide(); |
394 return; | 422 return; |
395 } | 423 } |
396 tooltip_window_at_mouse_press_ = NULL; | 424 tooltip_window_at_mouse_press_ = NULL; |
397 } | 425 } |
398 | 426 |
399 // We add the !tooltip_->IsVisible() below because when we come here from | 427 // We add the !tooltip_->IsVisible() below because when we come here from |
400 // TooltipTimerFired(), the tooltip_text may not have changed but we still | 428 // TooltipTimerFired(), the tooltip_text may not have changed but we still |
401 // want to update the tooltip because the timer has fired. | 429 // want to update the tooltip because the timer has fired. |
402 // If we come here from UpdateTooltip(), we have already checked for tooltip | 430 // If we come here from UpdateTooltip(), we have already checked for tooltip |
403 // visibility and this check below will have no effect. | 431 // visibility and this check below will have no effect. |
404 if (tooltip_text_ != tooltip_text || !tooltip_->IsVisible()) { | 432 if (tooltip_text_ != tooltip_text || !tooltip_->IsVisible()) { |
| 433 tooltip_shown_timer_.Stop(); |
405 tooltip_text_ = tooltip_text; | 434 tooltip_text_ = tooltip_text; |
406 if (tooltip_text_.empty()) { | 435 if (tooltip_text_.empty()) { |
407 tooltip_->Hide(); | 436 tooltip_->Hide(); |
408 } else { | 437 } else { |
409 string16 tooltip_text(tooltip_text_); | 438 string16 tooltip_text(tooltip_text_); |
410 gfx::Point widget_loc = curr_mouse_loc_; | 439 gfx::Point widget_loc = curr_mouse_loc_; |
411 widget_loc = widget_loc.Add( | 440 widget_loc = widget_loc.Add( |
412 tooltip_window_->GetScreenBounds().origin()); | 441 tooltip_window_->GetScreenBounds().origin()); |
413 tooltip_->SetText(tooltip_text, widget_loc); | 442 tooltip_->SetText(tooltip_text, widget_loc); |
414 tooltip_->Show(); | 443 tooltip_->Show(); |
| 444 tooltip_shown_timer_.Start(FROM_HERE, |
| 445 base::TimeDelta::FromMilliseconds(kTooltipShownTimeoutMs), |
| 446 this, &TooltipController::TooltipShownTimerFired); |
415 } | 447 } |
416 } | 448 } |
417 } | 449 } |
418 | 450 |
419 bool TooltipController::IsTooltipVisible() { | 451 bool TooltipController::IsTooltipVisible() { |
420 return tooltip_->IsVisible(); | 452 return tooltip_->IsVisible(); |
421 } | 453 } |
422 | 454 |
423 bool TooltipController::IsDragDropInProgress() { | 455 bool TooltipController::IsDragDropInProgress() { |
424 return drag_drop_client_->IsDragDropInProgress(); | 456 return drag_drop_client_->IsDragDropInProgress(); |
425 } | 457 } |
426 | 458 |
427 } // namespace internal | 459 } // namespace internal |
428 } // namespace ash | 460 } // namespace ash |
OLD | NEW |