From c52bac70514b260f1f42e0e87f511ac0d7826d16 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Tue, 28 Apr 2020 19:39:11 +0200
Subject: [PATCH] changed and added additional Menu and ContextMenu options

---
 VECTO3GUI/Helper/FileDialogHelper.cs          |  16 +-
 VECTO3GUI/MainWindow.xaml                     |  27 +-
 VECTO3GUI/Model/JobListModel.cs               |   2 +-
 .../ViewModel/Impl/AbstractBusJobViewModel.cs |   2 +-
 VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs  | 272 +++++++++---------
 .../ViewModel/Interfaces/IJoblistViewModel.cs |   2 +-
 VECTO3GUI/Views/JoblistView.xaml              |  97 +++++--
 7 files changed, 246 insertions(+), 172 deletions(-)

diff --git a/VECTO3GUI/Helper/FileDialogHelper.cs b/VECTO3GUI/Helper/FileDialogHelper.cs
index bf0fac214d..b115606392 100644
--- a/VECTO3GUI/Helper/FileDialogHelper.cs
+++ b/VECTO3GUI/Helper/FileDialogHelper.cs
@@ -13,17 +13,25 @@ namespace VECTO3GUI.Helper
 {
 	public static class FileDialogHelper
 	{
-		private const string XMLFilter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
-		private const string JobFilter = "Job Files (*.vectojob|*.vectojob|All Files (*.*)|*.*";
+		public const string XMLFilter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*";
+		public const string JobFilter = "Job Files (*.vectojob|*.vectojob|All Files (*.*)|*.*";
 
 
-		public static string[] ShowSelectFilesDialog(bool multiselect, string initialDirectory = null)
+
+
+
+		public static string[] ShowSelectFilesDialog(bool multiselect)
+		{
+			return ShowSelectFilesDialog(multiselect, XMLFilter);
+		}
+		
+		public static string[] ShowSelectFilesDialog(bool multiselect, string filter = XMLFilter, string initialDirectory = null)
 		{
 			using (var openFileDialog = new OpenFileDialog())
 			{
 				openFileDialog.InitialDirectory = initialDirectory;
 				openFileDialog.Multiselect = multiselect;
-				openFileDialog.Filter = XMLFilter;
+				openFileDialog.Filter = filter;
 				var result = openFileDialog.ShowDialog();
 
 				if (result == DialogResult.OK)
diff --git a/VECTO3GUI/MainWindow.xaml b/VECTO3GUI/MainWindow.xaml
index 3ce384cae5..fccc5f76bc 100644
--- a/VECTO3GUI/MainWindow.xaml
+++ b/VECTO3GUI/MainWindow.xaml
@@ -8,6 +8,7 @@
         xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
         xmlns:impl="clr-namespace:VECTO3GUI.ViewModel.Impl"
         xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
+        xmlns:views="clr-namespace:VECTO3GUI.Views"
         mc:Ignorable="d"
         Title="{Binding Version}" Height="515.36" Width="972.48" WindowStartupLocation="CenterScreen"
         d:DataContext="{d:DesignInstance Type=impl:MainWindowViewModel, IsDesignTimeCreatable=False}">
@@ -24,13 +25,14 @@
 
                 <Menu IsMainMenu="True" Style="{DynamicResource MetroMenu}">
                     <MenuItem Header="File" VerticalAlignment="Center">
-                        <MenuItem Header="New" Style="{DynamicResource MetroMenuItem}" Margin="0"
-                                  Command="{Binding CurrentViewModel.CreateNewJob}"/>
-                        <MenuItem Header="Edit" Style="{DynamicResource MetroMenuItem}" Margin="0" 
-                                  Command="{Binding CurrentViewModel.EditJob}"/>
-                        <Separator HorizontalAlignment="Stretch" Background="Gray"/>
-                        <MenuItem Header="Open" Command="{Binding CurrentViewModel.AddJob}"/>
-                        <MenuItem Header="Open Folder"/>
+
+                        <MenuItem Header="Add Job" Command="{Binding CurrentViewModel.AddJob}"/>
+                        <MenuItem Header="Edit Job" 
+                                  Command="{Binding CurrentViewModel.EditJob}"
+                                  CommandParameter="{Binding CurrentViewModel.SelectedJobEntry}"/>
+                        <MenuItem Header="Remove Job" 
+                                  Command="{Binding CurrentViewModel.RemoveJob}"
+                                  CommandParameter="{Binding CurrentViewModel.SelectedJobEntry}"/>
                         <Separator HorizontalAlignment="Stretch" Background="Gray"/>
                         <MenuItem Header="Exit" Command="{Binding CurrentViewModel.ExitMainCommand}"
                                   CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
@@ -42,21 +44,20 @@
                         <!--<MenuItem.Icon>
                             <iconPacks:PackIconModern Width="15" Height="15" Kind="Tools" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green" />
                         </MenuItem.Icon>-->
-                        <MenuItem Header="Single Bus Job"
+                        <MenuItem Header="Create Single Bus Job"
                                   Command="{Binding CurrentViewModel.AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.SingleBusJob}}"/>
-                        <MenuItem Header="Completed Bus Job"
+                        <MenuItem Header="Create Completed Bus Job"
                                   Command="{Binding CurrentViewModel.AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.CompletedBusJob}}"/>
-                        <MenuItem Header="New Completed XML"/>
+                        <MenuItem Header="Create Completed XML"
+                                  Command="{Binding CurrentViewModel.CreateNewJob}"/>
                         <Separator HorizontalAlignment="Stretch" Background="Gray"/>
-                        <MenuItem Header="Default Settings"
+                        <MenuItem Header="Settings"
                                   Command="{Binding CurrentViewModel.OpenSettings}"/>
                     </MenuItem>
 
 
                     <MenuItem Header="Help" VerticalAlignment="Center">
-                        <MenuItem Header="User Manual"/>
                         <MenuItem Header="About Vecto"/>
-                        <MenuItem Header="Relase Notes"/>
                     </MenuItem>
                 </Menu>
 
diff --git a/VECTO3GUI/Model/JobListModel.cs b/VECTO3GUI/Model/JobListModel.cs
index 7043d7845c..99a2fab301 100644
--- a/VECTO3GUI/Model/JobListModel.cs
+++ b/VECTO3GUI/Model/JobListModel.cs
@@ -53,7 +53,7 @@ namespace VECTO3GUI.Model
 		
 		private void SetJobList(IList<JobEntry> jobEntries)
 		{
-			if (jobEntries.IsNullOrEmpty())
+			if (jobEntries == null)
 				return;
 
 			JobList = new List<JobListEntry>();
diff --git a/VECTO3GUI/ViewModel/Impl/AbstractBusJobViewModel.cs b/VECTO3GUI/ViewModel/Impl/AbstractBusJobViewModel.cs
index 4f02db72d0..37c5556ff6 100644
--- a/VECTO3GUI/ViewModel/Impl/AbstractBusJobViewModel.cs
+++ b/VECTO3GUI/ViewModel/Impl/AbstractBusJobViewModel.cs
@@ -236,7 +236,7 @@ namespace VECTO3GUI.ViewModel.Impl
 
 		private string OpenFileSelector(JobFileType jobFileType, string textPropertyName)
 		{
-			var dialogResult = FileDialogHelper.ShowSelectFilesDialog(false, Settings.XmlFilePathFolder);
+			var dialogResult = FileDialogHelper.ShowSelectFilesDialog(false, FileDialogHelper.XMLFilter, Settings.XmlFilePathFolder);
 			if (dialogResult == null)
 				return null;
 
diff --git a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs
index 603d7aeea1..f0646e800f 100644
--- a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs
+++ b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs
@@ -3,11 +3,13 @@ using System.Collections;
 using System.Collections.ObjectModel;
 using System.Collections.Specialized;
 using System.ComponentModel;
+using System.Diagnostics;
 using System.IO;
 using System.Linq;
 using System.Windows;
 using System.Windows.Input;
 using System.Xml;
+using Castle.Core.Internal;
 using Ninject;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCore.InputData.FileIO.XML;
@@ -27,15 +29,11 @@ namespace VECTO3GUI.ViewModel.Impl
 		protected ObservableCollectionEx<JobEntry> _jobs;
 		protected readonly ObservableCollection<MessageEntry> _messages = new ObservableCollection<MessageEntry>();
 		private readonly SettingsModel _settings;
+		private string _firstContextMenu;
 
 		private JobEntry _selectedJobEntry;
 		private JobListModel _jobListModel;
 
-		#endregion
-
-
-		#region Commands
-
 		private ICommand _newJobCommand;
 		private ICommand _editJobCommand;
 		private ICommand _removeJobCommand;
@@ -43,10 +41,13 @@ namespace VECTO3GUI.ViewModel.Impl
 		private ICommand _addJobCommand;
 		private ICommand _openJobCommand;
 		private ICommand _openSettingsCommand;
-		private ICommand _exitCommand;
 		private ICommand _exitMainCommand;
 		private ICommand _addBusJobCommand;
 		private ICommand _editCompletedFileCommand;
+		private ICommand _moveJobUpCommand;
+		private ICommand _moveJobDownCommand;
+		private ICommand _startSimulationCommand;
+		private ICommand _openInFolderCommand;
 
 		#endregion
 
@@ -55,7 +56,16 @@ namespace VECTO3GUI.ViewModel.Impl
 		public JobEntry SelectedJobEntry
 		{
 			get { return _selectedJobEntry; }
-			set { SetProperty(ref _selectedJobEntry, value); }
+			set
+			{
+				SetProperty(ref _selectedJobEntry, value);
+				if (_selectedJobEntry != null) {
+					var firstJobTyp = _selectedJobEntry.JobType == JobType.SingleBusJob
+						? JobFileType.PrimaryBusFile
+						: JobFileType.PIFBusFile;
+					FirstContextMenu = $"View {firstJobTyp.GetLable()}";
+				} 
+			}	
 		}
 
 		public ObservableCollectionEx<JobEntry> Jobs
@@ -69,9 +79,14 @@ namespace VECTO3GUI.ViewModel.Impl
 			get { return _messages; }
 		}
 
+		public string FirstContextMenu
+		{
+			get { return _firstContextMenu; }
+			set { SetProperty(ref _firstContextMenu, value); }
+		}
 		#endregion
 
-		
+
 		public JoblistViewModel()
 		{
 			_settings = new SettingsModel();
@@ -88,38 +103,39 @@ namespace VECTO3GUI.ViewModel.Impl
 
 		private void JobItemChanged(object sender, PropertyChangedEventArgs e)
 		{
-			if(e.PropertyName == "Selected" && sender is JobEntry )
-				UpdateJobEntry((JobEntry) sender);
+			if (e.PropertyName == "Selected" && sender is JobEntry)
+				UpdateJobEntry((JobEntry)sender);
 		}
 
 		private void JobsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
 		{
-			switch (e.Action) {
+			switch (e.Action)
+			{
 				case NotifyCollectionChangedAction.Add:
 				case NotifyCollectionChangedAction.Remove:
+				case NotifyCollectionChangedAction.Move:
+				case NotifyCollectionChangedAction.Reset:
 					_jobListModel.SaveJobList(_jobs);
 					break;
 			}
 		}
-		
-		#region Implementation IJoblistViewModel
+
+		#region Commands
 
 		public ICommand RemoveJob
 		{
 			get
 			{
-				return _removeJobCommand ??
-						(_removeJobCommand = new RelayCommand(DoRemoveJob, CanRemoveJob));
+				return _removeJobCommand ?? (_removeJobCommand = new RelayCommand<JobEntry>(DoRemoveJob, CanRemoveJob));
 			}
 		}
-		private void DoRemoveJob()
+		private void DoRemoveJob(JobEntry jobEntry)
 		{
-			_jobs.Remove(SelectedJobEntry);
-			SelectedJobEntry = null;
+			_jobs.Remove(jobEntry);
 		}
-		private bool CanRemoveJob()
+		private bool CanRemoveJob(JobEntry jobEntry)
 		{
-			return SelectedJobEntry != null;
+			return jobEntry != null;
 		}
 
 
@@ -127,8 +143,7 @@ namespace VECTO3GUI.ViewModel.Impl
 		{
 			get
 			{
-				return _removeAllJobCommand ??
-						(_removeAllJobCommand = new RelayCommand(DoRemoveAllJobs));
+				return _removeAllJobCommand ?? (_removeAllJobCommand = new RelayCommand(DoRemoveAllJobs));
 			}
 		}
 		private void DoRemoveAllJobs()
@@ -136,16 +151,29 @@ namespace VECTO3GUI.ViewModel.Impl
 			_jobs.Clear();
 			SelectedJobEntry = null;
 		}
-		
+
 
 		public ICommand EditJob
 		{
 			get
 			{
-				return _editJobCommand ??
-						(_editJobCommand = new RelayCommand<JobEntry>(DoEditJob, CanEditJob));
+				return _editJobCommand ?? (_editJobCommand = new RelayCommand<JobEntry>(DoEditJob, CanEditJob));
 			}
 		}
+		private bool CanEditJob(JobEntry jobEntry)
+		{
+			return jobEntry != null;
+		}
+		private void DoEditJob(JobEntry jobEntry)
+		{
+			var viewModel = GetBusJobViewModel(jobEntry.JobType, jobEntry);
+			var window = CreateBusJobOutputWindow(viewModel, jobEntry.JobType);
+			if (window.ShowDialog() != true)
+				ResetBusJobEntries(jobEntry);
+			else
+				UpdateJobEntry(((IBusJobViewModel)viewModel).SavedJobEntry);
+		}
+
 
 		public ICommand EditCompletedFile
 		{
@@ -156,12 +184,10 @@ namespace VECTO3GUI.ViewModel.Impl
 							new RelayCommand<JobEntry>(DoEditCompletedFile, CanEditCompletdFile));
 			}
 		}
-
 		private bool CanEditCompletdFile(JobEntry jobEntry)
 		{
 			return jobEntry != null;
 		}
-
 		private void DoEditCompletedFile(JobEntry jobEntry)
 		{
 			var viewModel = ReadCompletedXmlFile(jobEntry);
@@ -172,29 +198,12 @@ namespace VECTO3GUI.ViewModel.Impl
 			window.Show();
 		}
 
-		private bool CanEditJob(JobEntry jobEntry)
-		{
-			return jobEntry != null;
-		}
-
-		private void DoEditJob(JobEntry jobEntry)
-		{
-			var viewModel = GetBusJobViewModel(jobEntry.JobType, jobEntry);
-			var window = CreateBusJobOutputWindow(viewModel, jobEntry.JobType);
-			if(window.ShowDialog() != true)
-			  ResetBusJobEntries(jobEntry);
-			else
-				UpdateJobEntry(((IBusJobViewModel)viewModel).SavedJobEntry);
-		}
-
-
 
 		public ICommand CreateNewJob
 		{
 			get
 			{
-				return _newJobCommand ??
-						(_newJobCommand = new RelayCommand(DoNewJobCommand));
+				return _newJobCommand ?? (_newJobCommand = new RelayCommand(DoNewJobCommand));
 			}
 		}
 		private void DoNewJobCommand()
@@ -209,16 +218,25 @@ namespace VECTO3GUI.ViewModel.Impl
 		{
 			get
 			{
-				return _openJobCommand ??
-						(_openJobCommand = new RelayCommand(DoOpenJobCommand));
+				return _openJobCommand ?? (_openJobCommand = new RelayCommand<JobFileType>(DoOpenJobCommand));
 			}
 		}
-		private void DoOpenJobCommand()
+		private void DoOpenJobCommand(JobFileType jobFileType)
 		{
 			if (SelectedJobEntry == null)
 				return;
 
-			var xmlViewModel = new XMLViewModel(SelectedJobEntry.FirstFilePath);
+			XMLViewModel xmlViewModel = null;
+
+			switch (jobFileType) {
+				case JobFileType.PIFBusFile:
+				case JobFileType.PrimaryBusFile:
+					xmlViewModel = new XMLViewModel(SelectedJobEntry.FirstFilePath);
+					break;
+				case JobFileType.CompletedBusFile:
+					xmlViewModel = new XMLViewModel(SelectedJobEntry.SecondFilePath);
+					break;
+			}
 			var window = OutputWindowHelper.CreateOutputWindow(Kernel, xmlViewModel, xmlViewModel.FileName);
 			window.Show();
 		}
@@ -233,16 +251,12 @@ namespace VECTO3GUI.ViewModel.Impl
 		}
 		private void DoAddJob()
 		{
-			var filePath = FileDialogHelper.ShowSelectFilesDialog(false, _settings.XmlFilePathFolder);
-			if (filePath != null)
-			{
-				_jobs.Add(new JobEntry()
-				{
-					FirstFilePath = filePath.First(),
-					Selected = false,
-					Sorting = _jobs.Count
-				});
-			}
+			var filePath = FileDialogHelper.ShowSelectFilesDialog(false, FileDialogHelper.JobFilter);
+			if (filePath.IsNullOrEmpty() || !IsNewJobFile(filePath.First()))
+				return;
+
+			var jobEntry = SerializeHelper.DeserializeToObject<JobEntry>(filePath.First());
+			_jobs.Add(jobEntry);
 		}
 
 
@@ -250,8 +264,7 @@ namespace VECTO3GUI.ViewModel.Impl
 		{
 			get
 			{
-				return _openSettingsCommand ??
-					  (_openSettingsCommand = new RelayCommand(DoOpenSettingsCommand));
+				return _openSettingsCommand ?? (_openSettingsCommand = new RelayCommand(DoOpenSettingsCommand));
 			}
 		}
 		private void DoOpenSettingsCommand()
@@ -262,12 +275,12 @@ namespace VECTO3GUI.ViewModel.Impl
 			window.ShowDialog();
 		}
 
+
 		public ICommand ExitMainCommand
 		{
 			get
 			{
-				return _exitMainCommand ??
-						(_exitMainCommand = new RelayCommand<Window>(DoCloseMainCommand));
+				return _exitMainCommand ?? (_exitMainCommand = new RelayCommand<Window>(DoCloseMainCommand));
 			}
 		}
 		private void DoCloseMainCommand(Window window)
@@ -275,31 +288,77 @@ namespace VECTO3GUI.ViewModel.Impl
 			window?.Close();
 		}
 
+
 		public ICommand AddBusJob
 		{
 			get
 			{
-				return _addBusJobCommand ??
-						(_addBusJobCommand = new RelayCommand<JobType>(DoAddBusJobCommand));
+				return _addBusJobCommand ?? (_addBusJobCommand = new RelayCommand<JobType>(DoAddBusJobCommand));
 			}
 		}
 		private void DoAddBusJobCommand(JobType jobType)
 		{
 			var viewModel = GetBusJobViewModel(jobType);
 			var window = CreateBusJobOutputWindow(viewModel, jobType);
-			if(window.ShowDialog() == true)
+			if (window.ShowDialog() == true)
 				AddBusJobEntry(((IBusJobViewModel)viewModel)?.SavedJobEntry);
 		}
 
 
-		public ICommand MoveJobUp { get { return new RelayCommand(() => { }, () => false); } }
-		public ICommand MoveJobDown { get { return new RelayCommand(() => { }, () => false); } }
-		public ICommand StartSimulation { get { return new RelayCommand(() => { }, () => false); } }
-		public ICommand JobEntrySetActive { get { return new RelayCommand(() => { }, () => false); } }
+		public ICommand MoveJobUp
+		{
+			get { return _moveJobUpCommand ?? (_moveJobUpCommand = new RelayCommand<JobEntry>(DoMoveJobUpCommand)); }
+		}
+		private void DoMoveJobUpCommand(JobEntry jobEntry)
+		{
+			if (jobEntry == null)
+				return;
+			var index = _jobs.IndexOf(jobEntry);
+			if (index - 1 >= 0)
+				_jobs.Move(index, index - 1);
+		}
+
+
+		public ICommand MoveJobDown
+		{
+			get { return _moveJobDownCommand ?? (_moveJobDownCommand = new RelayCommand<JobEntry>(DoMoveJobDownCommand)); }
+		}
+		private void DoMoveJobDownCommand(JobEntry jobEntry)
+		{
+			if (jobEntry == null)
+				return;
+			var index = _jobs.IndexOf(jobEntry);
+			if (index + 1 < _jobs.Count)
+				_jobs.Move(index, index + 1);
+		}
+
+		public ICommand StartSimulation
+		{
+			get { return _startSimulationCommand ?? (_startSimulationCommand = new RelayCommand(DoStartSimulationCommand)); }
+		}
+
+		private void DoStartSimulationCommand()
+		{
+
+		}
+
+		public ICommand OpenInFolder
+		{
+			get { return _openInFolderCommand ?? (_openInFolderCommand = new RelayCommand<JobEntry>(DoOpenInFolderCommand)); }
+		}
 
+		private void DoOpenInFolderCommand(JobEntry jobEntry)
+		{
+			if (jobEntry != null) {
+				var dirPath = Path.GetDirectoryName(jobEntry.JobEntryFilePath);
+				if (Directory.Exists(dirPath)) {
+					Process.Start("explorer.exe", dirPath);
+				}
+			}
+		}
 
 		#endregion
-		
+
 		private object GetBusJobViewModel(JobType jobType, JobEntry jobEntry = null)
 		{
 			var currentJobType = jobEntry?.JobType ?? jobType;
@@ -338,7 +397,7 @@ namespace VECTO3GUI.ViewModel.Impl
 
 		private void ResetBusJobEntries(JobEntry jobEntry)
 		{
-		   SerializeHelper.DeserializeToObject<JobEntry>(jobEntry.JobEntryFilePath);
+			SerializeHelper.DeserializeToObject<JobEntry>(jobEntry.JobEntryFilePath);
 		}
 
 		private void UpdateJobEntry(JobEntry jobEntry)
@@ -349,7 +408,8 @@ namespace VECTO3GUI.ViewModel.Impl
 		private IJobEditViewModel ReadCompletedXmlFile(JobEntry jobEntry)
 		{
 			var xmlInputReader = Kernel.Get<IXMLInputDataReader>();
-			using (var reader = XmlReader.Create(jobEntry.SecondFilePath)) {
+			using (var reader = XmlReader.Create(jobEntry.SecondFilePath))
+			{
 				var readerResult = xmlInputReader.Create(reader) as IDeclarationInputDataProvider;
 				return CreateCompleteBusVehicleViewModel(readerResult);
 			}
@@ -364,60 +424,16 @@ namespace VECTO3GUI.ViewModel.Impl
 			return dataProvider == null ? null : new CompleteVehicleBusJobViewModel(Kernel, dataProvider);
 		}
 
-		//private IJobEditViewModel ReadJob(string jobFile)
-		//{
-		//	if (jobFile == null)
-		//		return null;
-
-		//	var ext = Path.GetExtension(jobFile);
-		//	if (ext == Constants.FileExtensions.VectoXMLDeclarationFile)
-		//	{
-
-		//		var localName = GetLocalName(jobFile);
-		//		var xmlInputReader = Kernel.Get<IXMLInputDataReader>();
-
-		//		using (var reader = XmlReader.Create(jobFile))
-		//		{
-		//			if (localName == XMLNames.VectoPrimaryVehicleReport)
-		//				return CreatePrimaryBusVehicleViewModel(xmlInputReader.Create(reader));
-
-		//			if (localName == XMLNames.VectoInputDeclaration)
-		//			{
-		//				var readerResult = xmlInputReader.Create(reader) as IDeclarationInputDataProvider;
-		//				if(readerResult?.JobInputData.Vehicle is XMLDeclarationCompletedBusDataProviderV26)
-		//					return CreateCompleteBusVehicleViewModel(readerResult);
-		//			}
-		//		}
-		//	}
-
-		//	return null;
-		//}
-
-		//private string GetLocalName(string jobFilePath)
-		//{
-		//	var doc = XDocument.Load(jobFilePath);
-		//	return doc.Root?.Name.LocalName;
-		//}
-
-
-		//private IJobEditViewModel CreateCompleteBusVehicleViewModel(IDeclarationInputDataProvider dataProvider)
-		//{
-		//	_messages.Add(new MessageEntry {
-		//		Message = "Edit File"
-		//	});
-		//	return dataProvider == null ? null : new CompleteVehicleBusJobViewModel(Kernel, dataProvider);
-		//}
-
-
-		//private IJobEditViewModel CreatePrimaryBusVehicleViewModel(IInputDataProvider inputData)
-		//{
-		//	var dataProvider = inputData as IPrimaryVehicleInformationInputDataProvider;
-		//	return dataProvider == null ? null : new PrimaryVehicleBusJobViewModel(Kernel, dataProvider);
-		//}
-	}
-
-
-
-
+		private bool IsNewJobFile(string filePath)
+		{
+			if (!_jobs.IsNullOrEmpty()) {
+				for (int i = 0; i < _jobs.Count; i++) {
+					if (_jobs[i].JobEntryFilePath == filePath)
+						return false;
+				}
+			}
 
+			return true;
+		}
+	}
 }
