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

namespace Controls.Pages
{
    public partial class MultiScaleImagePage : PhoneApplicationPage
    {
        // aktueller Vergroesserungsfaktor
        private double currentzoomfactor = 1.0;
        // erste Beruehrungspostion
        private Point mousedownposition;

        // Hauptkonstruktor
        public MultiScaleImagePage()
        {
            InitializeComponent();
        }

        // Ereignismethode, wenn die Grafik erfolgreich geladen wurde
        private void myMultiScaleImage_ImageOpenSucceeded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("DeepZoom Image wurde erfolgreich geladen!");
        }

        // Ereignismethode für die Vergroesserungsschaltflaeche
        private void btnZoomIn_Click(object sender, EventArgs e)
        {
            // Aufrufen der eigenen Vergroesserungs- bzw. Verkleinerungsmethode
            Zoom(currentzoomfactor * 1.3, myMultiScaleImage.ElementToLogicalPoint(new Point(.5 * myMultiScaleImage.ActualWidth, .5 * myMultiScaleImage.ActualHeight)));
        }

        // Ereignismethode für die Verkleinerungsschaltflaeche
        private void btnZoomOut_Click(object sender, EventArgs e)
        {
            // Aufrufen der eigenen Vergroesserungs- bzw. Verkleinerungsmethode
            Zoom(currentzoomfactor / 1.3, myMultiScaleImage.ElementToLogicalPoint(new Point(.5 * myMultiScaleImage.ActualWidth, .5 * myMultiScaleImage.ActualHeight)));         
        }

        // eigenen Vergroesserungs- bzw. Verkleinerungsmethode
        private void Zoom(double newzoom, Point p)
        {
            // Ausfuehren der Zoom-Methode des MultiScaleImage & setzen des neuen Zoomfaktors
            myMultiScaleImage.ZoomAboutLogicalPoint(newzoom / currentzoomfactor, p.X, p.Y);
            currentzoomfactor = newzoom;
        }

        // Ereignismethode sobald die Beruehrung endet
        private void myMultiScaleImage_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // Startpunkt der Beruehrung merken
            mousedownposition = e.GetPosition(this);
        }

        // Ereignismethode, die waehrend der Bewegung ausgefuehrt wird
        private void myMultiScaleImage_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            // neuen ViewPoint berechnen und setzen
            Point newViewPoint = myMultiScaleImage.ViewportOrigin;
            newViewPoint.X += (mousedownposition.X - e.GetPosition(this).X) / myMultiScaleImage.ActualWidth * myMultiScaleImage.ViewportWidth;
            newViewPoint.Y += (mousedownposition.Y - e.GetPosition(this).Y) / myMultiScaleImage.ActualWidth * myMultiScaleImage.ViewportWidth;
            myMultiScaleImage.ViewportOrigin = newViewPoint;
        }
    }
}