From db1f5bee2225aac6ce7d71aa049673b68cc8cc8f Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Tue, 31 May 2022 14:32:12 +0200
Subject: [PATCH] added additional buttons to view selected FL Curve files

---
 VECTO/GUI/IEPCForm.Designer.vb |   80 +-
 VECTO/GUI/IEPCForm.resx        |    5 +-
 VECTO/GUI/IEPCForm.vb          | 1493 +++++++++++++++++---------------
 3 files changed, 843 insertions(+), 735 deletions(-)

diff --git a/VECTO/GUI/IEPCForm.Designer.vb b/VECTO/GUI/IEPCForm.Designer.vb
index 901c96aba2..c8f7250a2f 100644
--- a/VECTO/GUI/IEPCForm.Designer.vb
+++ b/VECTO/GUI/IEPCForm.Designer.vb
@@ -22,6 +22,7 @@ Partial Class IEPCForm
 	'Do not modify it using the code editor.
 	<System.Diagnostics.DebuggerStepThrough()>
 	Private Sub InitializeComponent()
+        Me.components = New System.ComponentModel.Container()
         Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(IEPCForm))
         Me.btFLCurveFile1 = New System.Windows.Forms.Button()
         Me.tbThermalOverload = New System.Windows.Forms.TextBox()
@@ -37,6 +38,7 @@ Partial Class IEPCForm
         Me.FlowLayoutPanel9 = New System.Windows.Forms.FlowLayoutPanel()
         Me.Label44 = New System.Windows.Forms.Label()
         Me.tbFLCurve1 = New System.Windows.Forms.TextBox()
+        Me.btShowFLCurve1 = New System.Windows.Forms.Button()
         Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
         Me.Label11 = New System.Windows.Forms.Label()
         Me.Label4 = New System.Windows.Forms.Label()
@@ -73,6 +75,7 @@ Partial Class IEPCForm
         Me.Label28 = New System.Windows.Forms.Label()
         Me.tbFLCurve2 = New System.Windows.Forms.TextBox()
         Me.btFLCurveFile2 = New System.Windows.Forms.Button()
+        Me.btShowFLCurve2 = New System.Windows.Forms.Button()
         Me.TableLayoutPanel4 = New System.Windows.Forms.TableLayoutPanel()
         Me.Label17 = New System.Windows.Forms.Label()
         Me.Label18 = New System.Windows.Forms.Label()
@@ -139,6 +142,9 @@ Partial Class IEPCForm
         Me.Label10 = New System.Windows.Forms.Label()
         Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
         Me.LbStatus = New System.Windows.Forms.ToolStripStatusLabel()
+        Me.CmOpenFile = New System.Windows.Forms.ContextMenuStrip(Me.components)
+        Me.OpenWithToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
+        Me.ShowInFolderToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
         Me.tcVoltageLevels.SuspendLayout
         Me.tpFirstVoltageLevel.SuspendLayout
         Me.FlowLayoutPanel9.SuspendLayout
@@ -165,6 +171,7 @@ Partial Class IEPCForm
         Me.FlowLayoutPanel7.SuspendLayout
         Me.FlowLayoutPanel8.SuspendLayout
         Me.StatusStrip1.SuspendLayout
+        Me.CmOpenFile.SuspendLayout
         Me.SuspendLayout
         '
         'btFLCurveFile1
@@ -284,6 +291,7 @@ Partial Class IEPCForm
         Me.FlowLayoutPanel9.Controls.Add(Me.Label44)
         Me.FlowLayoutPanel9.Controls.Add(Me.tbFLCurve1)
         Me.FlowLayoutPanel9.Controls.Add(Me.btFLCurveFile1)
+        Me.FlowLayoutPanel9.Controls.Add(Me.btShowFLCurve1)
         Me.FlowLayoutPanel9.Location = New System.Drawing.Point(6, 94)
         Me.FlowLayoutPanel9.Name = "FlowLayoutPanel9"
         Me.FlowLayoutPanel9.Size = New System.Drawing.Size(496, 26)
@@ -309,6 +317,17 @@ Partial Class IEPCForm
         Me.tbFLCurve1.Size = New System.Drawing.Size(277, 20)
         Me.tbFLCurve1.TabIndex = 60
         '
+        'btShowFLCurve1
+        '
+        Me.btShowFLCurve1.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
+        Me.btShowFLCurve1.Location = New System.Drawing.Point(449, 1)
+        Me.btShowFLCurve1.Margin = New System.Windows.Forms.Padding(0, 1, 0, 0)
+        Me.btShowFLCurve1.Name = "btShowFLCurve1"
+        Me.btShowFLCurve1.Size = New System.Drawing.Size(24, 24)
+        Me.btShowFLCurve1.TabIndex = 85
+        Me.btShowFLCurve1.TabStop = false
+        Me.btShowFLCurve1.UseVisualStyleBackColor = true
+        '
         'TableLayoutPanel1
         '
         Me.TableLayoutPanel1.ColumnCount = 7
@@ -556,7 +575,7 @@ Partial Class IEPCForm
         '
         Me.Label47.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
         Me.Label47.AutoSize = true
-        Me.Label47.Location = New System.Drawing.Point(189, 126)
+        Me.Label47.Location = New System.Drawing.Point(189, 127)
         Me.Label47.Name = "Label47"
         Me.Label47.Size = New System.Drawing.Size(106, 13)
         Me.Label47.TabIndex = 6
@@ -575,7 +594,7 @@ Partial Class IEPCForm
         Me.lvPowerMap1.Location = New System.Drawing.Point(3, 3)
         Me.lvPowerMap1.MultiSelect = false
         Me.lvPowerMap1.Name = "lvPowerMap1"
-        Me.lvPowerMap1.Size = New System.Drawing.Size(292, 120)
+        Me.lvPowerMap1.Size = New System.Drawing.Size(292, 121)
         Me.lvPowerMap1.TabIndex = 7
         Me.lvPowerMap1.TabStop = false
         Me.lvPowerMap1.UseCompatibleStateImageBehavior = false
@@ -636,7 +655,7 @@ Partial Class IEPCForm
         '
         Me.Label5.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
         Me.Label5.AutoSize = true
-        Me.Label5.Location = New System.Drawing.Point(189, 126)
+        Me.Label5.Location = New System.Drawing.Point(189, 127)
         Me.Label5.Name = "Label5"
         Me.Label5.Size = New System.Drawing.Size(106, 13)
         Me.Label5.TabIndex = 6
@@ -655,7 +674,7 @@ Partial Class IEPCForm
         Me.lvPowerMap2.Location = New System.Drawing.Point(3, 3)
         Me.lvPowerMap2.MultiSelect = false
         Me.lvPowerMap2.Name = "lvPowerMap2"
-        Me.lvPowerMap2.Size = New System.Drawing.Size(292, 120)
+        Me.lvPowerMap2.Size = New System.Drawing.Size(292, 121)
         Me.lvPowerMap2.TabIndex = 7
         Me.lvPowerMap2.TabStop = false
         Me.lvPowerMap2.UseCompatibleStateImageBehavior = false
@@ -676,6 +695,7 @@ Partial Class IEPCForm
         Me.FlowLayoutPanel10.Controls.Add(Me.Label28)
         Me.FlowLayoutPanel10.Controls.Add(Me.tbFLCurve2)
         Me.FlowLayoutPanel10.Controls.Add(Me.btFLCurveFile2)
+        Me.FlowLayoutPanel10.Controls.Add(Me.btShowFLCurve2)
         Me.FlowLayoutPanel10.Location = New System.Drawing.Point(6, 94)
         Me.FlowLayoutPanel10.Name = "FlowLayoutPanel10"
         Me.FlowLayoutPanel10.Size = New System.Drawing.Size(496, 26)
@@ -712,6 +732,17 @@ Partial Class IEPCForm
         Me.btFLCurveFile2.TabIndex = 29
         Me.btFLCurveFile2.UseVisualStyleBackColor = true
         '
+        'btShowFLCurve2
+        '
+        Me.btShowFLCurve2.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
+        Me.btShowFLCurve2.Location = New System.Drawing.Point(449, 1)
+        Me.btShowFLCurve2.Margin = New System.Windows.Forms.Padding(0, 1, 0, 0)
+        Me.btShowFLCurve2.Name = "btShowFLCurve2"
+        Me.btShowFLCurve2.Size = New System.Drawing.Size(24, 24)
+        Me.btShowFLCurve2.TabIndex = 85
+        Me.btShowFLCurve2.TabStop = false
+        Me.btShowFLCurve2.UseVisualStyleBackColor = true
+        '
         'TableLayoutPanel4
         '
         Me.TableLayoutPanel4.Anchor = System.Windows.Forms.AnchorStyles.None
@@ -1000,9 +1031,9 @@ Partial Class IEPCForm
         '
         Me.FlowLayoutPanel2.Controls.Add(Me.btAddGear)
         Me.FlowLayoutPanel2.Controls.Add(Me.btRemoveGear)
-        Me.FlowLayoutPanel2.Location = New System.Drawing.Point(3, 127)
+        Me.FlowLayoutPanel2.Location = New System.Drawing.Point(3, 128)
         Me.FlowLayoutPanel2.Name = "FlowLayoutPanel2"
