Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
VectoJobForm.vb 38.2 KiB
Newer Older
' Copyright 2014 European Union.
' Licensed under the EUPL (the 'Licence');
'
' * You may not use this work except in compliance with the Licence.
' * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
' * Unless required by applicable law or agreed to in writing,
'   software distributed under the Licence is distributed on an "AS IS" basis,
'   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
'
' See the LICENSE.txt for the specific language governing permissions and limitations.
Option Infer On

Imports System.Collections.Generic
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Windows.Forms.DataVisualization.Charting
Imports TUGraz.VECTO.Input_Files
Imports TUGraz.VectoCommon.InputData
Imports TUGraz.VectoCommon.Models
Imports TUGraz.VectoCommon.Utils
Imports TUGraz.VectoCore.InputData.FileIO.JSON
Imports TUGraz.VectoCore.Models.Declaration

''' <summary>
''' Job Editor. Create/Edit VECTO job files (.vecto)
''' </summary>
''' <remarks></remarks>
Public Class VectoJobForm
	Public VECTOfile As String
	Private _changed As Boolean = False
	Private _pgDriverOn As Boolean = True
	Private _auxDialog As VehicleAuxiliariesDialog
	Public EngineIdleSpeed As Double
	Public EngineFullLoadFile As String

	'AA-TB
	'Populate Advanced Auxiliaries
	Private Sub PopulateAdvancedAuxiliaries()
		'Scan the program directory for DLL's which are AdvancedAuxiliaries and display
		Dim aList As List(Of AdvancedAuxiliary) = DiscoverAdvancedAuxiliaries()

		cboAdvancedAuxiliaries.DataSource = aList
		cboAdvancedAuxiliaries.DisplayMember = "AuxiliaryName"
	End Sub


	'Initialise form
	Private Sub F02_GEN_Load(sender As Object, e As EventArgs) Handles Me.Load
		EngineIdleSpeed = -1
		EngineFullLoadFile = ""
		_auxDialog = New VehicleAuxiliariesDialog

		For x = 0 To TabControl1.TabCount - 1
			TabControl1.TabPages(x).Show()
		Next

		LvAux.Columns(2).Width = -2

		'Declaration Mode
		If Cfg.DeclMode Then
			LvAux.Columns(2).Text = "Technology"
		Else
			LvAux.Columns(2).Text = "Input File"
		End If

		CbEngOnly.Enabled = Not Cfg.DeclMode
		GrCycles.Enabled = Not Cfg.DeclMode
		GrVACC.Enabled = Not Cfg.DeclMode
		PnStartStop.Enabled = Not Cfg.DeclMode
		RdOff.Enabled = Not Cfg.DeclMode
		GrLAC.Enabled = Not Cfg.DeclMode
		ButAuxAdd.Enabled = Not Cfg.DeclMode
		ButAuxRem.Enabled = Not Cfg.DeclMode
		PnEcoRoll.Enabled = Not Cfg.DeclMode

		'AA-TB
		PopulateAdvancedAuxiliaries()

		'Attempt to select that found in Config
	End Sub

	'Close - Check for unsaved changes
	Private Sub F02_GEN_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
		If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
			e.Cancel = ChangeCheckCancel()
		End If
	End Sub

	'Set generic values for Declaration mode
	Private Sub DeclInit()

		If Not Cfg.DeclMode Then Exit Sub

		LvCycles.Items.Clear()
		CbEngOnly.Checked = False
		TbDesMaxFile.Text = ""
		If Not RdEcoRoll.Checked Then RdOverspeed.Checked = True
		CbLookAhead.Checked = True

		TbSSspeed.Text = DeclarationData.Driver.StartStop.MaxSpeed.AsKmph().ToGUIFormat()	'cDeclaration.SSspeed
		TbSStime.Text = DeclarationData.Driver.StartStop.MinTime.ToGUIFormat()	 'cDeclaration.SStime
		TbSSdelay.Text = DeclarationData.Driver.StartStop.Delay.ToGUIFormat()	 ' cDeclaration.SSdelay
		tbLacPreviewFactor.Text = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor.ToGUIFormat()
		tbLacDfTargetSpeedFile.Text = ""
		tbLacDfVelocityDropFile.Text = ""

		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph().ToGUIFormat()	 'cDeclaration.Overspeed
		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph().ToGUIFormat() _
		' cDeclaration.Underspeed
		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph().ToGUIFormat()	 'cDeclaration.ECvmin
			(LvAux.Items(0).Text <> Constants.AuxiliaryKey.Fan OrElse LvAux.Items(1).Text <> Constants.AuxiliaryKey.SteerPump OrElse
			LvAux.Items(2).Text <> Constants.AuxiliaryKey.HVAC OrElse LvAux.Items(3).Text <> Constants.AuxiliaryKey.ElecSys OrElse
			LvAux.Items(4).Text <> Constants.AuxiliaryKey.PneumSys) Then
			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.Fan, "Fan", DeclarationData.Fan))
			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.SteerPump, "Steering pump", DeclarationData.SteeringPump))
			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.HVAC, "HVAC",
											DeclarationData.HeatingVentilationAirConditioning))
			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.ElecSys, "Electric System", DeclarationData.ElectricSystem))
			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.PneumSys, "Pneumatic System",
											DeclarationData.PneumaticSystem))
	Protected Function GetTechListForAux(key As String, nameStr As String, aux As IDeclarationAuxiliaryTable) _
		As ListViewItem
		Dim LV0 As ListViewItem

		LV0 = New ListViewItem(key)
		LV0.SubItems.Add(nameStr)
		Dim auxtech As String() = aux.GetTechnologies()
		If auxtech.Count > 1 Then
			LV0.SubItems.Add("")
		Else
			LV0.SubItems.Add(auxtech(0))
		End If
		Return LV0
	End Function


	'Show/Hide "Driver Assist" Tab
	Private Sub SetDrivertab(onOff As Boolean)
		If onOff Then
			If Not _pgDriverOn Then
				_pgDriverOn = True
				TabControl1.TabPages.Insert(1, _pgDriver)
			If _pgDriverOn Then
				_pgDriverOn = False
				TabControl1.Controls.Remove(_pgDriver)
			End If
		End If
	End Sub


