using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Microsoft.Phone.Controls;
using System.Reflection;

namespace InputScopes
{
    // Demo zum Testen der verschiedenen Input Types der virtuellen Tastatur    
    public partial class MainPage : PhoneApplicationPage
    {
        // Hauptkonstruktor
        public MainPage()
        {
            InitializeComponent();

            // ListBoxeintraege setzen
            lbx_InputScopes.ItemsSource = GetInputScopeNames();
            lbx_InputScopes.SelectedIndex = 0;
        }

        // Methode zum Auslesen aller Werte der Enumeration InputScopeNames
        private IEnumerable<string> GetInputScopeNames()
        {
            // Festlegen des EnumTyps
            Type enumInputScopeNameValue = typeof(InputScopeNameValue);

            List<string> inputScopeNameValueList = new List<String>();

            // Holen der kompletten Felder der Enum
            FieldInfo[] fieldInfoArray = enumInputScopeNameValue.GetFields();

            // Filtern des Namens
            foreach (FieldInfo fieldInfo in fieldInfoArray)
            {
                if (fieldInfo.FieldType.IsEnum)
                {
                    // Name der Liste hinzufügen
                    inputScopeNameValueList.Add(fieldInfo.Name);
                }
            }

            return inputScopeNameValueList;
        }       
        
        // Ereignismethode der ListBox, sobald sich die Auswahl ändert, wird der InputScope entsprechend gewechselt
        private void lbx_InputScopes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // gewählter Wert aus ListBox als inputScopeNameValue parsen
            InputScopeNameValue inputScopeNameValue = (InputScopeNameValue)Enum.Parse(typeof(InputScopeNameValue), lbx_InputScopes.SelectedItem.ToString(), true);

            try
            {
                // gewählter InputScope für Textbox setzen
                tbTest.InputScope = new InputScope()
                {
                    Names = { new InputScopeName() { NameValue = inputScopeNameValue } }
                };
            }
            // Insofern der InputScope nicht auf dem Gerät existiert, wird eine OverflowException geworfen
            catch (OverflowException)
            {
                MessageBox.Show("Der gewählte InputScope '" + inputScopeNameValue +"' ist auf dem Gerät nicht vorhanden!", "Fehler", MessageBoxButton.OK);
            }
        }
    }
}