diff --git a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs
index 076af7ee9f..09bcf5e9d9 100644
--- a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs
+++ b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs
@@ -18,10 +18,10 @@ namespace VECTO3GUI.ViewModel.Interfaces
 		ICommand StartSimulation { get; }
 		ICommand EditJob { get; }
 		ICommand EditCompletedFile { get; }
-		ICommand JobEntrySetActive { get; }
 		ICommand CreateNewJob { get; }
 		ICommand OpenJob { get; }
 		ICommand OpenSettings { get; }
 		ICommand ExitMainCommand { get; }
+		ICommand OpenInFolder { get; }
 	}
 }
diff --git a/VECTO3GUI/Views/JoblistView.xaml b/VECTO3GUI/Views/JoblistView.xaml
index 6822016183..3bca126ed3 100644
--- a/VECTO3GUI/Views/JoblistView.xaml
+++ b/VECTO3GUI/Views/JoblistView.xaml
@@ -3,12 +3,9 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             xmlns:viewModel="clr-namespace:VECTO3GUI.ViewModel"
-             xmlns:helper="clr-namespace:VECTO3GUI.Helper"
              xmlns:impl="clr-namespace:VECTO3GUI.ViewModel.Impl"
              xmlns:interfaces="clr-namespace:VECTO3GUI.ViewModel.Interfaces"
              xmlns:views="clr-namespace:VECTO3GUI.Views"
