Update coding style.
[master-thesis.git] / Parasitemia / ParasitemiaUI / GUI.fs
index 35bc2ad..46171a7 100644 (file)
@@ -20,10 +20,10 @@ open ParasitemiaCore.Utils
 open Types
 
 let run (defaultConfig : Config) (fileToOpen : string option) =
-    let app = new Application()
-    let win = Views.MainWindow()
+    let app = new Application ()
+    let win = Views.MainWindow ()
 
-    let state = State.State(defaultConfig)
+    let state = State.State defaultConfig
     let mutable currentScale = 1.
     let mutable displayHealthy = false
     let warningBelowNumberOfRBC = 1000
@@ -40,9 +40,12 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         let y = rbc.center.Y - rbcHeight / 2. |> roundInt
         let w = roundInt rbcWidth
         let h = roundInt rbcHeight
-        img.GetSubRect(System.Drawing.Rectangle(System.Drawing.Point((if x < 0 then 0 else x), (if y < 0 then 0 else y)),
-                                                System.Drawing.Size((if x + w >= img.Width then img.Width - x else w),
-                                                                    (if y + h >= img.Height then img.Height - y else h))))
+        img.GetSubRect (
+            System.Drawing.Rectangle (
+                System.Drawing.Point ((if x < 0 then 0 else x), (if y < 0 then 0 else y)),
+                System.Drawing.Size ((if x + w >= img.Width then img.Width - x else w), (if y + h >= img.Height then img.Height - y else h))
+            )
+        )
 
     let setRBCFrameStyle (srcImg : SourceImage) (rbc : RBC) (frame : Views.RBCFrame) =
         frame.Opacity <- if displayHealthy || rbc.setManually || rbc.infected then 1. else 0.
@@ -58,19 +61,19 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         frame.Tag <- rbc
         setRBCFrameStyle srcImg rbc frame
         frame.border.StrokeThickness <- 1.
-        frame.txtRBCNumber.Text <- rbc.num.ToString()
+        frame.txtRBCNumber.Text <- string rbc.num
         frame
 
     let updateDocumentStatus () =
         win.txtDocumentStatus.Text <- if state.FilePath = "" then "<New document>" else state.FilePath
 
-    let statusMessageTimer = Threading.DispatcherTimer()
-    statusMessageTimer.Tick.AddHandler(fun obj args -> statusMessageTimer.Stop(); win.txtMessageStatus.Text <- "")
-    statusMessageTimer.Interval <- TimeSpan(0, 0, 2)
+    let statusMessageTimer = Threading.DispatcherTimer ()
+    statusMessageTimer.Tick.AddHandler (fun obj args -> statusMessageTimer.Stop (); win.txtMessageStatus.Text <- "")
+    statusMessageTimer.Interval <- TimeSpan (0, 0, 2)
     let displayStatusMessage (message : string) =
         win.txtMessageStatus.Text <- message
-        statusMessageTimer.Stop()
-        statusMessageTimer.Start()
+        statusMessageTimer.Stop ()
+        statusMessageTimer.Start ()
 
     let highlightRBCFrame (frame : Views.RBCFrame) (highlight : bool) =
         let rbc = frame.Tag :?> RBC
@@ -82,51 +85,51 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
             if not rbc.infected && not rbc.setManually && not displayHealthy then frame.Opacity <- 0.
 
     let zoomToRBC (rbc : RBC) =