#Region "Browse Buttons"

	Private Sub ButtonVEH_Click(sender As Object, e As EventArgs) Handles ButtonVEH.Click
		If VehicleFileBrowser.OpenDialog(fFileRepl(TbVEH.Text, GetPath(VECTOfile))) Then
			TbVEH.Text = GetFilenameWithoutDirectory(VehicleFileBrowser.Files(0), GetPath(VECTOfile))
		End If
	End Sub

	Private Sub ButtonMAP_Click(sender As Object, e As EventArgs) Handles ButtonMAP.Click
		If EngineFileBrowser.OpenDialog(fFileRepl(TbENG.Text, GetPath(VECTOfile))) Then
			TbENG.Text = GetFilenameWithoutDirectory(EngineFileBrowser.Files(0), GetPath(VECTOfile))
		End If
	End Sub

	Private Sub ButtonGBX_Click(sender As Object, e As EventArgs) Handles ButtonGBX.Click
		If GearboxFileBrowser.OpenDialog(fFileRepl(TbGBX.Text, GetPath(VECTOfile))) Then
			TbGBX.Text = GetFilenameWithoutDirectory(GearboxFileBrowser.Files(0), GetPath(VECTOfile))
		End If
	End Sub

	Private Sub BtDesMaxBr_Click_1(sender As Object, e As EventArgs) Handles BtDesMaxBr.Click
		If DriverAccelerationFileBrowser.OpenDialog(fFileRepl(TbDesMaxFile.Text, GetPath(VECTOfile))) Then
			TbDesMaxFile.Text = GetFilenameWithoutDirectory(DriverAccelerationFileBrowser.Files(0), GetPath(VECTOfile))
		End If
	End Sub

	Private Sub BtAccOpen_Click(sender As Object, e As EventArgs) Handles BtAccOpen.Click
		OpenFiles(fFileRepl(TbDesMaxFile.Text, GetPath(VECTOfile)))
	End Sub

#End Region

