diff options
Diffstat (limited to 'views/mouse_watcher.h')
-rw-r--r-- | views/mouse_watcher.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/views/mouse_watcher.h b/views/mouse_watcher.h new file mode 100644 index 0000000..7037487 --- /dev/null +++ b/views/mouse_watcher.h @@ -0,0 +1,75 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef VIEWS_MOUSE_WATCHER_H_ +#define VIEWS_MOUSE_WATCHER_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/scoped_ptr.h" +#include "gfx/insets.h" + +namespace views { + +class View; + +// MouseWatcherListener is notified when the mouse moves outside the view. +class MouseWatcherListener { + public: + virtual void MouseMovedOutOfView() = 0; + + protected: + virtual ~MouseWatcherListener(); +}; + +// MouseWatcher is used to watch mouse movement and notify its listener when the +// mouse moves outside the bounds of a view. +class MouseWatcher { + public: + // Creates a new MouseWatcher. |hot_zone_insets| is added to the bounds of + // the view to determine the active zone. For example, if + // |hot_zone_insets.bottom()| is 10, then the listener is not notified if + // the y coordinate is between the origin of the view and height of the view + // plus 10. + MouseWatcher(views::View* host, + MouseWatcherListener* listener, + const gfx::Insets& hot_zone_insets); + ~MouseWatcher(); + + // Starts watching mouse movements. When the mouse moves outside the bounds of + // the view the listener is notified. |Start| may be invoked any number of + // times. If the mouse moves outside the bounds of the view the listener is + // notified and watcher stops watching events. + void Start(); + + // Stops watching mouse events. + void Stop(); + + private: + class Observer; + + // Are we currently observing events? + bool is_observing() const { return observer_.get() != NULL; } + + // Notifies the listener and stops watching events. + void NotifyListener(); + + // View we're listening for events over. + views::View* host_; + + // Our listener. + MouseWatcherListener* listener_; + + // Insets added to the bounds of the view. + const gfx::Insets hot_zone_insets_; + + // Does the actual work of listening for mouse events. + scoped_ptr<Observer> observer_; + + DISALLOW_COPY_AND_ASSIGN(MouseWatcher); +}; + +} // namespace views + +#endif // VIEWS_MOUSE_WATCHER_H_ |