-        win.scrollViewCurrentImage.ScrollToHorizontalOffset(rbc.center.X * currentScale - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
-        win.scrollViewCurrentImage.ScrollToVerticalOffset(rbc.center.Y * currentScale - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
+        win.scrollViewCurrentImage.ScrollToHorizontalOffset (rbc.center.X * currentScale - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
+        win.scrollViewCurrentImage.ScrollToVerticalOffset (rbc.center.Y * currentScale - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
 
 
     let txtImageName_TextChanged =
-        TextChangedEventHandler(fun obj args -> state.CurrentImage |> Option.iter(fun srcImg -> state.SetName srcImg win.txtImageName.Text))
+        TextChangedEventHandler (fun obj args -> state.CurrentImage |> Option.iter (fun srcImg -> state.SetName srcImg win.txtImageName.Text))
 
     let updateCurrentImageInformation () =
-        win.txtImageName.TextChanged.RemoveHandler(txtImageName_TextChanged)
-        win.txtImageInformation1.Inlines.Clear()
-        win.txtImageInformation2.Inlines.Clear()
+        win.txtImageName.TextChanged.RemoveHandler (txtImageName_TextChanged)
+        win.txtImageInformation1.Inlines.Clear ()
+        win.txtImageInformation2.Inlines.Clear ()
         win.txtImageName.Text <- ""
 
         match state.CurrentImage with
         | Some srcImg ->
             win.gridImageInformation.Visibility <- Visibility.Visible
             win.txtImageName.Text <- srcImg.name
-            win.txtImageName.TextChanged.AddHandler(txtImageName_TextChanged)
+            win.txtImageName.TextChanged.AddHandler txtImageName_TextChanged
 
             // The left part.
             let parasitemiaStr = Utils.percentText (state.ImageParasitemia srcImg)
-            win.txtImageInformation1.Inlines.Add(Documents.Run("Parasitemia: ", FontWeight = FontWeights.Bold))
-            win.txtImageInformation1.Inlines.Add(parasitemiaStr)
-            win.txtImageInformation1.Inlines.Add(Documents.LineBreak())
+            win.txtImageInformation1.Inlines.Add (Documents.Run ("Parasitemia: ", FontWeight = FontWeights.Bold))
+            win.txtImageInformation1.Inlines.Add parasitemiaStr
+            win.txtImageInformation1.Inlines.Add (Documents.LineBreak ())
 
-            win.txtImageInformation1.Inlines.Add(Documents.Run("Last analysis: ", FontWeight = FontWeights.Bold))
-            win.txtImageInformation1.Inlines.Add(Documents.Run(if srcImg.dateLastAnalysis.Ticks = 0L then "<Never>" else srcImg.dateLastAnalysis.ToLocalTime().ToString()))
+            win.txtImageInformation1.Inlines.Add (Documents.Run ("Last analysis: ", FontWeight = FontWeights.Bold))
+            win.txtImageInformation1.Inlines.Add (Documents.Run (if srcImg.dateLastAnalysis.Ticks = 0L then "<Never>" else string (srcImg.dateLastAnalysis.ToLocalTime())))
 
             // The right part part.
-            win.txtImageInformation2.Inlines.Add(Documents.Run("Added infected erythrocyte: ", FontWeight = FontWeights.Bold))
-            win.txtImageInformation2.Inlines.Add(Documents.Run((state.ImageNbManuallyChangedRBCStr srcImg true) + " " + (state.ImageManuallyChangedRBCStr srcImg true)))
-            win.txtImageInformation2.Inlines.Add(Documents.LineBreak())
-            win.txtImageInformation2.Inlines.Add(Documents.Run("Removed infected erythrocyte: ", FontWeight = FontWeights.Bold))
-            win.txtImageInformation2.Inlines.Add(Documents.Run((state.ImageNbManuallyChangedRBCStr srcImg false) + " " + (state.ImageManuallyChangedRBCStr srcImg false)))
+            win.txtImageInformation2.Inlines.Add (Documents.Run ("Added infected erythrocyte: ", FontWeight = FontWeights.Bold))
+            win.txtImageInformation2.Inlines.Add (Documents.Run ((state.ImageNbManuallyChangedRBCStr srcImg true) + " " + (state.ImageManuallyChangedRBCStr srcImg true)))
+            win.txtImageInformation2.Inlines.Add (Documents.LineBreak ())
+            win.txtImageInformation2.Inlines.Add (Documents.Run ("Removed infected erythrocyte: ", FontWeight = FontWeights.Bold))
+            win.txtImageInformation2.Inlines.Add (Documents.Run ((state.ImageNbManuallyChangedRBCStr srcImg false) + " " + (state.ImageManuallyChangedRBCStr srcImg false)))
 
         | _ ->
             win.gridImageInformation.Visibility <- Visibility.Hidden
 
     let updateGlobalParasitemia () =
-        win.txtGlobalParasitemia.Inlines.Clear()
+        win.txtGlobalParasitemia.Inlines.Clear ()
         let total, infected = state.GlobalParasitemia
-        win.txtGlobalParasitemia.Inlines.Add(Documents.Run(Utils.percentText (total, infected), FontWeight = FontWeights.Bold))
+        win.txtGlobalParasitemia.Inlines.Add (Documents.Run (Utils.percentText (total, infected), FontWeight = FontWeights.Bold))
         if total > 0 && total < warningBelowNumberOfRBC then
-            win.txtGlobalParasitemia.Inlines.Add(
-                Documents.Run(
+            win.txtGlobalParasitemia.Inlines.Add (
+                Documents.Run (
                     sprintf " Warning: the number of erythrocytes should be above %d" warningBelowNumberOfRBC,
                     FontWeight = FontWeights.Bold,
                     Foreground = Brushes.Red
@@ -150,7 +153,7 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                 let marginBottom = previewHeight * (canvasHeight - (win.scrollViewCurrentImage.VerticalOffset - win.borderCurrentImage.BorderThickness.Bottom) - win.scrollViewCurrentImage.ViewportHeight) / canvasHeight - 2.
 
                 preview.viewport.Margin <-
-                    Thickness(
+                    Thickness (
                         marginLeft,
                         marginTop,
                         marginRight,
@@ -173,11 +176,11 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         updateGlobalParasitemia ()
 
     and RBCFrame (srcImg : SourceImage) (rbc : RBC) : Views.RBCFrame =
-        let frame = RBCFrameFromExisting srcImg rbc (Views.RBCFrame())
-        frame.SetValue(Panel.ZIndexProperty, Int32.MaxValue - rbc.num) // To be sure the
-        frame.menuRBCSetAsHealthy.Click.AddHandler(fun obj args -> setAsInfected srcImg (frame.Tag :?> RBC) false)
-        frame.menuRBCSetAsInfected.Click.AddHandler(fun obj args -> setAsInfected srcImg (frame.Tag :?> RBC) true)
-        frame.ContextMenuOpening.AddHandler(
+        let frame = RBCFrameFromExisting srcImg rbc (Views.RBCFrame ())
+        frame.SetValue (Panel.ZIndexProperty, Int32.MaxValue - rbc.num) // To be sure the
+        frame.menuRBCSetAsHealthy.Click.AddHandler (fun obj args -> setAsInfected srcImg (frame.Tag :?> RBC) false)
+        frame.menuRBCSetAsInfected.Click.AddHandler (fun obj args -> setAsInfected srcImg (frame.Tag :?> RBC) true)
+        frame.ContextMenuOpening.AddHandler (
             fun obj args ->
                 if (frame.Tag :?> RBC).infected then
                     frame.menuRBCSetAsHealthy.Visibility <- Visibility.Visible
@@ -186,9 +189,9 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                     frame.menuRBCSetAsHealthy.Visibility <- Visibility.Collapsed
                     frame.menuRBCSetAsInfected.Visibility <- Visibility.Visible
         )
-        frame.ContextMenuClosing.AddHandler(fun obj args -> if not frame.IsMouseOver then highlightRBCFrame frame false )
-        frame.MouseEnter.AddHandler(fun obj args -> highlightRBCFrame frame true)
-        frame.MouseLeave.AddHandler(fun obj args -> if not frame.grid.ContextMenu.IsOpen then highlightRBCFrame frame false)
+        frame.ContextMenuClosing.AddHandler (fun obj args -> if not frame.IsMouseOver then highlightRBCFrame frame false )
+        frame.MouseEnter.AddHandler (fun obj args -> highlightRBCFrame frame true)
+        frame.MouseLeave.AddHandler (fun obj args -> if not frame.grid.ContextMenu.IsOpen then highlightRBCFrame frame false)
         frame
 
     and updateRBCFramesPreview () =
@@ -201,17 +204,17 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                         RBCFrameFromExisting srcImg rbc (win.stackRBC.Children.[currentPreview] :?> Views.RBCFrame)
                     else
                         let f = RBCFrame srcImg rbc
-                        f.MouseLeftButtonUp.AddHandler(fun obj args -> zoomToRBC (f.Tag :?> RBC))
-                        win.stackRBC.Children.Add(f) |> ignore
+                        f.MouseLeftButtonUp.AddHandler (fun obj args -> zoomToRBC (f.Tag :?> RBC))
+                        win.stackRBC.Children.Add f |> ignore
                         f
 
                 currentPreview <- currentPreview + 1
 
                 previewInfected.Height <- win.stackRBC.ActualHeight
                 previewInfected.Width <- win.stackRBC.ActualHeight * rbc.size.Width / rbc.size.Height
-                previewInfected.border.Fill <- ImageBrush(BitmapSourceConvert.ToBitmapSource(extractRBCPreview srcImg.img rbc))
+                previewInfected.border.Fill <- ImageBrush (BitmapSourceConvert.ToBitmapSource (extractRBCPreview srcImg.img rbc))
 
-            win.stackRBC.Children.RemoveRange(currentPreview, win.stackRBC.Children.Count - currentPreview)
+            win.stackRBC.Children.RemoveRange (currentPreview, win.stackRBC.Children.Count - currentPreview)
         | _ -> ()
 
         updateViewportPreview ()
@@ -226,27 +229,27 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                         RBCFrameFromExisting srcImg rbc (win.canvasCurrentImage.Children.[currentCanvas] :?> Views.RBCFrame)
                     else
                         let f = RBCFrame srcImg rbc
-                        win.canvasCurrentImage.Children.Add(f) |> ignore
+                        win.canvasCurrentImage.Children.Add f |> ignore
                         f
 
                 currentCanvas <- currentCanvas + 1
 
-                Canvas.SetLeft(frame, rbc.center.X - rbc.size.Width / 2.)
-                Canvas.SetTop(frame, rbc.center.Y - rbc.size.Height / 2.)
+                Canvas.SetLeft (frame, rbc.center.X - rbc.size.Width / 2.)
+                Canvas.SetTop (frame, rbc.center.Y - rbc.size.Height / 2.)
 
             for i in currentCanvas .. win.canvasCurrentImage.Children.Count - 1 do
                 win.canvasCurrentImage.Children.[i].Visibility <- Visibility.Hidden
         | _ -> ()
 
     let askDocumentPathToSave () : string option =
-        let dialog = SaveFileDialog(AddExtension = true, DefaultExt = PiaZ.extension, Filter = PiaZ.filter)
+        let dialog = SaveFileDialog (AddExtension = true, DefaultExt = PiaZ.extension, Filter = PiaZ.filter)
 
         if state.FilePath <> "" then
             dialog.FileName <- FileInfo(state.FilePath).Name
         elif state.PatientID <> "" then
             dialog.FileName <- state.PatientID + PiaZ.extension
 
-        let res = dialog.ShowDialog()
+        let res = dialog.ShowDialog ()
         if res.HasValue && res.Value then
             Some dialog.FileName
         else
@@ -258,16 +261,16 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                 match askDocumentPathToSave () with
                 | Some filepath ->
                     state.FilePath <- filepath
-                    state.Save()
+                    state.Save ()
                 | _ -> ()
             else
-                state.Save()
+                state.Save ()
             updateDocumentStatus ()
             displayStatusMessage "Document saved"
         with
         | :? IOException as ex ->
             Log.Error "%O" ex
-            MessageBox.Show(sprintf "The document cannot be save in \"%s\"" state.FilePath, "Error saving the document", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
+            MessageBox.Show (sprintf "The document cannot be save in \"%s\"" state.FilePath, "Error saving the document", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
 
     let saveCurrentDocumentAsNewFile () =
         match askDocumentPathToSave () with
@@ -279,7 +282,7 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
     // Ask the use to save the current document if neccessary.
     let askSaveCurrent () =
         if state.AlteredSinceLastSave then
-            match MessageBox.Show("Would you like to save the current document?", "Saving the current document", MessageBoxButton.YesNo, MessageBoxImage.Question) with
+            match MessageBox.Show ("Would you like to save the current document?", "Saving the current document", MessageBoxButton.YesNo, MessageBoxImage.Question) with
             | MessageBoxResult.Yes -> saveCurrentDocument ()
             | _ -> ()
 
@@ -291,11 +294,11 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
             // Highlight the preview.
             win.stackPreviews.Children
             |> Seq.cast<Views.ImageSourcePreview>
-            |> Seq.iter (fun preview -> preview.border.BorderThickness <- Thickness(if preview.Tag = (srcImg :> Object) then 3. else 0.))
+            |> Seq.iter (fun preview -> preview.border.BorderThickness <- Thickness (if preview.Tag = (srcImg :> Object) then 3. else 0.))
 
             win.canvasCurrentImage.Height <- float srcImg.img.Height
             win.canvasCurrentImage.Width <- float srcImg.img.Width
-            win.canvasCurrentImage.Background <- ImageBrush(BitmapSourceConvert.ToBitmapSource(srcImg.img))
+            win.canvasCurrentImage.Background <- ImageBrush (BitmapSourceConvert.ToBitmapSource (srcImg.img))
 
             updateRBCFramesCurrent ()
             updateRBCFramesPreview ()
@@ -303,8 +306,8 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         | None ->
             win.imgLogos.Visibility <- Visibility.Visible
 
-            win.stackRBC.Children.Clear()
-            win.canvasCurrentImage.Children.Clear()
+            win.stackRBC.Children.Clear ()
+            win.canvasCurrentImage.Children.Clear ()
             win.canvasCurrentImage.Background <- canvasCurrentImageColor
 
         updateCurrentImageInformation ()
@@ -315,27 +318,29 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
             updateCurrentImage ()
 
     let addPreview (srcImg : SourceImage) =
-        let imgCtrl = Views.ImageSourcePreview(Margin = Thickness(3.))
+        let imgCtrl = Views.ImageSourcePreview (Margin = Thickness 3.)
 
-        imgCtrl.menuRemoveImage.Click.AddHandler(fun obj args ->
-            win.stackPreviews.Children.Remove(imgCtrl)
-            let srcImg = imgCtrl.Tag :?> SourceImage
-            let currentRemoved = Some srcImg = state.CurrentImage
-            state.RemoveSourceImage srcImg
-            if currentRemoved then
-                updateCurrentImage()
+        imgCtrl.menuRemoveImage.Click.AddHandler (
+            fun obj args ->
+                win.stackPreviews.Children.Remove (imgCtrl)
+                let srcImg = imgCtrl.Tag :?> SourceImage
+                let currentRemoved = Some srcImg = state.CurrentImage
+                state.RemoveSourceImage srcImg
+                if currentRemoved then
+                    updateCurrentImage ()
 
-            updateGlobalParasitemia()
+                updateGlobalParasitemia ()
 
-            // Update image numbers.
-            win.stackPreviews.Children |> Seq.cast<Views.ImageSourcePreview> |> Seq.iter (fun imgPreview -> imgPreview.txtImageNumber.Text <- (imgPreview.Tag :?> SourceImage).num.ToString()))
+                // Update image numbers.
+                win.stackPreviews.Children |> Seq.cast<Views.ImageSourcePreview> |> Seq.iter (fun imgPreview -> imgPreview.txtImageNumber.Text <- (imgPreview.Tag :?> SourceImage).num.ToString ())
+        )
 
         imgCtrl.Tag <- srcImg
-        imgCtrl.txtImageNumber.Text <- srcImg.num.ToString()
+        imgCtrl.txtImageNumber.Text <- string srcImg.num
         let width = 200
         let height = srcImg.img.Height * width / srcImg.img.Width
-        imgCtrl.imagePreview.Source <- BitmapSourceConvert.ToBitmapSource(srcImg.img.Resize(width, height, Emgu.CV.CvEnum.Inter.Cubic))
-        win.stackPreviews.Children.Add(imgCtrl) |> ignore
+        imgCtrl.imagePreview.Source <- BitmapSourceConvert.ToBitmapSource (srcImg.img.Resize (width, height, Emgu.CV.CvEnum.Inter.Cubic))
+        win.stackPreviews.Children.Add imgCtrl |> ignore
 
         // Zoom to a mouse position into the control 'imgCtrl'.
         let zoomTo (mousePos : Point) =
@@ -343,24 +348,27 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
             let canvasH = win.canvasCurrentImage.ActualHeight * currentScale
             let centerX = (mousePos.X - imgCtrl.BorderThickness.Left) / (imgCtrl.ActualWidth - imgCtrl.BorderThickness.Left) * canvasW
             let centerY = (mousePos.Y - imgCtrl.BorderThickness.Top) / (imgCtrl.ActualHeight - imgCtrl.BorderThickness.Top) * canvasH
-            win.scrollViewCurrentImage.ScrollToHorizontalOffset(centerX - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
-            win.scrollViewCurrentImage.ScrollToVerticalOffset(centerY - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
-
-        imgCtrl.MouseLeftButtonDown.AddHandler(fun obj args ->
-            setCurrentImage (state.SourceImages |> Seq.find (fun srcImg -> (srcImg :> Object) = imgCtrl.Tag))
-            imgCtrl.UpdateLayout()
-            zoomTo (args.GetPosition(imgCtrl))
-            imgCtrl.CaptureMouse() |> ignore
+            win.scrollViewCurrentImage.ScrollToHorizontalOffset (centerX - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
+            win.scrollViewCurrentImage.ScrollToVerticalOffset (centerY - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
+
+        imgCtrl.MouseLeftButtonDown.AddHandler (
+            fun obj args ->
+                setCurrentImage (state.SourceImages |> Seq.find (fun srcImg -> (srcImg :> Object) = imgCtrl.Tag))
+                imgCtrl.UpdateLayout ()
+                zoomTo (args.GetPosition (imgCtrl))
+                imgCtrl.CaptureMouse () |> ignore
         )
 
-        imgCtrl.MouseMove.AddHandler(fun obj args ->
-            if imgCtrl.IsMouseCaptured then
-                zoomTo (args.GetPosition(imgCtrl))
+        imgCtrl.MouseMove.AddHandler (
+            fun obj args ->
+                if imgCtrl.IsMouseCaptured then
+                    zoomTo (args.GetPosition imgCtrl)
         )
 
-        imgCtrl.MouseLeftButtonUp.AddHandler(fun obj args ->
-            if imgCtrl.IsMouseCaptured then
-                imgCtrl.ReleaseMouseCapture()
+        imgCtrl.MouseLeftButtonUp.AddHandler (
+            fun obj args ->
+                if imgCtrl.IsMouseCaptured then
+                    imgCtrl.ReleaseMouseCapture ()
         )
 
     let updatePreviews () =
@@ -380,48 +388,48 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         let previousFilePath = state.FilePath
         try
             state.FilePath <- filepath
-            state.Load()
+            state.Load ()
             updateGUI ()
         with
         | :? IOException as ex ->
             Log.Error "%O" ex
             state.FilePath <- previousFilePath
-            MessageBox.Show(sprintf "The document cannot be loaded from \"%s\"" filepath, "Error loading the document", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
+            MessageBox.Show (sprintf "The document cannot be loaded from \"%s\"" filepath, "Error loading the document", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
 
     let askLoadFile () =
-        let dialog = OpenFileDialog(Filter = PiaZ.filter)
-        let res = dialog.ShowDialog()
+        let dialog = OpenFileDialog (Filter = PiaZ.filter)
+        let res = dialog.ShowDialog ()
         if res.HasValue && res.Value then
             loadFile dialog.FileName
 
     let newFile () =
         askSaveCurrent ()
-        state.Reset()
-        updateGUI()
+        state.Reset ()
+        updateGUI ()
 
     let exportResults () =
         let extension = ".txt"
-        let dialog = SaveFileDialog(AddExtension = true, DefaultExt = extension)
+        let dialog = SaveFileDialog (AddExtension = true, DefaultExt = extension)
 
         if state.FilePath <> "" then
-            dialog.FileName <- Path.GetFileNameWithoutExtension(state.FilePath) + extension
+            dialog.FileName <- Path.GetFileNameWithoutExtension state.FilePath + extension
         elif state.PatientID <> "" then
             dialog.FileName <- state.PatientID + extension
 
-        let res = dialog.ShowDialog()
+        let res = dialog.ShowDialog ()
         if res.HasValue && res.Value then
             try
                 Export.exportResults state dialog.FileName
             with
             | :? IOException as ex ->
                 Log.Error "%O" ex
-                MessageBox.Show(sprintf "The results cannot be exported in \"%s\"" state.FilePath, "Error exporting the files", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
+                MessageBox.Show (sprintf "The results cannot be exported in \"%s\"" state.FilePath, "Error exporting the files", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
 
     let importImage () =
-        let dialog = OpenFileDialog(Filter = "Image Files|*.png;*.jpg;*.tif;*.tiff", Multiselect = true)
-        let res = dialog.ShowDialog()
+        let dialog = OpenFileDialog (Filter = "Image Files|*.png;*.jpg;*.tif;*.tiff", Multiselect = true)
+        let res = dialog.ShowDialog ()
         if res.HasValue && res.Value then
-            let noSourceImage = state.SourceImages.Count() = 0
+            let noSourceImage = state.SourceImages.Count () = 0
 
             for filename in dialog.FileNames do
                 try
@@ -430,7 +438,7 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                 with
                 | _ as ex ->
                     Log.Error "%O" ex
-                    MessageBox.Show(sprintf "Unable to read the image from \"%s\"" filename, "Error adding an image", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
+                    MessageBox.Show (sprintf "Unable to read the image from \"%s\"" filename, "Error adding an image", MessageBoxButton.OK, MessageBoxImage.Error) |> ignore
 
             updateGlobalParasitemia ()
 
@@ -447,173 +455,179 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
         updateRBCFramesPreview ()
         updateRBCFramesCurrent ()
 
-    win.txtPatient.TextChanged.AddHandler(fun obj args -> state.PatientID <- win.txtPatient.Text)
+    win.txtPatient.TextChanged.AddHandler (fun obj args -> state.PatientID <- win.txtPatient.Text)
 
-    win.menuExit.Click.AddHandler(fun obj args -> win.Close())
-    win.menuSave.Click.AddHandler(fun obj args -> saveCurrentDocument ())
-    win.menuSaveAs.Click.AddHandler(fun obj args -> saveCurrentDocumentAsNewFile ())
-    win.menuOpen.Click.AddHandler(fun obj args -> askLoadFile ())
-    win.menuNew.Click.AddHandler(fun obj args -> newFile ())
-    win.menuExportResults.Click.AddHandler(fun obj args -> exportResults ())
+    win.menuExit.Click.AddHandler (fun obj args -> win.Close ())
+    win.menuSave.Click.AddHandler (fun obj args -> saveCurrentDocument ())
+    win.menuSaveAs.Click.AddHandler (fun obj args -> saveCurrentDocumentAsNewFile ())
+    win.menuOpen.Click.AddHandler (fun obj args -> askLoadFile ())
+    win.menuNew.Click.AddHandler (fun obj args -> newFile ())
+    win.menuExportResults.Click.AddHandler (fun obj args -> exportResults ())
 
-    win.menuAddSourceImage.Click.AddHandler(fun obj args -> importImage ())
+    win.menuAddSourceImage.Click.AddHandler (fun obj args -> importImage ())
 
-    win.menuAnalysis.SubmenuOpened.AddHandler(fun obj args -> win.menuStartAnalysis.IsEnabled <- state.SourceImages.Count() > 0)
+    win.menuAnalysis.SubmenuOpened.AddHandler (fun obj args -> win.menuStartAnalysis.IsEnabled <- state.SourceImages.Count () > 0)
 
-    win.menuStartAnalysis.Click.AddHandler(fun obj args -> showAnalysisWindow ())
+    win.menuStartAnalysis.Click.AddHandler (fun obj args -> showAnalysisWindow ())
 
-    win.menuHightlightRBC.Click.AddHandler(fun obj args -> setHighlightRBC win.menuHightlightRBC.IsChecked)
+    win.menuHightlightRBC.Click.AddHandler (fun obj args -> setHighlightRBC win.menuHightlightRBC.IsChecked)
 
-    win.menuAbout.Click.AddHandler(fun obj args -> About.showWindow win)
+    win.menuAbout.Click.AddHandler (fun obj args -> About.showWindow win)
 
-    win.Closing.AddHandler(fun obj args -> askSaveCurrent ())
+    win.Closing.AddHandler (fun obj args -> askSaveCurrent ())
 
     // Zoom on the current image.
     let adjustCurrentImageBorders (deltaX : float) (deltaY : float) =
         win.borderCurrentImage.BorderThickness <-
-            Thickness(
+            Thickness (
                 (win.scrollViewCurrentImage.ViewportWidth + deltaX) / 2.,
                 (win.scrollViewCurrentImage.ViewportHeight + deltaY) / 2.,
                 (win.scrollViewCurrentImage.ViewportWidth + deltaX) / 2.,
                 (win.scrollViewCurrentImage.ViewportHeight + deltaY) / 2.
             )
 
-    win.canvasCurrentImage.SizeChanged.AddHandler(fun obj args ->
-        let deltaX = args.NewSize.Width - args.PreviousSize.Width
-        let deltaY = args.NewSize.Height - args.PreviousSize.Height
-        if deltaX > 0.5 || deltaY > 0.5 then
-            adjustCurrentImageBorders 0.0 0.0
-            // Center the view at the center of the image initialy.
-            win.scrollViewCurrentImage.UpdateLayout()
-            win.scrollViewCurrentImage.ScrollToHorizontalOffset(win.borderCurrentImage.ActualWidth / 2. - win.scrollViewCurrentImage.ViewportWidth / 2.)
-            win.scrollViewCurrentImage.ScrollToVerticalOffset(win.borderCurrentImage.ActualHeight / 2. - win.scrollViewCurrentImage.ViewportHeight / 2.)
+    win.canvasCurrentImage.SizeChanged.AddHandler (
+        fun obj args ->
+            let deltaX = args.NewSize.Width - args.PreviousSize.Width
+            let deltaY = args.NewSize.Height - args.PreviousSize.Height
+            if deltaX > 0.5 || deltaY > 0.5 then
+                adjustCurrentImageBorders 0.0 0.0
+                // Center the view at the center of the image initialy.
+                win.scrollViewCurrentImage.UpdateLayout ()
+                win.scrollViewCurrentImage.ScrollToHorizontalOffset (win.borderCurrentImage.ActualWidth / 2. - win.scrollViewCurrentImage.ViewportWidth / 2.)
+                win.scrollViewCurrentImage.ScrollToVerticalOffset (win.borderCurrentImage.ActualHeight / 2. - win.scrollViewCurrentImage.ViewportHeight / 2.)
     )
 
-    win.scrollViewCurrentImage.SizeChanged.AddHandler(fun obj args ->
-        let deltaX = args.NewSize.Width - args.PreviousSize.Width
-        let deltaY = args.NewSize.Height - args.PreviousSize.Height
-        adjustCurrentImageBorders deltaX deltaY
-        win.scrollViewCurrentImage.ScrollToHorizontalOffset(win.scrollViewCurrentImage.HorizontalOffset + deltaX / 8.)
-        win.scrollViewCurrentImage.ScrollToVerticalOffset(win.scrollViewCurrentImage.VerticalOffset + deltaY / 8.)
+    win.scrollViewCurrentImage.SizeChanged.AddHandler (
+        fun obj args ->
+            let deltaX = args.NewSize.Width - args.PreviousSize.Width
+            let deltaY = args.NewSize.Height - args.PreviousSize.Height
+            adjustCurrentImageBorders deltaX deltaY
+            win.scrollViewCurrentImage.ScrollToHorizontalOffset (win.scrollViewCurrentImage.HorizontalOffset + deltaX / 8.)
+            win.scrollViewCurrentImage.ScrollToVerticalOffset (win.scrollViewCurrentImage.VerticalOffset + deltaY / 8.)
     )
 
     let mutable maxScale = 4.
     let mutable minScale = 0.25
-    let currentImageScaleTransform = ScaleTransform()
+    let currentImageScaleTransform = ScaleTransform ()
     win.canvasCurrentImage.LayoutTransform <- currentImageScaleTransform
-    win.borderCurrentImage.PreviewMouseWheel.AddHandler(fun obj args ->
-        let scaleFactor = if args.Delta > 0 then 2.0 else 0.5
-        if scaleFactor > 1. && currentScale < maxScale || scaleFactor < 1. && currentScale > minScale then
-            let previousScale = currentScale
-            currentScale <-
-                let newScale = currentScale * scaleFactor
-                if newScale > maxScale then maxScale elif newScale < minScale then minScale else newScale
-            let realScaleFactor = currentScale / previousScale
+    win.borderCurrentImage.PreviewMouseWheel.AddHandler (
+        fun obj args ->
+            let scaleFactor = if args.Delta > 0 then 2.0 else 0.5
+            if scaleFactor > 1. && currentScale < maxScale || scaleFactor < 1. && currentScale > minScale then
+                let previousScale = currentScale
+                currentScale <-
+                    let newScale = currentScale * scaleFactor
+                    if newScale > maxScale then maxScale elif newScale < minScale then minScale else newScale
+                let realScaleFactor = currentScale / previousScale
 
-            let centerX = win.scrollViewCurrentImage.HorizontalOffset + win.scrollViewCurrentImage.ViewportWidth / 2. - win.borderCurrentImage.BorderThickness.Left
-            let centerY = win.scrollViewCurrentImage.VerticalOffset + win.scrollViewCurrentImage.ViewportHeight / 2. - win.borderCurrentImage.BorderThickness.Top
+                let centerX = win.scrollViewCurrentImage.HorizontalOffset + win.scrollViewCurrentImage.ViewportWidth / 2. - win.borderCurrentImage.BorderThickness.Left
+                let centerY = win.scrollViewCurrentImage.VerticalOffset + win.scrollViewCurrentImage.ViewportHeight / 2. - win.borderCurrentImage.BorderThickness.Top
 
-            currentImageScaleTransform.ScaleX <- currentScale
-            currentImageScaleTransform.ScaleY <- currentScale
+                currentImageScaleTransform.ScaleX <- currentScale
+                currentImageScaleTransform.ScaleY <- currentScale
 
-            win.scrollViewCurrentImage.ScrollToHorizontalOffset(centerX * realScaleFactor - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
-            win.scrollViewCurrentImage.ScrollToVerticalOffset(centerY * realScaleFactor - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
+                win.scrollViewCurrentImage.ScrollToHorizontalOffset (centerX * realScaleFactor - win.scrollViewCurrentImage.ViewportWidth / 2. + win.borderCurrentImage.BorderThickness.Left)
+                win.scrollViewCurrentImage.ScrollToVerticalOffset (centerY * realScaleFactor - win.scrollViewCurrentImage.ViewportHeight / 2. + win.borderCurrentImage.BorderThickness.Top)
 
-        args.Handled <- true
+            args.Handled <- true
     )
 
     // Pan on the current image.
-    let mutable scrollStartPosition = Point(0., 0.)
+    let mutable scrollStartPosition = Point (0., 0.)
     let mutable scrollStartOffsetX = 0.
     let mutable scrollStartOffsetY = 0.
-    win.borderCurrentImage.PreviewMouseLeftButtonDown.AddHandler(fun obj args ->
-        scrollStartPosition <- args.GetPosition(win.scrollViewCurrentImage)
-        scrollStartOffsetX <- win.scrollViewCurrentImage.HorizontalOffset
-        scrollStartOffsetY <- win.scrollViewCurrentImage.VerticalOffset
-        win.borderCurrentImage.Cursor <- Input.Cursors.ScrollAll
-        win.borderCurrentImage.CaptureMouse() |> ignore
-        args.Handled <- true
+    win.borderCurrentImage.PreviewMouseLeftButtonDown.AddHandler (
+        fun obj args ->
+            scrollStartPosition <- args.GetPosition win.scrollViewCurrentImage
+            scrollStartOffsetX <- win.scrollViewCurrentImage.HorizontalOffset
+            scrollStartOffsetY <- win.scrollViewCurrentImage.VerticalOffset
+            win.borderCurrentImage.Cursor <- Input.Cursors.ScrollAll
+            win.borderCurrentImage.CaptureMouse () |> ignore
+            args.Handled <- true
     )
 
-    win.borderCurrentImage.PreviewMouseMove.AddHandler(fun obj args ->
-        if win.borderCurrentImage.IsMouseCaptured then
-            let position = args.GetPosition(win.scrollViewCurrentImage)
-            let deltaX = scrollStartPosition.X - position.X
-            let deltaY = scrollStartPosition.Y - position.Y
-            win.scrollViewCurrentImage.ScrollToHorizontalOffset(deltaX + scrollStartOffsetX)
-            win.scrollViewCurrentImage.ScrollToVerticalOffset(deltaY + scrollStartOffsetY)
+    win.borderCurrentImage.PreviewMouseMove.AddHandler (
+        fun obj args ->
+            if win.borderCurrentImage.IsMouseCaptured then
+                let position = args.GetPosition win.scrollViewCurrentImage
+                let deltaX = scrollStartPosition.X - position.X
+                let deltaY = scrollStartPosition.Y - position.Y
+                win.scrollViewCurrentImage.ScrollToHorizontalOffset (deltaX + scrollStartOffsetX)
+                win.scrollViewCurrentImage.ScrollToVerticalOffset (deltaY + scrollStartOffsetY)
 
-            args.Handled <- true
+                args.Handled <- true
     )
 
-    win.borderCurrentImage.PreviewMouseLeftButtonUp.AddHandler(fun obj args ->
-        if win.borderCurrentImage.IsMouseCaptured then
-            win.borderCurrentImage.Cursor <- Input.Cursors.Arrow
-            win.borderCurrentImage.ReleaseMouseCapture()
-            args.Handled <- true
+    win.borderCurrentImage.PreviewMouseLeftButtonUp.AddHandler (
+        fun obj args ->
+            if win.borderCurrentImage.IsMouseCaptured then
+                win.borderCurrentImage.Cursor <- Input.Cursors.Arrow
+                win.borderCurrentImage.ReleaseMouseCapture ()
+                args.Handled <- true
     )
 
     // Shortcuts.
     // Save.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> saveCurrentDocument ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.S, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> saveCurrentDocument ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.S, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Save as.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> saveCurrentDocumentAsNewFile ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.S, Input.ModifierKeys.Control ||| Input.ModifierKeys.Shift)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> saveCurrentDocumentAsNewFile ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.S, Input.ModifierKeys.Control ||| Input.ModifierKeys.Shift)
         )
     ) |> ignore
 
     // Open.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> askLoadFile ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.O, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> askLoadFile ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.O, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // New file.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> newFile ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.N, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> newFile ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.N, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Export results.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> exportResults ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.E, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> exportResults ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.E, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Import an image.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> importImage ()), (fun obj -> true)),
-            Input.KeyGesture(Input.Key.A, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> importImage ()), (fun obj -> true)),
+            Input.KeyGesture (Input.Key.A, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Show analysis dialog.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand((fun obj -> showAnalysisWindow ()), (fun obj -> state.SourceImages.Count() > 0)),
-            Input.KeyGesture(Input.Key.Y, Input.ModifierKeys.Control)
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand ((fun obj -> showAnalysisWindow ()), (fun obj -> state.SourceImages.Count () > 0)),
+            Input.KeyGesture (Input.Key.Y, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Toggle RBC highlight.
-    win.InputBindings.Add(
-        Input.KeyBinding(
-            ViewModule.FunCommand(
+    win.InputBindings.Add (
+        Input.KeyBinding (
+            ViewModule.FunCommand (
                 (
                     fun obj ->
                         win.menuHightlightRBC.IsChecked <- not win.menuHightlightRBC.IsChecked
@@ -621,20 +635,20 @@ let run (defaultConfig : Config) (fileToOpen : string option) =
                 ),
                 (fun obj -> true)
             ),
-            Input.KeyGesture(Input.Key.H, Input.ModifierKeys.Control)
+            Input.KeyGesture (Input.Key.H, Input.ModifierKeys.Control)
         )
     ) |> ignore
 
     // Viewport preview.
-    win.scrollViewCurrentImage.ScrollChanged.AddHandler(fun obj args -> updateViewportPreview ())
+    win.scrollViewCurrentImage.ScrollChanged.AddHandler (fun obj args -> updateViewportPreview ())
 
     updateDocumentStatus ()
     win.gridImageInformation.Visibility <- Visibility.Hidden
 
-    win.Show()
+    win.Show ()
 
     match fileToOpen with
     | Some filepath -> loadFile filepath
     | None -> ()
 
-    app.Run()
+    app.Run ()