-             xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
              xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
              mc:Ignorable="d" 
              d:DesignHeight="300" d:DesignWidth="600"
@@ -33,12 +30,33 @@
 
 
         <Grid Grid.Row="1" Grid.Column="0">
-            <Button VerticalAlignment="Top" Margin="10,40,0,0">
-                <StackPanel Orientation="Horizontal">
-                    <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlPlay" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/>
-                    <TextBlock Text="Start " />
+
+            <StackPanel Orientation="Vertical">
+                <Button VerticalAlignment="Top" Margin="10,10,0,0">
+                    <StackPanel Orientation="Horizontal">
+                        <iconPacks:PackIconModern Width="20" Height="15" Kind="ControlPlay" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/>
+                        <TextBlock Text="Start " />
+                    </StackPanel>
+                </Button>
+
+                <StackPanel Orientation="Vertical" HorizontalAlignment="Right" Margin="0,10,0,0">
+                    <Button Width="25" 
+                            Command="{Binding MoveJobUp}"
+                            CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}">
+                        <StackPanel Orientation="Horizontal">
+                            <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowUp" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/>
+                        </StackPanel>
+                    </Button>
+
+                    <Button Width="25" Margin="0,5,0,0"
+                            Command="{Binding MoveJobDown}"
+                            CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}">
+                        <StackPanel Orientation="Horizontal">
+                            <iconPacks:PackIconModern Width="15" Height="15" Kind="ArrowDown" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Green"/>
+                        </StackPanel>
+                    </Button>
                 </StackPanel>
