Newer
Older

Franz KOBER josef
committed
using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;

Franz KOBER josef
committed
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Xml;
using Castle.Core.Internal;

Franz KOBER josef
committed
using Ninject;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCore.InputData.FileIO.XML;

Franz KOBER josef
committed
using VECTO3GUI.Util;
using VECTO3GUI.ViewModel.Interfaces;

Franz KOBER josef
committed

Franz KOBER josef
committed
namespace VECTO3GUI.ViewModel.Impl

Franz KOBER josef
committed
{
public class JoblistViewModel : ObservableObject, IJoblistViewModel
{
protected ObservableCollectionEx<JobEntry> _jobs;
protected readonly ObservableCollection<MessageEntry> _messages = new ObservableCollection<MessageEntry>();
private string _firstContextMenu;

Franz KOBER josef
committed
private JobEntry _selectedJobEntry;
private JobListModel _jobListModel;

Franz KOBER josef
committed
private ICommand _newJobCommand;
private ICommand _editJobCommand;
private ICommand _removeJobCommand;

Franz KOBER josef
committed
private ICommand _removeAllJobCommand;
private ICommand _openJobCommand;

Franz KOBER josef
committed
private ICommand _openSettingsCommand;
private ICommand _exitMainCommand;
private ICommand _addBusJobCommand;
private ICommand _editCompletedFileCommand;
private ICommand _moveJobUpCommand;
private ICommand _moveJobDownCommand;
private ICommand _startSimulationCommand;
private ICommand _openInFolderCommand;
#endregion
#region Properties
public JobEntry SelectedJobEntry
{
get { return _selectedJobEntry; }
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
{
get { return _jobs; }
set { SetProperty(ref _jobs, value); }
public ObservableCollection<MessageEntry> Messages
{
get { return _messages; }
}
public string FirstContextMenu
{
get { return _firstContextMenu; }
set { SetProperty(ref _firstContextMenu, value); }
}

Franz KOBER josef
committed
public JoblistViewModel()
{
_settings = new SettingsModel();
SetJobEntries();
}
private void SetJobEntries()
{
_jobListModel = new JobListModel();
_jobs = new ObservableCollectionEx<JobEntry>(_jobListModel.GetJobEntries());
_jobs.CollectionChanged += JobsCollectionChanged;
_jobs.CollectionItemChanged += JobItemChanged;

Franz KOBER josef
committed
}
private void JobItemChanged(object sender, PropertyChangedEventArgs e)

Franz KOBER josef
committed
{
if (e.PropertyName == "Selected" && sender is JobEntry)
UpdateJobEntry((JobEntry)sender);

Franz KOBER josef
committed
}
private void JobsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Move:
case NotifyCollectionChangedAction.Reset:
_jobListModel.SaveJobList(_jobs);
break;
}
}
#region Commands

Franz KOBER josef
committed
public ICommand RemoveJob
{
get
{
return _removeJobCommand ?? (_removeJobCommand = new RelayCommand<JobEntry>(DoRemoveJob, CanRemoveJob));

Franz KOBER josef
committed
}
}
private void DoRemoveJob(JobEntry jobEntry)

Franz KOBER josef
committed
{
_jobs.Remove(jobEntry);

Franz KOBER josef
committed
}
private bool CanRemoveJob(JobEntry jobEntry)
return jobEntry != null;

Franz KOBER josef
committed

Franz KOBER josef
committed
public ICommand RemoveAllJobs
{
get
{
return _removeAllJobCommand ?? (_removeAllJobCommand = new RelayCommand(DoRemoveAllJobs));

Franz KOBER josef
committed
}
}
private void DoRemoveAllJobs()
{
_jobs.Clear();
SelectedJobEntry = null;
}

Franz KOBER josef
committed

Franz KOBER josef
committed
public ICommand EditJob
{
get
{
return _editJobCommand ?? (_editJobCommand = new RelayCommand<JobEntry>(DoEditJob, CanEditJob));

Franz KOBER josef
committed
}
}
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
{
get
{
return _editCompletedFileCommand ??
(_editCompletedFileCommand =
new RelayCommand<JobEntry>(DoEditCompletedFile, CanEditCompletdFile));
}
}
private bool CanEditCompletdFile(JobEntry jobEntry)
{
return jobEntry != null;
}
private void DoEditCompletedFile(JobEntry jobEntry)
{
var viewModel = ReadCompletedXmlFile(jobEntry);
if (viewModel == null)
return;
var window = OutputWindowHelper.CreateOutputWindow(Kernel, viewModel);
window.Show();
}

Franz KOBER josef
committed
public ICommand CreateNewJob
{
get
{
return _newJobCommand ?? (_newJobCommand = new RelayCommand(DoNewJobCommand));

Franz KOBER josef
committed
}
}
private void DoNewJobCommand()

Franz KOBER josef
committed
{
var jobEditView = new CompleteVehicleBusJobViewModel(Kernel, null);

Franz KOBER josef
committed
var window = OutputWindowHelper.CreateOutputWindow(Kernel, jobEditView, "New File");
window.Show();

Franz KOBER josef
committed
}

Franz KOBER josef
committed
get
{
return _openJobCommand ?? (_openJobCommand = new RelayCommand<JobFileType>(DoOpenJobCommand));

Franz KOBER josef
committed
}
private void DoOpenJobCommand(JobFileType jobFileType)

Franz KOBER josef
committed
if (SelectedJobEntry == null)
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();
}

Franz KOBER josef
committed

Franz KOBER josef
committed
public ICommand AddJob
{
get
{
return _addJobCommand ?? (_addJobCommand = new RelayCommand(DoAddJob));

Franz KOBER josef
committed
}
}
var filePath = FileDialogHelper.ShowSelectFilesDialog(false, FileDialogHelper.JobFilter);
if (filePath.IsNullOrEmpty() || !IsNewJobFile(filePath.First()))
return;
var jobEntry = SerializeHelper.DeserializeToObject<JobEntry>(filePath.First());
_jobs.Add(jobEntry);

Franz KOBER josef
committed
public ICommand OpenSettings
{
get
{
return _openSettingsCommand ?? (_openSettingsCommand = new RelayCommand(DoOpenSettingsCommand));

Franz KOBER josef
committed
}
}
private void DoOpenSettingsCommand()
{
var viewModel = new SettingsViewModel();
var window = OutputWindowHelper.CreateOutputWindow(Kernel, viewModel, "Settings", 440, 200,
ResizeMode.NoResize);
window.ShowDialog();
}
public ICommand ExitMainCommand
{
get
{
return _exitMainCommand ?? (_exitMainCommand = new RelayCommand<Window>(DoCloseMainCommand));
}
}
private void DoCloseMainCommand(Window window)
{
window?.Close();
}
public ICommand AddBusJob
{
get
{
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)
AddBusJobEntry(((IBusJobViewModel)viewModel)?.SavedJobEntry);

Franz KOBER josef
committed
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
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);
}
}
}