-        Me.FlowLayoutPanel2.Size = New System.Drawing.Size(61, 29)
+        Me.FlowLayoutPanel2.Size = New System.Drawing.Size(61, 28)
         Me.FlowLayoutPanel2.TabIndex = 54
         '
         'btAddGear
@@ -1027,7 +1058,7 @@ Partial Class IEPCForm
         '
         Me.Label6.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
         Me.Label6.AutoSize = true
-        Me.Label6.Location = New System.Drawing.Point(191, 124)
+        Me.Label6.Location = New System.Drawing.Point(191, 125)
         Me.Label6.Name = "Label6"
         Me.Label6.Size = New System.Drawing.Size(106, 13)
         Me.Label6.TabIndex = 6
@@ -1046,7 +1077,7 @@ Partial Class IEPCForm
         Me.lvGear.Location = New System.Drawing.Point(3, 3)
         Me.lvGear.MultiSelect = false
         Me.lvGear.Name = "lvGear"
-        Me.lvGear.Size = New System.Drawing.Size(294, 118)
+        Me.lvGear.Size = New System.Drawing.Size(294, 119)
         Me.lvGear.TabIndex = 7
         Me.lvGear.TabStop = false
         Me.lvGear.UseCompatibleStateImageBehavior = false
@@ -1108,7 +1139,7 @@ Partial Class IEPCForm
         Me.lvDragCurve.Location = New System.Drawing.Point(3, 3)
         Me.lvDragCurve.MultiSelect = false
         Me.lvDragCurve.Name = "lvDragCurve"
-        Me.lvDragCurve.Size = New System.Drawing.Size(294, 118)
+        Me.lvDragCurve.Size = New System.Drawing.Size(294, 119)
         Me.lvDragCurve.TabIndex = 77
         Me.lvDragCurve.TabStop = false
         Me.lvDragCurve.UseCompatibleStateImageBehavior = false
@@ -1128,9 +1159,9 @@ Partial Class IEPCForm
         '
         Me.FlowLayoutPanel11.Controls.Add(Me.btAddDragCurve)
         Me.FlowLayoutPanel11.Controls.Add(Me.btRemoveDragCurve)
-        Me.FlowLayoutPanel11.Location = New System.Drawing.Point(3, 127)
+        Me.FlowLayoutPanel11.Location = New System.Drawing.Point(3, 128)
         Me.FlowLayoutPanel11.Name = "FlowLayoutPanel11"
-        Me.FlowLayoutPanel11.Size = New System.Drawing.Size(61, 29)
+        Me.FlowLayoutPanel11.Size = New System.Drawing.Size(61, 28)
         Me.FlowLayoutPanel11.TabIndex = 54
         '
         'btAddDragCurve
@@ -1155,7 +1186,7 @@ Partial Class IEPCForm
         '
         Me.Label7.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
         Me.Label7.AutoSize = true
-        Me.Label7.Location = New System.Drawing.Point(191, 124)
+        Me.Label7.Location = New System.Drawing.Point(191, 125)
         Me.Label7.Name = "Label7"
         Me.Label7.Size = New System.Drawing.Size(106, 13)
         Me.Label7.TabIndex = 6
@@ -1390,6 +1421,25 @@ Partial Class IEPCForm
         Me.LbStatus.Size = New System.Drawing.Size(39, 17)
         Me.LbStatus.Text = "Status"
         '
+        'CmOpenFile
+        '
+        Me.CmOpenFile.ImageScalingSize = New System.Drawing.Size(24, 24)
+        Me.CmOpenFile.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.OpenWithToolStripMenuItem, Me.ShowInFolderToolStripMenuItem})
+        Me.CmOpenFile.Name = "CmOpenFile"
+        Me.CmOpenFile.Size = New System.Drawing.Size(153, 48)
+        '
+        'OpenWithToolStripMenuItem
+        '
+        Me.OpenWithToolStripMenuItem.Name = "OpenWithToolStripMenuItem"
+        Me.OpenWithToolStripMenuItem.Size = New System.Drawing.Size(152, 22)
+        Me.OpenWithToolStripMenuItem.Text = "Open with ..."
+        '
+        'ShowInFolderToolStripMenuItem
+        '
+        Me.ShowInFolderToolStripMenuItem.Name = "ShowInFolderToolStripMenuItem"
+        Me.ShowInFolderToolStripMenuItem.Size = New System.Drawing.Size(152, 22)
+        Me.ShowInFolderToolStripMenuItem.Text = "Show in Folder"
+        '
         'IEPCForm
         '
         Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
@@ -1459,6 +1509,7 @@ Partial Class IEPCForm
         Me.FlowLayoutPanel8.PerformLayout
         Me.StatusStrip1.ResumeLayout(false)
         Me.StatusStrip1.PerformLayout
+        Me.CmOpenFile.ResumeLayout(false)
         Me.ResumeLayout(false)
         Me.PerformLayout
 
@@ -1579,4 +1630,9 @@ End Sub
     Friend WithEvents ColumnHeader5 As ColumnHeader
     Friend WithEvents FlowLayoutPanel11 As FlowLayoutPanel
     Friend WithEvents Label7 As Label
+    Friend WithEvents btShowFLCurve1 As Button
+    Friend WithEvents btShowFLCurve2 As Button
+    Friend WithEvents CmOpenFile As ContextMenuStrip
+    Friend WithEvents OpenWithToolStripMenuItem As ToolStripMenuItem
+    Friend WithEvents ShowInFolderToolStripMenuItem As ToolStripMenuItem
 End Class
diff --git a/VECTO/GUI/IEPCForm.resx b/VECTO/GUI/IEPCForm.resx
index ceb8b403c0..50021e8dee 100644
--- a/VECTO/GUI/IEPCForm.resx
+++ b/VECTO/GUI/IEPCForm.resx
@@ -160,8 +160,11 @@
   <metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>231, 20</value>
   </metadata>
+  <metadata name="CmOpenFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>462, 18</value>
+  </metadata>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>25</value>
+    <value>62</value>
   </metadata>
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
diff --git a/VECTO/GUI/IEPCForm.vb b/VECTO/GUI/IEPCForm.vb
index c323b6b9db..7c779d2925 100644
--- a/VECTO/GUI/IEPCForm.vb
+++ b/VECTO/GUI/IEPCForm.vb
@@ -5,735 +5,784 @@ Imports TUGraz.VectoCore.InputData.FileIO.JSON
 
 Public Class IEPCForm
 
