aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2018-04-25 09:44:13 +0300
committerAvi Levkovich <avi@twine-s.com>2018-04-25 09:44:13 +0300
commitd352d3b3bd785d9eb8a93347333de0b357f7ce0e (patch)
tree2488173ea7e4f9d5ddb6ef53de57998815732847 /Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI
parentc82908b6d5314bc2602ea10c373267b79fbdd810 (diff)
parenta89077bae848d010ae70da6be572dee3b824a895 (diff)
downloadTango-d352d3b3bd785d9eb8a93347333de0b357f7ce0e.tar.gz
Tango-d352d3b3bd785d9eb8a93347333de0b357f7ce0e.zip
Start SPI ADS1220
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI')
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/bug.pngbin0 -> 5276 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationModel.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationTemplate.cshtml70
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamFoundationServiceExtendedClient.cs160
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamMembersProvider.cs19
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/WorkItemValidationAttribute.cs32
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj36
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs101
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs14
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs69
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ReportIssueViewVM.cs43
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs4
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml3
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml16
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml92
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml.cs28
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/packages.config3
22 files changed, 641 insertions, 106 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
index 1334a349d..d9c64b9e3 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.xaml.cs
@@ -12,9 +12,9 @@ using Tango.BL.Entities;
using Tango.Logging;
using Tango.MachineStudio.UI.Windows;
using Tango.Settings;
-using Microsoft.Practices.ServiceLocation;
using Tango.MachineStudio.Common.EventLogging;
using Tango.BL.Enumerations;
+using Tango.Core.DI;
namespace Tango.MachineStudio.UI
{
@@ -72,7 +72,7 @@ namespace Tango.MachineStudio.UI
try
{
- var eventLogger = ServiceLocator.Current.GetInstance<IEventLogger>();
+ var eventLogger = TangoIOC.Default.GetInstance<IEventLogger>();
if (eventLogger != null)
{
eventLogger.Log(e.Exception, "Application Crashed!");
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/bug.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/bug.png
new file mode 100644
index 000000000..ed4b8e6e6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/bug.png
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml.cs
index 8461a5d93..9901d3b80 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml.cs
@@ -1,5 +1,4 @@
using MahApps.Metro.Controls;
-using Microsoft.Practices.ServiceLocation;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -16,6 +15,7 @@ using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using Tango.Core.DI;
using Tango.Core.Helpers;
using Tango.Logging;
using Tango.MachineStudio.Common.StudioApplication;
@@ -90,7 +90,7 @@ namespace Tango.MachineStudio.UI
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
- ServiceLocator.Current.GetInstance<IStudioApplicationManager>().ShutDown();
+ TangoIOC.Default.GetInstance<IStudioApplicationManager>().ShutDown();
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
index d7035b57b..4afddae69 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Modules/DefaultStudioModuleLoader.cs
@@ -1,5 +1,4 @@
-using GalaSoft.MvvmLight.Ioc;
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
index 52602e6de..0bbcfd313 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs
@@ -1,5 +1,4 @@
-using Microsoft.Practices.ServiceLocation;
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -8,7 +7,6 @@ using System.Threading.Tasks;
using Tango.Core.Helpers;
using Tango.MachineStudio.Common.StudioApplication;
using Tango.MachineStudio.Common.Navigation;
-using GalaSoft.MvvmLight.Ioc;
using System.Reflection;
using System.Collections;
using Tango.Core;
@@ -20,6 +18,7 @@ using System.Windows;
using Tango.Integration.Services;
using Tango.MachineStudio.Common.EventLogging;
using Tango.BL.Enumerations;
+using Tango.Core.DI;
namespace Tango.MachineStudio.UI.StudioApplication
{
@@ -136,7 +135,7 @@ namespace Tango.MachineStudio.UI.StudioApplication
await Task.Factory.StartNew(async () =>
{
//Do Shutdown Procedures...
- foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IShutdownRequestBlocker>())
+ foreach (var vm in TangoIOC.Default.GetAllInstancesByBase<IStudioViewModel>())
{
try
{
@@ -153,7 +152,7 @@ namespace Tango.MachineStudio.UI.StudioApplication
}
}
- foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IShutdownListener>())
+ foreach (var vm in TangoIOC.Default.GetAllInstancesByBase<IStudioViewModel>())
{
vm.OnShuttingDown();
}
@@ -191,7 +190,7 @@ namespace Tango.MachineStudio.UI.StudioApplication
LogManager.Log(ex, "Error disconnecting from machine.");
}
- var eventLogger = ServiceLocator.Current.GetInstance<IEventLogger>();
+ var eventLogger = TangoIOC.Default.GetInstance<IEventLogger>();
if (eventLogger != null)
{
eventLogger.Log(EventTypes.ApplicationTerminated, "Application Terminated!");
@@ -210,18 +209,18 @@ namespace Tango.MachineStudio.UI.StudioApplication
/// </summary>
/// <param name="moduleName">Name of the module.</param>
/// <param name="args">The arguments.</param>
- public void RequestModule(string moduleName, object args)
+ public void RequestModule(string moduleName, params object[] args)
{
IStudioModule module = _moduleLoader.UserModules.SingleOrDefault(x => x.Name == moduleName);
if (module != null)
{
- ServiceLocator.Current.GetInstance<ViewModels.MainViewVM>().StartModule(module);
+ TangoIOC.Default.GetInstance<ViewModels.MainViewVM>().StartModule(module);
//Notify request listeners.
- foreach (var vm in ServiceLocator.Current.GetAllInstancesByBase<IModuleRequestListener>())
+ foreach (var vm in TangoIOC.Default.GetAllInstancesByBase<IStudioViewModel>())
{
- vm.OnRequestModule(module, args);
+ vm.OnModuleRequest(module, args);
}
}
else
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationModel.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationModel.cs
new file mode 100644
index 000000000..eb9ef8012
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationModel.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.BL.Entities;
+
+namespace Tango.MachineStudio.UI.TFS
+{
+ public class SystemInformationModel
+ {
+ public String ApplicationVersion { get; set; }
+ public String EmbeddedVersion { get; set; }
+ public String UserName { get; set; }
+ public String HostName { get; set; }
+ public Machine Machine { get; set; }
+ public String ConfigurationString { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationTemplate.cshtml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationTemplate.cshtml
new file mode 100644
index 000000000..7b0c4a896
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/SystemInformationTemplate.cshtml
@@ -0,0 +1,70 @@
+@{
+ Tango.MachineStudio.UI.TFS.SystemInformationModel vm = Model as Tango.MachineStudio.UI.TFS.SystemInformationModel;
+}
+
+<div>
+ <div style="font-size:20pt;text-decoration:underline">System Information</div>
+ <table style="margin-top:10px">
+ <tbody>
+
+ <tr>
+ <td><b>Application Version:</b></td>
+ <td>@vm.ApplicationVersion</td>
+ </tr>
+
+ <tr>
+ <td><b>Embedded Version:</b></td>
+ <td>@vm.EmbeddedVersion</td>
+ </tr>
+
+ <tr>
+ <td><b>Host Name:</b></td>
+ <td>@vm.HostName</td>
+ </tr>
+
+ <tr>
+ <td><b>User:</b></td>
+ <td>@vm.UserName</td>
+ </tr>
+
+ </tbody>
+ </table>
+
+ <div style="font-size:20pt;text-decoration:underline;margin-top:10px">Machine</div>
+
+ @if (vm.Machine != null)
+ {
+ <table style="margin-top:10px">
+ <tbody>
+
+ <tr>
+ <td><b>Organization:</b></td>
+ <td>@vm.Machine.Organization.Name</td>
+ </tr>
+
+ <tr>
+ <td><b>Name:</b></td>
+ <td>@vm.Machine.Name</td>
+ </tr>
+
+ <tr>
+ <td><b>S/N:</b></td>
+ <td>@vm.Machine.SerialNumber</td>
+ </tr>
+
+ <tr>
+ <td><b>Version:</b></td>
+ <td>@vm.Machine.MachineVersion.Version</td>
+ </tr>
+
+ </tbody>
+ </table>
+
+ <div style="font-size:20pt;text-decoration:underline;margin-top:10px">Configuration</div>
+ <div style="white-space:pre;margin-top:10px;font-size:8pt">@vm.ConfigurationString</div>
+ }
+ else
+ {
+ <div style="color:Red;margin-top:10px">Not Connected</div>
+ }
+</div> \ No newline at end of file
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamFoundationServiceExtendedClient.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamFoundationServiceExtendedClient.cs
new file mode 100644
index 000000000..27b257e61
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamFoundationServiceExtendedClient.cs
@@ -0,0 +1,160 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Tango.BL.Entities;
+using Tango.Core.DI;
+using Tango.Core.Helpers;
+using Tango.Integration.Operation;
+using Tango.Logging;
+using Tango.MachineStudio.Common.Authentication;
+using Tango.MachineStudio.Common.StudioApplication;
+using Tango.SharedUI.Helpers;
+using Tango.TFS;
+
+namespace Tango.MachineStudio.UI.TFS
+{
+ public class TeamFoundationServiceExtendedClient : TeamFoundationServiceClient
+ {
+ public Project Project { get; private set; }
+
+ private bool _isInitialized;
+ public bool IsInitialized
+ {
+ get { return _isInitialized; }
+ private set { _isInitialized = value; RaisePropertyChangedAuto(); }
+ }
+
+ public TeamFoundationServiceExtendedClient(string collectionURL, string userName, string personalToken) : base(collectionURL, userName, personalToken)
+ {
+
+ }
+
+ public Task<WorkItem> UploadWorkItem(WorkItem workItem)
+ {
+ return UploadWorkItem(Project, workItem);
+ }
+
+ public void Initialize()
+ {
+ Task.Factory.StartNew(() =>
+ {
+ if (!IsInitialized)
+ {
+ Project = GetProject("Tango").Result;
+ IsInitialized = true;
+ }
+ });
+ }
+
+ public WorkItem CreateBug()
+ {
+ WorkItem item = new WorkItem();
+
+ IAuthenticationProvider auth = TangoIOC.Default.GetInstance<IAuthenticationProvider>();
+ IStudioApplicationManager app = TangoIOC.Default.GetInstance<IStudioApplicationManager>();
+
+ item.Area = Project.Areas.FirstOrDefault();
+ item.Iteration = Project.Iterations.FirstOrDefault();
+
+ TeamMember currentUser = Project.Members.SingleOrDefault(x => x.UniqueName.ToLower().Contains(auth.CurrentUser.Email.ToLower()));
+ item.CreatedBy = currentUser;
+ item.ChangedBy = currentUser;
+ item.AuthorizedAs = currentUser;
+
+ item.FoundInBuild = app.Version;
+ item.Priority = Priority.Priority3;
+ item.Severity = Severity.Medium;
+ item.State = State.New;
+ item.Type = WorkItemType.Bug;
+
+ var bitmap = UIHelper.TakeSnapshot(MainWindow.Instance);
+ String filePath = PathHelper.GetTempFilePath();
+ bitmap.SaveJpeg(filePath, 30);
+
+ item.Attachments.Add(new Attachment()
+ {
+ Description = "Screen Capture",
+ FilePath = filePath,
+ Name = "Screen Capture.jpg",
+ });
+
+ FileLogger appFileLogger = LogManager.Default.RegisteredLoggers.FirstOrDefault(x => x.GetType() == typeof(FileLogger)) as FileLogger;
+ FileLogger embeddedFileLogger = MachineOperator.EmbeddedLogManager.RegisteredLoggers.FirstOrDefault(x => x.GetType() == typeof(FileLogger)) as FileLogger;
+
+ if (appFileLogger != null)
+ {
+ String appLogFile = PathHelper.GetTempFilePath();
+ File.Copy(appFileLogger.LogFile, appLogFile);
+
+ item.Attachments.Add(new Attachment()
+ {
+ Description = "Application Log File",
+ FilePath = appLogFile,
+ Name = Path.GetFileName(appFileLogger.LogFile),
+ });
+ }
+
+ if (embeddedFileLogger != null && File.Exists(embeddedFileLogger.LogFile))
+ {
+ String embeddedLogFile = PathHelper.GetTempFilePath();
+ File.Copy(appFileLogger.LogFile, embeddedLogFile);
+
+ item.Attachments.Add(new Attachment()
+ {
+ Description = "Embedded Log File",
+ FilePath = embeddedLogFile,
+ Name = Path.GetFileName(embeddedFileLogger.LogFile),
+ });
+ }
+
+ SystemInformationModel sysModel = new SystemInformationModel();
+ sysModel.ApplicationVersion = app.Version;
+ sysModel.EmbeddedVersion = "Fake Version";
+ sysModel.HostName = Environment.MachineName;
+ sysModel.UserName = auth.CurrentUser.Contact.FullName;
+
+ if (app.ConnectedMachine != null)
+ {
+ Machine machine = app.ConnectedMachine.Machine;
+
+ sysModel.Machine = machine;
+
+ MachineDesigner.Views.MainView machineView = new MachineDesigner.Views.MainView();
+ machineView.Width = 1280;
+ machineView.Height = 1100;
+ machineView.PanelColumnDefinition.Width = new System.Windows.GridLength(0);
+ machineView.stackHeader.Visibility = Visibility.Collapsed;
+ machineView.Background = System.Windows.Media.Brushes.White;
+ machineView.DataContext = new MachineDesigner.ViewModels.MainViewVM() { SelectedMachine = machine, Configuration = machine.Configuration };
+
+ String configImageFile = PathHelper.GetTempFilePath();
+ machineView.RenderToFile(configImageFile, System.Drawing.Imaging.ImageFormat.Jpeg, new System.Windows.Size(machineView.Width, machineView.Height), 100);
+
+ item.Attachments.Add(new Attachment()
+ {
+ Description = "Machine Configuration",
+ FilePath = configImageFile,
+ Name = "Machine Configuration.jpg"
+ });
+
+ sysModel.ConfigurationString = machine.Configuration.CloneConfiguration().ToJsonString();
+ }
+
+ String html = String.Empty;
+
+ using (var stream = EmbeddedResourceHelper.GetEmbeddedResourceStream("Tango.MachineStudio.UI.TFS.SystemInformationTemplate.cshtml"))
+ {
+ StreamReader reader = new StreamReader(stream);
+ html = reader.ReadToEnd();
+ }
+
+ item.SystemInformation = CodeGeneration.Helper.Parse(html, sysModel);
+
+ return item;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamMembersProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamMembersProvider.cs
new file mode 100644
index 000000000..0691ca6bd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/TeamMembersProvider.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.AutoComplete.Editors;
+using Tango.Core.DI;
+
+namespace Tango.MachineStudio.UI.TFS
+{
+ public class TeamMembersProvider : ISuggestionProvider
+ {
+ public IEnumerable GetSuggestions(string filter)
+ {
+ return TangoIOC.Default.GetInstance<TeamFoundationServiceExtendedClient>().Project.Members.Where(x => x.AssignName.ToLower().Contains(filter.ToLower()));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/WorkItemValidationAttribute.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/WorkItemValidationAttribute.cs
new file mode 100644
index 000000000..1418d0576
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/TFS/WorkItemValidationAttribute.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.TFS;
+
+namespace Tango.MachineStudio.UI.TFS
+{
+ public class WorkItemValidationAttribute : ValidationAttribute
+ {
+ public override bool IsValid(object value)
+ {
+ WorkItem item = value as WorkItem;
+
+ if (String.IsNullOrWhiteSpace(item.Title))
+ {
+ ErrorMessage = "Title is empty";
+ return false;
+ }
+
+ if (item.AssignedTo == null)
+ {
+ ErrorMessage = "Assigned To is empty";
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
index eb4139936..8ab6bb188 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj
@@ -54,15 +54,6 @@
<Reference Include="FontAwesome.WPF, Version=4.7.0.37774, Culture=neutral, PublicKeyToken=0758b07a11a4f466, processorArchitecture=MSIL">
<HintPath>..\..\packages\FontAwesome.WPF.4.7.0.9\lib\net40\FontAwesome.WPF.dll</HintPath>
</Reference>
- <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
- <HintPath>..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
- </Reference>
- <Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
- <HintPath>..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
- </Reference>
- <Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
- <HintPath>..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
- </Reference>
<Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
@@ -78,9 +69,6 @@
<Reference Include="MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
- <Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
- <HintPath>..\..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
- </Reference>
<Reference Include="SimpleValidator, Version=0.6.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\SimpleValidator.0.6.1.0\lib\net40\SimpleValidator.dll</HintPath>
</Reference>
@@ -123,7 +111,7 @@
<Reference Include="System.Windows" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
- <HintPath>..\..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
+ <HintPath>..\..\packages\Expression.Blend.Sdk.1.0.2\lib\net45\System.Windows.Interactivity.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
@@ -159,6 +147,10 @@
<DependentUpon>MessageBoxWindow.xaml</DependentUpon>
</Compile>
<Compile Include="SupervisingController\IMainView.cs" />
+ <Compile Include="TFS\SystemInformationModel.cs" />
+ <Compile Include="TFS\TeamFoundationServiceExtendedClient.cs" />
+ <Compile Include="TFS\TeamMembersProvider.cs" />
+ <Compile Include="TFS\WorkItemValidationAttribute.cs" />
<Compile Include="ViewModels\ConnectedMachineViewVM.cs" />
<Compile Include="ViewModels\LoadingViewVM.cs" />
<Compile Include="ViewModels\LoginViewVM.cs" />
@@ -168,6 +160,7 @@
<Compile Include="ViewModels\MainViewVM.cs" />
<Compile Include="ViewModelLocator.cs" />
<Compile Include="ViewModels\ModuleWindowVM.cs" />
+ <Compile Include="ViewModels\ReportIssueViewVM.cs" />
<Compile Include="ViewModels\ShutdownViewVM.cs" />
<Compile Include="ViewModels\UpdateViewVM.cs" />
<Compile Include="Views\ConnectedMachineView.xaml.cs">
@@ -194,6 +187,9 @@
<Compile Include="Notifications\DialogWindow.xaml.cs">
<DependentUpon>DialogWindow.xaml</DependentUpon>
</Compile>
+ <Compile Include="Views\ReportIssueView.xaml.cs">
+ <DependentUpon>ReportIssueView.xaml</DependentUpon>
+ </Compile>
<Compile Include="Views\ShutdownView.xaml.cs">
<DependentUpon>ShutdownView.xaml</DependentUpon>
</Compile>
@@ -270,6 +266,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="Views\ReportIssueView.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Views\ShutdownView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -331,6 +331,10 @@
<Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project>
<Name>Tango.BL</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.CodeGeneration\Tango.CodeGeneration.csproj">
+ <Project>{caedae94-11ed-473c-888a-268a6d38cd20}</Project>
+ <Name>Tango.CodeGeneration</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj">
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
@@ -359,6 +363,10 @@
<Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project>
<Name>Tango.SharedUI</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.TFS\Tango.TFS.csproj">
+ <Project>{998f8471-dc1b-41b6-9d96-354e1b4e7a32}</Project>
+ <Name>Tango.TFS</Name>
+ </ProjectReference>
<ProjectReference Include="..\..\Tango.Transport\Tango.Transport.csproj">
<Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project>
<Name>Tango.Transport</Name>
@@ -452,6 +460,8 @@
</ItemGroup>
<ItemGroup>
<Content Include="Html\HTML Templates\Thread Break.html" />
+ <EmbeddedResource Include="TFS\SystemInformationTemplate.cshtml" />
+ <Resource Include="Images\bug.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
index fa3a38c5c..8e6f11452 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs
@@ -1,7 +1,5 @@
-using GalaSoft.MvvmLight;
-using GalaSoft.MvvmLight.Ioc;
-using Microsoft.Practices.ServiceLocation;
using System;
+using Tango.Core.DI;
using Tango.Integration.Services;
using Tango.Logging;
using Tango.MachineStudio.Common.Authentication;
@@ -21,9 +19,11 @@ using Tango.MachineStudio.UI.Navigation;
using Tango.MachineStudio.UI.Notifications;
using Tango.MachineStudio.UI.StudioApplication;
using Tango.MachineStudio.UI.SupervisingController;
+using Tango.MachineStudio.UI.TFS;
using Tango.MachineStudio.UI.ViewModels;
using Tango.MachineStudio.UI.Views;
using Tango.Settings;
+using Tango.TFS;
namespace Tango.MachineStudio.UI
{
@@ -40,66 +40,65 @@ namespace Tango.MachineStudio.UI
/// </summary>
public ViewModelLocator()
{
- ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
-
////if (ViewModelBase.IsInDesignModeStatic)
////{
//// // Create design time view services and models
- //// SimpleIoc.Default.Register<IDataService, DesignDataService>();
+ //// TangoIOC.Default.Register<IDataService, DesignDataService>();
////}
////else
////{
//// // Create run time view services and models
- //// SimpleIoc.Default.Register<IDataService, DataService>();
+ //// TangoIOC.Default.Register<IDataService, DataService>();
////}
- SimpleIoc.Default.Unregister<INotificationProvider>();
- SimpleIoc.Default.Unregister<IAuthenticationProvider>();
- SimpleIoc.Default.Unregister<INavigationManager>();
- SimpleIoc.Default.Unregister<IStudioModuleLoader>();
- SimpleIoc.Default.Unregister<IStudioApplicationManager>();
- SimpleIoc.Default.Unregister<ExternalBridgeScanner>();
- SimpleIoc.Default.Unregister<IVideoCaptureProvider>();
- SimpleIoc.Default.Unregister<IDiagnosticsFrameProvider>();
- SimpleIoc.Default.Unregister<IEventLogger>();
- SimpleIoc.Default.Unregister<ISpeechProvider>();
- SimpleIoc.Default.Unregister<IHtmlPresenter>();
+ TangoIOC.Default.Unregister<INotificationProvider>();
+ TangoIOC.Default.Unregister<IAuthenticationProvider>();
+ TangoIOC.Default.Unregister<INavigationManager>();
+ TangoIOC.Default.Unregister<IStudioModuleLoader>();
+ TangoIOC.Default.Unregister<IStudioApplicationManager>();
+ TangoIOC.Default.Unregister<ExternalBridgeScanner>();
+ TangoIOC.Default.Unregister<IVideoCaptureProvider>();
+ TangoIOC.Default.Unregister<IDiagnosticsFrameProvider>();
+ TangoIOC.Default.Unregister<IEventLogger>();
+ TangoIOC.Default.Unregister<ISpeechProvider>();
+ TangoIOC.Default.Unregister<IHtmlPresenter>();
+ TangoIOC.Default.Unregister<ITeamFoundationServiceClient>();
- SimpleIoc.Default.Register<INotificationProvider, DefaultNotificationProvider>();
- SimpleIoc.Default.Register<IAuthenticationProvider, DefaultAuthenticationProvider>();
- SimpleIoc.Default.Register<INavigationManager, DefaultNavigationManager>();
- SimpleIoc.Default.Register<IStudioModuleLoader, DefaultStudioModuleLoader>();
- SimpleIoc.Default.Register<IStudioApplicationManager, DefaultStudioApplicationManager>();
- SimpleIoc.Default.Register<ExternalBridgeScanner, ExternalBridgeScanner>();
- SimpleIoc.Default.Register<ExternalBridgeScanner, ExternalBridgeScanner>();
- SimpleIoc.Default.Register<IVideoCaptureProvider, DefaultVideoCaptureProvider>();
- SimpleIoc.Default.Register<IDiagnosticsFrameProvider, DefaultDiagnosticsFrameProvider>();
- SimpleIoc.Default.Register<IEventLogger, DefaultEventLogger>();
- SimpleIoc.Default.Register<ISpeechProvider, DefaultSpeechProvider>();
- SimpleIoc.Default.Register<IHtmlPresenter, DefaultHtmlPresenter>();
+ TangoIOC.Default.Register<TeamFoundationServiceExtendedClient>(new TeamFoundationServiceExtendedClient("https://twinetfs.visualstudio.com/DefaultCollection", "Roy", "szzfokrceo4rhd4eqi5qpmxn3pa5iwl3q7tlqd36l2m7smz2ynoa"));
+ TangoIOC.Default.Register<INotificationProvider, DefaultNotificationProvider>();
+ TangoIOC.Default.Register<IAuthenticationProvider, DefaultAuthenticationProvider>();
+ TangoIOC.Default.Register<INavigationManager, DefaultNavigationManager>();
+ TangoIOC.Default.Register<IStudioModuleLoader, DefaultStudioModuleLoader>();
+ TangoIOC.Default.Register<IStudioApplicationManager, DefaultStudioApplicationManager>();
+ TangoIOC.Default.Register<ExternalBridgeScanner, ExternalBridgeScanner>();
+ TangoIOC.Default.Register<IVideoCaptureProvider, DefaultVideoCaptureProvider>();
+ TangoIOC.Default.Register<IDiagnosticsFrameProvider, DefaultDiagnosticsFrameProvider>();
+ TangoIOC.Default.Register<IEventLogger, DefaultEventLogger>();
+ TangoIOC.Default.Register<ISpeechProvider, DefaultSpeechProvider>();
+ TangoIOC.Default.Register<IHtmlPresenter, DefaultHtmlPresenter>();
- SimpleIoc.Default.Register<MainViewVM>();
- SimpleIoc.Default.Register<LoadingViewVM>();
- SimpleIoc.Default.Register<ShutdownViewVM>();
- SimpleIoc.Default.Register<LoginViewVM>();
- SimpleIoc.Default.Register<MachineConnectionViewVM>();
- SimpleIoc.Default.Register<ConnectedMachineViewVM>();
- SimpleIoc.Default.Register<MachineLoginViewVM>();
- SimpleIoc.Default.Register<UpdateViewVM>();
+ TangoIOC.Default.Register<MainViewVM>();
+ TangoIOC.Default.Register<LoadingViewVM>();
+ TangoIOC.Default.Register<ShutdownViewVM>();
+ TangoIOC.Default.Register<LoginViewVM>();
+ TangoIOC.Default.Register<MachineConnectionViewVM>();
+ TangoIOC.Default.Register<ConnectedMachineViewVM>();
+ TangoIOC.Default.Register<MachineLoginViewVM>();
+ TangoIOC.Default.Register<UpdateViewVM>();
//Register View (Supervising Controller Pattern).
- if (!ViewModelBase.IsInDesignModeStatic)
- {
- LogManager.Log(String.Format("Registering Supervising Controller {0}...", nameof(IMainView)));
- SimpleIoc.Default.Register(() => (IMainView)MainView.Self);
- }
+ //if (!ViewModelBase.IsInDesignModeStatic)
+ //{
+ // LogManager.Log(String.Format("Registering Supervising Controller {0}...", nameof(IMainView)));
+ // TangoIOC.Default.Register(() => (IMainView)MainView.Self);
+ //}
}
public MainViewVM MainViewVM
{
get
{
- return ServiceLocator.Current.GetInstance<MainViewVM>();
+ return TangoIOC.Default.GetInstance<MainViewVM>();
}
}
@@ -107,7 +106,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<LoadingViewVM>();
+ return TangoIOC.Default.GetInstance<LoadingViewVM>();
}
}
@@ -115,7 +114,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<ShutdownViewVM>();
+ return TangoIOC.Default.GetInstance<ShutdownViewVM>();
}
}
@@ -123,7 +122,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<LoginViewVM>();
+ return TangoIOC.Default.GetInstance<LoginViewVM>();
}
}
@@ -131,7 +130,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<MachineConnectionViewVM>();
+ return TangoIOC.Default.GetInstance<MachineConnectionViewVM>();
}
}
@@ -139,7 +138,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<ConnectedMachineViewVM>();
+ return TangoIOC.Default.GetInstance<ConnectedMachineViewVM>();
}
}
@@ -147,7 +146,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<MachineLoginViewVM>();
+ return TangoIOC.Default.GetInstance<MachineLoginViewVM>();
}
}
@@ -155,7 +154,7 @@ namespace Tango.MachineStudio.UI
{
get
{
- return ServiceLocator.Current.GetInstance<UpdateViewVM>();
+ return TangoIOC.Default.GetInstance<UpdateViewVM>();
}
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
index 512341f7e..2b2b442f7 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs
@@ -15,6 +15,7 @@ using Tango.SharedUI;
using Tango.BL;
using Tango.MachineStudio.Common.EventLogging;
using Tango.BL.Enumerations;
+using Tango.MachineStudio.UI.TFS;
namespace Tango.MachineStudio.UI.ViewModels
{
@@ -25,6 +26,7 @@ namespace Tango.MachineStudio.UI.ViewModels
public class LoadingViewVM : ViewModel
{
private INotificationProvider _notificationProvider;
+ private TeamFoundationServiceExtendedClient _tfs;
private INavigationManager _navigationManager;
private IStudioModuleLoader _studioModuleLoader;
private IEventLogger _eventLogger;
@@ -45,8 +47,9 @@ namespace Tango.MachineStudio.UI.ViewModels
/// <param name="navigationManager">The navigation manager.</param>
/// <param name="studioModuleLoader">The studio module loader.</param>
/// <param name="notificationProvider">The notification provider.</param>
- public LoadingViewVM(IStudioApplicationManager applicationManager, INavigationManager navigationManager, IStudioModuleLoader studioModuleLoader, INotificationProvider notificationProvider, IEventLogger eventLogger)
+ public LoadingViewVM(IStudioApplicationManager applicationManager, INavigationManager navigationManager, IStudioModuleLoader studioModuleLoader, INotificationProvider notificationProvider, IEventLogger eventLogger, TeamFoundationServiceExtendedClient teamFoundationClient)
{
+ _tfs = teamFoundationClient;
_eventLogger = eventLogger;
ApplicationManager = applicationManager;
_navigationManager = navigationManager;
@@ -66,6 +69,15 @@ namespace Tango.MachineStudio.UI.ViewModels
{
try
{
+ try
+ {
+ _tfs.Initialize();
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Could not initialize Team Foundation Service client.");
+ }
+
ObservablesEntitiesAdapter.Instance.Initialize();
_eventLogger.Log(EventTypes.ApplicationStarted, "Application Started!");
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
index b97825d34..0882267e8 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs
@@ -1,6 +1,4 @@
-using GalaSoft.MvvmLight.Ioc;
-using GalaSoft.MvvmLight.Messaging;
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
@@ -14,6 +12,7 @@ using System.Windows.Controls;
using System.Windows.Media;
using Tango.BL.Entities;
using Tango.Core.Commands;
+using Tango.Core.DI;
using Tango.Integration.Services;
using Tango.Logging;
using Tango.MachineStudio.Common;
@@ -30,6 +29,7 @@ using Tango.MachineStudio.Common.StudioApplication;
using Tango.MachineStudio.Common.Update;
using Tango.MachineStudio.UI.StudioApplication;
using Tango.MachineStudio.UI.SupervisingController;
+using Tango.MachineStudio.UI.TFS;
using Tango.MachineStudio.UI.Views;
using Tango.MachineStudio.UI.Windows;
using Tango.PMR.Stubs;
@@ -45,7 +45,7 @@ namespace Tango.MachineStudio.UI.ViewModels
/// Represents the Machine Studio main view, view model.
/// </summary>
/// <seealso cref="Tango.SharedUI.ViewModel{Tango.MachineStudio.UI.SupervisingController.IMainView}" />
- public class MainViewVM : ViewModel<IMainView>
+ public class MainViewVM : ViewModel
{
private IStudioModule _currentModule;
private INavigationManager _navigation;
@@ -143,6 +143,11 @@ namespace Tango.MachineStudio.UI.ViewModels
/// </summary>
public RelayCommand<MachinesEvent> ResolveMachineEventCommand { get; set; }
+ /// <summary>
+ /// Gets or sets the report issue command.
+ /// </summary>
+ public RelayCommand ReportIssueCommand { get; set; }
+
private IAuthenticationProvider _authenticationProvider;
/// <summary>
/// Gets or sets the authentication provider.
@@ -184,6 +189,11 @@ namespace Tango.MachineStudio.UI.ViewModels
}
/// <summary>
+ /// Gets or sets the TFS client.
+ /// </summary>
+ public TeamFoundationServiceExtendedClient TFSClient { get; set; }
+
+ /// <summary>
/// Gets or sets the speech provider.
/// </summary>
public ISpeechProvider SpeechProvider { get; set; }
@@ -240,7 +250,6 @@ namespace Tango.MachineStudio.UI.ViewModels
/// <param name="applicationManager">The application manager.</param>
/// <param name="navigationManager">The navigation manager.</param>
public MainViewVM(
- IMainView view,
IAuthenticationProvider authenticationProvider,
IStudioModuleLoader studioModuleLoader,
INotificationProvider notificationProvider,
@@ -249,8 +258,9 @@ namespace Tango.MachineStudio.UI.ViewModels
IEventLogger eventLogger,
IDiagnosticsFrameProvider frameProvider,
ISpeechProvider speechProvider,
- IHtmlPresenter htmlPresenter) : base(view)
+ IHtmlPresenter htmlPresenter, TeamFoundationServiceExtendedClient tfs) : base()
{
+ TFSClient = tfs;
_eventLogger = eventLogger;
_navigation = navigationManager;
AuthenticationProvider = authenticationProvider;
@@ -290,6 +300,8 @@ namespace Tango.MachineStudio.UI.ViewModels
ToggleSpeechCommand = new RelayCommand(() => { SpeechProvider.Mute = !SpeechProvider.Mute; });
ResolveMachineEventCommand = new RelayCommand<MachinesEvent>(ResolveMachineEvent);
+
+ ReportIssueCommand = new RelayCommand(ReportIssue);
}
private void MachineEventsStateProvider_EventsResolved(object sender, IEnumerable<MachinesEvent> e)
@@ -500,17 +512,22 @@ namespace Tango.MachineStudio.UI.ViewModels
if (module != null)
{
+ LogManager.Log(String.Format("Starting module '{0}'...", module.Name));
+
if (!(MainView.Self as MainView).TransitionControl.Elements.ToList().Exists(x => x.GetType() == module.MainViewType))
{
+ LogManager.Log("Module was not initialized. Initializing...");
+
FrameworkElement view = Activator.CreateInstance(module.MainViewType) as FrameworkElement;
NavigationControl.SetNavigationName(view, module.Name);
(MainView.Self as MainView).TransitionControl.Elements.Add(view);
}
}
- foreach (var m in StudioModuleLoader.AllModules.Where(x => x != module))
+ foreach (var m in StudioModuleLoader.AllModules.Where(x => x != module && !x.InNewWindow))
{
m.IsLoaded = false;
+ TangoIOC.Default.GetModuleViewModels(m).ToList().ForEach(x => x.OnNavigatedFrom());
}
if (module != null)
@@ -518,24 +535,21 @@ namespace Tango.MachineStudio.UI.ViewModels
CurrentModule = module;
CurrentModule.IsLoaded = true;
IsModuleLoaded = true;
+
+ LogManager.Log(String.Format("Navigating to module '{0}'...", module.Name));
(MainView.Self as MainView).TransitionControl.NavigateTo(module.Name);
+
+ TangoIOC.Default.GetModuleViewModels(module).ToList().ForEach(x => x.OnNavigatedTo());
}
else
{
IsModuleLoaded = false;
+ LogManager.Log(String.Format("Navigating to Home..."));
(MainView.Self as MainView).TransitionControl.NavigateTo("Home");
}
}
/// <summary>
- /// Called when the <see cref="T:Tango.SharedUI.IView" /> is loaded and attached.
- /// </summary>
- protected override void OnViewAttached()
- {
- base.OnViewAttached();
- }
-
- /// <summary>
/// Opens the module in a new window.
/// </summary>
/// <param name="module">The module.</param>
@@ -545,17 +559,21 @@ namespace Tango.MachineStudio.UI.ViewModels
try
{
+ module.InNewWindow = true;
+
StartModule(null);
- module.InNewWindow = true;
+ LogManager.Log(String.Format("Starting module '{0}' in new window...", module.Name));
if (!(MainView.Self as MainView).TransitionControl.Elements.ToList().Exists(x => x.GetType() == module.MainViewType))
{
+ LogManager.Log("Module was not initialized. Initializing...");
FrameworkElement v = Activator.CreateInstance(module.MainViewType) as FrameworkElement;
NavigationControl.SetNavigationName(v, module.Name);
(MainView.Self as MainView).TransitionControl.Elements.Add(v);
}
+ LogManager.Log("Detaching module view...");
var view = (MainView.Self as MainView).TransitionControl.GetAndDetach(module.Name);
ModuleWindowVM vm = new ModuleWindowVM(module);
@@ -563,13 +581,20 @@ namespace Tango.MachineStudio.UI.ViewModels
window.Closing += (x, y) =>
{
+ LogManager.Log(String.Format("Closing module '{0}' on new window...", module.Name));
+
window.grid.Children.Remove(view);
module.InNewWindow = false;
+ TangoIOC.Default.GetModuleViewModels(module).ToList().ForEach(v => v.OnNavigatedFrom());
};
window.Owner = MainWindow.Instance;
+
+ LogManager.Log("Opening new window...");
window.Show();
+ TangoIOC.Default.GetModuleViewModels(module).ToList().ForEach(x => x.OnNavigatedTo());
+
(_applicationManager as DefaultStudioApplicationManager).RegisterOpenedWindow(window);
}
catch (Exception ex)
@@ -617,5 +642,17 @@ namespace Tango.MachineStudio.UI.ViewModels
_notificationProvider.ShowWarning("Could not locate guidance content for the specified event.");
}
}
+
+ private void ReportIssue()
+ {
+ _notificationProvider.ShowModalDialog<ReportIssueViewVM, ReportIssueView>(new ReportIssueViewVM(TFSClient.Project, TFSClient.CreateBug()), async (vm) =>
+ {
+ using (_notificationProvider.PushTaskItem("Uploading bug report..."))
+ {
+ await TFSClient.UploadWorkItem(vm.WorkItem);
+ }
+
+ }, null);
+ }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ReportIssueViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ReportIssueViewVM.cs
new file mode 100644
index 000000000..9660db8a5
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/ReportIssueViewVM.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.UI.TFS;
+using Tango.SharedUI.Components;
+using Tango.TFS;
+
+namespace Tango.MachineStudio.UI.ViewModels
+{
+ public class ReportIssueViewVM : DialogViewVM
+ {
+ public SelectedObjectCollection<Tag> SelectedTags { get; set; }
+
+ public Project Project { get; set; }
+
+ [WorkItemValidation]
+ public WorkItem WorkItem { get; set; }
+
+ public ReportIssueViewVM() : base()
+ {
+
+ }
+
+ public ReportIssueViewVM(Project project, WorkItem workItem) : this()
+ {
+ Project = project;
+ WorkItem = workItem;
+ SelectedTags = new SelectedObjectCollection<Tag>(Project.Tags.ToObservableCollection(), new System.Collections.ObjectModel.ObservableCollection<Tag>());
+ }
+
+ protected override void Accept()
+ {
+ if (Validate())
+ {
+ WorkItem.Tags = SelectedTags.SynchedSource.ToList();
+ base.Accept();
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs
index ab4fd8e0b..0f6ec8b98 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs
@@ -1,6 +1,5 @@
using FluentFTP;
using Ionic.Zip;
-using Microsoft.Practices.ServiceLocation;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -12,6 +11,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Commands;
+using Tango.Core.DI;
using Tango.Core.Helpers;
using Tango.Logging;
using Tango.MachineStudio.Common.Authentication;
@@ -256,7 +256,7 @@ namespace Tango.MachineStudio.UI.ViewModels
}
}
- ServiceLocator.Current.GetInstance<MainViewVM>().DisableCheckForUpdates = true;
+ TangoIOC.Default.GetInstance<MainViewVM>().DisableCheckForUpdates = true;
Status = UpdateStatus.UpdateCompleted;
}
catch (Exception ex)
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
index 7f54263b7..08e1006c1 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoginView.xaml
@@ -5,6 +5,7 @@
xmlns:rules="clr-namespace:Tango.MachineStudio.Common.ValidationRules;assembly=Tango.MachineStudio.Common"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:automation="clr-namespace:Tango.MachineStudio.Common.Automation;assembly=Tango.MachineStudio.Common"
xmlns:helpers="clr-namespace:Tango.SharedUI.Helpers;assembly=Tango.SharedUI"
xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
mc:Ignorable="d"
@@ -35,7 +36,7 @@
<PasswordBox x:Name="txtPass" helpers:PasswordHelper.Attach="True" helpers:PasswordHelper.Password="{Binding Password,Mode=TwoWay}" Margin="5 0 0 0" materialDesign:HintAssist.FloatingScale="0.50" materialDesign:HintAssist.Hint="Password" materialDesign:TextFieldAssist.TextBoxViewMargin="1 0 1 0" FontSize="20" Style="{StaticResource MaterialDesignFloatingHintPasswordBox}" AutomationProperties.IsRequiredForForm="True" />
</DockPanel>
<CheckBox Margin="25 20 0 0" IsChecked="{Binding RememberMe}">Remember me</CheckBox>
- <Button Margin="25 20 0 0" Height="50" Command="{Binding LoginCommand}" Content="LOGIN">
+ <Button AutomationProperties.AutomationId="{x:Static automation:UI.LoginButton}" Margin="25 20 0 0" Height="50" Command="{Binding LoginCommand}" Content="LOGIN">
</Button>
</StackPanel>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
index dd3d122b6..86723479b 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml
@@ -316,6 +316,22 @@
</Image.Style>
</Image>
</Button>
+
+ <Button Cursor="Hand" Command="{Binding ReportIssueCommand}" IsEnabled="{Binding TFSClient.IsInitialized}">
+ <Button.Style>
+ <Style TargetType="Button" BasedOn="{StaticResource emptyButton}">
+ <Setter Property="ToolTip" Value="Report and issue"></Setter>
+ <Setter Property="Opacity" Value="1"></Setter>
+ <Style.Triggers>
+ <Trigger Property="IsEnabled" Value="False">
+ <Setter Property="ToolTip" Value="The team foundation service is not available."></Setter>
+ <Setter Property="Opacity" Value="0.5"></Setter>
+ </Trigger>
+ </Style.Triggers>
+ </Style>
+ </Button.Style>
+ <Image Margin="10 0 0 0" Source="/Images/bug.png" Width="24" RenderOptions.BitmapScalingMode="Fant" />
+ </Button>
</StackPanel>
</Grid>
</Grid>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
index df1f97f23..1e894f3f2 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml.cs
@@ -1,5 +1,4 @@
-using Microsoft.Practices.ServiceLocation;
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -27,6 +26,7 @@ using Tango.Core.Helpers;
using Tango.SharedUI.Helpers;
using Tango.Logging;
using static Tango.SharedUI.Controls.NavigationControl;
+using Tango.Core.DI;
namespace Tango.MachineStudio.UI.Views
{
@@ -41,7 +41,7 @@ namespace Tango.MachineStudio.UI.Views
{
InitializeComponent();
- _loader = ServiceLocator.Current.GetInstance<IStudioModuleLoader>() as DefaultStudioModuleLoader;
+ _loader = TangoIOC.Default.GetInstance<IStudioModuleLoader>() as DefaultStudioModuleLoader;
_loader.ModulesLoaded += Loader_ModulesLoaded;
}
@@ -51,7 +51,7 @@ namespace Tango.MachineStudio.UI.Views
{
LogManager.Default.Log("Loading modules views...");
- var item = ServiceLocator.Current.GetInstance<INotificationProvider>().PushTaskItem("Loading Modules...");
+ var item = TangoIOC.Default.GetInstance<INotificationProvider>().PushTaskItem("Loading Modules...");
var modules = _loader.UserModules.ToList();
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml
new file mode 100644
index 000000000..f2e3038b9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml
@@ -0,0 +1,92 @@
+<UserControl x:Class="Tango.MachineStudio.UI.Views.ReportIssueView"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
+ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete"
+ xmlns:integration="clr-namespace:Tango.Integration.Services;assembly=Tango.Integration"
+ xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
+ xmlns:vm="clr-namespace:Tango.MachineStudio.UI.ViewModels"
+ xmlns:tfs="clr-namespace:Tango.TFS;assembly=Tango.TFS"
+ xmlns:tfss="clr-namespace:Tango.MachineStudio.UI.TFS"
+ xmlns:local="clr-namespace:Tango.MachineStudio.UI.Views"
+ mc:Ignorable="d" Width="530" Height="650" Background="White" d:DataContext="{d:DesignInstance Type=vm:ReportIssueViewVM, IsDesignTimeCreatable=False}">
+
+ <UserControl.Resources>
+ <converters:EnumToItemsSourceConverter x:Key="EnumToItemsSourceConverter" />
+ <tfss:TeamMembersProvider x:Key="TeamMembersProvider" />
+ <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
+ </UserControl.Resources>
+
+ <Grid>
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="90"/>
+ <RowDefinition Height="377*"/>
+ <RowDefinition Height="70"/>
+ </Grid.RowDefinitions>
+
+ <Grid>
+ <StackPanel Orientation="Horizontal">
+ <Image Source="/Images/bug.png" Width="48" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock VerticalAlignment="Center" Margin="10 0 0 0" FontSize="20">Report Issue</TextBlock>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Row="1">
+ <StackPanel>
+ <TextBox materialDesign:HintAssist.Hint="Title" materialDesign:HintAssist.IsFloating="True" FontSize="16" Text="{Binding WorkItem.Title}"></TextBox>
+
+ <autoComplete:AutoCompleteTextBox Provider="{StaticResource TeamMembersProvider}" SelectedItem="{Binding WorkItem.AssignedTo,Mode=TwoWay}" DisplayMember="DisplayName" Margin="0 10 0 0" materialDesign:HintAssist.Hint="Assigned To" materialDesign:HintAssist.IsFloating="True"></autoComplete:AutoCompleteTextBox>
+ <ComboBox Margin="0 10 0 0" materialDesign:HintAssist.Hint="Area" materialDesign:HintAssist.IsFloating="True" ItemsSource="{Binding Project.Areas}" SelectedItem="{Binding WorkItem.Area}" DisplayMemberPath="Name"></ComboBox>
+ <ComboBox Margin="0 10 0 0" materialDesign:HintAssist.Hint="Severity" materialDesign:HintAssist.IsFloating="True" ItemsSource="{Binding Source={x:Type tfs:Severity},Converter={StaticResource EnumToItemsSourceConverter}}" SelectedValue="{Binding WorkItem.Severity}" SelectedValuePath="Value" DisplayMemberPath="DisplayName"></ComboBox>
+
+ <TextBlock Margin="0 10 0 0">Tags</TextBlock>
+ <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Height="120">
+ <ItemsControl ItemsSource="{Binding SelectedTags}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel IsItemsHost="True" Orientation="Horizontal" />
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <ToggleButton Style="{StaticResource emptyToggleButton}" IsChecked="{Binding IsSelected}" Cursor="Hand">
+ <Border CornerRadius="5" Margin="0 5 5 5" Padding="5" BorderThickness="1" BorderBrush="DimGray">
+ <Border.Style>
+ <Style TargetType="Border">
+ <Setter Property="Background" Value="Silver"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding IsSelected}" Value="True">
+ <Setter Property="Background" Value="{StaticResource AccentColorBrush}"></Setter>
+ <Setter Property="TextElement.Foreground" Value="White"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Border.Style>
+ <TextBlock Text="{Binding Data.Name}" FontSize="11"></TextBlock>
+ </Border>
+ </ToggleButton>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </ScrollViewer>
+ </StackPanel>
+ </Grid>
+
+ <Grid Grid.Row="2">
+ <Button HorizontalAlignment="Right" Width="140" Command="{Binding OKCommand}">SUBMIT</Button>
+
+ <ItemsControl ItemsSource="{Binding ValidationErrors}" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Center" Visibility="Visible">
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <TextBlock Foreground="#FF4C4C" Margin="0 2 0 0"><Run>*</Run> <Run Text="{Binding}"></Run></TextBlock>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </Grid>
+ </Grid>
+ </Grid>
+</UserControl>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml.cs
new file mode 100644
index 000000000..91a288d3e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/ReportIssueView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.MachineStudio.UI.Views
+{
+ /// <summary>
+ /// Interaction logic for ReportIssueView.xaml
+ /// </summary>
+ public partial class ReportIssueView : UserControl
+ {
+ public ReportIssueView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/packages.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/packages.config
index 5dcc330a7..9568f9f90 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/packages.config
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/packages.config
@@ -3,6 +3,7 @@
<package id="CommonServiceLocator" version="1.3" targetFramework="net46" />
<package id="Dragablz" version="0.0.3.197" targetFramework="net46" />
<package id="EntityFramework" version="6.0.0" targetFramework="net46" />
+ <package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net46" />
<package id="FluentFTP" version="19.1.2" targetFramework="net46" />
<package id="FontAwesome.WPF" version="4.7.0.9" targetFramework="net46" />
<package id="Google.Protobuf" version="3.4.1" targetFramework="net46" />
@@ -10,8 +11,6 @@
<package id="MahApps.Metro" version="1.5.0" targetFramework="net46" />
<package id="MaterialDesignColors" version="1.1.2" targetFramework="net46" />
<package id="MaterialDesignThemes" version="2.3.1.953" targetFramework="net46" />
- <package id="MvvmLight" version="5.3.0.0" targetFramework="net46" />
- <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net46" />
<package id="SimpleValidator" version="0.6.1.0" targetFramework="net46" />
<package id="System.Data.SQLite" version="1.0.106.0" targetFramework="net46" />
<package id="System.Data.SQLite.Core" version="1.0.106.0" targetFramework="net46" />