-            </Button>
+            </StackPanel>
         </Grid>
 
         <Grid Grid.Row="1" Grid.Column="1" Margin="10">
@@ -50,17 +68,47 @@
 
                 <DataGrid.Resources>
                     <ContextMenu x:Key="RowMenu">
-                        <MenuItem Header="View File" Command="{Binding DataContext.OpenJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
-                        <MenuItem Header="Edit File" Command="{Binding DataContext.EditJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
+                        <MenuItem Header="{Binding DataContext.FirstContextMenu, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" 
+                                  Command="{Binding DataContext.OpenJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding Source={x:Static impl:JobFileType.PrimaryBusFile}}"/>
+                        <MenuItem Header="View Completed Bus File" 
+                                  Command="{Binding DataContext.OpenJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding Source={x:Static impl:JobFileType.CompletedBusFile}}"/>
+
                         <Separator HorizontalAlignment="Stretch" Background="Gray"/>
-                        <MenuItem Header="Remove File" Command="{Binding DataContext.RemoveJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
+
+                        <MenuItem Header="Edit Job" 
+                                  Command="{Binding DataContext.EditJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
+                        <MenuItem Header="Edit Completed File" 
+                                  Command="{Binding DataContext.EditCompletedFile, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
+
+                        <Separator HorizontalAlignment="Stretch" Background="Gray"/>
+
+                        <MenuItem Header="Show In Folder"
+                                  Command="{Binding DataContext.OpenInFolder, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
+
+                        <Separator HorizontalAlignment="Stretch" Background="Gray"/>
+
+                        <MenuItem Header="Remove Job" 
+                                  Command="{Binding DataContext.RemoveJob, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"
+                                  CommandParameter="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}"/>
                     </ContextMenu>
                 </DataGrid.Resources>
 
                 <DataGrid.ContextMenu>
                     <ContextMenu>
