src/GestureControl/GestureControl.cs
changeset 173 e99fe78cd168
--- /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();
+        }
+    }
+}