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

Skip to content
Snippets Groups Projects
VectoJobForm.vb 44 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.

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
Imports TUGraz.VectoCore.Models.SimulationComponent.Data
Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox

''' <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

	'AA-TB
	'Populate Advanced Auxiliaries
	Private Sub PopulateAdvancedAuxiliaries()
		'Scan the program directory for DLL's which are AdvancedAuxiliaries and display
		Dim aList As Dictionary(Of String, AdvancedAuxiliary) = DiscoverAdvancedAuxiliaries()
		cboAdvancedAuxiliaries.DataSource = aList.Select(Function(x) x.Value).ToList()
		cboAdvancedAuxiliaries.DisplayMember = "AuxiliaryName"
	End Sub


	'Initialise form
	Private Sub F02_GEN_Load(sender As Object, e As EventArgs) Handles Me.Load
		_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
		TbAuxPAdd.Enabled = Not Cfg.DeclMode

		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

Markus QUARITSCH's avatar
Markus QUARITSCH committed
		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 = ""

Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()	 'cDeclaration.Overspeed
		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat() _
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()	 'cDeclaration.ECvmin
		TbAuxPAdd.Text = ""
		If _
			LvAux.Items.Count <> 5 OrElse
			(LvAux.Items(0).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.Fan OrElse
			LvAux.Items(1).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.SteeringPump OrElse
			LvAux.Items(2).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.HeatingVentilationAirCondition OrElse
			LvAux.Items(3).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.ElectricSystem OrElse
			LvAux.Items(4).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.PneumaticSystem) Then
			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.Fan, DeclarationData.Fan))
			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.SteeringPump, DeclarationData.SteeringPump))
			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.HVAC, DeclarationData.HeatingVentilationAirConditioning))
			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.ElectricSystem, DeclarationData.ElectricSystem))
			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.PneumaticSystem, DeclarationData.PneumaticSystem))
	Protected Function GetTechListForAux(type As AuxiliaryType, aux As IDeclarationAuxiliaryTable) _
		Dim listViewItem As ListViewItem
		listViewItem = New ListViewItem(type.Key())
		listViewItem.SubItems.Add(type.Name())
		Dim auxtech As String() = aux.GetTechnologies()
		If auxtech.Count > 1 Then
			listViewItem.SubItems.Add("")
			listViewItem.SubItems.Add(auxtech(0))
		Return listViewItem
	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(FileRepl(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(FileRepl(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(FileRepl(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(FileRepl(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(FileRepl(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 = FileRepl(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 = FileRepl(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 = FileRepl(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
			MsgBox("File not found!" & ChrW(10) & ChrW(10) & "Save file and try again.")
		Else
		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 JobfileFileBrowser.SaveDialog("") Then
		Try
			Return VECTOsave(VectoFile)
		Catch ex As Exception
			MsgBox("Error when saving file" + Environment.NewLine + ex.Message)
			Return False
		End Try
	End Function

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

		VectoNew()
		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(file), 
																IEngineeringInputDataProvider)
		Dim vectoJob As IEngineeringJobInputData = inputData.JobInputData()
		If Cfg.DeclMode <> vectoJob.SavedInDeclarationMode Then
			Select Case WrongMode()
				Case 1
					Close()
					MainForm.RbDecl.Checked = Not MainForm.RbDecl.Checked
					MainForm.OpenVectoFile(file)
				Case -1
					Exit Sub
			End Select
		End If

		'Update Form

		'Files -----------------------------
		TbVEH.Text = GetRelativePath(inputData.VehicleInputData.Source, _basePath)
		TbENG.Text = GetRelativePath(inputData.EngineInputData.Source, _basePath)
		TbGBX.Text = GetRelativePath(inputData.GearboxInputData.Source, _basePath)
		Dim driver As IDriverEngineeringInputData = inputData.DriverInputData
		ChBStartStop.Checked = driver.StartStop.Enabled
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbSSspeed.Text = driver.StartStop.MaxSpeed.AsKmph.ToGUIFormat()
		TbSStime.Text = driver.StartStop.MinTime.ToGUIFormat()
		TbSSdelay.Text = driver.StartStop.Delay.ToGUIFormat()
		If (Cfg.DeclMode) Then
			TbDesMaxFile.Text = ""
			'AA-TB
			'Try and Select any previously selected Auxiliary Type
			Dim declarationInput As IDeclarationInputDataProvider = CType(inputData, IDeclarationInputDataProvider)
			Dim auxInput As IAuxiliariesDeclarationInputData = declarationInput.AuxiliaryInputData()
			LvAux.Items.Clear()
			Dim entry As IAuxiliaryDeclarationInputData
			For Each entry In auxInput.Auxiliaries
				'If entry.AuxiliaryType = AuxiliaryDemandType.Constant Then Continue For
				Try
					Dim lv0 As ListViewItem = New ListViewItem
					lv0.SubItems(0).Text = AuxiliaryTypeHelper.GetAuxKey(entry.Type)
					lv0.SubItems.Add(AuxiliaryTypeHelper.ToString(entry.Type))
					lv0.SubItems.Add(String.Join(", ", entry.Technology))
					LvAux.Items.Add(lv0)
				Catch ex As Exception
				End Try
			TbDesMaxFile.Text =
				If(driver.AccelerationCurve Is Nothing, "", GetRelativePath(driver.AccelerationCurve.Source, _basePath))

			Dim auxInput As IAuxiliariesEngineeringInputData = inputData.AuxiliaryInputData()
			For Each item As AdvancedAuxiliary In cboAdvancedAuxiliaries.Items
				If _
					AuxiliaryModelHelper.Parse(item.AssemblyName) = auxInput.AuxiliaryAssembly AndAlso
					auxInput.AuxiliaryVersion = item.AuxiliaryVersion _
					Then
					cboAdvancedAuxiliaries.SelectedItem = item
					Exit For
				End If
			Next
			'AA-TB
			'Assign any previously saved Axiliary FilePath
			txtAdvancedAuxiliaryFile.Text =
				If _
					(IO.File.Exists(auxInput.AdvancedAuxiliaryFilePath), GetRelativePath(auxInput.AdvancedAuxiliaryFilePath, _basePath),
					"")
			LvAux.Items.Clear()
			For Each entry As IAuxiliaryEngineeringInputData In auxInput.Auxiliaries
				If entry.AuxiliaryType = AuxiliaryDemandType.Constant Then
					TbAuxPAdd.Text = entry.ConstantPowerDemand.ToGUIFormat()
					Continue For
				End If

				Dim lv0 As ListViewItem = New ListViewItem
				lv0.SubItems(0).Text = entry.ID
				lv0.SubItems.Add(entry.AuxiliaryType.ToString())
				lv0.SubItems.Add(If(entry.DemandMap Is Nothing, "", entry.DemandMap.Source))
				LvAux.Items.Add(lv0)
			Next
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		Try
			Dim sb As ICycleData
			For Each sb In vectoJob.Cycles
				Dim lv0 As ListViewItem = New ListViewItem
				lv0.Text = GetRelativePath(sb.CycleData.Source, Path.GetDirectoryName(Path.GetFullPath(file))) 'sb.Name
				LvCycles.Items.Add(lv0)
			Next
		Catch ex As Exception
		End Try
		CbEngOnly.Checked = vectoJob.EngineOnlyMode
		If driver.OverSpeedEcoRoll.Mode = DriverMode.EcoRoll Then
		ElseIf driver.OverSpeedEcoRoll.Mode = DriverMode.Overspeed Then
			RdOverspeed.Checked = True
		Else
			RdOff.Checked = True
		End If
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbOverspeed.Text = driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()
		TbUnderSpeed.Text = driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat()
		TbVmin.Text = driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()
		CbLookAhead.Checked = driver.Lookahead.Enabled
		'TbAlookahead.Text = CStr(VEC0.ALookahead)
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		tbLacMinSpeed.Text = driver.Lookahead.MinSpeed.AsKmph.ToGUIFormat()
		'TbVminLA.Text = CStr(VEC0.VMinLa)
		tbLacPreviewFactor.Text = driver.Lookahead.LookaheadDistanceFactor.ToGUIFormat()
		tbDfCoastingOffset.Text = driver.Lookahead.CoastingDecisionFactorOffset.ToGUIFormat()
		tbDfCoastingScale.Text = driver.Lookahead.CoastingDecisionFactorScaling.ToGUIFormat()
		tbLacDfTargetSpeedFile.Text = If(driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup Is Nothing, "",
										GetRelativePath(driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup.Source, _basePath))
		tbLacDfVelocityDropFile.Text = If(driver.Lookahead.CoastingDecisionFactorVelocityDropLookup Is Nothing, "",
										GetRelativePath(driver.Lookahead.CoastingDecisionFactorVelocityDropLookup.Source, _basePath))

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

		DeclInit()


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


		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 As String = ResolveAAUXFilePath(GetPath(VectoFile), txtAdvancedAuxiliaryFile.Text)
			Dim aaAssemblyName As String = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
			Dim aaAssemblyVersion As String = 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 vectoJob As VectoJob = New VectoJob
		vectoJob.FilePath = file

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

		vectoJob.PathVeh = TbVEH.Text
		vectoJob.PathEng = TbENG.Text

		For Each lv0 As ListViewItem In LvCycles.Items
		vectoJob.StartStop = ChBStartStop.Checked
		vectoJob.StartStopMaxSpeed = TbSSspeed.Text.ToDouble()
		vectoJob.StartStopTime = TbSStime.Text.ToDouble()
		vectoJob.StartStopDelay = TbSSdelay.Text.ToDouble()
		vectoJob.AuxiliaryAssembly = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AssemblyName
		vectoJob.AuxiliaryVersion = DirectCast(cboAdvancedAuxiliaries.SelectedItem, AdvancedAuxiliary).AuxiliaryVersion
		vectoJob.AdvancedAuxiliaryFilePath = txtAdvancedAuxiliaryFile.Text

		For Each lv0 As ListViewItem In LvAux.Items
			Dim auxEntry As VectoJob.AuxEntry = New VectoJob.AuxEntry
				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
			vectoJob.AuxPaths.Add(lv0.SubItems(0).Text, auxEntry)
		vectoJob.AuxPAdd = TbAuxPAdd.Text.ToDouble(0)
		vectoJob.EcoRollOn = RdEcoRoll.Checked
		vectoJob.OverSpeedOn = RdOverspeed.Checked
		vectoJob.OverSpeed = TbOverspeed.Text.ToDouble(0)
		vectoJob.UnderSpeed = TbUnderSpeed.Text.ToDouble(0)
		vectoJob.VMin = TbVmin.Text.ToDouble(0)
		vectoJob.LookAheadOn = CbLookAhead.Checked
		'vec0.ALookahead = CSng(fTextboxToNumString(TbAlookahead.Text))
		'vec0.VMinLa = CSng(fTextboxToNumString(TbVminLA.Text))
		vectoJob.LookAheadMinSpeed = tbLacMinSpeed.Text.ToDouble(0)
		vectoJob.LacPreviewFactor = tbLacPreviewFactor.Text.ToDouble(0)
		vectoJob.LacDfOffset = tbDfCoastingOffset.Text.ToDouble(0)
		vectoJob.LacDfScale = tbDfCoastingScale.Text.ToDouble(0)
		vectoJob.LacDfTargetSpeedFile = tbLacDfTargetSpeedFile.Text
		vectoJob.LacDfVelocityDropFile = tbLacDfVelocityDropFile.Text
		'------------------------------------------------------------

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

		file = GetFilenameWithoutPath(VectoFile, True)

		Text = file
		ToolStripStatusLabelGEN.Text = ""

	Public Sub VectoNew()

		If ChangeCheckCancel() Then Exit Sub

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

		'Start/Stop
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbSSspeed.Text = DeclarationData.Driver.StartStop.MaxSpeed.AsKmph.ToGUIFormat()
		TbSStime.Text = DeclarationData.Driver.StartStop.MinTime.ToGUIFormat()
		TbSSdelay.Text = DeclarationData.Driver.StartStop.Delay.ToGUIFormat()
		ChBStartStop.Checked = False

		LvAux.Items.Clear()

		CbEngOnly.Checked = False

		RdOff.Checked = True
		CbLookAhead.Checked = True
		'TbAlookahead.Text = "-0.5"
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()
		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph.ToGUIFormat()
		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph.ToGUIFormat()
Markus QUARITSCH's avatar
Markus QUARITSCH committed
		tbLacMinSpeed.Text = DeclarationData.Driver.LookAhead.MinimumSpeed.AsKmph.ToGUIFormat()
		tbLacPreviewFactor.Text = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor.ToGUIFormat()
		tbDfCoastingOffset.Text = DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset.ToGUIFormat()
		tbDfCoastingScale.Text = DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling.ToGUIFormat()
		tbLacDfTargetSpeedFile.Text = ""
		tbLacDfVelocityDropFile.Text = ""

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

		DeclInit()

		EngineForm.AutoSendTo = False

		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.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 As ListViewItem = LvAux.SelectedItems(0)
		_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(FileRepl(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
		Dim genDir As String = GetPath(VectoFile)

		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()
		pnLookAheadCoasting.Enabled = CbLookAhead.Checked
	End Sub

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