-                        <MenuItem Header="Add File" Command="{Binding AddJob}"/>
-                        <MenuItem Header="New File" Command="{Binding CreateNewJob}"/>
+                        <MenuItem Header="Add Job" Command="{Binding AddJob}"
+                                  CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/>
+                        <Separator HorizontalAlignment="Stretch" Background="Gray"/>
+                        <MenuItem Header="Create Single Bus Job"
+                                  Command="{Binding AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.SingleBusJob}}"/>
+                        <MenuItem Header="Create Completed Bus Job"
+                                  Command="{Binding AddBusJob}" CommandParameter="{Binding Source={x:Static impl:JobType.CompletedBusJob}}"/>
+                        <MenuItem Header="Create Completed XML"
+                                  Command="{Binding CreateNewJob}"/>
                         <Separator HorizontalAlignment="Stretch" Background="Gray"/>
                         <MenuItem Header="Remove All" Command="{Binding RemoveAllJobs}"/>
                     </ContextMenu>
@@ -83,24 +131,25 @@
         </Grid>
 
         <Grid Grid.Row="1" Grid.Column="2" Margin="0,0,10,0">
-            <StackPanel Orientation="Vertical" Margin="0,30,0,0">
-                <Button Margin="0,5,0,0" Content="Edit Job" Width="110"
+            <StackPanel Orientation="Vertical" Margin="0,30,0,0" Width="105">
+                <Button Margin="0,5,0,0" Content="Add Job" 
+                        Command="{Binding AddJob}"/>
+
+                <Button Margin="0,5,0,0" Content="Edit Job"
                         Command="{Binding EditJob}"
                         CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/>
 