#Region "Open Buttons"

	'Open Vehicle Editor
	Private Sub ButOpenVEH_Click(sender As Object, e As EventArgs) Handles ButOpenVEH.Click
		Dim f As String
		f = fFileRepl(TbVEH.Text, GetPath(VECTOfile))
		VehicleForm.AutoSendTo = True

		If Not Trim(f) = "" Then
			If Not File.Exists(f) Then
				MsgBox("File not found!")
				Exit Sub
			End If
		End If

		If Not VehicleForm.Visible Then
			VehicleForm.Show()
		Else
			If VehicleForm.WindowState = FormWindowState.Minimized Then VehicleForm.WindowState = FormWindowState.Normal
			VehicleForm.BringToFront()
		End If

		If Not Trim(f) = "" Then
			Try
				VehicleForm.OpenVehicle(f)
			Catch ex As Exception
				MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Error loading Vehicle File")
			End Try
		End If
	End Sub

	'Open Engine Editor
	Private Sub ButOpenENG_Click(sender As Object, e As EventArgs) Handles ButOpenENG.Click
		Dim f As String
		f = fFileRepl(TbENG.Text, GetPath(VECTOfile))
		EngineForm.AutoSendTo = True

		If Not Trim(f) = "" Then
			If Not File.Exists(f) Then
				MsgBox("File not found!")
				Exit Sub
			End If
		End If

		If Not EngineForm.Visible Then
			EngineForm.Show()
		Else
			If EngineForm.WindowState = FormWindowState.Minimized Then EngineForm.WindowState = FormWindowState.Normal
			EngineForm.BringToFront()
		End If

		If Not Trim(f) = "" Then EngineForm.OpenEngineFile(f)
	End Sub

	'Open Gearbox Editor
	Private Sub ButOpenGBX_Click(sender As Object, e As EventArgs) Handles ButOpenGBX.Click
		Dim f As String
		f = fFileRepl(TbGBX.Text, GetPath(VECTOfile))
		GearboxForm.AutoSendTo = True

		If Not Trim(f) = "" Then
			If Not File.Exists(f) Then
				MsgBox("File not found!")
				Exit Sub
			End If
		End If

		If Not GearboxForm.Visible Then
			GearboxForm.Show()
		Else
			If GearboxForm.WindowState = FormWindowState.Minimized Then GearboxForm.WindowState = FormWindowState.Normal
			GearboxForm.BringToFront()
		End If

		If Not Trim(f) = "" Then GearboxForm.openGBX(f)
	End Sub

#End Region

