aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Modules/Tango.PPC.Jobs/Controls/JobSummeryViewer.xaml
blob: fd0a63456dd3ba55f5fed6b42fd8f3dfa042f48c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<UserControl x:Class="Tango.PPC.Jobs.Controls.JobSummeryViewer"
             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:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:enumerations="clr-namespace:Tango.BL.Enumerations;assembly=Tango.BL"
             xmlns:entities="clr-namespace:Tango.BL.Entities;assembly=Tango.BL"
             xmlns:local="clr-namespace:Tango.PPC.Jobs.Controls"
             mc:Ignorable="d" 
             d:DesignHeight="60" d:DesignWidth="500" Height="38" d:DataContext="{d:DesignInstance Type=entities:Job, IsDesignTimeCreatable=False}" x:Name="control">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="1*" />
            </Grid.RowDefinitions>

            <ItemsControl ClipToBounds="False" ItemsSource="{Binding EffectiveSegments,IsAsync=True}" Visibility="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DisplayMarkers,Converter={StaticResource BooleanToVisibilityConverter}}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid x:Name="grid">
                            <Grid.Width>
                                <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}">
                                    <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.Length"></Binding>
                                    <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding>
                                    <Binding Path="LengthWithFactor"></Binding>
                                </MultiBinding>
                            </Grid.Width>

                            <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource TangoSmallFontSize}">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="Visibility" Value="Visible"></Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding ElementName=grid,Path=ActualWidth,Converter={StaticResource SmallerThanToBooleanConverter},ConverterParameter=20}" Value="True">
                                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                                 <Run Text="{Binding LengthWithFactor,Mode=OneWay,StringFormat=N0,IsAsync=True}"></Run><Run Text="m"></Run>
                            </TextBlock>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

            <Border Grid.Row="1" x:Name="brush_border" ClipToBounds="False" CornerRadius="10" Margin="0 5 0 0">
                <Border.Clip>
                    <RectangleGeometry RadiusX="10" RadiusY="10">
                        <RectangleGeometry.Rect>
                            <MultiBinding Converter="{StaticResource WidthHeightToRectConverter}">
                                <Binding ElementName="brush_border" Path="ActualWidth"  />
                                <Binding ElementName="brush_border" Path="ActualHeight"  />
                            </MultiBinding>
                        </RectangleGeometry.Rect>
                    </RectangleGeometry>
                </Border.Clip>
                <Grid>
                    <ItemsControl ClipToBounds="False" ItemsSource="{Binding EffectiveSegments,IsAsync=True}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" ClipToBounds="False"></StackPanel>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.Width>
                                        <MultiBinding Converter="{StaticResource SegmentLengthToWidthConverter}">
                                            <Binding RelativeSource="{RelativeSource AncestorType=UserControl}" Path="DataContext.Length"></Binding>
                                            <Binding RelativeSource="{RelativeSource AncestorType=ItemsControl}" Path="ActualWidth"></Binding>
                                            <Binding Path="LengthWithFactor"></Binding>
                                        </MultiBinding>
                                    </Grid.Width>
                                    <Rectangle Fill="{Binding SegmentBrush}"></Rectangle>
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

                    <Rectangle Stroke="{StaticResource TangoGrayBrush}" StrokeThickness="1" StrokeDashArray="5 5 5 5" RadiusX="10" RadiusY="10" />
                </Grid>
            </Border>
        </Grid>

        <Grid Grid.Column="1" VerticalAlignment="Bottom">
            <Grid.Style>
                <Style TargetType="Grid">
                    <Setter Property="Visibility" Value="Collapsed"></Setter>
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding JobType}" Value="{x:Static enumerations:JobTypes.Embroidery}" />
                                <Condition Binding="{Binding ElementName=control,Path=IsActive}" Value="False" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Visibility" Value="Visible"></Setter>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </Grid.Style>

            <TextBlock Margin="10 0 0 -2" VerticalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">
                <Run Text="x"></Run><Run Text="{Binding NumberOfUnits}"></Run>
            </TextBlock>
        </Grid>
    </Grid>