-                <Button Margin="0,5,0,0" Content="Edit Completed File" Width="110" 
-                        Command="{Binding EditCompletedFile}"
-                        CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}" />
-                
+                <Button Margin="0,5,0,0"  Content="Remove Job"  
+                        Command="{Binding RemoveJob}" 
+                        CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/>
 
-                <!--<Button Margin="0,5,0,0" Command="{Binding AddBusJob}" Content="Add Bus Job"/>
-                <Button Margin="0,5,0,0" Command="{Binding EditJob}" Content="Edit File" />
-                <Button Margin="0,5,0,0" Command="{Binding CreateNewJob}" Content="New File"  />
-                <Button Margin="0,5,0,0" Command="{Binding RemoveJob}" Content="Remove File"  />-->
+                <Button Margin="0,5,0,0" Content="Edit Completed File" 
+                        Command="{Binding EditCompletedFile}"
+                        CommandParameter="{Binding ElementName=JobList, Path=SelectedItem}"/>
             </StackPanel>
         </Grid>
         
-        <Grid Grid.Row="2" Grid.ColumnSpan="3" Margin="10,20,20,10">
+        <Grid Grid.Row="2" Grid.ColumnSpan="3" Grid.Column="0" Margin="10,20,20,10">
             <DataGrid ItemsSource="{Binding Messages}" BorderThickness="1" CanUserAddRows="False" AutoGenerateColumns="False" SelectionUnit="FullRow" 
                       IsReadOnly="True" HeadersVisibility="All"  RowHeaderWidth="5">
                 
-- 
GitLab