-    Public JobDir As String = ""
-    Private _iepcFilePath as String = ""
-    Private _powerMapDlg As IEPCInputDialog
-    Private _dragCurveDlg As IEPCInputDialog
-    Private _gearDlg As IEPCGearInputDialog
-    Private _flcFilePath1 as String
-    Private _flcFilePath2 as String
-    Private _changed as Boolean
-    
-    Private Sub IEPCForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
-        _powerMapDlg = New IEPCInputDialog(IEPCDialogType.PowerMapDialog)
-        _dragCurveDlg = New IEPCInputDialog(IEPCDialogType.DragCurveDialog)
-        _gearDlg = New IEPCGearInputDialog()
-    End Sub
-
-    Public Sub ReadIEPCFile(file As String)
-        Dim inputData = JSONInputDataFactory.ReadIEPCEngineeringInputData(file, True)
-
-        tbModel.Text = inputData.Model
-        tbInertia.Text = inputData.Inertia.ToGUIFormat()
-        cbDifferentialIncluded.Checked = inputData.DifferentialIncluded
-        cbDesignTypeWheelMotor.Checked = inputData.DesignTypeWheelMotor
-        tbNumberOfDesignTypeWheelMotor.Text = inputData.NrOfDesignTypeWheelMotorMeasured.Value.ToGUIFormat()
-        tbThermalOverload.Text = inputData.OverloadRecoveryFactor.ToGUIFormat()
-
-        Dim voltageLevel = inputData.VoltageLevels.First()
-        SetFirstVoltageLevel(voltageLevel)
-        voltageLevel = inputData.VoltageLevels.Last()
-        SetSecondaryVoltageLevel(voltageLevel)
-        SetGearEntries(inputData.Gears)
-        SetDragEntries(inputData.DragCurves)
-        _iepcFilePath = file
-
-        LbStatus.Text = ""
-        _changed = False
-    End Sub
-
-    Private Sub SetFirstVoltageLevel(voltageLevel As IElectricMotorVoltageLevel)
-        tbVoltage1.Text = voltageLevel.VoltageLevel.ToGUIFormat()
-        tbContinousTorque1.Text = voltageLevel.ContinuousTorque.ToGUIFormat()
-        tbContinousTorqueSpeed1.Text = voltageLevel.ContinuousTorqueSpeed.AsRPM.ToGUIFormat()
-        tbOverloadTime1.Text = voltageLevel.OverloadTime.ToGUIFormat()
-        tbOverloadTorque1.Text = voltageLevel.OverloadTorque.ToGUIFormat()
-        tboverloadTorqueSpeed1.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat()
-        tbFLCurve1.Text = voltageLevel.FullLoadCurve.Source
-        SetPowerMapEntries(_lvPowerMap1, voltageLevel.PowerMap)
-    End Sub
-
-    Private Sub SetSecondaryVoltageLevel(voltageLevel As IElectricMotorVoltageLevel)
-        tbVoltage2.Text = voltageLevel.VoltageLevel.ToGUIFormat()
-        tbContinousTorque2.Text = voltageLevel.ContinuousTorque.ToGUIFormat()
-        tbContinousTorqueSpeed2.Text = voltageLevel.ContinuousTorqueSpeed.AsRPM.ToGUIFormat()
-        tbOverloadTime2.Text = voltageLevel.OverloadTime.ToGUIFormat()
-        tbOverloadTorque2.Text = voltageLevel.OverloadTorque.ToGUIFormat()
-        tbOverloadTorqueSpeed2.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat()
-        tbFLCurve2.Text = voltageLevel.FullLoadCurve.Source
-        SetPowerMapEntries(_lvPowerMap2, voltageLevel.PowerMap)
-    End Sub
-
-    Private Sub SetGearEntries(entries As IList(Of IGearEntry))
-        For Each entry As IGearEntry In entries
-            Dim listEntry = CreateListViewItem(entry.Ratio, entry.MaxOutputShaftTorque, entry.MaxOutputShaftSpeed)
-            _lvGear.Items.Add(listEntry)
-        Next
-    End Sub
-
-    Private Sub SetDragEntries(entries As IList(Of IDragCurve))
-        For Each entry As IDragCurve In entries
-            Dim listEntry = CreateListViewItem(entry.Gear.Value, entry.DragCurve.Source)
-            _lvDragCurve.Items.Add(listEntry)
-        Next
-    End Sub
-
-    Private Sub SetPowerMapEntries(powerMapListView As ListView, entries As IList(Of IElectricMotorPowerMap))
-        For Each entry As IElectricMotorPowerMap In entries
-            Dim listEntry = CreateListViewItem(entry.Gear, entry.PowerMap.Source)
-            powerMapListView.Items.Add(listEntry)
-        Next
-    End Sub
-
-    Private Function CreateListViewItem(axleNumber As Integer, filepath As String) As ListViewItem
-        Dim retVal As New ListViewItem
-        retVal.SubItems(0).Text = axleNumber.ToGUIFormat()
-        retVal.SubItems.Add(filepath)
-        Return retVal
-    End Function
-
-    Private Function CreateListViewItem(ratio As Double, outputShaftTorque As NewtonMeter, outputShaftSpeed As PerSecond) As ListViewItem
-        Dim retVal As New ListViewItem
-        retVal.SubItems(0).Text = ratio.ToGUIFormat()
-        retVal.SubItems.Add(outputShaftTorque?.ToGUIFormat())
-        retVal.SubItems.Add(outputShaftSpeed?.ToGUIFormat())
-        Return retVal
-    End Function
-
-    Private Function CreateListViewItem(ratio As Double, outputShaftTorque As Double?, outputShaftSpeed As Double?) As ListViewItem
-
-        Dim retVal As New ListViewItem
-        retVal.SubItems(0).Text = ratio.ToGUIFormat()
-        If outputShaftTorque.HasValue Then
-            retVal.SubItems.Add(outputShaftTorque.Value.ToGUIFormat())
-        End If
-        If outputShaftSpeed.HasValue Then
-            retVal.SubItems.Add(outputShaftSpeed.Value.ToGUIFormat())
-        End If
-        Return retVal
-
-    End Function
-
-    Private Sub btAddDragCurve_Click(sender As Object, e As EventArgs) Handles btAddDragCurve.Click
-        AddListViewItem(_dragCurveDlg, _lvDragCurve)
-    End Sub
-
-    Private Sub AddListViewItem(dialog As IEPCInputDialog, listView As ListView)
-        If dialog.ShowDialog() = DialogResult.OK Then
-            Dim gear = Convert.ToInt32(dialog.tbGear.Text)
-            Dim filePath = dialog.tbInputFile.Text
-            listView.Items.Add(CreateListViewItem(gear, filePath))
-            Change()
-        End If
-    End Sub
-
-    Private Sub btRemoveDragCurve_Click(sender As Object, e As EventArgs) Handles btRemoveDragCurve.Click
-        RemoveListEntry(_lvDragCurve)
-    End Sub
-    
-    Private Sub btRemoveGear_Click(sender As Object, e As EventArgs) Handles btRemoveGear.Click
-        RemoveListEntry(_lvGear)
-        RemoveListEntry(_lvPowerMap1)
-        RemoveListEntry(_lvPowerMap2)
-    End Sub
-
-    Private Sub RemoveListEntry(listView As ListView)
-        If listView.Items.Count = 0 Then
-            Exit Sub
-        Else
-            listView.Items(listView.Items.Count - 1).Remove()
-            Change()
-        End If
-    End Sub
-
-    Private Sub btAddGear_Click(sender As Object, e As EventArgs) Handles btAddGear.Click
-        _gearDlg.Clear()
-
-        If (_gearDlg.ShowDialog() = DialogResult.OK) Then
-            Dim ratio = Convert.ToDouble(_gearDlg.tbRatio.Text)
-            Dim outputShaftTorque As Double?
-            Dim outputShaftSpeed As Double?
-            If _gearDlg.tbMaxOutShaftTorque.Text.Length > 0 Then
-                outputShaftTorque = _gearDlg.tbMaxOutShaftTorque.Text.ToDouble(0)
-            End If
-            If _gearDlg.tbMaxOutShaftSpeed.Text.Length > 0 Then
-                outputShaftSpeed = _gearDlg.tbMaxOutShaftTorque.Text.ToDouble(0)
-            End If
-
-            Dim entry = CreateListViewItem(ratio, outputShaftTorque, outputShaftSpeed)
-            _lvGear.Items.Add(entry)
-            AddPowerMapEntry(lvPowerMap1, _lvGear.Items.Count)
-            AddPowerMapEntry(lvPowerMap2, _lvGear.Items.Count)
-        
-            Change()
-        End If
-    End Sub
-
-    Private Sub AddPowerMapEntry(powerMapListView As ListView, gearIndex As Integer)
-        Dim retVal As New ListViewItem
-        retVal.SubItems(0).Text = gearIndex.ToString()
-        powerMapListView.Items.Add(retVal)
-    End Sub
-    
-    Private Sub lvGear_DoubleClick(sender As Object, e As EventArgs) Handles lvGear.DoubleClick
-
-        If lvGear.SelectedItems.Count = 0 Then Exit Sub
-
-        Dim entry As ListViewItem = lvGear.SelectedItems(0)
-
-        _gearDlg.tbRatio.Text = entry.SubItems(0).Text
-        _gearDlg.tbMaxOutShaftSpeed.Text = entry.SubItems(1).Text
-        _gearDlg.tbMaxOutShaftTorque.Text = entry.SubItems(2).Text
-        _gearDlg.tbRatio.Focus()
-
-        If _gearDlg.ShowDialog() = DialogResult.OK Then
-            entry.SubItems(0).Text = _gearDlg.tbRatio.Text
-            entry.SubItems(1).Text = _gearDlg.tbMaxOutShaftSpeed.Text
-            entry.SubItems(2).Text = _gearDlg.tbMaxOutShaftTorque.Text
-            Change()
-        End If
-
-    End Sub
-    
-    Private Sub lvDragCurve_DoubleClick(sender As Object, e As EventArgs) Handles lvDragCurve.DoubleClick 
-        EditEntry(_dragCurveDlg, lvDragCurve)
-    End Sub
-
-    Private Sub lvPowerMap1_DoubleClick(sender As Object, e As EventArgs) Handles lvPowerMap1.DoubleClick
-        EditEntry(_powerMapDlg, lvPowerMap1)
-    End Sub
-
-    Private Sub lvPowerMap2_DoubleClick(sender As Object, e As EventArgs) Handles lvPowerMap2.DoubleClick 
-        EditEntry(_powerMapDlg, lvPowerMap2)
-    End Sub
-
-    Private Sub EditEntry(dialog As IEPCInputDialog, listView As ListView)
-
-        If listView.SelectedItems.Count = 0 Then Exit Sub
-
-        Dim entry As ListViewItem = listView.SelectedItems(0)
-        dialog.tbGear.Text = entry.SubItems(0).Text
-        If entry.SubItems.Count = 2 Then
-            dialog.tbInputFile.Text = entry.SubItems(1).Text
-        End If
-        dialog.tbGear.Focus()
-
-        If dialog.ShowDialog() = DialogResult.OK Then
-            entry.SubItems(0).Text = dialog.tbGear.Text
-            entry.SubItems(1).Text = dialog.tbInputFile.Text
-        End If
-
-    End Sub
-
-    Private Sub btFLCurveFile1_Click(sender As Object, e As EventArgs) Handles btFLCurveFile1.Click
-        If IEPCFLCFileBrowser.OpenDialog(FileRepl(tbFLCurve1.Text, GetPath(_flcFilePath1))) Then
-            tbFLCurve1.Text = GetFilenameWithoutDirectory(IEPCFLCFileBrowser.Files(0), GetPath(_flcFilePath1))
-        End If
-    End Sub
-
-    Private Sub btFLCurveFile2_Click(sender As Object, e As EventArgs) Handles btFLCurveFile2.Click
-        If IEPCFLCFileBrowser.OpenDialog(FileRepl(tbFLCurve2.Text, GetPath(_flcFilePath2))) Then
-            tbFLCurve2.Text = GetFilenameWithoutDirectory(IEPCFLCFileBrowser.Files(0), GetPath(_flcFilePath2))
-        End If
-    End Sub
-
-    Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
-        NewIEPC()
-    End Sub
-
-    Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
-        If IEPCFileBrowser.OpenDialog(_iepcFilePath) Then
-            Try
-                ReadIEPCFile(IEPCFileBrowser.Files(0))
-            Catch ex As Exception
-                MsgBox(ex.Message, MsgBoxStyle.OkOnly, $"Error loading IEPC(.{IEPCFileBrowser.Extensions}) File")
-            End Try
-        End If
-    End Sub
-    
-    #Region "Toolbar"
-
-    Public Sub NewIEPC()
-        tbModel.Text = ""
-        tbInertia.Text = ""
-        cbDifferentialIncluded.Checked = False
-        cbDifferentialIncluded.Checked = False
-        tbNumberOfDesignTypeWheelMotor.Text = ""
-        tbThermalOverload.Text = ""
-
-        tbVoltage1.Text = ""
-        tbContinousTorque1.Text = ""
-        tbContinousTorqueSpeed1.Text = ""
-        tbOverloadTime1.Text = ""
-        tbOverloadTorque1.Text = ""
-        tboverloadTorqueSpeed1.Text = ""
-        tbFLCurve1.Text = ""
-        _flcFilePath1 = ""
-        RemoveAllListViewItems(lvPowerMap1)
-        
-        tbVoltage2.Text = ""
-        tbContinousTorque2.Text = ""
-        tbContinousTorqueSpeed2.Text = ""
-        tbOverloadTime2.Text = ""
-        tbOverloadTorque2.Text = ""
-        tboverloadTorqueSpeed2.Text = ""
-        tbFLCurve2.Text = ""
-        _flcFilePath2 = ""
-        RemoveAllListViewItems(lvPowerMap2)
-        
-        RemoveAllListViewItems(lvDragCurve)
-        RemoveAllListViewItems(lvGear)
-        LbStatus.Text = ""
-
-        _changed = False
-    End Sub
-
-    Private Sub RemoveAllListViewItems(listView As ListView)
-        If listView.Items.Count = 0 Then
-            Exit Sub
-        Else
-            For Each listItem As ListViewItem In listView.Items
-                listItem.Remove()
-            Next
-        End If
-    End Sub
-
-    Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
-        SaveOrSaveAs(False)
-    End Sub
-
-    Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
-        SaveOrSaveAs(True)
-    End Sub
-
-    Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
-        If ChangeCheckCancel() Then Exit Sub
-
-        If _iepcFilePath = "" Then
-            If MsgBox("Save file now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
-                If Not SaveOrSaveAs(True) Then Exit Sub
-            Else
-                Exit Sub
-            End If
-        End If
-
-        If Not VectoJobForm.Visible Then
-            JobDir = ""
-            VectoJobForm.Show()
-            VectoJobForm.VectoNew()
-        Else
-            VectoJobForm.WindowState = FormWindowState.Normal
-        End If
-
-        VectoJobForm.TbENG.Text = GetFilenameWithoutDirectory(_iepcFilePath, JobDir)
-    End Sub
-
-    Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
-        If File.Exists(Path.Combine(MyAppPath, "User Manual\help.html")) Then
-            Dim defaultBrowserPath As String = BrowserUtils.GetDefaultBrowserPath()
-            Process.Start(defaultBrowserPath,
-                          $"""file://{Path.Combine(MyAppPath, "User Manual\help.html#iepc-editor")}""")
-        Else
-            MsgBox("User Manual not found!", MsgBoxStyle.Critical)
-        End If
-    End Sub
-    
-    #End Region
-    
-    #Region "Save Methods"
-    
-    Private Function ChangeCheckCancel() As Boolean
-        If _changed Then
-            Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
-                Case MsgBoxResult.Yes
-                    Return Not SaveOrSaveAs(False)
-                Case MsgBoxResult.Cancel
-                    Return True
-                Case Else
-                    _changed = False
-                    Return False
-            End Select
-        Else
-            Return False
-        End If
-    End Function
-    
-    Private Function SaveOrSaveAs(ByVal saveAs As Boolean) As Boolean
-        If ValidateData() = False Then _
-            Return False
-
-        If _iepcFilePath = "" Or saveAs Then
-            If IEPCFileBrowser.SaveDialog(_iepcFilePath) Then
-                _iepcFilePath = IEPCFileBrowser.Files(0)
-            Else
-                Return False
-            End If
-        End If
-        Return SaveIEPCToFile(_iepcFilePath)
-    End Function
-    
-    Private Function SaveIEPCToFile(ByVal file As String) As Boolean
-        Dim iepc = New IEPCInputData 
-
-        iepc.SetCommonEntries(tbModel.Text, tbInertia.Text, cbDesignTypeWheelMotor.Checked, 
-                              tbNumberOfDesignTypeWheelMotor.Text, cbDifferentialIncluded.Checked,
-                              tbThermalOverload.Text)
-        
-        iepc.SetVoltageLevelEntries(tbVoltage1.Text, tbContinousTorque1.Text, tbContinousTorqueSpeed1.Text,
-                                    tbOverloadTime1.Text, tbOverloadTorque1.Text, tboverloadTorqueSpeed1.Text, 
-                                    tbFLCurve1.Text, lvPowerMap1)
-
-        iepc.SetVoltageLevelEntries(tbVoltage2.Text, tbContinousTorque2.Text, tbContinousTorqueSpeed2.Text,
-                                    tbOverloadTime2.Text, tbOverloadTorque2.Text, tboverloadTorqueSpeed2.Text, 
-                                    tbFLCurve2.Text, lvPowerMap2)
-
-        iepc.SetGearsEntries(lvGear)
-        iepc.SetDragCurveEntries(lvDragCurve)
-
-
-        If Not iepc.SaveFile(file) Then
-            MsgBox("Cannot save to " & file, MsgBoxStyle.Critical)
-            Return False
-        End If
-
-        _changed = False
-        LbStatus.Text = ""
-
-        Return True
-    End Function
-
-
-    #End Region
-
-
-
-    Private Sub ButOK_Click(sender As Object, e As EventArgs) Handles ButOK.Click
-        SaveOrSaveAs(true)
-    End Sub
-
-    Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
-        Close()
-    End Sub
-
-
-    #Region "Validate Input"
-
-    Private Function ValidateData() As Boolean
-
-        If ValidateModel() = False Then Return False
-        If ValidateInertia() = False Then Return False
-        If ValidateNrDesignTypeWheelMotorMeasured() = False Then Return False
-        If ValidateOverloadRecoveryFactor() = False Then Return False
-
-        If ValidateVoltage(tbVoltage1) = False Then Return False
-        If ValidateContinuousTorque(tbContinousTorque1) = False Then Return False
-        If ValidateContinuousTorqueSpeed(tbContinousTorqueSpeed1) = False Then Return False
-        If ValidateOverloadTime(tbOverloadTime1) = False Then Return False
-        If ValidateOverloadTorque(tbOverloadTorque1) = False Then Return False
-        If ValidateOverloadTorqueSpeed(tboverloadTorqueSpeed1) = False Then Return False
-        
-        If ValidateVoltage(tbVoltage2) = False Then Return False
-        If ValidateContinuousTorque(tbContinousTorque2) = False Then Return False
-        If ValidateContinuousTorqueSpeed(tbContinousTorqueSpeed2) = False Then Return False
-        If ValidateOverloadTime(tbOverloadTime2) = False Then Return False
-        If ValidateOverloadTorque(tbOverloadTorque2) = False Then Return False
-        If ValidateOverloadTorqueSpeed(tboverloadTorqueSpeed2) = False Then Return False
-
-        If ValidateAmountOfEntries() = False Then Return False
-        If ValidateFullLoadCurve1() = False Then Return False
-        If ValidateFullLoadCurve2() = False Then Return False
-
-        If ValidatePowerMapEntries(_lvPowerMap1) = False Then Return False
-        If ValidatePowerMapEntries(_lvPowerMap2) = False Then Return False
-
-        Return True
-    End Function
-    
-    Private Function ValidateModel() As Boolean
-        If String.IsNullOrEmpty(tbModel.Text) Then
-            ShowErrorMessageBox("Model", tbModel)
-            Return False
-        End If
-        Return True
-    End Function
-    
-    Private Function ValidateInertia() As Boolean
-        If Not ValidDoubleValue(tbInertia.Text) Then
-            ShowErrorMessageBox("Inertia", tbInertia)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateNrDesignTypeWheelMotorMeasured() As Boolean 
-        If Not cbDesignTypeWheelMotor.Checked AND Not ValidDoubleValue(tbNumberOfDesignTypeWheelMotor.Text) Then
-            ShowErrorMessageBox("Nr of Design Type Wheel Motor Measured", tbNumberOfDesignTypeWheelMotor)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateOverloadRecoveryFactor() As Boolean
-        If Not ValidDoubleValue(tbThermalOverload.Text) Then
-            ShowErrorMessageBox("Thermal Overload Recovery Factor", tbThermalOverload)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateVoltage(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Voltage", tb)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateContinuousTorque(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Continuous Torque", tb)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateContinuousTorqueSpeed(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Continuous Torque", tb)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateOverloadTime(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Overload Time", tb)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateOverloadTorque(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Overload Torque", tb)
-            Return False
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateOverloadTorqueSpeed(tb As TextBox) As Boolean
-        If Not ValidDoubleValue(tb.Text) Then
-            ShowErrorMessageBox("Overload Torque Speed", tb)
-            Return False
-        End If
-        Return True
-    End Function
-    
-    Private Function ValidateAmountOfEntries() As Boolean
-        If _lvGear.Items.Count = 0 Then
-            ShowErrorMessageBox("Invalid input no Gear given")
-            Return False
-        End If
-
-        If Not _lvPowerMap1.Items.Count = _lvGear.Items.Count Then
-            ShowErrorMessageBox("Invalid number of Power Map entries at Voltage Level Low")
-            Return False
-        End If
-        
-        If Not _lvPowerMap2.Items.Count = _lvGear.Items.Count Then
-            ShowErrorMessageBox("Invalid number of Power Map entries at Voltage Level High")
-            Return False
-        End If
-
-        If _lvDragCurve.Items.Count = 0 
-            ShowErrorMessageBox("Invalid input no Drag Curve given")
-            Return False
-        End If
-
-        If Not _lvDragCurve.Items.Count = _lvGear.Items.Count And _lvDragCurve.Items.Count > 1
-            ShowErrorMessageBox("Invalid numbers of Drag Curves given")
-            Return False
-        End If
-
-        Return True
-    End Function
-
-    Private Function ValidateFullLoadCurve1() As Boolean
-        If Not File.Exists(tbFLCurve1.Text) Then
-            ShowErrorMessageBox("No valid file path given", tbFLCurve1, False)
-            Return False
-        End If
+	Public JobDir As String = ""
+	Private _iepcFilePath as String = ""
+	Private _powerMapDlg As IEPCInputDialog
+	Private _dragCurveDlg As IEPCInputDialog
+	Private _gearDlg As IEPCGearInputDialog
+	Private _flcFilePath1 as String
+	Private _flcFilePath2 as String
+	Private _changed as Boolean
+	
+	Private _contextMenuFiles As String()
+
+	
+	Private Sub IEPCForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+		_powerMapDlg = New IEPCInputDialog(IEPCDialogType.PowerMapDialog)
+		_dragCurveDlg = New IEPCInputDialog(IEPCDialogType.DragCurveDialog)
+		_gearDlg = New IEPCGearInputDialog()
+	End Sub
+
+	Public Sub ReadIEPCFile(file As String)
+		Dim inputData = JSONInputDataFactory.ReadIEPCEngineeringInputData(file, True)
+
+		tbModel.Text = inputData.Model
+		tbInertia.Text = inputData.Inertia.ToGUIFormat()
+		cbDifferentialIncluded.Checked = inputData.DifferentialIncluded
+		cbDesignTypeWheelMotor.Checked = inputData.DesignTypeWheelMotor
+		tbNumberOfDesignTypeWheelMotor.Text = inputData.NrOfDesignTypeWheelMotorMeasured.Value.ToGUIFormat()
+		tbThermalOverload.Text = inputData.OverloadRecoveryFactor.ToGUIFormat()
+
+		Dim voltageLevel = inputData.VoltageLevels.First()
+		SetFirstVoltageLevel(voltageLevel)
+		voltageLevel = inputData.VoltageLevels.Last()
+		SetSecondaryVoltageLevel(voltageLevel)
+		SetGearEntries(inputData.Gears)
+		SetDragEntries(inputData.DragCurves)
+		_iepcFilePath = file
+
+		LbStatus.Text = ""
+		_changed = False
+	End Sub
+
+	Private Sub SetFirstVoltageLevel(voltageLevel As IElectricMotorVoltageLevel)
+		tbVoltage1.Text = voltageLevel.VoltageLevel.ToGUIFormat()
+		tbContinousTorque1.Text = voltageLevel.ContinuousTorque.ToGUIFormat()
+		tbContinousTorqueSpeed1.Text = voltageLevel.ContinuousTorqueSpeed.AsRPM.ToGUIFormat()
+		tbOverloadTime1.Text = voltageLevel.OverloadTime.ToGUIFormat()
+		tbOverloadTorque1.Text = voltageLevel.OverloadTorque.ToGUIFormat()
+		tboverloadTorqueSpeed1.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat()
+		tbFLCurve1.Text = voltageLevel.FullLoadCurve.Source
+		SetPowerMapEntries(_lvPowerMap1, voltageLevel.PowerMap)
+	End Sub
+
+	Private Sub SetSecondaryVoltageLevel(voltageLevel As IElectricMotorVoltageLevel)
+		tbVoltage2.Text = voltageLevel.VoltageLevel.ToGUIFormat()
+		tbContinousTorque2.Text = voltageLevel.ContinuousTorque.ToGUIFormat()
+		tbContinousTorqueSpeed2.Text = voltageLevel.ContinuousTorqueSpeed.AsRPM.ToGUIFormat()
+		tbOverloadTime2.Text = voltageLevel.OverloadTime.ToGUIFormat()
+		tbOverloadTorque2.Text = voltageLevel.OverloadTorque.ToGUIFormat()
+		tbOverloadTorqueSpeed2.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat()
+		tbFLCurve2.Text = voltageLevel.FullLoadCurve.Source
+		SetPowerMapEntries(_lvPowerMap2, voltageLevel.PowerMap)
+	End Sub
+
+	Private Sub SetGearEntries(entries As IList(Of IGearEntry))
+		For Each entry As IGearEntry In entries
+			Dim listEntry = CreateListViewItem(entry.Ratio, entry.MaxOutputShaftTorque, entry.MaxOutputShaftSpeed)
+			_lvGear.Items.Add(listEntry)
+		Next
+	End Sub
+
+	Private Sub SetDragEntries(entries As IList(Of IDragCurve))
+		For Each entry As IDragCurve In entries
+			Dim listEntry = CreateListViewItem(entry.Gear.Value, entry.DragCurve.Source)
+			_lvDragCurve.Items.Add(listEntry)
+		Next
+	End Sub
+
+	Private Sub SetPowerMapEntries(powerMapListView As ListView, entries As IList(Of IElectricMotorPowerMap))
+		For Each entry As IElectricMotorPowerMap In entries
+			Dim listEntry = CreateListViewItem(entry.Gear, entry.PowerMap.Source)
+			powerMapListView.Items.Add(listEntry)
+		Next
+	End Sub
+
+	Private Function CreateListViewItem(axleNumber As Integer, filepath As String) As ListViewItem
+		Dim retVal As New ListViewItem
+		retVal.SubItems(0).Text = axleNumber.ToGUIFormat()
+		retVal.SubItems.Add(filepath)
+		Return retVal
+	End Function
+
+	Private Function CreateListViewItem(ratio As Double, outputShaftTorque As NewtonMeter, outputShaftSpeed As PerSecond) As ListViewItem
+		Dim retVal As New ListViewItem
+		retVal.SubItems(0).Text = ratio.ToGUIFormat()
+		retVal.SubItems.Add(outputShaftTorque?.ToGUIFormat())
+		retVal.SubItems.Add(outputShaftSpeed?.ToGUIFormat())
+		Return retVal
+	End Function
+
+	Private Function CreateListViewItem(ratio As Double, outputShaftTorque As Double?, outputShaftSpeed As Double?) As ListViewItem
+
+		Dim retVal As New ListViewItem
+		retVal.SubItems(0).Text = ratio.ToGUIFormat()
+		If outputShaftTorque.HasValue Then
+			retVal.SubItems.Add(outputShaftTorque.Value.ToGUIFormat())
+		End If
+		If outputShaftSpeed.HasValue Then
+			retVal.SubItems.Add(outputShaftSpeed.Value.ToGUIFormat())
+		End If
+		Return retVal
+
+	End Function
+
+	Private Sub btAddDragCurve_Click(sender As Object, e As EventArgs) Handles btAddDragCurve.Click
+		AddListViewItem(_dragCurveDlg, _lvDragCurve)
+	End Sub
+
+	Private Sub AddListViewItem(dialog As IEPCInputDialog, listView As ListView)
+		If dialog.ShowDialog() = DialogResult.OK Then
+			Dim gear = Convert.ToInt32(dialog.tbGear.Text)
+			Dim filePath = dialog.tbInputFile.Text
+			listView.Items.Add(CreateListViewItem(gear, filePath))
+			Change()
+		End If
+	End Sub
+
+	Private Sub btRemoveDragCurve_Click(sender As Object, e As EventArgs) Handles btRemoveDragCurve.Click
+		RemoveListEntry(_lvDragCurve)
+	End Sub
+	
+	Private Sub btRemoveGear_Click(sender As Object, e As EventArgs) Handles btRemoveGear.Click
+		RemoveListEntry(_lvGear)
+		RemoveListEntry(_lvPowerMap1)
+		RemoveListEntry(_lvPowerMap2)
+	End Sub
+
+	Private Sub RemoveListEntry(listView As ListView)
+		If listView.Items.Count = 0 Then
+			Exit Sub
+		Else
+			listView.Items(listView.Items.Count - 1).Remove()
+			Change()
+		End If
+	End Sub
+
+	Private Sub btAddGear_Click(sender As Object, e As EventArgs) Handles btAddGear.Click
+		_gearDlg.Clear()
+
+		If (_gearDlg.ShowDialog() = DialogResult.OK) Then
+			Dim ratio = Convert.ToDouble(_gearDlg.tbRatio.Text)
+			Dim outputShaftTorque As Double?
+			Dim outputShaftSpeed As Double?
+			If _gearDlg.tbMaxOutShaftTorque.Text.Length > 0 Then
+				outputShaftTorque = _gearDlg.tbMaxOutShaftTorque.Text.ToDouble(0)
+			End If
+			If _gearDlg.tbMaxOutShaftSpeed.Text.Length > 0 Then
+				outputShaftSpeed = _gearDlg.tbMaxOutShaftTorque.Text.ToDouble(0)
+			End If
+
+			Dim entry = CreateListViewItem(ratio, outputShaftTorque, outputShaftSpeed)
+			_lvGear.Items.Add(entry)
+			AddPowerMapEntry(lvPowerMap1, _lvGear.Items.Count)
+			AddPowerMapEntry(lvPowerMap2, _lvGear.Items.Count)
 		
-        Dim fileExtension = new FileInfo(tbFLCurve1.Text).Extension
-        If Not $".{IEPCFLCFileBrowser.Extensions.First()}" = fileExtension Then
-            ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCFLCFileBrowser.Extensions.First()}) has the wrong extension",
-                                tbFLCurve1, False)
-            Return False		
-        End If
-        Return True
-    End Function
-
-    Private Function ValidateFullLoadCurve2() As Boolean
-        If Not File.Exists(tbFLCurve2.Text) Then
-            ShowErrorMessageBox("Invalid input no valid file path given", tbFLCurve2, False)
-            Return False
-        End If
+			Change()
+		End If
+	End Sub
+
+	Private Sub AddPowerMapEntry(powerMapListView As ListView, gearIndex As Integer)
+		Dim retVal As New ListViewItem
+		retVal.SubItems(0).Text = gearIndex.ToString()
+		powerMapListView.Items.Add(retVal)
+	End Sub
+	
+	Private Sub lvGear_DoubleClick(sender As Object, e As EventArgs) Handles lvGear.DoubleClick
+
+		If lvGear.SelectedItems.Count = 0 Then Exit Sub
+
+		Dim entry As ListViewItem = lvGear.SelectedItems(0)
+
+		_gearDlg.tbRatio.Text = entry.SubItems(0).Text
+		_gearDlg.tbMaxOutShaftSpeed.Text = entry.SubItems(1).Text
+		_gearDlg.tbMaxOutShaftTorque.Text = entry.SubItems(2).Text
+		_gearDlg.tbRatio.Focus()
+
+		If _gearDlg.ShowDialog() = DialogResult.OK Then
+			entry.SubItems(0).Text = _gearDlg.tbRatio.Text
+			entry.SubItems(1).Text = _gearDlg.tbMaxOutShaftSpeed.Text
+			entry.SubItems(2).Text = _gearDlg.tbMaxOutShaftTorque.Text
+			Change()
+		End If
+
+	End Sub
+	
+	Private Sub lvDragCurve_DoubleClick(sender As Object, e As EventArgs) Handles lvDragCurve.DoubleClick 
+		EditEntry(_dragCurveDlg, lvDragCurve)
+	End Sub
+
+	Private Sub lvPowerMap1_DoubleClick(sender As Object, e As EventArgs) Handles lvPowerMap1.DoubleClick
+		EditEntry(_powerMapDlg, lvPowerMap1)
+	End Sub
+
+	Private Sub lvPowerMap2_DoubleClick(sender As Object, e As EventArgs) Handles lvPowerMap2.DoubleClick 
+		EditEntry(_powerMapDlg, lvPowerMap2)
+	End Sub
+
+	Private Sub EditEntry(dialog As IEPCInputDialog, listView As ListView)
+
+		If listView.SelectedItems.Count = 0 Then Exit Sub
+
+		Dim entry As ListViewItem = listView.SelectedItems(0)
+		dialog.tbGear.Text = entry.SubItems(0).Text
+		If entry.SubItems.Count = 2 Then
+			dialog.tbInputFile.Text = entry.SubItems(1).Text
+		End If
+		dialog.tbGear.Focus()
+
+		If dialog.ShowDialog() = DialogResult.OK Then
+			entry.SubItems(0).Text = dialog.tbGear.Text
+			entry.SubItems(1).Text = dialog.tbInputFile.Text
+		End If
+
+	End Sub
+
+	Private Sub btFLCurveFile1_Click(sender As Object, e As EventArgs) Handles btFLCurveFile1.Click
+		If IEPCFLCFileBrowser.OpenDialog(FileRepl(tbFLCurve1.Text, GetPath(_flcFilePath1))) Then
+			tbFLCurve1.Text = GetFilenameWithoutDirectory(IEPCFLCFileBrowser.Files(0), GetPath(_flcFilePath1))
+		End If
+	End Sub
+
+	Private Sub btFLCurveFile2_Click(sender As Object, e As EventArgs) Handles btFLCurveFile2.Click
+		If IEPCFLCFileBrowser.OpenDialog(FileRepl(tbFLCurve2.Text, GetPath(_flcFilePath2))) Then
+			tbFLCurve2.Text = GetFilenameWithoutDirectory(IEPCFLCFileBrowser.Files(0), GetPath(_flcFilePath2))
+		End If
+	End Sub
+
+	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
+		NewIEPC()
+	End Sub
+
+	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
+		If IEPCFileBrowser.OpenDialog(_iepcFilePath) Then
+			Try
+				ReadIEPCFile(IEPCFileBrowser.Files(0))
+			Catch ex As Exception
+				MsgBox(ex.Message, MsgBoxStyle.OkOnly, $"Error loading IEPC(.{IEPCFileBrowser.Extensions}) File")
+			End Try
+		End If
+	End Sub
+	
+	#Region "Toolbar"
+
+	Public Sub NewIEPC()
+		tbModel.Text = ""
+		tbInertia.Text = ""
+		cbDifferentialIncluded.Checked = False
+		cbDifferentialIncluded.Checked = False
+		tbNumberOfDesignTypeWheelMotor.Text = ""
+		tbThermalOverload.Text = ""
+
+		tbVoltage1.Text = ""
+		tbContinousTorque1.Text = ""
+		tbContinousTorqueSpeed1.Text = ""
+		tbOverloadTime1.Text = ""
+		tbOverloadTorque1.Text = ""
+		tboverloadTorqueSpeed1.Text = ""
+		tbFLCurve1.Text = ""
+		_flcFilePath1 = ""
+		RemoveAllListViewItems(lvPowerMap1)
 		