Franz KOBER josef
committed
private object GetBusJobViewModel(JobType jobType, JobEntry jobEntry = null)
{
var currentJobType = jobEntry?.JobType ?? jobType;

Franz KOBER josef
committed

Franz KOBER josef
committed
switch (currentJobType)
{
case JobType.SingleBusJob:
viewModel = jobEntry == null
? new SingleBusJobViewModel(Kernel, jobType)
: new SingleBusJobViewModel(Kernel, jobEntry);
break;
case JobType.CompletedBusJob:
viewModel = jobEntry == null
? new CompletedBusJobViewModel(Kernel, jobType)
: new CompletedBusJobViewModel(Kernel, jobEntry);
break;

Franz KOBER josef
committed

Franz KOBER josef
committed
}
private OutputWindow CreateBusJobOutputWindow(object viewModel, JobType jobType)

Franz KOBER josef
committed
{
return OutputWindowHelper.CreateOutputWindow(Kernel, viewModel, $"Create {jobType.GetLabel()}",
460, 200, ResizeMode.NoResize);

Franz KOBER josef
committed
}
private void AddBusJobEntry(JobEntry jobEntry)

Franz KOBER josef
committed
{
if (jobEntry == null)
return;
_jobs.Add(jobEntry);

Franz KOBER josef
committed
}
private void ResetBusJobEntries(JobEntry jobEntry)
SerializeHelper.DeserializeToObject<JobEntry>(jobEntry.JobEntryFilePath);
private void UpdateJobEntry(JobEntry jobEntry)
{
SerializeHelper.SerializeToFile(jobEntry.JobEntryFilePath, jobEntry);
}
private IJobEditViewModel ReadCompletedXmlFile(JobEntry jobEntry)
{
var xmlInputReader = Kernel.Get<IXMLInputDataReader>();
using (var reader = XmlReader.Create(jobEntry.SecondFilePath))
{
var readerResult = xmlInputReader.Create(reader) as IDeclarationInputDataProvider;
return CreateCompleteBusVehicleViewModel(readerResult);
}
}
private IJobEditViewModel CreateCompleteBusVehicleViewModel(IDeclarationInputDataProvider dataProvider)
{
_messages.Add(new MessageEntry
{
Message = "Edit File"
});
return dataProvider == null ? null : new CompleteVehicleBusJobViewModel(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;
}
}