Imports System.Collections.ObjectModel Imports EgtWPFLib5 Imports Newtonsoft.Json Imports System.IO Imports EgtBEAMWALL.Core Imports EgtUILib Imports System.ComponentModel Imports System.Globalization Public Class StrategyManagerVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private m_StrategySetupList As New ObservableCollection(Of StrategySetup) Public ReadOnly Property StrategySetupList As ObservableCollection(Of StrategySetup) Get Return m_StrategySetupList End Get End Property Private m_SelStrategySetup As StrategySetup Public Property SelStrategySetup As StrategySetup Get Return m_SelStrategySetup End Get Set(value As StrategySetup) m_SelStrategySetup = value m_SelStrategySetup.Read() NotifyPropertyChanged(NameOf(SelStrategySetup)) End Set End Property ' Permette di selezionare l'elemento dell'albero Public m_SelTreeItem As Topology Public Property SelTreeItem As Topology Get Return m_SelTreeItem End Get Set(value As Topology) m_SelTreeItem = value NotifyPropertyChanged(NameOf(SelTreeItem)) End Set End Property ''' ''' Funzione che aggiorna la selezione dell'elemento dell'albero ''' ''' Elemento dell'albero Friend Sub UpdateSelTreeItem(Item As Topology) m_SelTreeItem = Item NotifyPropertyChanged(NameOf(SelTreeItem)) End Sub ' Utilizzato per indicare che viene effettuata una modifica Private m_bIsModifyStrategy As Boolean = False Public ReadOnly Property bIsModifyStrategy As Boolean Get Return m_bIsModifyStrategy End Get End Property Friend Sub SetbIsModifyStrategy(value As Boolean) m_bIsModifyStrategy = value If m_bIsModifyStrategy Then SetSaveImage("pack://application:,,,/Resources/NewPage/SaveModify.png") Else SetSaveImage("pack://application:,,,/Resources/ProjectManager/Save.png") End If NotifyPropertyChanged(NameOf(bIsModifyStrategy)) End Sub ' Immagine SaveCommand Private m_SaveImage As String = "pack://application:,,,/Resources/ProjectManager/Save.png" Public ReadOnly Property SaveImage As String Get Return m_SaveImage End Get End Property Friend Sub SetSaveImage(value As String) m_SaveImage = value NotifyPropertyChanged(NameOf(SaveImage)) End Sub ' Lista che contiene le strategie filtrate Private m_StrategyProductionList As New ObservableCollection(Of Strategy) Public Property StrategyProductionList As ObservableCollection(Of Strategy) Get Return m_StrategyProductionList End Get Set(value As ObservableCollection(Of Strategy)) m_StrategyProductionList = value NotifyPropertyChanged(NameOf(StrategyProductionList)) End Set End Property Private m_StrategyProductionPath As String = String.Empty Public ReadOnly Property StrategyProductionPath As String Get Return m_StrategyProductionPath End Get End Property Friend Sub SetStrategyProductionPath(value As String) m_StrategyProductionPath = value NotifyPropertyChanged(NameOf(StrategyProductionPath)) End Sub #Region "Messages" Public ReadOnly Property SaveToolTip As String Get Return EgtMsg(62571) End Get End Property Public ReadOnly Property SaveAsToolTip As String Get Return EgtMsg(62572) End Get End Property #End Region ' Messages ' Definizione Comandi Private m_AddSelectedStrategyCommand As ICommand Private m_RemoveSelectedStrategyCommand As ICommand Private m_OpenCommand As ICommand Private m_SaveCommand As ICommand Private m_OpenFileNameCustomConfigCommand As ICommand Private m_MoveUpSelectedStrategyCommand As ICommand Private m_MoveDownSelectedStrategyCommand As ICommand Private m_cmdOk As ICommand Private m_cmdCancel As ICommand #End Region ' Field & Properties #Region "CONSTRUCTOR" Sub New() ' Setto riferimento Map.SetRefStrategyManagerVM(Me) ' leggo cartella dei setup delle strategie Dim AISetupDirPath As String = Map.refMainWindowVM.MainWindowM.GetAISetupDirPath() Dim AISetupPaths As String() = Directory.GetFiles(AISetupDirPath) For Each AiSetup In AISetupPaths m_StrategySetupList.Add(New StrategySetup(Path.GetFileNameWithoutExtension(AiSetup))) Next If m_StrategySetupList.Count > 0 Then SelStrategySetup = m_StrategySetupList(0) End If ' Assegno riferimento funzione per aggiornare elemento selezionato dall'albero Topology.refUpdateSelTreeItem = AddressOf UpdateSelTreeItem End Sub #End Region ' Constructor #Region "METHODS" ''' ''' Funzione per creare file json ''' Friend Sub CreateCustumerConfigJsonFile(fileCostumerConfig As String) Try Dim m_JsonStrategyFeatureList As New ObservableCollection(Of JsonStrategyFeature)(m_SelStrategySetup.StrategyFeatureList.Select(AddressOf ConvertToJsonStrategy)) ' Serializzazione in JSON Dim AvailableStrategyListjsonFile As String = JsonConvert.SerializeObject(m_JsonStrategyFeatureList, Formatting.Indented) ' Scrittura su file File.WriteAllText(Map.refMainWindowVM.MainWindowM.GetAISetupDirPath() & "\" & fileCostumerConfig & ".json", AvailableStrategyListjsonFile) Catch ex As Exception EgtOutLog("Errore durante la creazione del file JSON: " & ex.Message) End Try End Sub ''' ''' Funzione per convertire da AvailableStrategy a JsonAvailableStrategy ''' ''' ''' Private Function ConvertToJsonStrategy(StrategyFeature As StrategyFeature) As JsonStrategyFeature Return New JsonStrategyFeature With { .sName = StrategyFeature.sName, .nPRC = StrategyFeature.nPRC, .nGRP = StrategyFeature.nGRP, .TopologyList = New ObservableCollection(Of JsonTopology)(StrategyFeature.TopologyList.Select(AddressOf ConvertToJsonTopology))} End Function ''' ''' Funzione per convertire da Topology a JsonTopology ''' ''' ''' Private Function ConvertToJsonTopology(Topology As Topology) As JsonTopology Return New JsonTopology With { .sName = Topology.sName, .StrategyList = New ObservableCollection(Of JsonStrategy)(Topology.StrategyList.Select(AddressOf ConvertToJsonStrategyConfiguration)) } End Function ''' ''' Funzione per convertire da StrategyConfiguration a JsonStrategyConfiguration ''' ''' ''' Private Function ConvertToJsonStrategyConfiguration(Strategy As Strategy) As JsonStrategy Return New JsonStrategy With { .sStrategyID = Strategy.sStrategyID, .nIndexInList = Strategy.nIndexInList, .bActive = Strategy.bActive, .ParameterList = New ObservableCollection(Of JsonGenericParameter)(Strategy.ParameterList.Select(AddressOf ConvertToJsonParameter))} End Function ''' ''' Funzione per convertire da GenericParameter a JsonGenericParameter ''' ''' ''' Private Function ConvertToJsonParameter(GenericParameter As GenericParameter) As JsonGenericParameter Return New JsonGenericParameter With { .sName = GenericParameter.sName, .sNameNge = GenericParameter.sNameNge, .sValue = GenericParameter.sValue, .sDescriptionShort = GenericParameter.sDescriptionShort, .sDescriptionLong = GenericParameter.sDescriptionLong, .sType = GenericParameter.sType, .sMessageId = GenericParameter.sMessageId, .sMinUserLevel = GenericParameter.sMinUserLevel, .Choices = New ObservableCollection(Of JsonChoiceParameter)(GenericParameter.Choices.Select(AddressOf ConvertToJsonChoiceParameter))} End Function ''' ''' Funzione per convertire da ChoicesParameter a JsonChoicesParameter ''' ''' ''' Private Function ConvertToJsonChoiceParameter(ChoiceParameter As ChoiceParameter) As JsonChoiceParameter Return New JsonChoiceParameter With { .sValue = ChoiceParameter.sValue, .sDescriptionShort = ChoiceParameter.sDescriptionShort, .sDescriptionLong = ChoiceParameter.sDescriptionLong, .sMessageId = ChoiceParameter.sMessageId} End Function ''' ''' Funzione che salva il file CustomConfig Json ''' Private Sub SaveJson() ' Determina il nome del file JSON Dim fileCustomerConfigJson As String = If(Not IsNothing(m_SelStrategySetup), CUSTOMERCONFIG_FILE, m_SelStrategySetup.sName) ' Se l'elemento selezionato è vuoto assegno il default e lo aggiungo alla lista If IsNothing(m_SelStrategySetup) Then m_SelStrategySetup.sName = CUSTOMERCONFIG_FILE m_StrategySetupList.Add(m_SelStrategySetup) NotifyPropertyChanged(NameOf(SelStrategySetup.sName)) NotifyPropertyChanged(NameOf(StrategySetupList)) End If ' Crea il file JSON CreateCustumerConfigJsonFile(fileCustomerConfigJson) ' Se un file è stato selezionato, resetta il flag di modifica SetbIsModifyStrategy(False) End Sub ''' ''' Funzione che salva il file customconfig se sono presenti modifiche ''' Friend Sub SaveCustomConfigJson() ' Controlla se il file JSON è stato modificato If Not m_bIsModifyStrategy Then Return ' Chiede conferma per il salvataggio If MessageBox.Show("Il file Json è stato modificato. Vuoi salvarlo?", EgtMsg(15003), MessageBoxButton.YesNo, MessageBoxImage.Information) = MessageBoxResult.Yes Then SaveJson() End If End Sub ''' ''' Funzione che recupera le strategie filtrate ''' Friend Sub GetStrategyProduction() ' Pulisco la lista m_StrategyProductionList.Clear() ' Recupero Feature selezionata Dim selFeature As BTLFeatureVM = Map.refProjectVM.MachGroupPanelVM.SelectedMachGroup.SelPart.SelFeatureVM ' Popolo la lista con le strategie Dim AvailableStrategyItem As StrategyFeature = m_SelStrategySetup.StrategyFeatureList.FirstOrDefault(Function(AvailableStrategy) selFeature.nPRC = AvailableStrategy.nPRC AndAlso selFeature.nSelGRP = AvailableStrategy.nGRP) ' Controllo se AvailableStrategyItem non è nullo If Not IsNothing(AvailableStrategyItem) Then ' Se esiste, popola la lista con le strategie m_StrategyProductionList = New ObservableCollection(Of Strategy)(AvailableStrategyItem.TopologyList.SelectMany(Function(topology) topology.StrategyList)) End If NotifyPropertyChanged(NameOf(StrategyProductionList)) End Sub #End Region ' Methods #Region "COMMANDS" #Region "AddSelectedStrategyCommand" Public ReadOnly Property AddSelectedStrategyCommand As ICommand Get If m_AddSelectedStrategyCommand Is Nothing Then m_AddSelectedStrategyCommand = New Command(AddressOf AddSelectedStrategyToActiveStrategy) End If Return m_AddSelectedStrategyCommand End Get End Property ''' ''' Funzione che permette di aggiungere la strategia da StrategyList a ActiveStrategyList ''' Public Sub AddSelectedStrategyToActiveStrategy() ' Controllo se SelectedStrategy se è nullo esco If IsNothing(m_SelTreeItem.SelAvailableStrategy) Then Return ' Setto a true booleano per modifica SetbIsModifyStrategy(True) ' Setto indice per capire che la strategia è stata spostata in ActiveStrategyList m_SelTreeItem.SelAvailableStrategy.SetIndexList(m_SelTreeItem.StrategyList.Count - 1) ' Aggiorno le liste m_SelTreeItem.AvailableStrategyList_View.Refresh() m_SelTreeItem.ActiveStrategyList_View.Refresh() End Sub #End Region ' AddSelectedStrategyCommand #Region "RemoveSelectedStrategyCommand" Public ReadOnly Property RemoveSelectedStrategyCommand As ICommand Get If m_RemoveSelectedStrategyCommand Is Nothing Then m_RemoveSelectedStrategyCommand = New Command(AddressOf RemoveSelectedStrategyToActiveStrategy) End If Return m_RemoveSelectedStrategyCommand End Get End Property ''' ''' Funzione che rimuove la strategia da ActiveStrategyList e la riaggiunge a StrategyList ''' Public Sub RemoveSelectedStrategyToActiveStrategy() ' Controllo se SelectedActiveStrategy se è nullo esco If IsNothing(m_SelTreeItem.SelActiveStrategy) Then Return ' Setto indice per capire che la strategia è stata spostata in StrategyList m_SelTreeItem.SelActiveStrategy.SetIndexList(-1) ' Aggiorno le liste m_SelTreeItem.AvailableStrategyList_View.Refresh() m_SelTreeItem.ActiveStrategyList_View.Refresh() End Sub #End Region ' RemoveSelectedStrategyCommand #Region "OpenFileNameCustomConfigCommand" Public ReadOnly Property OpenFileNameCustomConfigCommand As ICommand Get If m_OpenFileNameCustomConfigCommand Is Nothing Then m_OpenFileNameCustomConfigCommand = New Command(AddressOf OpenFileNameCustomConfig) End If Return m_OpenFileNameCustomConfigCommand End Get End Property ''' ''' Funzione che visualizza la textbox ''' Public Sub OpenFileNameCustomConfig() Dim SaveAsStrategyWnd As New SaveAsStrategyV With { .DataContext = New SaveAsStrategyVM, .Owner = Application.Current.MainWindow } SaveAsStrategyWnd.ShowDialog() End Sub #End Region ' OpenFileNameCustomConfigCommand #Region "SaveCommand" Public ReadOnly Property SaveCommand As ICommand Get If m_SaveCommand Is Nothing Then m_SaveCommand = New Command(AddressOf Save) End If Return m_SaveCommand End Get End Property ''' ''' Funzione che salva il file json CustomerConfig ''' Public Sub Save() SaveJson() End Sub #End Region ' SaveCommand #Region "MoveUpSelectedStrategyCommand" Public ReadOnly Property MoveUpSelectedStrategyCommand As ICommand Get If m_MoveUpSelectedStrategyCommand Is Nothing Then m_MoveUpSelectedStrategyCommand = New Command(AddressOf MoveUpSelectedStrategy) End If Return m_MoveUpSelectedStrategyCommand End Get End Property ''' ''' Funzione che permette di spostare in alto la strategia selezionata ''' Public Sub MoveUpSelectedStrategy() ' Controllo se SelectedActiveStrategy se è nullo esco If IsNothing(m_SelTreeItem.SelActiveStrategy) Then Return ' Recupero indice elemento selezionato in lista Dim IndexActiveStrategy As Integer = m_SelTreeItem.StrategyList.IndexOf(m_SelTreeItem.SelActiveStrategy) ' Recupero indice elemento selezionato in lista Dim NewIndexActiveStrategy As Integer = IndexActiveStrategy - 1 ' Se l'indice è maggiore di 0 If IndexActiveStrategy > 0 Then ' Muovo l'elemento selezionato sopra di 1 m_SelTreeItem.StrategyList.Move(IndexActiveStrategy, NewIndexActiveStrategy) End If ' Aggiorno la lista m_SelTreeItem.ActiveStrategyList_View.MoveCurrentToNext() m_SelTreeItem.ActiveStrategyList_View.Refresh() End Sub #End Region ' MoveUpSelectedStrategyCommand #Region "MoveDownSelectedStrategyCommand" Public ReadOnly Property MoveDownSelectedStrategyCommand As ICommand Get If m_MoveDownSelectedStrategyCommand Is Nothing Then m_MoveDownSelectedStrategyCommand = New Command(AddressOf MoveDownSelectedStrategy) End If Return m_MoveDownSelectedStrategyCommand End Get End Property ''' ''' Funzione che permette di spostare in basso la strategia selezionata ''' Public Sub MoveDownSelectedStrategy() If IsNothing(m_SelTreeItem.SelActiveStrategy) Then Return ' Recupero indice elemento selezionato in lista Dim IndexActiveStrategy As Integer = m_SelTreeItem.StrategyList.IndexOf(m_SelTreeItem.SelActiveStrategy) ' Recupero indice elemento selezionato in lista Dim NewIndexActiveStrategy As Integer = IndexActiveStrategy + 1 ' Se l'indice è maggiore di 0 If IndexActiveStrategy >= 0 Then ' Muovo l'elemento selezionato sopra di 1 m_SelTreeItem.StrategyList.Move(IndexActiveStrategy, NewIndexActiveStrategy) End If ' Aggiorno la lista m_SelTreeItem.ActiveStrategyList_View.Refresh() End Sub #End Region ' MoveDownSelectedStrategyCommand #Region "Ok_Command" Public ReadOnly Property Ok_Command As ICommand Get If m_cmdOk Is Nothing Then m_cmdOk = New Command(AddressOf Ok) End If Return m_cmdOk End Get End Property Public Sub Ok() Map.refProjectVM.SetSelManagerTab(ProjectVM.StrategyManagerTab.RAWPARTMANAGER) ' Abilito LeftPanel Map.refProjectVM.SetOnlyProdLeftPanel_IsEnabled(True) Map.refProjectVM.SetOnlyProdLeftPanel_Opacity(1) End Sub #End Region ' Ok_Command #Region "Cancel_Command" Public ReadOnly Property Cancel_Command As ICommand Get If m_cmdCancel Is Nothing Then m_cmdCancel = New Command(AddressOf Cancel) End If Return m_cmdCancel End Get End Property Public Sub Cancel() Map.refProjectVM.SetSelManagerTab(ProjectVM.StrategyManagerTab.RAWPARTMANAGER) ' Abilito LeftPanel Map.refProjectVM.SetOnlyProdLeftPanel_IsEnabled(True) Map.refProjectVM.SetOnlyProdLeftPanel_Opacity(1) End Sub #End Region ' Cancel_Command #End Region ' Commands End Class '----------- Classe che rappresenta un file di setup delle strategie ----------- Public Class StrategySetup Inherits VMBase #Region "FIELDS & PROPERTIES" Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value End Set End Property Private m_StrategyFeatureList As New ObservableCollection(Of StrategyFeature) Public Property StrategyFeatureList As ObservableCollection(Of StrategyFeature) Get Return m_StrategyFeatureList End Get Set(value As ObservableCollection(Of StrategyFeature)) m_StrategyFeatureList = value End Set End Property Private m_SelStrategyFeature As StrategyFeature Public Property SelStrategyFeature As StrategyFeature Get Return m_SelStrategyFeature End Get Set(value As StrategyFeature) m_SelStrategyFeature = value NotifyPropertyChanged(NameOf(SelStrategyFeature)) End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(sName As String) m_sName = sName End Sub #End Region ' Constructor #Region "METHODS" Friend Sub Read() ' carico default Dim sStrategiesDirPath As String = Map.refMainWindowVM.MainWindowM.GetStrategiesDirPath() Dim sAvailableStrategiesFilePath As String = sStrategiesDirPath & "\" & AVAILABLESTRATEGYLIST_FILE & ".json" If File.Exists(sAvailableStrategiesFilePath) Then Dim sReadedFile As String = File.ReadAllText(sAvailableStrategiesFilePath) Dim JsonStrategyFeatureList As List(Of JsonStrategyFeature) = JsonConvert.DeserializeObject(Of List(Of JsonStrategyFeature))(sReadedFile) m_StrategyFeatureList = New ObservableCollection(Of StrategyFeature)((From JsonStrategyFeature In JsonStrategyFeatureList Select New StrategyFeature(JsonStrategyFeature)).ToList()) End If ' carico custom Dim sAISetupDirPath As String = Map.refMainWindowVM.MainWindowM.GetAISetupDirPath() Dim sStrategyConfigurationFilePath As String = sAISetupDirPath & "\" & sName & ".json" If File.Exists(sStrategyConfigurationFilePath) Then Dim sReadedFile As String = File.ReadAllText(sStrategyConfigurationFilePath) Dim JsonStrategyFeatureList As List(Of JsonStrategyFeature) = JsonConvert.DeserializeObject(Of List(Of JsonStrategyFeature))(sReadedFile) For Each Feature In JsonStrategyFeatureList Dim DefaultFeature As StrategyFeature = m_StrategyFeatureList.FirstOrDefault(Function(x) x.nPRC = Feature.nPRC AndAlso x.nGRP = Feature.nGRP) ' gestire caso non venga trovata perchè non esiste più in default??' If Not IsNothing(DefaultFeature) Then For Each Topology In Feature.TopologyList Dim DefaultTopology As Topology = DefaultFeature.TopologyList.FirstOrDefault(Function(x) x.sName = Topology.sName) ' gestire caso non venga trovata perchè non esiste più in default??' For Each Strategy In Topology.StrategyList Dim DefaultStrategy As Strategy = DefaultTopology.StrategyList.FirstOrDefault(Function(x) x.sStrategyID = Strategy.sStrategyID) If IsNothing(DefaultStrategy) Then DefaultTopology.StrategyList.Add(New Strategy(DefaultTopology, Strategy)) ' verifico indici!! Else DefaultStrategy.ReadConfiguration(Strategy) End If Next Next End If Next End If End Sub #End Region ' Methods End Class '----------- Classe che fa riferimento alle Feature ----------- Public Class StrategyFeature Inherits VMBase #Region "FIELDS & PROPETIES" Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_nPRC As Integer Public Property nPRC As Integer Get Return m_nPRC End Get Set(value As Integer) m_nPRC = value NotifyPropertyChanged(NameOf(nPRC)) End Set End Property Private m_nGRP As Integer Public Property nGRP As Integer Get Return m_nGRP End Get Set(value As Integer) m_nGRP = value NotifyPropertyChanged(NameOf(nGRP)) End Set End Property Private m_TopologyList As New ObservableCollection(Of Topology) Public Property TopologyList As ObservableCollection(Of Topology) Get Return m_TopologyList End Get Set(value As ObservableCollection(Of Topology)) m_TopologyList = value NotifyPropertyChanged(NameOf(TopologyList)) End Set End Property #End Region ' Fields & Propeties #Region "CONSTRUCTOR" Sub New(JsonStrategyFeature As JsonStrategyFeature) If IsNothing(JsonStrategyFeature) Then Return m_sName = JsonStrategyFeature.sName m_nPRC = JsonStrategyFeature.nPRC m_nGRP = JsonStrategyFeature.nGRP m_TopologyList = New ObservableCollection(Of Topology)(JsonStrategyFeature.TopologyList.Select(Function(jsonTopology) New Topology(jsonTopology))) NotifyPropertyChanged(NameOf(TopologyList)) End Sub #End Region ' Constructor End Class '----------- Classe che fa riferimento alle Topologie delle Feature ----------- Public Class Topology Inherits VMBase #Region "FIELDS & PROPETIES" Friend Shared refUpdateSelTreeItem As Action(Of Topology) Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_bIsSelected As Boolean Public Property IsSelected As Boolean Get Return m_bIsSelected End Get Set(value As Boolean) m_bIsSelected = value refUpdateSelTreeItem(Me) If Not value Then SelActiveStrategy = Nothing SelAvailableStrategy = Nothing End If m_AvailableStrategyList_View.Refresh() m_ActiveStrategyList_View.Refresh() End Set End Property Private m_AvailableStrategyList_View As ICollectionView = Nothing Public ReadOnly Property AvailableStrategyList_View As ICollectionView Get Return m_AvailableStrategyList_View End Get End Property Private m_ActiveStrategyList_View As ICollectionView = Nothing Public ReadOnly Property ActiveStrategyList_View As ICollectionView Get Return m_ActiveStrategyList_View End Get End Property Private m_StrategyList As New ObservableCollection(Of Strategy) Public Property StrategyList As ObservableCollection(Of Strategy) Get Return m_StrategyList End Get Set(value As ObservableCollection(Of Strategy)) m_StrategyList = value NotifyPropertyChanged(NameOf(StrategyList)) End Set End Property Private m_SelActiveStrategy As Strategy Public Property SelActiveStrategy As Strategy Get Return m_SelActiveStrategy End Get Set(value As Strategy) m_SelActiveStrategy = value SelParamStrategy = value End Set End Property Private m_SelAvailableStrategy As Strategy Public Property SelAvailableStrategy As Strategy Get Return m_SelAvailableStrategy End Get Set(value As Strategy) m_SelAvailableStrategy = value SelParamStrategy = value End Set End Property Private m_SelParamStrategy As Strategy Public Property SelParamStrategy As Strategy Get Return m_SelParamStrategy End Get Set(value As Strategy) m_SelParamStrategy = value NotifyPropertyChanged(NameOf(SelParamStrategy)) End Set End Property #End Region ' Fields & Propeties #Region "CONSTRUCTOR" Sub New(JsonTopology As JsonTopology) If IsNothing(JsonTopology) Then Return m_sName = JsonTopology.sName m_StrategyList = New ObservableCollection(Of Strategy)(JsonTopology.StrategyList.Select(Function(jsonStrategy) New Strategy(Me, jsonStrategy))) m_AvailableStrategyList_View = New ListCollectionView(StrategyList) m_AvailableStrategyList_View.Filter = AddressOf AvailableStrategyFilter m_ActiveStrategyList_View = New ListCollectionView(StrategyList) m_ActiveStrategyList_View.Filter = AddressOf ActiveStrategyFilter NotifyPropertyChanged(NameOf(StrategyList)) End Sub #End Region ' Constructor Private Function AvailableStrategyFilter(Strategy As Object) As Boolean Return DirectCast(Strategy, Strategy).nIndexInList < 0 End Function Private Function ActiveStrategyFilter(Strategy As Object) As Boolean Return DirectCast(Strategy, Strategy).nIndexInList >= 0 End Function End Class '----------- Classe che fa alle Strategie delle Topologie delle Feature ----------- Public Class Strategy Inherits VMBase #Region "FIELDS & PROPETIES" Private m_ParentTopology As Topology Private m_sStrategyID As String Public Property sStrategyID As String Get Return m_sStrategyID End Get Set(value As String) m_sStrategyID = value NotifyPropertyChanged(NameOf(sStrategyID)) End Set End Property Private m_nIndexInList As Integer = -1 Public Property nIndexInList As Integer Get Return m_nIndexInList End Get Set(value As Integer) m_nIndexInList = value NotifyPropertyChanged(NameOf(nIndexInList)) End Set End Property Friend Sub SetIndexList(value As Integer) m_nIndexInList = value If nIndexInList > -1 Then m_bActive = True Else m_bActive = False End If NotifyPropertyChanged(NameOf(nIndexInList)) NotifyPropertyChanged(NameOf(bActive)) End Sub Private m_bActive As Boolean Public ReadOnly Property bActive As Boolean Get Return m_bActive End Get End Property Private m_sImageStrategy As String = "pack://application:,,,/Resources/NewPage/LogoProvaStrategy.png" Public Property sImageStrategy As String Get Return m_sImageStrategy End Get Set(value As String) m_sImageStrategy = value NotifyPropertyChanged(NameOf(sImageStrategy)) End Set End Property Private m_ParameterList As New ObservableCollection(Of GenericParameter) Public Property ParameterList As ObservableCollection(Of GenericParameter) Get Return m_ParameterList End Get Set(value As ObservableCollection(Of GenericParameter)) m_ParameterList = value NotifyPropertyChanged(NameOf(ParameterList)) End Set End Property #End Region ' Fields & Propeties #Region "CONSTRUCTOR" Sub New(ParentTopology As Topology, JsonStrategy As JsonStrategy) m_ParentTopology = ParentTopology If IsNothing(JsonStrategy) Then Return m_sStrategyID = JsonStrategy.sStrategyID m_nIndexInList = JsonStrategy.nIndexInList m_bActive = JsonStrategy.bActive ReadConfigurationStrategyJson() 'NotifyPropertyChanged(NameOf(ParameterList)) End Sub #End Region ' Constructor ''' ''' Funzione che legge il file json delle strategie ''' Private Sub ReadConfigurationStrategyJson() ' Recupero file StrategyJson Dim StrategyPath As String = Map.refMainWindowVM.MainWindowM.GetStandardDirPath() & "\" & sStrategyID & "\" & sStrategyID & ".json" ' Controllo se il file esiste If Not File.Exists(StrategyPath) Then Return ' Leggo il contenuto del file JSON e deserializzo Dim StrategyJson As String = File.ReadAllText(StrategyPath) Dim strategyConfig As JsonStrategy = JsonConvert.DeserializeObject(Of JsonStrategy)(StrategyJson) ' Assegno ParamList per poter visualizzarla da interfaccia econtrollo di che tipo è se Strategy o JsonStrategy m_ParameterList = New ObservableCollection(Of GenericParameter)(strategyConfig.ParameterList.Select(Function(p) New GenericParameter(p)).ToList()) End Sub Friend Sub ReadConfiguration(ConfigurationStrategy As JsonStrategy) m_nIndexInList = ConfigurationStrategy.nIndexInList NotifyPropertyChanged(NameOf(nIndexInList)) 'm_ParentTopology.NotifyPropertyChanged(NameOf(m_ParentTopology.AvailableStrategyList_View)) 'm_ParentTopology.NotifyPropertyChanged(NameOf(m_ParentTopology.ActiveStrategyList_View)) For Each Parameter In ConfigurationStrategy.ParameterList Dim DefaultParameter As GenericParameter = m_ParameterList.FirstOrDefault(Function(x) x.sNameNge = Parameter.sNameNge) If IsNothing(DefaultParameter) Then m_ParameterList.Add(New GenericParameter(Parameter)) ' verifico indici!! Else DefaultParameter.sValue = Parameter.sValue End If Next End Sub End Class '----------- Classe che fa riferimento ai parametri delle Strategie ----------- Public Class GenericParameter Inherits VMBase #Region "FIELDS & PROPETIES" Private m_ParentStrategy As Strategy Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_sNameNge As String Public Property sNameNge As String Get Return m_sNameNge End Get Set(value As String) m_sNameNge = value NotifyPropertyChanged(NameOf(sNameNge)) End Set End Property Friend m_sValue As String Public Property sValue As String Get Return m_sValue End Get Set(value As String) m_sValue = value NotifyPropertyChanged(NameOf(sValue)) End Set End Property Private m_sDescriptionShort As String Public Property sDescriptionShort As String Get Return m_sDescriptionShort End Get Set(value As String) m_sDescriptionShort = value NotifyPropertyChanged(NameOf(sDescriptionShort)) End Set End Property Private m_sDescriptionLong As String Public Property sDescriptionLong As String Get Return m_sDescriptionLong End Get Set(value As String) m_sDescriptionLong = value NotifyPropertyChanged(NameOf(sDescriptionLong)) End Set End Property Private m_sType As String Public Property sType As String Get Return m_sType End Get Set(value As String) m_sType = value NotifyPropertyChanged(NameOf(sType)) End Set End Property Private m_sMessageId As String Public Property sMessageId As String Get Return m_sMessageId End Get Set(value As String) m_sMessageId = value NotifyPropertyChanged(NameOf(sMessageId)) End Set End Property Private m_sMinUserLevel As Integer Public Property sMinUserLevel As Integer Get Return m_sMinUserLevel End Get Set(value As Integer) m_sMinUserLevel = value NotifyPropertyChanged(NameOf(sMinUserLevel)) End Set End Property Private m_Choices As New ObservableCollection(Of ChoiceParameter) Public Property Choices As ObservableCollection(Of ChoiceParameter) Get Return m_Choices End Get Set(value As ObservableCollection(Of ChoiceParameter)) m_Choices = value NotifyPropertyChanged(NameOf(Choices)) End Set End Property ' Seleziona elemento nella combobox Choices Public m_SelectedChoice As ChoiceParameter Public Property SelectedChoice As ChoiceParameter Get Return m_SelectedChoice End Get Set(value As ChoiceParameter) m_SelectedChoice = value If Not IsNothing(m_SelectedChoice) Then m_sValue = m_SelectedChoice.sValue End If NotifyPropertyChanged(NameOf(SelectedChoice)) NotifyPropertyChanged(NameOf(sValue)) End Set End Property Friend m_SelTypeValue As Integer = 0 Public Property SelTypeValue As Integer Get Return m_SelTypeValue End Get Set(value As Integer) m_SelTypeValue = value NotifyPropertyChanged(NameOf(SelTypeValue)) End Set End Property #End Region ' Fields & Propeties #Region "CONSTRUCTOR" Sub New(JsonGenericParameter As JsonGenericParameter) If IsNothing(JsonGenericParameter) Then Return m_sName = JsonGenericParameter.sName m_sNameNge = JsonGenericParameter.sNameNge m_sValue = JsonGenericParameter.sValue m_sDescriptionShort = JsonGenericParameter.sDescriptionShort m_sDescriptionLong = JsonGenericParameter.sDescriptionLong m_sType = JsonGenericParameter.sType m_sMessageId = JsonGenericParameter.sMessageId m_sMinUserLevel = JsonGenericParameter.sMinUserLevel m_Choices = New ObservableCollection(Of ChoiceParameter)(JsonGenericParameter.Choices.Select(Function(jsonChoice) New ChoiceParameter(jsonChoice))) NotifyPropertyChanged(NameOf(Choices)) End Sub #End Region ' Constructor End Class '----------- Classe che fa riferimento ai parametri delle Scelte ----------- Public Class ChoiceParameter Inherits VMBase #Region "FIELD & PROPERTIES" Private m_sValue As String Public Property sValue As String Get Return m_sValue End Get Set(value As String) m_sValue = value NotifyPropertyChanged(NameOf(sValue)) End Set End Property Private m_sDescriptionShort As String Public Property sDescriptionShort As String Get Return m_sDescriptionShort End Get Set(value As String) m_sDescriptionShort = value NotifyPropertyChanged(NameOf(sDescriptionShort)) End Set End Property Private m_sDescriptionLong As String Public Property sDescriptionLong As String Get Return m_sDescriptionLong End Get Set(value As String) m_sDescriptionLong = value NotifyPropertyChanged(NameOf(sDescriptionLong)) End Set End Property Private m_sMessageId As String Public Property sMessageId As String Get Return m_sMessageId End Get Set(value As String) m_sMessageId = value NotifyPropertyChanged(NameOf(sMessageId)) End Set End Property #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New(JsonChoiceParameter As JsonChoiceParameter) If Not IsNothing(JsonChoiceParameter) Then m_sValue = JsonChoiceParameter.sValue m_sDescriptionShort = JsonChoiceParameter.sDescriptionShort m_sDescriptionLong = JsonChoiceParameter.sDescriptionLong m_sMessageId = JsonChoiceParameter.sMessageId End If End Sub #End Region ' Constructor End Class '----------- Classe che fa riferimento alle Feature del file Json ----------- Public Class JsonStrategyFeature Inherits VMBase #Region "FIELDS & PROPETIES" Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_nPRC As Integer Public Property nPRC As Integer Get Return m_nPRC End Get Set(value As Integer) m_nPRC = value NotifyPropertyChanged(NameOf(nPRC)) End Set End Property Private m_nGRP As Integer Public Property nGRP As Integer Get Return m_nGRP End Get Set(value As Integer) m_nGRP = value NotifyPropertyChanged(NameOf(nGRP)) End Set End Property Private m_TopologyList As New ObservableCollection(Of JsonTopology) Public Property TopologyList As ObservableCollection(Of JsonTopology) Get Return m_TopologyList End Get Set(value As ObservableCollection(Of JsonTopology)) m_TopologyList = value NotifyPropertyChanged(NameOf(TopologyList)) End Set End Property #End Region ' Fields & Propeties End Class '----------- Classe che fa riferimento alle Topologie delle Feature del file Json ----------- Public Class JsonTopology Inherits VMBase #Region "FIELDS & PROPETIES" Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_StrategyList As New ObservableCollection(Of JsonStrategy) Public Property StrategyList As ObservableCollection(Of JsonStrategy) Get Return m_StrategyList End Get Set(value As ObservableCollection(Of JsonStrategy)) m_StrategyList = value NotifyPropertyChanged(NameOf(StrategyList)) End Set End Property #End Region ' Fields & Propeties End Class '----------- Classe che fa alle Strategie delle Topologie delle Feature del file Json ----------- Public Class JsonStrategy Inherits VMBase #Region "FIELDS & PROPETIES" Private m_sStrategyID As String Public Property sStrategyID As String Get Return m_sStrategyID End Get Set(value As String) m_sStrategyID = value NotifyPropertyChanged(NameOf(sStrategyID)) End Set End Property Private m_nIndexInList As Integer = -1 Public Property nIndexInList As Integer Get Return m_nIndexInList End Get Set(value As Integer) m_nIndexInList = value NotifyPropertyChanged(NameOf(nIndexInList)) End Set End Property Private m_bActive As Boolean Public Property bActive As Boolean Get Return m_bActive End Get Set(value As Boolean) m_bActive = value NotifyPropertyChanged(NameOf(bActive)) End Set End Property Private m_ParameterList As New ObservableCollection(Of JsonGenericParameter) Public Property ParameterList As ObservableCollection(Of JsonGenericParameter) Get Return m_ParameterList End Get Set(value As ObservableCollection(Of JsonGenericParameter)) m_ParameterList = value NotifyPropertyChanged(NameOf(ParameterList)) End Set End Property #End Region ' Fields & Propeties End Class '----------- Classe che fa riferimento ai parametri delle Strategie nel file Json ----------- Public Class JsonGenericParameter Inherits VMBase #Region "FIELDS & PROPETIES" Private m_sName As String Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value NotifyPropertyChanged(NameOf(sName)) End Set End Property Private m_sNameNge As String Public Property sNameNge As String Get Return m_sNameNge End Get Set(value As String) m_sNameNge = value NotifyPropertyChanged(NameOf(sNameNge)) End Set End Property Private m_sValue As String Public Property sValue As String Get Return m_sValue End Get Set(value As String) m_sValue = value NotifyPropertyChanged(NameOf(sValue)) End Set End Property Private m_sDescriptionShort As String Public Property sDescriptionShort As String Get Return m_sDescriptionShort End Get Set(value As String) m_sDescriptionShort = value NotifyPropertyChanged(NameOf(sDescriptionShort)) End Set End Property Private m_sDescriptionLong As String Public Property sDescriptionLong As String Get Return m_sDescriptionLong End Get Set(value As String) m_sDescriptionLong = value NotifyPropertyChanged(NameOf(sDescriptionLong)) End Set End Property Private m_sType As String Public Property sType As String Get Return m_sType End Get Set(value As String) m_sType = value NotifyPropertyChanged(NameOf(sType)) End Set End Property Private m_sMessageId As String Public Property sMessageId As String Get Return m_sMessageId End Get Set(value As String) m_sMessageId = value NotifyPropertyChanged(NameOf(sMessageId)) End Set End Property Private m_sMinUserLevel As Integer Public Property sMinUserLevel As Integer Get Return m_sMinUserLevel End Get Set(value As Integer) m_sMinUserLevel = value NotifyPropertyChanged(NameOf(sMinUserLevel)) End Set End Property Private m_Choices As New ObservableCollection(Of JsonChoiceParameter) Public Property Choices As ObservableCollection(Of JsonChoiceParameter) Get Return m_Choices End Get Set(value As ObservableCollection(Of JsonChoiceParameter)) m_Choices = value NotifyPropertyChanged(NameOf(Choices)) End Set End Property #End Region ' Fields & Propeties End Class '----------- Classe che fa riferimento ai parametri delle Scelte nel file Json ----------- Public Class JsonChoiceParameter Inherits VMBase Private m_sValue As String Public Property sValue As String Get Return m_sValue End Get Set(value As String) m_sValue = value NotifyPropertyChanged(NameOf(sValue)) End Set End Property Private m_sDescriptionShort As String Public Property sDescriptionShort As String Get Return m_sDescriptionShort End Get Set(value As String) m_sDescriptionShort = value NotifyPropertyChanged(NameOf(sDescriptionShort)) End Set End Property Private m_sDescriptionLong As String Public Property sDescriptionLong As String Get Return m_sDescriptionLong End Get Set(value As String) m_sDescriptionLong = value NotifyPropertyChanged(NameOf(sDescriptionLong)) End Set End Property Private m_sMessageId As String Public Property sMessageId As String Get Return m_sMessageId End Get Set(value As String) m_sMessageId = value NotifyPropertyChanged(NameOf(sMessageId)) End Set End Property End Class Public Class StrategyTypeToFocusableConverter Implements IValueConverter Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert If TypeOf value IsNot TreeViewItem Then Return True Select Case DirectCast(value, TreeViewItem).DataContext.GetType() Case GetType(Topology) Return True Case Else ' GetType(StrategyFeature) Return False End Select End Function Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack Throw New NotImplementedException() End Function End Class