diff options
author | varunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-27 21:39:36 +0000 |
---|---|---|
committer | varunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-27 21:39:36 +0000 |
commit | 53d47b9800c3fe909b3dcdfbd6875feca860af76 (patch) | |
tree | 5f4490a14ec87d8a9a2b6e60cf00ae1c2269562d /views/widget | |
parent | 582b55d4a0ee1c0ceea48b1b337b4b71597f9fe0 (diff) | |
download | chromium_src-53d47b9800c3fe909b3dcdfbd6875feca860af76.zip chromium_src-53d47b9800c3fe909b3dcdfbd6875feca860af76.tar.gz chromium_src-53d47b9800c3fe909b3dcdfbd6875feca860af76.tar.bz2 |
Enable tooltips for aura.
BUG=97249
TEST=none
Review URL: http://codereview.chromium.org/8371024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107630 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/widget')
-rw-r--r-- | views/widget/native_widget_aura.cc | 10 | ||||
-rw-r--r-- | views/widget/native_widget_aura.h | 2 | ||||
-rw-r--r-- | views/widget/tooltip_manager_views.cc | 69 | ||||
-rw-r--r-- | views/widget/tooltip_manager_views.h | 8 |
4 files changed, 59 insertions, 30 deletions
diff --git a/views/widget/native_widget_aura.cc b/views/widget/native_widget_aura.cc index 2113872f..de95a18 100644 --- a/views/widget/native_widget_aura.cc +++ b/views/widget/native_widget_aura.cc @@ -15,6 +15,7 @@ #include "ui/gfx/font.h" #include "ui/gfx/screen.h" #include "views/widget/native_widget_delegate.h" +#include "views/widget/tooltip_manager_views.h" #if defined(OS_WIN) #include "base/win/scoped_gdi_object.h" @@ -93,6 +94,12 @@ void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) { // TODO(beng): do this some other way. delegate_->OnNativeWidgetSizeChanged(params.bounds.size()); can_activate_ = params.can_activate; + if (params.type != Widget::InitParams::TYPE_TOOLTIP && !params.child) { + DCHECK(GetWidget()->GetRootView()); + views::TooltipManagerViews* manager = new views::TooltipManagerViews( + GetWidget()->GetRootView()); + tooltip_manager_.reset(manager); + } } NonClientFrameView* NativeWidgetAura::CreateNonClientFrameView() { @@ -170,8 +177,7 @@ void* NativeWidgetAura::GetNativeWindowProperty(const char* name) const { } TooltipManager* NativeWidgetAura::GetTooltipManager() const { - //NOTIMPLEMENTED(); - return NULL; + return tooltip_manager_.get(); } bool NativeWidgetAura::IsScreenReaderActive() const { diff --git a/views/widget/native_widget_aura.h b/views/widget/native_widget_aura.h index 3cf65e2..0462552 100644 --- a/views/widget/native_widget_aura.h +++ b/views/widget/native_widget_aura.h @@ -158,6 +158,8 @@ class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate, gfx::NativeCursor cursor_; + scoped_ptr<TooltipManager> tooltip_manager_; + DISALLOW_COPY_AND_ASSIGN(NativeWidgetAura); }; diff --git a/views/widget/tooltip_manager_views.cc b/views/widget/tooltip_manager_views.cc index 01433d1..a8b6d97 100644 --- a/views/widget/tooltip_manager_views.cc +++ b/views/widget/tooltip_manager_views.cc @@ -17,6 +17,11 @@ #include "base/time.h" #include "base/utf_string_conversions.h" #include "third_party/skia/include/core/SkColor.h" +#if defined(USE_AURA) +#include "ui/aura/aura_constants.h" +#include "ui/aura/event.h" +#include "ui/aura/window.h" +#endif #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/font.h" #include "ui/gfx/screen.h" @@ -26,7 +31,6 @@ #include "views/focus/focus_manager.h" #include "views/view.h" #include "views/widget/native_widget.h" -#include "views/widget/root_view.h" #if defined(USE_WAYLAND) #include "ui/wayland/events/wayland_event.h" @@ -69,7 +73,7 @@ int TooltipManager::GetMaxWidth(int x, int y) { return monitor_bounds.width() == 0 ? 800 : (monitor_bounds.width() + 1) / 2; } -TooltipManagerViews::TooltipManagerViews(internal::RootView* root_view) +TooltipManagerViews::TooltipManagerViews(views::View* root_view) : root_view_(root_view), tooltip_view_(NULL) { tooltip_label_.set_background( @@ -115,12 +119,19 @@ base::MessagePumpObserver::EventStatus TooltipManagerViews::WillProcessEvent( } #elif defined(USE_X11) base::EventStatus TooltipManagerViews::WillProcessEvent( - const base::NativeEvent& event) { - XGenericEventCookie* cookie = &event->xcookie; - if (cookie->evtype == XI_Motion) { - const XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(cookie->data); - OnMouseMoved(static_cast<int>(xievent->event_x), - static_cast<int>(xievent->event_y)); + const base::NativeEvent& native_event) { + if (!ui::IsMouseEvent(native_event)) + return base::EVENT_CONTINUE; +#if defined(USE_AURA) + aura::MouseEvent event(native_event); +#else + MouseEvent event(native_event); +#endif + switch (event.type()) { + case ui::ET_MOUSE_MOVED: + OnMouseMoved(event.x(), event.y()); + default: + break; } return base::EVENT_CONTINUE; } @@ -140,19 +151,18 @@ void TooltipManagerViews::DidProcessEvent(const base::NativeEvent& event) { #endif void TooltipManagerViews::TooltipTimerFired() { - if (tooltip_widget_->IsVisible()) { - UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); - } else { - tooltip_view_ = GetViewForTooltip(curr_mouse_pos_.x(), curr_mouse_pos_.y(), - false); - Update(); - } + UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); } View* TooltipManagerViews::GetViewForTooltip(int x, int y, bool for_keyboard) { View* view = NULL; if (!for_keyboard) { - view = root_view_->GetEventHandlerForPoint(gfx::Point(x, y)); + // Convert x,y from screen coordinates to |root_view_| coordinates. + gfx::Point point(x, y); + gfx::Rect r = root_view_->GetWidget()->GetClientAreaScreenBounds(); + point.SetPoint(point.x() - r.x(), point.y() - r.y()); + View::ConvertPointFromWidget(root_view_, &point); + view = root_view_->GetEventHandlerForPoint(point); } else { FocusManager* focus_manager = root_view_->GetFocusManager(); if (focus_manager) @@ -167,17 +177,31 @@ void TooltipManagerViews::UpdateIfRequired(int x, int y, bool for_keyboard) { if (view) view->GetTooltipText(gfx::Point(x, y), &tooltip_text); +#if defined(USE_AURA) + // In aura, and aura::Window can also have a tooltip. If the view doesnot have + // a tooltip, we must also check for the aura::Window underneath the cursor. + if (tooltip_text.empty()) { + aura::Window* root = reinterpret_cast<aura::Window*>( + root_view_->GetWidget()->GetNativeView()); + if (root) { + aura::Window* window = root->GetEventHandlerForPoint(gfx::Point(x, y)); + if (window) { + void* property = window->GetProperty(aura::kTooltipTextKey); + if (property) + tooltip_text = *reinterpret_cast<string16*>(property); + } + } + } +#endif + if (tooltip_view_ != view || tooltip_text_ != tooltip_text) { tooltip_view_ = view; + tooltip_text_ = tooltip_text; Update(); } } void TooltipManagerViews::Update() { - if (!tooltip_view_ || - !tooltip_view_->GetTooltipText(gfx::Point(), &tooltip_text_)) - tooltip_text_.clear(); - if (tooltip_text_.empty()) { tooltip_widget_->Hide(); } else { @@ -196,7 +220,6 @@ void TooltipManagerViews::Update() { void TooltipManagerViews::SetTooltipBounds(gfx::Point mouse_pos, int tooltip_width, int tooltip_height) { - View::ConvertPointToScreen(root_view_, &mouse_pos); gfx::Rect tooltip_rect(mouse_pos.x(), mouse_pos.y(), tooltip_width, tooltip_height); @@ -209,12 +232,14 @@ void TooltipManagerViews::SetTooltipBounds(gfx::Point mouse_pos, Widget* TooltipManagerViews::CreateTooltip() { Widget* widget = new Widget; Widget::InitParams params; + // For aura, since we set the type to TOOLTIP_TYPE, the widget will get + // auto-parented to the MenuAndTooltipsContainer. params.type = Widget::InitParams::TYPE_TOOLTIP; params.keep_on_top = true; params.accept_events = false; params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; widget->Init(params); - widget->SetOpacity(0x00); + widget->SetOpacity(0xFF); return widget; } diff --git a/views/widget/tooltip_manager_views.h b/views/widget/tooltip_manager_views.h index c2d63cd..3d22662 100644 --- a/views/widget/tooltip_manager_views.h +++ b/views/widget/tooltip_manager_views.h @@ -23,17 +23,13 @@ union WaylandEvent; namespace views { -namespace internal { -class RootView; -} - class Widget; // TooltipManager implementation for Views. class TooltipManagerViews : public TooltipManager, public MessageLoopForUI::Observer { public: - explicit TooltipManagerViews(internal::RootView* root_view); + explicit TooltipManagerViews(views::View* root_view); virtual ~TooltipManagerViews(); // TooltipManager. @@ -76,7 +72,7 @@ class TooltipManagerViews : public TooltipManager, void OnMouseMoved(int x, int y); scoped_ptr<Widget> tooltip_widget_; - internal::RootView* root_view_; + views::View* root_view_; View* tooltip_view_; string16 tooltip_text_; Label tooltip_label_; |