-        Dim fileExtension = new FileInfo(tbFLCurve2.Text).Extension
-        If Not $".{IEPCFLCFileBrowser.Extensions.First()}" = fileExtension Then
-            ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCFLCFileBrowser.Extensions.First()}) has the wrong file extension",
-                                tbFLCurve2, False)
-            Return False		
-        End If
-        Return True
-    End Function
-
-    Private Function ValidatePowerMapEntries(powerMap as ListView) As Boolean
-
-        For Each entry As ListViewItem In powerMap.Items
-            If entry.SubItems.Count = 1 Then
-                ShowErrorMessageBox("Invalid input missing Power Map files")
-                Return False
-            End If
-
-            If entry.SubItems.Count = 2 Then
-                Dim fileExtension = new FileInfo(entry.SubItems(1).Text).Extension
-                If Not $".{IEPCPowerMapFileBrowser.Extensions.First()}" = fileExtension
-                    ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCPowerMapFileBrowser.Extensions.First()}) has the wrong file extension")
-                    Return false
-                End If
-            End If
-        Next
-        Return True
-
-    End Function
-
-    Private Sub ShowErrorMessageBox(message As string, textbox As TextBox, Optional defaultMessage As Boolean = True)
-        If Not message = Nothing And defaultMessage Then
-            MsgBox($"Invalid input for {message}")
-            textbox.Focus()
-            Return
-        Else 
-            MsgBox($"{message}")
-            textbox.Focus()
-            Return
-        End If
-    End Sub
-
-    Private Sub ShowErrorMessageBox(message As string)
-        If Not message = Nothing Then
-            MsgBox($"{message}")
-            Return
-        End If
-    End Sub
-    
-    Private Function ValidDoubleValue(value As string) As Boolean
-        If String.IsNullOrEmpty(value)
-            Return false
-        End If
-        Return IsNumeric(value)
-    End Function
+		tbVoltage2.Text = ""
+		tbContinousTorque2.Text = ""
+		tbContinousTorqueSpeed2.Text = ""
+		tbOverloadTime2.Text = ""
+		tbOverloadTorque2.Text = ""
+		tboverloadTorqueSpeed2.Text = ""
+		tbFLCurve2.Text = ""
+		_flcFilePath2 = ""
+		RemoveAllListViewItems(lvPowerMap2)
+		
+		RemoveAllListViewItems(lvDragCurve)
+		RemoveAllListViewItems(lvGear)
+		LbStatus.Text = ""
+
+		_changed = False
+	End Sub
+
+	Private Sub RemoveAllListViewItems(listView As ListView)
+		If listView.Items.Count = 0 Then
+			Exit Sub
+		Else
+			For Each listItem As ListViewItem In listView.Items
+				listItem.Remove()
+			Next
+		End If
+	End Sub
+
+	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
+		SaveOrSaveAs(False)
+	End Sub
+
+	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
+		SaveOrSaveAs(True)
+	End Sub
+
+	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
+		If ChangeCheckCancel() Then Exit Sub
+
+		If _iepcFilePath = "" Then
+			If MsgBox("Save file now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
+				If Not SaveOrSaveAs(True) Then Exit Sub
+			Else
+				Exit Sub
+			End If
+		End If
+
+		If Not VectoJobForm.Visible Then
+			JobDir = ""
+			VectoJobForm.Show()
+			VectoJobForm.VectoNew()
+		Else
+			VectoJobForm.WindowState = FormWindowState.Normal
+		End If
+
+		VectoJobForm.TbENG.Text = GetFilenameWithoutDirectory(_iepcFilePath, JobDir)
+	End Sub
+
+	Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
+		If File.Exists(Path.Combine(MyAppPath, "User Manual\help.html")) Then
+			Dim defaultBrowserPath As String = BrowserUtils.GetDefaultBrowserPath()
+			Process.Start(defaultBrowserPath,
+						  $"""file://{Path.Combine(MyAppPath, "User Manual\help.html#iepc-editor")}""")
+		Else
+			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
+		End If
+	End Sub
+	
+	#End Region
+	
+	#Region "Save Methods"
+	
+	Private Function ChangeCheckCancel() As Boolean
+		If _changed Then
+			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
+				Case MsgBoxResult.Yes
+					Return Not SaveOrSaveAs(False)
+				Case MsgBoxResult.Cancel
+					Return True
+				Case Else
+					_changed = False
+					Return False
+			End Select
+		Else
+			Return False
+		End If
+	End Function
+	
+	Private Function SaveOrSaveAs(ByVal saveAs As Boolean) As Boolean
+		If ValidateData() = False Then _
+			Return False
+
+		If _iepcFilePath = "" Or saveAs Then
+			If IEPCFileBrowser.SaveDialog(_iepcFilePath) Then
+				_iepcFilePath = IEPCFileBrowser.Files(0)
+			Else
+				Return False
+			End If
+		End If
+		Return SaveIEPCToFile(_iepcFilePath)
+	End Function
+	
+	Private Function SaveIEPCToFile(ByVal file As String) As Boolean
+		Dim iepc = New IEPCInputData 
+
+		iepc.SetCommonEntries(tbModel.Text, tbInertia.Text, cbDesignTypeWheelMotor.Checked, 
+							  tbNumberOfDesignTypeWheelMotor.Text, cbDifferentialIncluded.Checked,
+							  tbThermalOverload.Text)
+		
+		iepc.SetVoltageLevelEntries(tbVoltage1.Text, tbContinousTorque1.Text, tbContinousTorqueSpeed1.Text,
+									tbOverloadTime1.Text, tbOverloadTorque1.Text, tboverloadTorqueSpeed1.Text, 
+									tbFLCurve1.Text, lvPowerMap1)
+
+		iepc.SetVoltageLevelEntries(tbVoltage2.Text, tbContinousTorque2.Text, tbContinousTorqueSpeed2.Text,
+									tbOverloadTime2.Text, tbOverloadTorque2.Text, tboverloadTorqueSpeed2.Text, 
+									tbFLCurve2.Text, lvPowerMap2)
+
+		iepc.SetGearsEntries(lvGear)
+		iepc.SetDragCurveEntries(lvDragCurve)
+
+
+		If Not iepc.SaveFile(file) Then
+			MsgBox("Cannot save to " & file, MsgBoxStyle.Critical)
+			Return False
+		End If
+
+		_changed = False
+		LbStatus.Text = ""
+
+		Return True
+	End Function
+
+
+	#End Region
+
+
+
+	Private Sub ButOK_Click(sender As Object, e As EventArgs) Handles ButOK.Click
+		SaveOrSaveAs(true)
+	End Sub
+
+	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
+		Close()
+	End Sub
+
+
+	#Region "Validate Input"
+
+	Private Function ValidateData() As Boolean
+
+		If ValidateModel() = False Then Return False
+		If ValidateInertia() = False Then Return False
+		If ValidateNrDesignTypeWheelMotorMeasured() = False Then Return False
+		If ValidateOverloadRecoveryFactor() = False Then Return False
+
+		If ValidateVoltage(tbVoltage1) = False Then Return False
+		If ValidateContinuousTorque(tbContinousTorque1) = False Then Return False
+		If ValidateContinuousTorqueSpeed(tbContinousTorqueSpeed1) = False Then Return False
+		If ValidateOverloadTime(tbOverloadTime1) = False Then Return False
+		If ValidateOverloadTorque(tbOverloadTorque1) = False Then Return False
+		If ValidateOverloadTorqueSpeed(tboverloadTorqueSpeed1) = False Then Return False
+		
+		If ValidateVoltage(tbVoltage2) = False Then Return False
+		If ValidateContinuousTorque(tbContinousTorque2) = False Then Return False
+		If ValidateContinuousTorqueSpeed(tbContinousTorqueSpeed2) = False Then Return False
+		If ValidateOverloadTime(tbOverloadTime2) = False Then Return False
+		If ValidateOverloadTorque(tbOverloadTorque2) = False Then Return False
+		If ValidateOverloadTorqueSpeed(tboverloadTorqueSpeed2) = False Then Return False
+
+		If ValidateAmountOfEntries() = False Then Return False
+		If ValidateFullLoadCurve1() = False Then Return False
+		If ValidateFullLoadCurve2() = False Then Return False
+
+		If ValidatePowerMapEntries(_lvPowerMap1) = False Then Return False
+		If ValidatePowerMapEntries(_lvPowerMap2) = False Then Return False
+
+		Return True
+	End Function
+	
+	Private Function ValidateModel() As Boolean
+		If String.IsNullOrEmpty(tbModel.Text) Then
+			ShowErrorMessageBox("Model", tbModel)
+			Return False
+		End If
+		Return True
+	End Function
+	
+	Private Function ValidateInertia() As Boolean
+		If Not ValidDoubleValue(tbInertia.Text) Then
+			ShowErrorMessageBox("Inertia", tbInertia)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateNrDesignTypeWheelMotorMeasured() As Boolean 
+		If Not cbDesignTypeWheelMotor.Checked AND Not ValidDoubleValue(tbNumberOfDesignTypeWheelMotor.Text) Then
+			ShowErrorMessageBox("Nr of Design Type Wheel Motor Measured", tbNumberOfDesignTypeWheelMotor)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateOverloadRecoveryFactor() As Boolean
+		If Not ValidDoubleValue(tbThermalOverload.Text) Then
+			ShowErrorMessageBox("Thermal Overload Recovery Factor", tbThermalOverload)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateVoltage(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Voltage", tb)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateContinuousTorque(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Continuous Torque", tb)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateContinuousTorqueSpeed(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Continuous Torque", tb)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateOverloadTime(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Overload Time", tb)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateOverloadTorque(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Overload Torque", tb)
+			Return False
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateOverloadTorqueSpeed(tb As TextBox) As Boolean
+		If Not ValidDoubleValue(tb.Text) Then
+			ShowErrorMessageBox("Overload Torque Speed", tb)
+			Return False
+		End If
+		Return True
+	End Function
+	
+	Private Function ValidateAmountOfEntries() As Boolean
+		If _lvGear.Items.Count = 0 Then
+			ShowErrorMessageBox("Invalid input no Gear given")
+			Return False
+		End If
+
+		If Not _lvPowerMap1.Items.Count = _lvGear.Items.Count Then
+			ShowErrorMessageBox("Invalid number of Power Map entries at Voltage Level Low")
+			Return False
+		End If
+		
+		If Not _lvPowerMap2.Items.Count = _lvGear.Items.Count Then
+			ShowErrorMessageBox("Invalid number of Power Map entries at Voltage Level High")
+			Return False
+		End If
+
+		If _lvDragCurve.Items.Count = 0 
+			ShowErrorMessageBox("Invalid input no Drag Curve given")
+			Return False
+		End If
+
+		If Not _lvDragCurve.Items.Count = _lvGear.Items.Count And _lvDragCurve.Items.Count > 1
+			ShowErrorMessageBox("Invalid numbers of Drag Curves given")
+			Return False
+		End If
+
+		Return True
+	End Function
+
+	Private Function ValidateFullLoadCurve1() As Boolean
+		If Not File.Exists(tbFLCurve1.Text) Then
+			ShowErrorMessageBox("No valid file path given", tbFLCurve1, False)
+			Return False
+		End If
+		
+		Dim fileExtension = new FileInfo(tbFLCurve1.Text).Extension
+		If Not $".{IEPCFLCFileBrowser.Extensions.First()}" = fileExtension Then
+			ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCFLCFileBrowser.Extensions.First()}) has the wrong extension",
+								tbFLCurve1, False)
+			Return False		
+		End If
+		Return True
+	End Function
+
+	Private Function ValidateFullLoadCurve2() As Boolean
+		If Not File.Exists(tbFLCurve2.Text) Then
+			ShowErrorMessageBox("Invalid input no valid file path given", tbFLCurve2, False)
+			Return False
+		End If
+		
+		Dim fileExtension = new FileInfo(tbFLCurve2.Text).Extension
+		If Not $".{IEPCFLCFileBrowser.Extensions.First()}" = fileExtension Then
+			ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCFLCFileBrowser.Extensions.First()}) has the wrong file extension",
+								tbFLCurve2, False)
+			Return False		
+		End If
+		Return True
+	End Function
+
+	Private Function ValidatePowerMapEntries(powerMap as ListView) As Boolean
+
+		For Each entry As ListViewItem In powerMap.Items
+			If entry.SubItems.Count = 1 Then
+				ShowErrorMessageBox("Invalid input missing Power Map files")
+				Return False
+			End If
+
+			If entry.SubItems.Count = 2 Then
+				Dim fileExtension = new FileInfo(entry.SubItems(1).Text).Extension
+				If Not $".{IEPCPowerMapFileBrowser.Extensions.First()}" = fileExtension
+					ShowErrorMessageBox($"The selected Full Load Curve file(.{IEPCPowerMapFileBrowser.Extensions.First()}) has the wrong file extension")
+					Return false
+				End If
+			End If
+		Next
+		Return True
+
+	End Function
+
+	Private Sub ShowErrorMessageBox(message As string, textbox As TextBox, Optional defaultMessage As Boolean = True)
+		If Not message = Nothing And defaultMessage Then
+			MsgBox($"Invalid input for {message}")
+			textbox.Focus()
+			Return
+		Else 
+			MsgBox($"{message}")
+			textbox.Focus()
+			Return
+		End If
+	End Sub
+
+	Private Sub ShowErrorMessageBox(message As string)
+		If Not message = Nothing Then
+			MsgBox($"{message}")
+			Return
+		End If
+	End Sub
+	
+	Private Function ValidDoubleValue(value As string) As Boolean
+		If String.IsNullOrEmpty(value)
+			Return false
+		End If
+		Return IsNumeric(value)
+	End Function
    
 #End Region
