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

Skip to content
Snippets Groups Projects
VectoJobForm.vb 37.1 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.Models
Imports TUGraz.VectoCommon.Utils
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 pgDriver As TabPage

	Private pgDriverON As Boolean = True

	Private AuxDlog As VehicleAuxiliariesDialog

	Public n_idle As Single
	Public FLDfile 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 cAdvancedAuxiliary) = 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
		Dim x As Int16

		n_idle = -1
		FLDfile = ""

		AuxDlog = New VehicleAuxiliariesDialog

		pgDriver = TabPgDriver

		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

		Changed = False
		'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()	'cDeclaration.SSspeed
		TbSStime.Text = DeclarationData.Driver.StartStop.MinTime.Value()   'cDeclaration.SStime
		TbSSdelay.Text = DeclarationData.Driver.StartStop.Delay.Value()	 ' cDeclaration.SSdelay

		tbLacPreviewFactor.Text = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor
		tbLacDfTargetSpeedFile.Text = ""
		tbLacDfVelocityDropFile.Text = ""

		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph()  'cDeclaration.Overspeed
		TbUnderSpeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed.AsKmph()	' cDeclaration.Underspeed
		TbVmin.Text = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed.AsKmph()	 'cDeclaration.ECvmin

		If _
			LvAux.Items.Count <> 5 OrElse
			(LvAux.Items(0).Text <> sKey.AUX.Fan OrElse LvAux.Items(1).Text <> sKey.AUX.SteerPump OrElse
			LvAux.Items(2).Text <> sKey.AUX.HVAC OrElse LvAux.Items(3).Text <> sKey.AUX.ElecSys OrElse
			LvAux.Items(4).Text <> sKey.AUX.PneumSys) Then
			LvAux.Items.Clear()


			LvAux.Items.Add(GetTechListForAux(sKey.AUX.Fan, "Fan", DeclarationData.Fan))

			LvAux.Items.Add(GetTechListForAux(sKey.AUX.SteerPump, "Steering pump", DeclarationData.SteeringPump))

			LvAux.Items.Add(GetTechListForAux(sKey.AUX.HVAC, "HVAC", DeclarationData.HeatingVentilationAirConditioning))

			LvAux.Items.Add(GetTechListForAux(sKey.AUX.ElecSys, "Electric System", DeclarationData.ElectricSystem))

			LvAux.Items.Add(GetTechListForAux(sKey.AUX.PneumSys, "Pneymatic System", DeclarationData.PneumaticSystem))

		End If
	End Sub

	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)
			End If
		Else
			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, fPATH(VECTOfile))) Then
			TbVEH.Text = fFileWoDir(VehicleFileBrowser.Files(0), fPATH(VECTOfile))
		End If
	End Sub

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

	Private Sub ButtonGBX_Click(sender As Object, e As EventArgs) Handles ButtonGBX.Click
		If GearboxFileBrowser.OpenDialog(fFileRepl(TbGBX.Text, fPATH(VECTOfile))) Then
			TbGBX.Text = fFileWoDir(GearboxFileBrowser.Files(0), fPATH(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, fPATH(VECTOfile))) Then
			TbDesMaxFile.Text = fFileWoDir(DriverAccelerationFileBrowser.Files(0), fPATH(VECTOfile))
		End If
	End Sub

	Private Sub BtAccOpen_Click(sender As Object, e As EventArgs) Handles BtAccOpen.Click
		OpenFiles(fFileRepl(TbDesMaxFile.Text, fPATH(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, fPATH(VECTOfile))

		'Thus Veh-file is returned
		VehicleForm.JobDir = fPATH(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 VehicleForm.OpenVehicle(f)
	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, fPATH(VECTOfile))

		'Thus Veh-file is returned
		EngineForm.JobDir = fPATH(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, fPATH(VECTOfile))

		'Thus Veh-file is returned
		GearboxForm.JobDir = fPATH(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 " & fFILE(file, True) & "!")
				Exit Sub
			End If
		Catch ex As Exception
			MsgBox("Failed to load " & fFILE(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 cAdvancedAuxiliary 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(AuxEntryKV.Value.TechStr)
			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

		Dim x As Short = Len(file)
		While Mid(file, x, 1) <> "\" And x > 0
			x = x - 1
		End While
		Text = Mid(file, x + 1, Len(file) - x)
		Changed = False
		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(fPATH(VECTOfile), txtAdvancedAuxiliaryFile.Text)

			Dim aaAssemblyName = DirectCast(cboAdvancedAuxiliaries.SelectedItem, cAdvancedAuxiliary).AssemblyName
			Dim aaAssemblyVersion = DirectCast(cboAdvancedAuxiliaries.SelectedItem, cAdvancedAuxiliary).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
			sb.Init(fPATH(file), lv0.Text)
			vec0.CycleFiles.Add(sb)
		Next

		vec0.PathGbx = TbGBX.Text


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

		'a_DesMax
		vec0.DesMaxFile = TbDesMaxFile.Text

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

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

			If Cfg.DeclMode Then
				auxEntry.TechStr = lv0.SubItems(2).Text
			Else
				auxEntry.Path.Init(fPATH(file), lv0.SubItems(2).Text)
			End If

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

550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000

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

		vec0.LacPreviewFactor = CSng(fTextboxToNumString(tbLacPreviewFactor.Text))
		vec0.LacDfOffset = CSng(fTextboxToNumString(tbDfCoastingOffset.Text))
		vec0.LacDfScale = CSng(fTextboxToNumString(tbDfCoastingScale.Text))
		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 = fFILE(VECTOfile, True)

		Text = file
		ToolStripStatusLabelGEN.Text = ""

		MainForm.AddToJobListView(VECTOfile)

		Changed = False

		Return True
	End Function

	'New file
	Public Sub VECTOnew()

		If ChangeCheckCancel() Then Exit Sub

		n_idle = -1
		FLDfile = ""

		'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 = ""
		Changed = False
		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()
		If Not Changed Then
			ToolStripStatusLabelGEN.Text = "Unsaved changes in current file"
			Changed = True
		End If
	End Sub

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

		If Changed Then

			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
				Case MsgBoxResult.Yes
					Return Not Save()
				Case MsgBoxResult.Cancel
					Return True
				Case Else 'MsgBoxResult.No
					Changed = False
					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

		AuxDlog.VehPath = fPATH(VECTOfile)
		AuxDlog.TbPath.Text = ""
		AuxDlog.CbType.SelectedIndex = -1
		AuxDlog.CbType.Text = ""
		AuxDlog.TbID.Text = "" '!!! Set Type before ID, because changing the type will overwrite the id !!!

lbDlog:
		If AuxDlog.ShowDialog = DialogResult.OK Then

			ID = UCase(Trim(AuxDlog.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)
					AuxDlog.TbID.SelectAll()
					AuxDlog.TbID.Focus()
					GoTo lbDlog
				End If
			Next

			lv0 = New ListViewItem
			lv0.SubItems(0).Text = UCase(Trim(AuxDlog.TbID.Text))
			lv0.SubItems.Add(Trim(AuxDlog.CbType.Text))
			lv0.SubItems.Add(Trim(AuxDlog.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)

		AuxDlog.VehPath = fPATH(VECTOfile)
		AuxDlog.CbType.SelectedIndex = -1
		AuxDlog.CbType.Text = selItem.SubItems(1).Text
		AuxDlog.TbID.Text = selItem.SubItems(0).Text	'After Type-set!

		If Cfg.DeclMode Then
			AuxDlog.CbTech.Text = selItem.SubItems(2).Text
			AuxDlog.TbPath.Text = ""
		Else
			AuxDlog.CbTech.SelectedIndex = -1
			AuxDlog.TbPath.Text = selItem.SubItems(2).Text
		End If

		If AuxDlog.ShowDialog = DialogResult.OK Then
			selItem.SubItems(0).Text = UCase(Trim(AuxDlog.TbID.Text))
			selItem.SubItems(1).Text = Trim(AuxDlog.CbType.Text)

			If Cfg.DeclMode Then
				selItem.SubItems(2).Text = Trim(AuxDlog.CbTech.Text)
			Else
				selItem.SubItems(2).Text = Trim(AuxDlog.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, fPATH(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 = fPATH(VECTOfile)

		If DrivingCycleFileBrowser.OpenDialog("", True) Then
			For Each s In DrivingCycleFileBrowser.Files
				LvCycles.Items.Add(fFileWoDir(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 VEH0 As New Vehicle
		Dim i As Integer
		Dim pmax As Single

		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
		'Dim m0 As 

		Dim s As Series
		Dim a As ChartArea
		Dim img As Image

		Dim EngOK = False

		TbHVCclass.Text = ""
		TbVehCat.Text = ""
		TbMass.Text = ""
		TbAxleConf.Text = ""