--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/GestureControl/GestureControl.cs Mon Oct 26 08:36:15 2009 +0100
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Media.Animation;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Microsoft.Surface;
+using Microsoft.Surface.Presentation;
+using Microsoft.Surface.Presentation.Controls;
+using System.Windows.Ink;
+
+namespace GestureControl
+{
+ public class GestureControl : ContentControl
+ {
+ private double angle = 0;
+ public static readonly DependencyProperty GestureProperty;
+ public String Gesture
+ {
+ get { return (String)GetValue(GestureControl.GestureProperty); }
+ set { SetValue(GestureControl.GestureProperty, value); }
+ }
+
+ #region GestureEvent
+ public delegate void GestureRoutedEventHandler(object sender, GestureRoutedEventArgs e);
+ public static readonly RoutedEvent gestureEvent = EventManager.RegisterRoutedEvent(
+ "GestureEvent", RoutingStrategy.Bubble, typeof(GestureRoutedEventHandler), typeof(GestureControl));
+
+ public event GestureRoutedEventHandler GestureEvent
+ {
+ add { AddHandler(gestureEvent, value); }
+ remove { RemoveHandler(gestureEvent, value); }
+ }
+ protected virtual void RaiseGestureEvent(String gesture)
+ {
+ try
+ {
+ GestureRoutedEventArgs newEventArgs = new GestureRoutedEventArgs(GestureControl.gestureEvent, gesture);
+ RaiseEvent(newEventArgs);
+ }
+ catch (Exception e) { }
+ }
+ #endregion
+
+ static GestureControl()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(GestureControl), new FrameworkPropertyMetadata(typeof(GestureControl)));
+
+ GestureControl.GestureProperty = DependencyProperty.Register("Gesture", typeof(String), typeof(GestureControl),
+ new FrameworkPropertyMetadata("None", new PropertyChangedCallback(OnGestureChanged)));
+ }
+ private static void OnGestureChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
+ {
+ //Debug.WriteLine("changed", "Gesture");
+ }
+
+ protected override void OnInitialized(EventArgs e)
+ {
+ base.OnInitialized(e);
+ this.InitializeControl();
+ }
+ protected void InitializeControl()
+ {
+ base.AddHandler(SurfaceControl.PreviewContactDownEvent, new RoutedEventHandler(AreaDown));
+ base.AddHandler(SurfaceInkCanvas.StrokeCollectedEvent, new RoutedEventHandler(AreaStrokeCollected));
+ }
+ // get angle from the first contact of the stroke
+ protected void AreaDown(object source, RoutedEventArgs e)
+ {
+ ContactEventArgs c = (ContactEventArgs)e;
+ this.angle = c.Contact.GetOrientation(this) - 270;
+ }
+
+ protected void AreaStrokeCollected(object source, RoutedEventArgs e)
+ {
+ Debug.WriteLine("collected", "Stroke");
+ System.Windows.Controls.InkCanvasStrokeCollectedEventArgs tmp = e as System.Windows.Controls.InkCanvasStrokeCollectedEventArgs;
+ // Apply a rotation with the angle of the first contact
+ Matrix rot = Matrix.Identity;
+ rot.Rotate(-this.angle);
+ Stroke s = tmp.Stroke;
+ s.Transform(rot, true);
+ // Get a list of point from a Bezier curve
+ StylusPointCollection tmp2 = s.GetBezierStylusPoints();
+ // Generate a list of SurfaceGesturePoint, just X and Y but can be improve
+ List<SurfaceGesturePoint> pointList = new List<SurfaceGesturePoint>();
+ foreach (StylusPoint p in tmp2)
+ pointList.Add(new SurfaceGesturePoint { X = p.X, Y = p.Y });
+ // create the gesture analyser and set the list
+ SurfaceGesture gesture = new SurfaceGesture(pointList, 1);
+ // try to get a pattern from the list, if one, raise a event
+ this.Gesture = gesture.GetPattern();
+ if (this.Gesture != "None")
+ {
+ this.RaiseGestureEvent(this.Gesture);
+ }
+ // clear the stroke
+ SurfaceInkCanvas ink = e.OriginalSource as SurfaceInkCanvas;
+ ink.Strokes.Clear();
+ }
+ }
+}