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