using System;
using System.Windows.Input;
using Microsoft.Phone.Controls;

namespace WPGesture2
{
    public partial class MainPage : PhoneApplicationPage
    {
        double lastX, lastY;

        public MainPage()
        {
            InitializeComponent();
        }

        private void rectangleFlick_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
        {
            translateTransform.X += e.DeltaManipulation.Translation.X;
            translateTransform.Y += e.DeltaManipulation.Translation.Y;
        }

        private void rectangleFlick_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
        {
            e.Handled = true;

            if (e.IsInertial)
            {
                decelerate.Stop();

                //Was wäre die ungefähre Position nach der Animation?
                lastX = translateTransform.X + e.FinalVelocities.LinearVelocity.X / 4;
                lastY = translateTransform.Y + e.FinalVelocities.LinearVelocity.Y / 4;

                //Was sind die Aussenkanten der Oberfläche, die nicht überschritten werden sollten?
                double maxHeight = (LayoutRoot.ActualHeight - rectangleFlick.ActualHeight)/2;
                double maxWidth = (LayoutRoot.ActualWidth - rectangleFlick.ActualWidth) / 2;

                //Was sind die maximal möglichen Werte, für das Rechteck auf der Oberfläche?
                lastX = MaxValue(lastX, -maxWidth, maxWidth);
                lastY = MaxValue(lastY, -maxHeight, maxHeight);

                //Setzen der Werte für die Animation
                XProperty.Value = lastX;
                YProperty.Value = lastY;

                decelerate.Begin();
            }
        }

        private void decelerate_Completed(object sender, EventArgs e)
        {
            decelerate.Stop();
            //Setze die finalen Werte nach der Animation
            translateTransform.X = lastX;
            translateTransform.Y = lastY;
        }

        private double MaxValue(double value, double min, double max)
        {
            return Math.Max(Math.Min(value, max), min);
        }
    }
}
