public AdvancedCarnassialOptions(CarnassialState state, MarkableCanvas markableCanvas, Window owner)
        {
            this.InitializeComponent();
            this.Owner = owner;
            this.carnassialState = state;
            this.markableCanvas = markableCanvas;

            // Throttles
            this.ImageRendersPerSecond.Minimum = Constant.ThrottleValues.DesiredMaximumImageRendersPerSecondLowerBound;
            this.ImageRendersPerSecond.Maximum = Constant.ThrottleValues.DesiredMaximumImageRendersPerSecondUpperBound;
            this.ImageRendersPerSecond.Value = this.carnassialState.Throttles.DesiredImageRendersPerSecond;
            this.ImageRendersPerSecond.ValueChanged += this.ImageRendersPerSecond_ValueChanged;
            this.ImageRendersPerSecond.ToolTip = this.carnassialState.Throttles.DesiredImageRendersPerSecond;

            // The Max Zoom Value
            this.MaxZoom.Value = this.markableCanvas.ZoomMaximum;
            this.MaxZoom.ToolTip = this.markableCanvas.ZoomMaximum;
            this.MaxZoom.Maximum = Constant.MarkableCanvas.ImageZoomMaximumRangeMaximum;
            this.MaxZoom.Minimum = Constant.MarkableCanvas.ImageZoomMaximumRangeMinimum;

            // Image Differencing Thresholds
            this.DifferenceThreshold.Value = this.carnassialState.DifferenceThreshold;
            this.DifferenceThreshold.ToolTip = this.carnassialState.DifferenceThreshold;
            this.DifferenceThreshold.Maximum = Constant.Images.DifferenceThresholdMax;
            this.DifferenceThreshold.Minimum = Constant.Images.DifferenceThresholdMin;
        }
        public CarnassialWindow()
        {
            AppDomain.CurrentDomain.UnhandledException += this.OnUnhandledException;
            this.InitializeComponent();

            this.MarkableCanvas.MouseEnter += new MouseEventHandler(this.MarkableCanvas_MouseEnter);
            this.MarkableCanvas.PreviewMouseDown += new MouseButtonEventHandler(this.MarkableCanvas_PreviewMouseDown);
            this.MarkableCanvas.MarkerEvent += new EventHandler<MarkerEventArgs>(this.MarkableCanvas_RaiseMarkerEvent);

            this.speechSynthesizer = new SpeechSynthesizer();
            this.state = new CarnassialState();
            this.Title = Constant.MainWindowBaseTitle;

            // recall user's state from prior sessions
            this.state.ReadFromRegistry();

            this.MenuOptionsAudioFeedback.IsChecked = this.state.AudioFeedback;
            this.MenuOptionsEnableCsvImportPrompt.IsChecked = !this.state.SuppressSpreadsheetImportPrompt;
            this.MenuOptionsOrderFilesByDateTime.IsChecked = this.state.OrderFilesByDateTime;
            this.MenuOptionsSkipDarkFileCheck.IsChecked = this.state.SkipDarkImagesCheck;

            // timer callback so the display will update to the current slider position when the user pauses whilst dragging the slider 
            this.timerFileNavigatorSlider = new DispatcherTimer();
            this.timerFileNavigatorSlider.Interval = TimeSpan.FromSeconds(1.0 / Constant.ThrottleValues.DesiredMaximumImageRendersPerSecondUpperBound);
            this.timerFileNavigatorSlider.Tick += this.FileNavigatorSlider_TimerTick;

            // populate lists of menu items
            for (int analysisSlot = 0; analysisSlot < Constant.AnalysisSlots; ++analysisSlot)
            {
                int displaySlot = analysisSlot + 1;

                MenuItem copyToAnalysisSlot = new MenuItem();
                copyToAnalysisSlot.Click += this.MenuEditCopyValuesToAnalysis_Click;
                copyToAnalysisSlot.Header = String.Format("Analysis _{0}", displaySlot);
                copyToAnalysisSlot.Icon = new Image() { Source = Constant.Images.Copy.Value };
                copyToAnalysisSlot.InputGestureText = String.Format("Ctrl+{0}", displaySlot);
                copyToAnalysisSlot.Tag = analysisSlot;
                copyToAnalysisSlot.ToolTip = String.Format("Copy data entered for the current file analysis number {0}.", displaySlot);
                this.MenuEditCopyValuesToAnalysis.Items.Add(copyToAnalysisSlot);

                MenuItem pasteFromAnalysisSlot = new MenuItem();
                pasteFromAnalysisSlot.Click += this.MenuEditPasteFromAnalysis_Click;
                pasteFromAnalysisSlot.Icon = new Image() { Source = Constant.Images.Paste.Value };
                pasteFromAnalysisSlot.InputGestureText = String.Format("{0}", displaySlot);
                pasteFromAnalysisSlot.IsEnabled = false;
                pasteFromAnalysisSlot.Header = String.Format("Analysis _{0}", displaySlot);
                pasteFromAnalysisSlot.Tag = analysisSlot;
                pasteFromAnalysisSlot.ToolTip = String.Format("Apply data in analysis {0}.", displaySlot);
                this.MenuEditPasteValuesFromAnalysis.Items.Add(pasteFromAnalysisSlot);
            }
            this.MenuFileRecentImageSets_Refresh();

            this.Top = this.state.CarnassialWindowPosition.Y;
            this.Left = this.state.CarnassialWindowPosition.X;
            this.Height = this.state.CarnassialWindowPosition.Height;
            this.Width = this.state.CarnassialWindowPosition.Width;
            Utilities.TryFitWindowInWorkingArea(this);
        }
 public void CarnassialProductionKeysRead()
 {
     CarnassialState state = new CarnassialState();
     state.ReadFromRegistry();
 }