Home | History | Annotate | Download | only in widget
      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
      3 // found in the LICENSE file.
      4 
      5 #include "ui/views/widget/tooltip_manager_aura.h"
      6 
      7 #include "base/logging.h"
      8 #include "ui/aura/client/screen_position_client.h"
      9 #include "ui/aura/window_event_dispatcher.h"
     10 #include "ui/aura/window_tree_host.h"
     11 #include "ui/base/resource/resource_bundle.h"
     12 #include "ui/gfx/rect.h"
     13 #include "ui/gfx/screen.h"
     14 #include "ui/views/widget/widget.h"
     15 #include "ui/wm/public/tooltip_client.h"
     16 
     17 namespace views {
     18 
     19 // static
     20 int TooltipManager::GetTooltipHeight() {
     21   // Not used for linux and chromeos.
     22   NOTIMPLEMENTED();
     23   return 0;
     24 }
     25 
     26 ////////////////////////////////////////////////////////////////////////////////
     27 // TooltipManagerAura public:
     28 
     29 TooltipManagerAura::TooltipManagerAura(Widget* widget) : widget_(widget) {
     30   aura::client::SetTooltipText(GetWindow(), &tooltip_text_);
     31 }
     32 
     33 TooltipManagerAura::~TooltipManagerAura() {
     34   aura::client::SetTooltipText(GetWindow(), NULL);
     35 }
     36 
     37 // static
     38 const gfx::FontList& TooltipManagerAura::GetDefaultFontList() {
     39   return ui::ResourceBundle::GetSharedInstance().GetFontList(
     40       ui::ResourceBundle::BaseFont);
     41 }
     42 
     43 // static
     44 void TooltipManagerAura::UpdateTooltipManagerForCapture(Widget* source) {
     45   if (!source->HasCapture())
     46     return;
     47 
     48   aura::Window* root_window = source->GetNativeView()->GetRootWindow();
     49   if (!root_window)
     50     return;
     51 
     52   gfx::Point screen_loc(
     53       root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot());
     54   aura::client::ScreenPositionClient* screen_position_client =
     55       aura::client::GetScreenPositionClient(root_window);
     56   if (!screen_position_client)
     57     return;
     58   screen_position_client->ConvertPointToScreen(root_window, &screen_loc);
     59   gfx::Screen* screen = gfx::Screen::GetScreenFor(root_window);
     60   aura::Window* target = screen->GetWindowAtScreenPoint(screen_loc);
     61   if (!target)
     62     return;
     63   gfx::Point target_loc(screen_loc);
     64   screen_position_client =
     65       aura::client::GetScreenPositionClient(target->GetRootWindow());
     66   if (!screen_position_client)
     67     return;
     68   screen_position_client->ConvertPointFromScreen(target, &target_loc);
     69   target = target->GetEventHandlerForPoint(target_loc);
     70   while (target) {
     71     Widget* target_widget = Widget::GetWidgetForNativeView(target);
     72     if (target_widget == source)
     73       return;
     74 
     75     if (target_widget) {
     76       if (target_widget->GetTooltipManager())
     77         target_widget->GetTooltipManager()->UpdateTooltip();
     78       return;
     79     }
     80     target = target->parent();
     81   }
     82 }
     83 
     84 ////////////////////////////////////////////////////////////////////////////////
     85 // TooltipManagerAura, TooltipManager implementation:
     86 
     87 const gfx::FontList& TooltipManagerAura::GetFontList() const {
     88   return GetDefaultFontList();
     89 }
     90 
     91 void TooltipManagerAura::UpdateTooltip() {
     92   aura::Window* root_window = GetWindow()->GetRootWindow();
     93   if (aura::client::GetTooltipClient(root_window)) {
     94     gfx::Point view_point =
     95         root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot();
     96     aura::Window::ConvertPointToTarget(root_window, GetWindow(), &view_point);
     97     View* view = GetViewUnderPoint(view_point);
     98     UpdateTooltipForTarget(view, view_point, root_window);
     99   }
    100 }
    101 
    102 void TooltipManagerAura::TooltipTextChanged(View* view)  {
    103   aura::Window* root_window = GetWindow()->GetRootWindow();
    104   if (aura::client::GetTooltipClient(root_window)) {
    105     gfx::Point view_point =
    106         root_window->GetHost()->dispatcher()->GetLastMouseLocationInRoot();
    107     aura::Window::ConvertPointToTarget(root_window, GetWindow(), &view_point);
    108     View* target = GetViewUnderPoint(view_point);
    109     if (target != view)
    110       return;
    111     UpdateTooltipForTarget(view, view_point, root_window);
    112   }
    113 }
    114 
    115 View* TooltipManagerAura::GetViewUnderPoint(const gfx::Point& point) {
    116   View* root_view = widget_->GetRootView();
    117   if (root_view)
    118     return root_view->GetTooltipHandlerForPoint(point);
    119   return NULL;
    120 }
    121 
    122 void TooltipManagerAura::UpdateTooltipForTarget(View* target,
    123                                                 const gfx::Point& point,
    124                                                 aura::Window* root_window) {
    125   if (target) {
    126     gfx::Point view_point = point;
    127     View::ConvertPointFromWidget(target, &view_point);
    128     base::string16 new_tooltip_text;
    129     if (!target->GetTooltipText(view_point, &new_tooltip_text))
    130       tooltip_text_.clear();
    131     else
    132       tooltip_text_ = new_tooltip_text;
    133   } else {
    134     tooltip_text_.clear();
    135   }
    136 
    137   aura::client::SetTooltipId(GetWindow(), target);
    138 
    139   aura::client::GetTooltipClient(root_window)->UpdateTooltip(GetWindow());
    140 }
    141 
    142 aura::Window* TooltipManagerAura::GetWindow() {
    143   return widget_->GetNativeView();
    144 }
    145 
    146 }  // namespace views.
    147