-    
+	
 #Region "Track changes"
 
-    Private Sub Change()
-        If Not _changed Then
-            LbStatus.Text = "Unsaved changes in current file"
-            _changed = True
-        End If
-    End Sub
-
-    Private Sub tbModel_TextChanged(sender As Object, e As EventArgs) Handles tbModel.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbInertia_TextChanged(sender As Object, e As EventArgs) Handles tbInertia.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbThermalOverload_TextChanged(sender As Object, e As EventArgs) Handles tbThermalOverload.TextChanged
-        Change()
-    End Sub
-
-    Private Sub cbDifferentialIncluded_CheckedChanged(sender As Object, e As EventArgs) Handles cbDifferentialIncluded.CheckedChanged
-        Change()
-    End Sub
-
-    Private Sub cbDesignTypeWheelMotor_CheckedChanged(sender As Object, e As EventArgs) Handles cbDesignTypeWheelMotor.CheckedChanged
-        tbNumberOfDesignTypeWheelMotor.Enabled = cbDesignTypeWheelMotor.Checked
-        If tbNumberOfDesignTypeWheelMotor.Enabled = False Then _
-            tbNumberOfDesignTypeWheelMotor.Text = "0"
-        Change()
-    End Sub
-
-    Private Sub tbNumberOfDesignTypeWheelMotor_TextChanged(sender As Object, e As EventArgs) Handles tbNumberOfDesignTypeWheelMotor.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbVoltage1_TextChanged(sender As Object, e As EventArgs) Handles tbVoltage1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbContinousTorque1_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorque1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbContinousTorqueSpeed1_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorqueSpeed1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbOverloadTime1_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTime1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbOverloadTorque1_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorque1.TextChanged
-        Change()
-    End Sub
-    
-    Private Sub tboverloadTorqueSpeed1_TextChanged(sender As Object, e As EventArgs) Handles tboverloadTorqueSpeed1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbFLCurve1_TextChanged(sender As Object, e As EventArgs) Handles tbFLCurve1.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbVoltage2_TextChanged(sender As Object, e As EventArgs) Handles tbVoltage2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbContinousTorque2_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorque2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbContinousTorqueSpeed2_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorqueSpeed2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbOverloadTime2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTime2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbOverloadTorque2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorque2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbOverloadTorqueSpeed2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorqueSpeed2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub tbFLCurve2_TextChanged(sender As Object, e As EventArgs) Handles tbFLCurve2.TextChanged
-        Change()
-    End Sub
-
-    Private Sub IEPCForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
-        If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
-            e.Cancel = ChangeCheckCancel()
-        End If
-    End Sub
+	Private Sub Change()
+		If Not _changed Then
+			LbStatus.Text = "Unsaved changes in current file"
+			_changed = True
+		End If
+	End Sub
+
+	Private Sub tbModel_TextChanged(sender As Object, e As EventArgs) Handles tbModel.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbInertia_TextChanged(sender As Object, e As EventArgs) Handles tbInertia.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbThermalOverload_TextChanged(sender As Object, e As EventArgs) Handles tbThermalOverload.TextChanged
+		Change()
+	End Sub
+
+	Private Sub cbDifferentialIncluded_CheckedChanged(sender As Object, e As EventArgs) Handles cbDifferentialIncluded.CheckedChanged
+		Change()
+	End Sub
+
+	Private Sub cbDesignTypeWheelMotor_CheckedChanged(sender As Object, e As EventArgs) Handles cbDesignTypeWheelMotor.CheckedChanged
+		tbNumberOfDesignTypeWheelMotor.Enabled = cbDesignTypeWheelMotor.Checked
+		If tbNumberOfDesignTypeWheelMotor.Enabled = False Then _
+			tbNumberOfDesignTypeWheelMotor.Text = "0"
+		Change()
+	End Sub
+
+	Private Sub tbNumberOfDesignTypeWheelMotor_TextChanged(sender As Object, e As EventArgs) Handles tbNumberOfDesignTypeWheelMotor.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbVoltage1_TextChanged(sender As Object, e As EventArgs) Handles tbVoltage1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbContinousTorque1_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorque1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbContinousTorqueSpeed1_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorqueSpeed1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbOverloadTime1_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTime1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbOverloadTorque1_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorque1.TextChanged
+		Change()
+	End Sub
+	
+	Private Sub tboverloadTorqueSpeed1_TextChanged(sender As Object, e As EventArgs) Handles tboverloadTorqueSpeed1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbFLCurve1_TextChanged(sender As Object, e As EventArgs) Handles tbFLCurve1.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbVoltage2_TextChanged(sender As Object, e As EventArgs) Handles tbVoltage2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbContinousTorque2_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorque2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbContinousTorqueSpeed2_TextChanged(sender As Object, e As EventArgs) Handles tbContinousTorqueSpeed2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbOverloadTime2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTime2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbOverloadTorque2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorque2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbOverloadTorqueSpeed2_TextChanged(sender As Object, e As EventArgs) Handles tbOverloadTorqueSpeed2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub tbFLCurve2_TextChanged(sender As Object, e As EventArgs) Handles tbFLCurve2.TextChanged
+		Change()
+	End Sub
+
+	Private Sub IEPCForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
+		If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
+			e.Cancel = ChangeCheckCancel()
+		End If
+	End Sub
+
+ 
 
 #End Region
 
