Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Unified Diff: ui/views/corewm/tooltip_controller.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/corewm/tooltip_controller.h ('k') | ui/views/corewm/tooltip_controller_test_helper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/corewm/tooltip_controller.cc
diff --git a/ui/views/corewm/tooltip_controller.cc b/ui/views/corewm/tooltip_controller.cc
deleted file mode 100644
index b1ffc1c7de8e61093d83bcc5c35bbdf21c07df74..0000000000000000000000000000000000000000
--- a/ui/views/corewm/tooltip_controller.cc
+++ /dev/null
@@ -1,368 +0,0 @@
-// Copyright (c) 2012 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 "ui/views/corewm/tooltip_controller.h"
-
-#include <vector>
-
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "ui/aura/client/capture_client.h"
-#include "ui/aura/client/cursor_client.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/events/event.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/screen.h"
-#include "ui/views/corewm/tooltip.h"
-#include "ui/views/widget/tooltip_manager.h"
-#include "ui/wm/public/drag_drop_client.h"
-
-namespace views {
-namespace corewm {
-namespace {
-
-const int kTooltipTimeoutMs = 500;
-const int kDefaultTooltipShownTimeoutMs = 10000;
-
-// Returns true if |target| is a valid window to get the tooltip from.
-// |event_target| is the original target from the event and |target| the window
-// at the same location.
-bool IsValidTarget(aura::Window* event_target, aura::Window* target) {
- if (!target || (event_target == target))
- return true;
-
- void* event_target_grouping_id = event_target->GetNativeWindowProperty(
- TooltipManager::kGroupingPropertyKey);
- void* target_grouping_id = target->GetNativeWindowProperty(
- TooltipManager::kGroupingPropertyKey);
- return event_target_grouping_id &&
- event_target_grouping_id == target_grouping_id;
-}
-
-// Returns the target (the Window tooltip text comes from) based on the event.
-// If a Window other than event.target() is returned, |location| is adjusted
-// to be in the coordinates of the returned Window.
-aura::Window* GetTooltipTarget(const ui::MouseEvent& event,
- gfx::Point* location) {
- switch (event.type()) {
- case ui::ET_MOUSE_CAPTURE_CHANGED:
- // On windows we can get a capture changed without an exit. We need to
- // reset state when this happens else the tooltip may incorrectly show.
- return NULL;
- case ui::ET_MOUSE_EXITED:
- return NULL;
- case ui::ET_MOUSE_MOVED:
- case ui::ET_MOUSE_DRAGGED: {
- aura::Window* event_target = static_cast<aura::Window*>(event.target());
- if (!event_target)
- return NULL;
-
- // If a window other than |event_target| has capture, ignore the event.
- // This can happen when RootWindow creates events when showing/hiding, or
- // the system generates an extra event. We have to check
- // GetGlobalCaptureWindow() as Windows does not use a singleton
- // CaptureClient.
- if (!event_target->HasCapture()) {
- aura::Window* root = event_target->GetRootWindow();
- if (root) {
- aura::client::CaptureClient* capture_client =
- aura::client::GetCaptureClient(root);
- if (capture_client) {
- aura::Window* capture_window =
- capture_client->GetGlobalCaptureWindow();
- if (capture_window && event_target != capture_window)
- return NULL;
- }
- }
- return event_target;
- }
-
- // If |target| has capture all events go to it, even if the mouse is
- // really over another window. Find the real window the mouse is over.
- gfx::Point screen_loc(event.location());
- aura::client::GetScreenPositionClient(event_target->GetRootWindow())->
- ConvertPointToScreen(event_target, &screen_loc);
- gfx::Screen* screen = gfx::Screen::GetScreenFor(event_target);
- aura::Window* target = screen->GetWindowAtScreenPoint(screen_loc);
- if (!target)
- return NULL;
- gfx::Point target_loc(screen_loc);
- aura::client::GetScreenPositionClient(target->GetRootWindow())->
- ConvertPointFromScreen(target, &target_loc);
- aura::Window* screen_target = target->GetEventHandlerForPoint(target_loc);
- if (!IsValidTarget(event_target, screen_target))
- return NULL;
-
- aura::Window::ConvertPointToTarget(screen_target, target, &target_loc);
- *location = target_loc;
- return screen_target;
- }
- default:
- NOTREACHED();
- break;
- }
- return NULL;
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// TooltipController public:
-
-TooltipController::TooltipController(scoped_ptr<Tooltip> tooltip)
- : tooltip_window_(NULL),
- tooltip_id_(NULL),
- tooltip_window_at_mouse_press_(NULL),
- tooltip_(tooltip.Pass()),
- tooltips_enabled_(true) {
- tooltip_timer_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
- this, &TooltipController::TooltipTimerFired);
-}
-
-TooltipController::~TooltipController() {
- if (tooltip_window_)
- tooltip_window_->RemoveObserver(this);
-}
-
-void TooltipController::UpdateTooltip(aura::Window* target) {
- // If tooltip is visible, we may want to hide it. If it is not, we are ok.
- if (tooltip_window_ == target && tooltip_->IsVisible())
- UpdateIfRequired();
-
- // Reset |tooltip_window_at_mouse_press_| if the moving within the same window
- // but over a region that has different tooltip text. By resetting
- // |tooltip_window_at_mouse_press_| we ensure the next time the timer fires
- // we'll requery for the tooltip text.
- // This handles the case of clicking on a view, moving within the same window
- // but over a different view, than back to the original.
- if (tooltip_window_at_mouse_press_ &&
- target == tooltip_window_at_mouse_press_ &&
- aura::client::GetTooltipText(target) != tooltip_text_at_mouse_press_) {
- tooltip_window_at_mouse_press_ = NULL;
- }
-
- // If we had stopped the tooltip timer for some reason, we must restart it if
- // there is a change in the tooltip.
- if (!tooltip_timer_.IsRunning()) {
- if (tooltip_window_ != target || (tooltip_window_ &&
- tooltip_text_ != aura::client::GetTooltipText(tooltip_window_))) {
- tooltip_timer_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
- this, &TooltipController::TooltipTimerFired);
- }
- }
-}
-
-void TooltipController::SetTooltipShownTimeout(aura::Window* target,
- int timeout_in_ms) {
- tooltip_shown_timeout_map_[target] = timeout_in_ms;
-}
-
-void TooltipController::SetTooltipsEnabled(bool enable) {
- if (tooltips_enabled_ == enable)
- return;
- tooltips_enabled_ = enable;
- UpdateTooltip(tooltip_window_);
-}
-
-void TooltipController::OnKeyEvent(ui::KeyEvent* event) {
- // On key press, we want to hide the tooltip and not show it until change.
- // This is the same behavior as hiding tooltips on timeout. Hence, we can
- // simply simulate a timeout.
- if (tooltip_shown_timer_.IsRunning()) {
- tooltip_shown_timer_.Stop();
- TooltipShownTimerFired();
- }
-}
-
-void TooltipController::OnMouseEvent(ui::MouseEvent* event) {
- switch (event->type()) {
- case ui::ET_MOUSE_CAPTURE_CHANGED:
- case ui::ET_MOUSE_EXITED:
- case ui::ET_MOUSE_MOVED:
- case ui::ET_MOUSE_DRAGGED: {
- curr_mouse_loc_ = event->location();
- aura::Window* target = NULL;
- // Avoid a call to gfx::Screen::GetWindowAtScreenPoint() since it can be
- // very expensive on X11 in cases when the tooltip is hidden anyway.
- if (tooltips_enabled_ &&
- !aura::Env::GetInstance()->IsMouseButtonDown() &&
- !IsDragDropInProgress()) {
- target = GetTooltipTarget(*event, &curr_mouse_loc_);
- }
- SetTooltipWindow(target);
- if (tooltip_timer_.IsRunning())
- tooltip_timer_.Reset();
-
- if (tooltip_->IsVisible())
- UpdateIfRequired();
- break;
- }
- case ui::ET_MOUSE_PRESSED:
- if ((event->flags() & ui::EF_IS_NON_CLIENT) == 0) {
- aura::Window* target = static_cast<aura::Window*>(event->target());
- // We don't get a release for non-client areas.
- tooltip_window_at_mouse_press_ = target;
- if (target)
- tooltip_text_at_mouse_press_ = aura::client::GetTooltipText(target);
- }
- tooltip_->Hide();
- break;
- case ui::ET_MOUSEWHEEL:
- // Hide the tooltip for click, release, drag, wheel events.
- if (tooltip_->IsVisible())
- tooltip_->Hide();
- break;
- default:
- break;
- }
-}
-
-void TooltipController::OnTouchEvent(ui::TouchEvent* event) {
- // TODO(varunjain): need to properly implement tooltips for
- // touch events.
- // Hide the tooltip for touch events.
- tooltip_->Hide();
- SetTooltipWindow(NULL);
-}
-
-void TooltipController::OnCancelMode(ui::CancelModeEvent* event) {
- tooltip_->Hide();
- SetTooltipWindow(NULL);
-}
-
-void TooltipController::OnWindowDestroyed(aura::Window* window) {
- if (tooltip_window_ == window) {
- tooltip_->Hide();
- tooltip_shown_timeout_map_.erase(tooltip_window_);
- tooltip_window_ = NULL;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// TooltipController private:
-
-void TooltipController::TooltipTimerFired() {
- UpdateIfRequired();
-}
-
-void TooltipController::TooltipShownTimerFired() {
- tooltip_->Hide();
-
- // Since the user presumably no longer needs the tooltip, we also stop the
- // tooltip timer so that tooltip does not pop back up. We will restart this
- // timer if the tooltip changes (see UpdateTooltip()).
- tooltip_timer_.Stop();
-}
-
-void TooltipController::UpdateIfRequired() {
- if (!tooltips_enabled_ ||
- aura::Env::GetInstance()->IsMouseButtonDown() ||
- IsDragDropInProgress() || !IsCursorVisible()) {
- tooltip_->Hide();
- return;
- }
-
- base::string16 tooltip_text;
- if (tooltip_window_)
- tooltip_text = aura::client::GetTooltipText(tooltip_window_);
-
- // If the user pressed a mouse button. We will hide the tooltip and not show
- // it until there is a change in the tooltip.
- if (tooltip_window_at_mouse_press_) {
- if (tooltip_window_ == tooltip_window_at_mouse_press_ &&
- tooltip_text == tooltip_text_at_mouse_press_) {
- tooltip_->Hide();
- return;
- }
- tooltip_window_at_mouse_press_ = NULL;
- }
-
- // If the uniqueness indicator is different from the previously encountered
- // one, we should force tooltip update
- const void* tooltip_id = aura::client::GetTooltipId(tooltip_window_);
- bool ids_differ = false;
- ids_differ = tooltip_id_ != tooltip_id;
- tooltip_id_ = tooltip_id;
-
- // We add the !tooltip_->IsVisible() below because when we come here from
- // TooltipTimerFired(), the tooltip_text may not have changed but we still
- // want to update the tooltip because the timer has fired.
- // If we come here from UpdateTooltip(), we have already checked for tooltip
- // visibility and this check below will have no effect.
- if (tooltip_text_ != tooltip_text || !tooltip_->IsVisible() || ids_differ) {
- tooltip_shown_timer_.Stop();
- tooltip_text_ = tooltip_text;
- base::string16 trimmed_text(tooltip_text_);
- views::TooltipManager::TrimTooltipText(&trimmed_text);
- // If the string consists entirely of whitespace, then don't both showing it
- // (an empty tooltip is useless).
- base::string16 whitespace_removed_text;
- base::TrimWhitespace(trimmed_text, base::TRIM_ALL,
- &whitespace_removed_text);
- if (whitespace_removed_text.empty()) {
- tooltip_->Hide();
- } else {
- gfx::Point widget_loc = curr_mouse_loc_ +
- tooltip_window_->GetBoundsInScreen().OffsetFromOrigin();
- tooltip_->SetText(tooltip_window_, whitespace_removed_text, widget_loc);
- tooltip_->Show();
- int timeout = GetTooltipShownTimeout();
- if (timeout > 0) {
- tooltip_shown_timer_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(timeout),
- this, &TooltipController::TooltipShownTimerFired);
- }
- }
- }
-}
-
-bool TooltipController::IsTooltipVisible() {
- return tooltip_->IsVisible();
-}
-
-bool TooltipController::IsDragDropInProgress() {
- if (!tooltip_window_)
- return false;
- aura::client::DragDropClient* client =
- aura::client::GetDragDropClient(tooltip_window_->GetRootWindow());
- return client && client->IsDragDropInProgress();
-}
-
-bool TooltipController::IsCursorVisible() {
- if (!tooltip_window_)
- return false;
- aura::Window* root = tooltip_window_->GetRootWindow();
- if (!root)
- return false;
- aura::client::CursorClient* cursor_client =
- aura::client::GetCursorClient(root);
- // |cursor_client| may be NULL in tests, treat NULL as always visible.
- return !cursor_client || cursor_client->IsCursorVisible();
-}
-
-int TooltipController::GetTooltipShownTimeout() {
- std::map<aura::Window*, int>::const_iterator it =
- tooltip_shown_timeout_map_.find(tooltip_window_);
- if (it == tooltip_shown_timeout_map_.end())
- return kDefaultTooltipShownTimeoutMs;
- return it->second;
-}
-
-void TooltipController::SetTooltipWindow(aura::Window* target) {
- if (tooltip_window_ == target)
- return;
- if (tooltip_window_)
- tooltip_window_->RemoveObserver(this);
- tooltip_window_ = target;
- if (tooltip_window_)
- tooltip_window_->AddObserver(this);
-}
-
-} // namespace corewm
-} // namespace views
« no previous file with comments | « ui/views/corewm/tooltip_controller.h ('k') | ui/views/corewm/tooltip_controller_test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698