</UserControl>
using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.Core; using Tango.Core.DI; using Tango.Core.Helpers; using Tango.PPC.Common.Application; using Tango.PPC.Common.Connection; using Tango.PPC.Common.Notifications; using Tango.PPC.Shared.Updates; namespace Tango.PPC.Common.UpdatePackages { public class DefaultPackageRunner : ExtendedObject, IPackageRunner { private JsonSerializerSettings _jsonSettings; private String _configFile; private PackagesFile _packagesFile; public event EventHandler<PackageStateChangedEventArgs> PackageStateChanged; public event EventHandler<PackageProgressEventArgs> PackageProgress; public DefaultPackageRunner() { _jsonSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, Error = (sender, args) => { args.ErrorContext.Handled = true; LogManager.Log(args.ErrorContext.Error.Message); } }; _jsonSettings.Converters.Add(new StringEnumConverter(false)); _configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Twine", "Tango", "Packages", "packages.json"); } public Task<PackagesFile> GetPackagesFile() { return Task.Factory.StartNew<PackagesFile>(() => { if (_packagesFile != null) { return _packagesFile; } else { Directory.CreateDirectory(Path.GetDirectoryName(_configFile)); _packagesFile = new PackagesFile(); try { if (File.Exists(_configFile)) { LogManager.Log("Loading packages config from " + _configFile + "..."); _packagesFile = JsonConvert.DeserializeObject<PackagesFile>(File.ReadAllText(_configFile), _jsonSettings); } } catch (Exception ex) { LogManager.Log(ex, "Error loading packages file."); } return _packagesFile; } }); } private void SavePackagesConfig() { Directory.CreateDirectory(Path.GetDirectoryName(_configFile)); String json = String.Empty; if (_packagesFile != null) { json = JsonConvert.SerializeObject(_packagesFile, _jsonSettings); } else { json = JsonConvert.SerializeObject(new PackagesFile(), _jsonSettings); } File.WriteAllText(_configFile, json); } public Task<PackageRunnerResult> Run(PackageType type, Version deltaVersion, String packagesFolder) { return Task.Factory.StartNew<PackageRunnerResult>(() => { PackageRunnerResult result = new PackageRunnerResult(); PackageContext context = new PackageContext(); context.ApplicationManager = TangoIOC.Default.GetInstance<IPPCApplicationManager>(); context.MachineProvider = TangoIOC.Default.GetInstance<IMachineProvider>(); context.NotificationProvider = TangoIOC.Default.GetInstance<INotificationProvider>(); context.InstalledVersion = context.ApplicationManager.Version; context.DeltaVersion = deltaVersion; LogManager.Log($"Running {type}-update packages..."); //Get installed packages. _packagesFile = GetPackagesFile().Result; LogManager.Log($"Installed packages file:\n{_packagesFile}"); if (Debugger.IsAttached) { LogManager.Log("Debugger attached detected. switching packages folder to main application path..."); //TO DEBUG PACKAGES -- // //On DEBUG build the packages assemblies are copied to the main application output folder using post-build events. //Then, if a debugger is attached, we change the packages folder to the main output folder so they can be debugged easily. packagesFolder = AssemblyHelper.GetCurrentAssemblyFolder(); } LogManager.Log($"Scanning for packages on '{packagesFolder}'..."); //Get all packages in folder. foreach (var packageFile in Directory.GetFiles(packagesFolder, "*.dll")) { LogManager.Log($"Loading assembly '{Path.GetFileName(packageFile)}'..."); Assembly asm; //Load assembly and investigate for types based on package type. try { asm = Assembly.LoadFile(packageFile); } catch (Exception ex) { LogManager.Log(ex, "Error loading assembly!"); continue; } try { foreach (var packageType in asm.GetTypes().Where( x => typeof(IPPCPackage).IsAssignableFrom(x) && x.GetCustomAttribute<PPCPackageAttribute>() != null && x.GetCustomAttribute<PPCPackageAttribute>().Type == type)) { LogManager.Log($"Checking package '{packageType.FullName}'..."); try { //Getting installed package from file. var installedPackage = _packagesFile.PackageInstallations.SingleOrDefault(x => x.PackageName == packageType.FullName); //Check if requires installation. if (installedPackage == null || installedPackage.State != PackageInstallationState.Installed) { if (installedPackage == null) { LogManager.Log("Package was never installed."); installedPackage = new PackageInstallation(); installedPackage.State = PackageInstallationState.NotInstalled; installedPackage.PackageName = packageType.FullName; installedPackage.Type = type; _packagesFile.PackageInstallations.Add(installedPackage); } else { LogManager.Log($"Package installation state is '{installedPackage.State}' due to {installedPackage.FailedReason}"); } LogManager.Log("Installing package..."); //Install package... var att = packageType.GetCustomAttribute<PPCPackageAttribute>(); var packageInstance = Activator.CreateInstance(packageType) as IPPCPackage; if (packageInstance != null) { try { OnPackageRuns(att.Name, installedPackage.State, installedPackage.Type); installedPackage.InstallationDate = DateTime.Now; context.ProgressAction = (message, isIntermediate, progress, total) => { PackageProgress?.Invoke(this, new PackageProgressEventArgs() { PackageName = att.Name, Message = message, IsIntermediate = isIntermediate, Progress = progress, Total = total }); }; PackageProgress?.Invoke(this, new PackageProgressEventArgs() { PackageName = type == PackageType.Pre ? "Preparing" : "Finalizing", Message = att.Name, IsIntermediate = true, Progress = 0, Total = 100 }); packageInstance.Run(context).GetAwaiter().GetResult(); installedPackage.State = PackageInstallationState.Installed; installedPackage.FailedReason = null; OnPackageRuns(att.Name, installedPackage.State, installedPackage.Type); LogManager.Log("Package installed successfully."); if (att.RequiresRestart) { result.RestartRequired = true; } Thread.Sleep(2000); } catch (Exception ex) { LogManager.Log(ex, "Package installation failed."); installedPackage.State = PackageInstallationState.Failed; installedPackage.FailedReason = ex.FlattenMessage(); OnPackageRuns(att.Name, installedPackage.State, installedPackage.Type); continue; } } } else { LogManager.Log("Package is already installed."); } } catch (Exception ex) { LogManager.Log(ex, "Error in handling the package!"); continue; } } } catch (Exception ex) { LogManager.Log(ex, "Error investigating assembly!"); continue; } } //Save package file. LogManager.Log("Running packages has completed. Saving packages config file."); try { SavePackagesConfig(); } catch (Exception ex) { LogManager.Log(ex, "Error saving packages file!"); } return result; }); } public Task<bool> IsPackageInstallationRequired(PackageType type, String packagesFolder) { return Task.Factory.StartNew<bool>(() => { LogManager.Log("Checking if any package installation is required..."); _packagesFile = GetPackagesFile().Result; //Get all packages in folder. foreach (var packageFile in Directory.GetFiles(packagesFolder, "*.dll")) { LogManager.Log($"Loading assembly '{Path.GetFileName(packageFile)}'..."); Assembly asm; //Load assembly and investigate for types based on package type. try { asm = Assembly.LoadFile(packageFile); } catch (Exception ex) { LogManager.Log(ex, "Error loading assembly!"); continue; } try { foreach (var packageType in asm.GetTypes().Where( x => typeof(IPPCPackage).IsAssignableFrom(x) && x.GetCustomAttribute<PPCPackageAttribute>() != null && x.GetCustomAttribute<PPCPackageAttribute>().Type == type)) { LogManager.Log($"Checking package '{packageType.FullName}'..."); try { //Getting installed package from file. var installedPackage = _packagesFile.PackageInstallations.SingleOrDefault(x => x.PackageName == packageType.FullName); //Check if requires installation. if (installedPackage == null || installedPackage.State != PackageInstallationState.Installed) { if (installedPackage == null) { LogManager.Log("Package was never installed."); return true; } else { LogManager.Log($"Package installation state is '{installedPackage.State}' due to {installedPackage.FailedReason}"); return true; } } else { LogManager.Log("Package is already installed."); } } catch (Exception ex) { LogManager.Log(ex, "Error in handling the package!"); continue; } } } catch (Exception ex) { LogManager.Log(ex, "Error investigating assembly!"); continue; } } LogManager.Log("No packages to install."); return false; }); } protected virtual void OnPackageRuns(String packageName, PackageInstallationState state, PackageType type) { PackageStateChanged?.Invoke(this, new PackageStateChangedEventArgs() { PackageName = packageName, State = state, PackageType = type, }); } } }