+	Private Sub btShowFLCurve1_Click(sender As Object, e As EventArgs) Handles btShowFLCurve1.Click
+		Dim theFile = FileRepl(tbFLCurve1.Text, GetPath(_iepcFilePath))
+
+		If theFile <> NoFile AndAlso File.Exists(theFile) Then
+			OpenFiles(theFile)
+		End If
+	End Sub
+	
+	Private Sub btShowFLCurve2_Click(sender As Object, e As EventArgs) Handles btShowFLCurve2.Click
+		Dim theFile = FileRepl(tbFLCurve2.Text, GetPath(_iepcFilePath))
+
+		If theFile <> NoFile AndAlso File.Exists(theFile) Then
+			OpenFiles(theFile)
+		End If
+	End Sub
+	
+	Private Sub OpenFiles(ParamArray files() As String)
+
+		If files.Length = 0 Then Exit Sub
+
+		_contextMenuFiles = files
+
+		OpenWithToolStripMenuItem.Text = "Open with " & Cfg.OpenCmdName
+
+		CmOpenFile.Show(Cursor.Position)
+	End Sub
+
+	Private Sub OpenWithToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenWithToolStripMenuItem.Click
+		If Not FileOpenAlt(_contextMenuFiles(0)) Then MsgBox("Failed to open file!")
+	End Sub
+
+	Private Sub ShowInFolderToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ShowInFolderToolStripMenuItem.Click
+
+		If File.Exists(_contextMenuFiles(0)) Then
+			Try
+				Process.Start("explorer", "/select,""" & _contextMenuFiles(0) & "")
+			Catch ex As Exception
+				MsgBox("Failed to open file!")
+			End Try
+		Else
+			MsgBox("File not found!")
+		End If
+	End Sub
+
 End Class
\ No newline at end of file
-- 
GitLab