#Region "Toolbar"

	'New
	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
		VECTOnew()
	End Sub

	'Open
	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
		If JobfileFileBrowser.OpenDialog(VECTOfile, False, "vecto") Then VECTOload2Form(JobfileFileBrowser.Files(0))
	End Sub

	'Save
	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
		Save()
	End Sub

	'Save As
	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
		If JobfileFileBrowser.SaveDialog(VECTOfile) Then Call VECTOsave(JobfileFileBrowser.Files(0))
	End Sub

	'Send to Job file list in main form
	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
		If ChangeCheckCancel() Then Exit Sub
		If VECTOfile = "" Then
			MsgBox("File not found!" & ChrW(10) & ChrW(10) & "Save file and try again.")
		Else
			MainForm.AddToJobListView(VECTOfile)
		End If
	End Sub

	'Help
	Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
		If File.Exists(MyAppPath & "User Manual\help.html") Then
			Dim BrowserRegistryString As String =
					My.Computer.Registry.ClassesRoot.OpenSubKey("\http\shell\open\command\").GetValue("").ToString
			Dim DefaultBrowserPath As String =
					Regex.Match(BrowserRegistryString, "(\"".*?\"")").Captures(0).ToString
			Process.Start(DefaultBrowserPath,
						String.Format("""{0}{1}""", MyAppPath, "User Manual\help.html#job-editor"))
		Else
			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
		End If
	End Sub


#End Region

	'Save ("Save" or "Save As" when new file)
	Private Function Save() As Boolean
		If VECTOfile = "" Then
			If JobfileFileBrowser.SaveDialog("") Then
				VECTOfile = JobfileFileBrowser.Files(0)
			Else
				Return False
			End If
		End If
		Return VECTOsave(VECTOfile)
	End Function

	'Open file
	Public Sub VECTOload2Form(file As String)
		If ChangeCheckCancel() Then Exit Sub

		VECTOnew()

		'Read GEN
		Dim VEC0 = New VectoJob
		VEC0.FilePath = file
		Try
			If Not VEC0.ReadFile() Then
				MsgBox("Failed to load " & GetFilenameWithoutPath(file, True) & "!")
				Exit Sub
			End If
		Catch ex As Exception
			MsgBox("Failed to load " & GetFilenameWithoutPath(file, True) & "!")
			Exit Sub
		End Try

		If Cfg.DeclMode <> VEC0.SavedInDeclMode Then
			Select Case WrongMode()
				Case 1
					Close()
					MainForm.RbDecl.Checked = Not MainForm.RbDecl.Checked
					MainForm.OpenVectoFile(file)
				Case -1
					Exit Sub
				Case Else '0
					'Continue...
			End Select
		End If


		'Update Form

		'Files -----------------------------
		TbVEH.Text = VEC0.PathVeh(True)
		TbENG.Text = VEC0.PathEng(True)
		TbGBX.Text = VEC0.PathGbx(True)

		'Start/Stop
		ChBStartStop.Checked = VEC0.StartStop
		TbSSspeed.Text = VEC0.StStV.ToString()
		TbSStime.Text = VEC0.StStT.ToString()
		TbSSdelay.Text = VEC0.StartStopDelay.ToString()

		'VACC
		TbDesMaxFile.Text = VEC0.DesMaxFile(True)


		'AA-TB
		'Try and Select any previously selected Auxiliary Type
		For Each item As AdvancedAuxiliary In cboAdvancedAuxiliaries.Items
			If item.AssemblyName = VEC0.AuxiliaryAssembly AndAlso VEC0.AuxiliaryVersion = item.AuxiliaryVersion Then
				cboAdvancedAuxiliaries.SelectedItem = item
				Exit For
			End If
		Next
		'AA-TB
		'Assign any previously saved Axiliary FilePath
		txtAdvancedAuxiliaryFile.Text = VEC0.AdvancedAuxiliaryFilePath


		LvAux.Items.Clear()
		For Each AuxEntryKV In VEC0.AuxPaths
			Dim lv0 = New ListViewItem
			lv0.SubItems(0).Text = AuxEntryKV.Key
			lv0.SubItems.Add(AuxEntryKV.Value.Type)
			If Cfg.DeclMode Then
				lv0.SubItems.Add(String.Join(", ", AuxEntryKV.Value.TechnologyList))
			Else
				lv0.SubItems.Add(AuxEntryKV.Value.Path.OriginalPath)
			End If
			LvAux.Items.Add(lv0)
		Next

		For Each sb In VEC0.CycleFiles
			Dim lv0 = New ListViewItem
			lv0.Text = sb.OriginalPath
			LvCycles.Items.Add(lv0)
		Next


		If VEC0.EcoRollOn Then
			RdEcoRoll.Checked = True
		ElseIf VEC0.OverSpeedOn Then
			RdOverspeed.Checked = True
		Else
			RdOff.Checked = True
		End If
		TbOverspeed.Text = CStr(VEC0.OverSpeed)
		TbUnderSpeed.Text = CStr(VEC0.UnderSpeed)
		TbVmin.Text = CStr(VEC0.VMin)
		CbLookAhead.Checked = VEC0.LookAheadOn
		'TbAlookahead.Text = CStr(VEC0.ALookahead)
		'TbVminLA.Text = CStr(VEC0.VMinLa)
		tbLacPreviewFactor.Text = CStr(VEC0.LacPreviewFactor)
		tbDfCoastingOffset.Text = CStr(VEC0.LacDfOffset)
		tbDfCoastingScale.Text = CStr(VEC0.LacDfScale)

		tbLacDfTargetSpeedFile.Text = VEC0.LacDfTargetSpeedFile
		tbLacDfVelocityDropFile.Text = VEC0.LacDfVelocityDropFile

		'-------------------------------------------------------------

		DeclInit()


		EngineForm.AutoSendTo = False
		GearboxForm.AutoSendTo = False
		VehicleForm.AutoSendTo = False


		VECTOfile = file

		While Mid(file, x, 1) <> "\" And x > 0
			x = x - 1
		End While
		Text = Mid(file, x + 1, Len(file) - x)
		ToolStripStatusLabelGEN.Text = ""	'file & " opened."

		UpdatePic()

		'-------------------------------------------------------------
	End Sub

	'Save file
	Private Function VECTOsave(file As String) As Boolean
		Dim message As String = String.Empty

		'AA-TB
		'Validation of Auxiliary Types/Advanced Auxiliaries
		'if not classic, check the file is valid, if not fail the operation and alert user.
		If cboAdvancedAuxiliaries.SelectedIndex > 0 Then

			'resolve absolute path for auxiliary file.
			Dim absoluteAAUxFile = ResolveAAUXFilePath(GetPath(VECTOfile), txtAdvancedAuxiliaryFile.Text)
			Dim aaAssemblyName = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
			Dim aaAssemblyVersion = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AuxiliaryVersion


			If Not ValidateAAUXFile(absoluteAAUxFile, aaAssemblyName, aaAssemblyVersion, message) Then
				MessageBox.Show(
					String.Format("You have selected an advanced auxiliary *Auxiliary Type*, but the file specified is invalid :{0}",
								message))
				Return False
			End If

		End If


		Dim vec0 = New VectoJob
		vec0.FilePath = file

		'Files ------------------------------------------------- -----------------

		vec0.PathVeh = TbVEH.Text
		vec0.PathEng = TbENG.Text

		For Each lv0 As ListViewItem In LvCycles.Items
			Dim sb = New SubPath
			vec0.CycleFiles.Add(sb)
		Next

		vec0.PathGbx = TbGBX.Text


		'Start/Stop
		vec0.StartStop = ChBStartStop.Checked
		vec0.StStV = TbSSspeed.Text.ToDouble()
		vec0.StStT = TbSStime.Text.ToDouble()
		vec0.StartStopDelay = TbSSdelay.Text.ToDouble()

		'a_DesMax
		vec0.DesMaxFile = TbDesMaxFile.Text

		'AA-TB
		vec0.AuxiliaryAssembly = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
		vec0.AuxiliaryVersion = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AuxiliaryVersion
		vec0.AdvancedAuxiliaryFilePath = txtAdvancedAuxiliaryFile.Text

		For Each lv0 As ListViewItem In LvAux.Items
			Dim auxEntry = New VectoJob.AuxEntry

			If Cfg.DeclMode Then
				auxEntry.TechnologyList.Clear()
				auxEntry.TechnologyList.Add(lv0.SubItems(2).Text)
				auxEntry.Path.Init(GetPath(file), lv0.SubItems(2).Text)
			End If

			auxEntry.Type = lv0.SubItems(1).Text
			vec0.AuxPaths.Add(lv0.SubItems(0).Text, auxEntry)
		Next


		vec0.EcoRollOn = RdEcoRoll.Checked
		vec0.OverSpeedOn = RdOverspeed.Checked
		vec0.OverSpeed = TbOverspeed.Text.ToDouble()
		vec0.UnderSpeed = TbUnderSpeed.Text.ToDouble()
		vec0.VMin = TbVmin.Text.ToDouble()
		vec0.LookAheadOn = CbLookAhead.Checked
		'vec0.ALookahead = CSng(fTextboxToNumString(TbAlookahead.Text))
		'vec0.VMinLa = CSng(fTextboxToNumString(TbVminLA.Text))

		vec0.LacPreviewFactor = tbLacPreviewFactor.Text.ToDouble()
		vec0.LacDfOffset = tbDfCoastingOffset.Text.ToDouble()
		vec0.LacDfScale = tbDfCoastingScale.Text.ToDouble()
		vec0.LacDfTargetSpeedFile = tbLacDfTargetSpeedFile.Text
		vec0.LacDfVelocityDropFile = tbLacDfVelocityDropFile.Text
		'------------------------------------------------------------

		'SAVE
		If Not vec0.SaveFile Then
			MsgBox("Cannot safe to " & file, MsgBoxStyle.Critical)
			Return False
		End If

		VECTOfile = file

		file = GetFilenameWithoutPath(VECTOfile, True)

		Text = file
		ToolStripStatusLabelGEN.Text = ""

		MainForm.AddToJobListView(VECTOfile)


		Return True
	End Function

	'New file
	Public Sub VECTOnew()

		If ChangeCheckCancel() Then Exit Sub

		EngineIdleSpeed = -1
		EngineFullLoadFile = ""

		'Files
		TbVEH.Text = ""
		TbENG.Text = ""
		LvCycles.Items.Clear()
		TbGBX.Text = ""
		TbDesMaxFile.Text = ""

		'Start/Stop
		TbSSspeed.Text = "5"
		TbSStime.Text = "5"
		ChBStartStop.Checked = False

		LvAux.Items.Clear()

		CbEngOnly.Checked = False

		RdOff.Checked = True
		CbLookAhead.Checked = True
		'TbAlookahead.Text = "-0.5"
		TbOverspeed.Text = ""
		TbUnderSpeed.Text = ""
		TbVmin.Text = ""
		'TbVminLA.Text = "50"
		tbLacPreviewFactor.Text = "10"
		tbDfCoastingOffset.Text = "2.5"
		tbDfCoastingScale.Text = "1.5"
		tbLacDfTargetSpeedFile.Text = ""
		tbLacDfVelocityDropFile.Text = ""

		'---------------------------------------------------

		DeclInit()

		EngineForm.AutoSendTo = False

		VECTOfile = ""
		Text = "Job Editor"
		ToolStripStatusLabelGEN.Text = ""
		UpdatePic()
	End Sub


#Region "Track changes"

#Region "'Change' Events"

	Private Sub TextBoxVEH_TextChanged(sender As Object, e As EventArgs) _
		Handles TbVEH.TextChanged
		UpdatePic()
		Change()
	End Sub

	Private Sub TextBoxMAP_TextChanged(sender As Object, e As EventArgs) _
		Handles TbENG.TextChanged
		UpdatePic()
		Change()
	End Sub

	Private Sub TextBoxFLD_TextChanged(sender As Object, e As EventArgs) _
		Handles TbGBX.TextChanged
		UpdatePic()
		Change()
	End Sub

	Private Sub TbDesMaxFile_TextChanged_1(sender As Object, e As EventArgs) Handles TbDesMaxFile.TextChanged
		Change()
	End Sub


	Private Sub TBSSspeed_TextChanged(sender As Object, e As EventArgs) Handles TbSSspeed.TextChanged
		Change()
	End Sub

	Private Sub TBSStime_TextChanged(sender As Object, e As EventArgs) _
		Handles TbSStime.TextChanged, TbSSdelay.TextChanged
		Change()
	End Sub

	Private Sub TbOverspeed_TextChanged(sender As Object, e As EventArgs) Handles TbOverspeed.TextChanged
		Change()
	End Sub

	Private Sub TbUnderSpeed_TextChanged(sender As Object, e As EventArgs) Handles TbUnderSpeed.TextChanged
		Change()
	End Sub

	Private Sub TbVmin_TextChanged(sender As Object, e As EventArgs) _
		Handles TbVmin.TextChanged
		Change()
	End Sub

	Private Sub LvCycles_AfterLabelEdit(sender As Object, e As LabelEditEventArgs) _
		Handles LvCycles.AfterLabelEdit
		Change()
	End Sub


#End Region

	Private Sub Change()
			ToolStripStatusLabelGEN.Text = "Unsaved changes in current file"
		End If
	End Sub

	' "Save changes? "... Returns True if User aborts
	Private Function ChangeCheckCancel() As Boolean


			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
				Case MsgBoxResult.Yes
					Return Not Save()
				Case MsgBoxResult.Cancel
					Return True
				Case Else 'MsgBoxResult.No
					Return False
			End Select

		Else

			Return False

		End If
	End Function

#End Region

#Region "Aux Listview"

	Private Sub ButAuxAdd_Click(sender As Object, e As EventArgs) Handles ButAuxAdd.Click
		Dim ID As String

		_auxDialog.VehPath = GetPath(VECTOfile)
		_auxDialog.TbPath.Text = ""
		_auxDialog.CbType.SelectedIndex = -1
		_auxDialog.CbType.Text = ""
		_auxDialog.TbID.Text = ""	'!!! Set Type before ID, because changing the type will overwrite the id !!!
		If _auxDialog.ShowDialog = DialogResult.OK Then
			ID = UCase(Trim(_auxDialog.TbID.Text))

			Dim lv0 As ListViewItem
			For Each lv0 In LvAux.Items
				If lv0.SubItems(0).Text = ID Then
					MsgBox("ID '" & ID & "' already defined!", MsgBoxStyle.Critical)
					_auxDialog.TbID.SelectAll()
					_auxDialog.TbID.Focus()
					GoTo lbDlog
				End If
			Next

			lv0 = New ListViewItem
			lv0.SubItems(0).Text = UCase(Trim(_auxDialog.TbID.Text))
			lv0.SubItems.Add(Trim(_auxDialog.CbType.Text))
			lv0.SubItems.Add(Trim(_auxDialog.TbPath.Text))
			LvAux.Items.Add(lv0)
			Change()
		End If
	End Sub

	Private Sub ButAuxRem_Click(sender As Object, e As EventArgs) Handles ButAuxRem.Click
		RemoveAuxItem()
	End Sub

	Private Sub LvAux_DoubleClick(sender As Object, e As EventArgs) Handles LvAux.DoubleClick
		EditAuxItem()
	End Sub

	Private Sub LvAux_KeyDown(sender As Object, e As KeyEventArgs) Handles LvAux.KeyDown
		Select Case e.KeyCode
			Case Keys.Delete, Keys.Back
				If Not Cfg.DeclMode Then RemoveAuxItem()
			Case Keys.Enter
				EditAuxItem()
		End Select
	End Sub

	Private Sub EditAuxItem()
		If LvAux.SelectedItems.Count = 0 Then
			Exit Sub
		End If

		Dim selItem = LvAux.SelectedItems(0)

		_auxDialog.VehPath = GetPath(VECTOfile)
		_auxDialog.CbType.SelectedIndex = -1
		_auxDialog.CbType.Text = selItem.SubItems(1).Text
		_auxDialog.TbID.Text = selItem.SubItems(0).Text	'After Type-set!
			_auxDialog.CbTech.Text = selItem.SubItems(2).Text
			_auxDialog.TbPath.Text = ""
			_auxDialog.CbTech.SelectedIndex = -1
			_auxDialog.TbPath.Text = selItem.SubItems(2).Text
		If _auxDialog.ShowDialog = DialogResult.OK Then
			selItem.SubItems(0).Text = UCase(Trim(_auxDialog.TbID.Text))
			selItem.SubItems(1).Text = Trim(_auxDialog.CbType.Text)
				selItem.SubItems(2).Text = Trim(_auxDialog.CbTech.Text)
				selItem.SubItems(2).Text = Trim(_auxDialog.TbPath.Text)
			End If

			Change()
		End If
	End Sub

	Private Sub RemoveAuxItem()
		Dim i As Integer

		If LvAux.SelectedItems.Count = 0 Then
			If LvAux.Items.Count = 0 Then
				Exit Sub
			Else
				LvAux.Items(LvAux.Items.Count - 1).Selected = True
			End If
		End If

		i = LvAux.SelectedItems(0).Index

		LvAux.SelectedItems(0).Remove()

		If LvAux.Items.Count > 0 Then
			If i < LvAux.Items.Count Then
				LvAux.Items(i).Selected = True
			Else
				LvAux.Items(LvAux.Items.Count - 1).Selected = True
			End If
			LvAux.Focus()
		End If

		Change()
	End Sub

#End Region

	'OK (Save & Close)
	Private Sub ButSave_Click(sender As Object, e As EventArgs) Handles ButOK.Click
		If Not Save() Then Exit Sub
		Close()
	End Sub

	'Cancel
	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
		Close()
	End Sub

#Region "Cycle list"

	Private Sub LvCycles_DoubleClick(sender As Object, e As EventArgs) Handles LvCycles.DoubleClick
		If LvCycles.SelectedItems.Count > 0 Then _
			OpenFiles(fFileRepl(LvCycles.SelectedItems(0).SubItems(0).Text, GetPath(VECTOfile)))
	End Sub

	Private Sub LvCycles_KeyDown(sender As Object, e As KeyEventArgs) Handles LvCycles.KeyDown
		Select Case e.KeyCode
			Case Keys.Delete, Keys.Back
				RemoveCycle()
			Case Keys.Enter
				If LvCycles.SelectedItems.Count > 0 Then LvCycles.SelectedItems(0).BeginEdit()
		End Select
	End Sub

	Private Sub BtDRIadd_Click(sender As Object, e As EventArgs) Handles BtDRIadd.Click

		If DrivingCycleFileBrowser.OpenDialog("", True) Then
			For Each s In DrivingCycleFileBrowser.Files
				LvCycles.Items.Add(GetFilenameWithoutDirectory(s, genDir))
			Next
			Change()
		End If
	End Sub

	Private Sub BtDRIrem_Click(sender As Object, e As EventArgs) Handles BtDRIrem.Click
		RemoveCycle()
	End Sub

	Private Sub RemoveCycle()
		Dim i As Integer

		If LvCycles.SelectedItems.Count = 0 Then
			If LvCycles.Items.Count = 0 Then
				Exit Sub
			Else
				LvCycles.Items(LvCycles.Items.Count - 1).Selected = True
			End If
		End If

		i = LvCycles.SelectedItems(0).Index

		LvCycles.SelectedItems(0).Remove()

		If LvCycles.Items.Count > 0 Then
			If i < LvCycles.Items.Count Then
				LvCycles.Items(i).Selected = True
			Else
				LvCycles.Items(LvCycles.Items.Count - 1).Selected = True
			End If

			LvCycles.Focus()
		End If

		Change()
	End Sub

#End Region

#Region "Enable/Disable GUI controls"

	'Engine only mode changed
	Private Sub CbEngOnly_CheckedChanged(sender As Object, e As EventArgs) Handles CbEngOnly.CheckedChanged
		CheckEngOnly()
		Change()
	End Sub

	Private Sub CheckEngOnly()
		Dim OnOff As Boolean

		OnOff = Not CbEngOnly.Checked

		SetDrivertab(OnOff)

		ButOpenVEH.Enabled = OnOff
		TbVEH.Enabled = OnOff
		ButtonVEH.Enabled = OnOff
		ButOpenGBX.Enabled = OnOff
		TbGBX.Enabled = OnOff
		ButtonGBX.Enabled = OnOff
		GrAux.Enabled = OnOff
	End Sub

	'Start/Stop changed 
	Private Sub ChBStartStop_CheckedChanged_1(sender As Object, e As EventArgs) _
		Handles ChBStartStop.CheckedChanged
		Change()
		If Not Cfg.DeclMode Then PnStartStop.Enabled = ChBStartStop.Checked
	End Sub

	'LAC changed
	Private Sub CbLookAhead_CheckedChanged(sender As Object, e As EventArgs) _
		Handles CbLookAhead.CheckedChanged
		Change()
	End Sub

	'EcoRoll / Overspeed changed
	Private Sub RdOff_CheckedChanged(sender As Object, e As EventArgs) _
		Handles RdOff.CheckedChanged, RdOverspeed.CheckedChanged, RdEcoRoll.CheckedChanged
		Dim EcoR As Boolean
		Dim Ovr As Boolean

		Change()

		EcoR = RdEcoRoll.Checked
		Ovr = RdOverspeed.Checked

		TbOverspeed.Enabled = Ovr Or EcoR
		Label13.Enabled = Ovr Or EcoR
		Label14.Enabled = Ovr Or EcoR

		TbUnderSpeed.Enabled = EcoR
		Label22.Enabled = EcoR
		Label20.Enabled = EcoR

		TbVmin.Enabled = Ovr Or EcoR
		Label23.Enabled = Ovr Or EcoR
		Label21.Enabled = Ovr Or EcoR
	End Sub

#End Region

	Public Sub UpdatePic()

		Dim f As CsvFile
		Dim lM As List(Of Single)
		Dim lup As List(Of Single)
		Dim ldown As List(Of Single)
		Dim line As String()


		Dim HDVclass As String