using System; using System.Collections.Generic; using System.Linq; 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.Navigation; using System.Windows.Shapes; using System.Threading; namespace Factorizator { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { #region Error variable private bool error = false; private bool Error { get { return error; } set { error = value; inputNumber.Background = (value) ? (Brushes.Pink) : (Brushes.White); } } #endregion #region Vars Thread worker = null; #endregion #region Constructor public MainWindow() { InitializeComponent(); } #endregion #region Keyboard handler private void Window_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; var text = Keyboard.FocusedElement as TextBox; if (e.KeyboardDevice.Modifiers == ModifierKeys.None) { switch (e.Key) { case Key.Enter: buttonCalculate_Click(this, new RoutedEventArgs()); break; case Key.Escape: statusCancel_Click(this, new RoutedEventArgs()); break; case Key.F1: DynamicLink.Launcher.StartModule("Help", "factorizator"); break; default: e.Handled = false; break; } } else if (text == null && e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.C) contextCopyRem_Click(this, new RoutedEventArgs()); else if (text == null && e.KeyboardDevice.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift) && e.Key == Key.C) contextCopyDiv_Click(this, new RoutedEventArgs()); else e.Handled = false; } #endregion #region UI handlers private void inputNumber_TextChanged(object sender, TextChangedEventArgs e) { if (Error) { Error = false; statusMessage.Text = "Ready"; } } private void buttonCalculate_Click(object sender, RoutedEventArgs e) { if (inputNumber.Text == "") return; decimal d; if (!decimal.TryParse(inputNumber.Text, out d)) { Error = true; statusMessage.Text = "Bad number."; } else BeginWork(d); } private void contextCopyRem_Click(object sender, RoutedEventArgs e) { DecimalPair pair = factorizationDisplay.SelectedItem as DecimalPair; if (pair == null) return; Clipboard.SetText(pair.First.ToString()); } private void contextCopyDiv_Click(object sender, RoutedEventArgs e) { DecimalPair pair = factorizationDisplay.SelectedItem as DecimalPair; if (pair == null) return; Clipboard.SetText(pair.Second.ToString()); } private void contextClear_Click(object sender, RoutedEventArgs e) { factorizationDisplay.Items.Clear(); } private void statusCancel_Click(object sender, RoutedEventArgs e) { FactorizatorAlgorithm.Abort = true; } private void TextBlock_MouseUp(object sender, MouseButtonEventArgs e) { DynamicLink.Launcher.StartModule("Help", "factorizator"); } #endregion #region Worker void BeginWork(decimal num) { num = Math.Truncate(num); // Visual stuff statusMessage.Text = "Calculating..."; statusProgress.Visibility = System.Windows.Visibility.Visible; statusCancel.Visibility = System.Windows.Visibility.Visible; // Start thread worker = new Thread(new ParameterizedThreadStart(DoWork)); worker.Start(num); } delegate void FinishWorkDelegate(decimal[] resultFact, decimal[] resultNum); void DoWork(object param) { decimal number = (decimal)param; decimal[] resultFact, resultNum; FactorizatorAlgorithm.Factorize(number, out resultFact, out resultNum); Dispatcher.Invoke(new FinishWorkDelegate(FinishWork), resultFact, resultNum); } void FinishWork(decimal[] resultFact, decimal[] resultNum) { factorizationDisplay.Items.Clear(); // Show results for (int i = 0; i < resultNum.Length; i++) { if (i < resultFact.Length) factorizationDisplay.Items.Add(new DecimalPair(resultNum[i], resultFact[i])); else factorizationDisplay.Items.Add(new DecimalPair(resultNum[i], 0)); } // Update visual stuff statusMessage.Text = "Ready"; statusProgress.Visibility = System.Windows.Visibility.Hidden; statusCancel.Visibility = System.Windows.Visibility.Hidden; } #endregion } }