16bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// Copyright (c) 2012 The Chromium Authors. All rights reserved. 26bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// Use of this source code is governed by a BSD-style license that can be 36bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis// found in the LICENSE file. 46bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 56bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#ifndef UI_VIEWS_COREWM_TOOLTIP_CONTROLLER_H_ 66bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#define UI_VIEWS_COREWM_TOOLTIP_CONTROLLER_H_ 76bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 86bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include <map> 96bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 106bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "base/memory/scoped_ptr.h" 116bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "base/strings/string16.h" 126bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "base/timer/timer.h" 136bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "ui/aura/window_observer.h" 146bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "ui/events/event_handler.h" 156bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "ui/gfx/point.h" 166bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "ui/views/views_export.h" 176bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#include "ui/wm/public/tooltip_client.h" 186bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1940d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rosenamespace aura { 205ac1df3e15f91ed663826faec7efe2462c18d98cAnna Zaksclass Window; 216bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} 226bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 236bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidisnamespace views { 2440d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rosenamespace corewm { 25964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 26964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Roseclass Tooltip; 27964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 28964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rosenamespace test { 29964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Roseclass TooltipControllerTestHelper; 30964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose} // namespace test 31964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 32964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose// TooltipController provides tooltip functionality for aura. 3340d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Roseclass VIEWS_EXPORT TooltipController : public aura::client::TooltipClient, 3440d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose public ui::EventHandler, 3540d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose public aura::WindowObserver { 3640d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose public: 3740d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose explicit TooltipController(scoped_ptr<Tooltip> tooltip); 3840d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose virtual ~TooltipController(); 3940d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose 40964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose // Overridden from aura::client::TooltipClient. 41964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose virtual void UpdateTooltip(aura::Window* target) OVERRIDE; 42964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose virtual void SetTooltipShownTimeout(aura::Window* target, 43964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose int timeout_in_ms) OVERRIDE; 44964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose virtual void SetTooltipsEnabled(bool enable) OVERRIDE; 45964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 46964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose // Overridden from ui::EventHandler. 47964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; 48964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 4940d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 5040d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose virtual void OnCancelMode(ui::CancelModeEvent* event) OVERRIDE; 5140d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose 5240d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose // Overridden from aura::WindowObserver. 5340d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 5440d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose 5540d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose const gfx::Point& mouse_location() const { return curr_mouse_loc_; } 56964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 57964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose private: 58964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose friend class test::TooltipControllerTestHelper; 59964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 60964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose void TooltipTimerFired(); 61964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose void TooltipShownTimerFired(); 62964490c0a8bd3398dc85d224a167ca9c35a36c85Jordan Rose 6340d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose // Updates the tooltip if required (if there is any change in the tooltip 6440d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose // text, tooltip id or the aura::Window). 6540d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose void UpdateIfRequired(); 6640d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose 6740d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose // Only used in tests. 6840d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose bool IsTooltipVisible(); 6940d8551890bc8454c4e0a28c9072c9c1d1dd588aJordan Rose 706bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis bool IsDragDropInProgress(); 716bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 7257300760964904cc022a175643342f29f46b7e6bAnna Zaks // Returns true if the cursor is visible. 736bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis bool IsCursorVisible(); 7457300760964904cc022a175643342f29f46b7e6bAnna Zaks 7557300760964904cc022a175643342f29f46b7e6bAnna Zaks int GetTooltipShownTimeout(); 7657300760964904cc022a175643342f29f46b7e6bAnna Zaks 7757300760964904cc022a175643342f29f46b7e6bAnna Zaks // Sets tooltip window to |target| if it is different from existing window. 7857300760964904cc022a175643342f29f46b7e6bAnna Zaks // Calls RemoveObserver on the existing window if it is not NULL. 793f5e8d87dbf449d8b39fe96068415428594d370eAnna Zaks // Calls AddObserver on the new window if it is not NULL. 803152b3cb5b6a2f797d0972c81a5eb3fd69c0d620Anna Zaks void SetTooltipWindow(aura::Window* target); 81063e0887ad65d666d23ee3178436ad6507abbd1bAnna Zaks 826bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis aura::Window* tooltip_window_; 83514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek base::string16 tooltip_text_; 84514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek const void* tooltip_id_; 85514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek 86514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek // These fields are for tracking state when the user presses a mouse button. 878ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks aura::Window* tooltip_window_at_mouse_press_; 8818c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek base::string16 tooltip_text_at_mouse_press_; 8918c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek 90514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek scoped_ptr<Tooltip> tooltip_; 91514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek 928ff5c41f2bde7ebbe568b4c15e59f14b8befae66Anna Zaks base::RepeatingTimer<TooltipController> tooltip_timer_; 9318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek 9457300760964904cc022a175643342f29f46b7e6bAnna Zaks // Timer to timeout the life of an on-screen tooltip. We hide the tooltip when 953f5e8d87dbf449d8b39fe96068415428594d370eAnna Zaks // this timer fires. 96514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek base::OneShotTimer<TooltipController> tooltip_shown_timer_; 97514f2c9dcb9e04b52929c5b141a6fe88bd68b33fTed Kremenek 98777d706547ebc751d998134774d9d5388fff8e02Anna Zaks // Location of the last event in |tooltip_window_|'s coordinates. 99777d706547ebc751d998134774d9d5388fff8e02Anna Zaks gfx::Point curr_mouse_loc_; 100777d706547ebc751d998134774d9d5388fff8e02Anna Zaks 1016bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis bool tooltips_enabled_; 1026bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1036bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis std::map<aura::Window*, int> tooltip_shown_timeout_map_; 1046bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1056bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis DISALLOW_COPY_AND_ASSIGN(TooltipController); 1066bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis}; 1076bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1086bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // namespace corewm 1096bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis} // namespace views 1106bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis 1116bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis#endif // UI_VIEWS_COREWM_TOOLTIP_CONTROLLER_H_ 1126bcb48dc67e417e0ecce803f28d13bbea2ee0243Argyrios Kyrtzidis