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