Updated Branches: refs/heads/master 769a66be8 -> f8d313d09
Minor improvement for CB-953 mouse events fired twice Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/commit/f8d313d0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/tree/f8d313d0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/diff/f8d313d0 Branch: refs/heads/master Commit: f8d313d09f84b373198b83abc5b930b88516ad36 Parents: 769a66b Author: Sergei Grebnov <sergey.greb...@akvelon.com> Authored: Thu Jun 28 18:07:00 2012 +0400 Committer: Sergei Grebnov <sergey.greb...@akvelon.com> Committed: Thu Jun 28 18:07:00 2012 +0400 ---------------------------------------------------------------------- framework/Cordova/BrowserMouseHelper.cs | 31 ++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/blob/f8d313d0/framework/Cordova/BrowserMouseHelper.cs ---------------------------------------------------------------------- diff --git a/framework/Cordova/BrowserMouseHelper.cs b/framework/Cordova/BrowserMouseHelper.cs index 281bff6..6c8f541 100644 --- a/framework/Cordova/BrowserMouseHelper.cs +++ b/framework/Cordova/BrowserMouseHelper.cs @@ -93,6 +93,17 @@ namespace WP7CordovaClassLib protected Border border; private bool firstMouseMove = false; + /// <summary> + /// Represents last known mouse down position. + /// Used to determine mouse move delta to avoid duplicate mouse events. + /// </summary> + private Point mouseDownPos; + + /// <summary> + /// Represent min delta value to consider event as a mouse move. Experimental calculated. + /// </summary> + private const int MouseMoveDeltaThreshold = 10; + public BrowserMouseHelper(ref WebBrowser browser) { @@ -114,6 +125,7 @@ namespace WP7CordovaClassLib border.ManipulationDelta += Border_ManipulationDelta; border.ManipulationCompleted += Border_ManipulationCompleted; border.DoubleTap += Border_DoubleTap; + border.Tap += Border_Tap; border.Hold += Border_Hold; border.MouseLeftButtonDown += Border_MouseLeftButtonDown; } @@ -217,6 +229,16 @@ namespace WP7CordovaClassLib #endregion + #region Tap + + void Border_Tap(object sender, GestureEventArgs e) + { + // prevents generating duplicated mouse events + // firstMouseMove == FALSE means we already handled this situation and generated mouse events + e.Handled = ! this.firstMouseMove; + } + #endregion + #region MouseEvents void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) @@ -224,6 +246,8 @@ namespace WP7CordovaClassLib //Debug.WriteLine("Border_MouseLeftButtonDown"); border.MouseMove += new MouseEventHandler(Border_MouseMove); border.MouseLeftButtonUp += new MouseButtonEventHandler(Border_MouseLeftButtonUp); + + this.mouseDownPos = e.GetPosition(_browser); // don't fire the down event until we know if this is a 'move' or not firstMouseMove = true; } @@ -235,6 +259,13 @@ namespace WP7CordovaClassLib // only the return value from the first mouse move event should be used to determine if scrolling is prevented. if (firstMouseMove) { + // even for simple tap there are situations where ui control generates move with some little delta value + // we should avoid such situations allowing to browser control generate native js mousedown/up/click events + if (Math.Abs(pos.X - mouseDownPos.X) + Math.Abs(pos.Y - mouseDownPos.Y) <= MouseMoveDeltaThreshold) + { + return; + } + InvokeSimulatedMouseEvent("mousedown", pos); firstMouseMove = false; ScrollDisabled = InvokeSimulatedMouseEvent("mousemove", pos);