diff options
| author | Avi Levkovich <avi@twine-s.com> | 2018-04-25 09:44:13 +0300 |
|---|---|---|
| committer | Avi Levkovich <avi@twine-s.com> | 2018-04-25 09:44:13 +0300 |
| commit | d352d3b3bd785d9eb8a93347333de0b357f7ce0e (patch) | |
| tree | 2488173ea7e4f9d5ddb6ef53de57998815732847 /Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI | |
| parent | c82908b6d5314bc2602ea10c373267b79fbdd810 (diff) | |
| parent | a89077bae848d010ae70da6be572dee3b824a895 (diff) | |
| download | Tango-d352d3b3bd785d9eb8a93347333de0b357f7ce0e.tar.gz Tango-d352d3b3bd785d9eb8a93347333de0b357f7ce0e.zip | |
Start SPI ADS1220
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI')
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 Binary files differnew file mode 100644 index 000000000..ed4b8e6e6 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/bug.png 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" /> |
