Imports System.Collections.ObjectModel Imports System.IO Imports EgtBEAMWALL.Core Imports EgtBEAMWALL.Core.ConstBeam Imports EgtBEAMWALL.DataLayer.DatabaseModels Imports EgtUILib Imports EgtWPFLib5 Public Class ProdManagerVM Inherits VMBase #Region "FIELDS & PROPERTIES" Private m_ProdManager_IsEnabled As Boolean = True Public ReadOnly Property ProdManager_IsEnabled As Boolean Get Return m_ProdManager_IsEnabled End Get End Property Private m_CurrProd As ProdFileVM Friend Property CurrProd As ProdFileVM Get Return m_CurrProd End Get Set(value As ProdFileVM) m_CurrProd = value End Set End Property Private m_TempCurrProd As ProdFileVM Friend Property TempCurrProd As ProdFileVM Get Return m_TempCurrProd End Get Set(value As ProdFileVM) m_TempCurrProd = value End Set End Property ' indice ultimo progetto Private m_nLastProdId As Integer Friend ReadOnly Property nLastProdId As Integer Get Return m_nLastProdId End Get End Property Public ReadOnly Property nProdType As BWType Get Return If(Not IsNothing(CurrProd), CurrProd.nType, BWType.NULL) End Get End Property Friend m_MruFiles As New MruList Public ReadOnly Property MruFileNames As ObservableCollection(Of String) Get Dim IdAndBTLFileNames As New ObservableCollection(Of String) For Each FileName In m_MruFiles.FileNames.ToList() Dim PdId As Integer = 0 Dim sPdId As String = Path.GetFileNameWithoutExtension(DirectCast(FileName, String).Replace("__", "_")) Integer.TryParse(sPdId, PdId) Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId) If IsNothing(PdFileM) Then m_MruFiles.Remove(FileName) Else Dim PdFileVM = New ProdFileVM(PdFileM) IdAndBTLFileNames.Add(sPdId & " | " & PdFileVM.sBTLFileName) End If Next Return IdAndBTLFileNames End Get End Property ' Definizione comandi Private m_cmdOpen As ICommand Private m_cmdOpenMruFile As ICommand Private m_cmdSave As ICommand Private m_cmdGoToProj As ICommand #Region "ToolTip" 'Proprietà ToolTip Public ReadOnly Property OpenToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 2) End Get End Property Public ReadOnly Property SaveToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 3) End Get End Property Public ReadOnly Property AddProj_ToolTip As String Get Return EgtMsg(61921) End Get End Property Public ReadOnly Property GoToProj_ToolTip As String Get Return EgtMsg(61922) End Get End Property #End Region ' ToolTip #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New() ' Creo riferimento a questa classe in Map Map.SetRefProdManagerVM(Me) ' Leggo ultimo indice di progetto m_nLastProdId = GetMainPrivateProfileInt(S_GENERAL, K_PRODSINDEX, 1) ' Impostazioni MruLists m_MruFiles.Init(S_MRUPRODFILES, 8) End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Friend Function InitNewProject(ByRef nProjId As Integer, ByRef nProdId As Integer, ByRef sProjectDir As String) As Boolean ' richiedo indice nuovo progetto nProdId = DbControllers.m_ProdController.GetNextIndex(nProjId) If nProdId <= 0 Then Return False sProjectDir = refMainWindowVM.MainWindowM.sProdsDir & "\" & nProdId.ToString("0000") ' creo cartella nuovo progetto If Not Directory.Exists(sProjectDir) Then Directory.CreateDirectory(sProjectDir) Else Dim di As System.IO.DirectoryInfo = New DirectoryInfo(sProjectDir) For Each file As FileInfo In di.EnumerateFiles() file.Delete() Next For Each dir As DirectoryInfo In di.EnumerateDirectories() dir.Delete(True) Next End If Return True End Function Public Function SetCurrProd(nProdId As Integer) As Boolean Dim CurrProdM As ProdFileM = DbControllers.m_ProdController.FindCoreByProdId(nProdId) If IsNothing(CurrProdM) Then Return False Map.refProdManagerVM.CurrProd = New ProdFileVM(CurrProdM) Return True End Function Public Sub ResetCurrProd() CurrProd = Nothing End Sub Friend Sub SetProdManagerIsEnabled(bIsEnabled As Boolean) m_ProdManager_IsEnabled = bIsEnabled NotifyPropertyChanged(NameOf(ProdManager_IsEnabled)) End Sub #End Region ' METHODS #Region "COMMANDS" #Region "OpenCommand" ''' ''' Returns a command that do Open. ''' Public ReadOnly Property OpenCommand As ICommand Get If m_cmdOpen Is Nothing Then m_cmdOpen = New Command(AddressOf Open) End If Return m_cmdOpen End Get End Property ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Friend Sub Open() ' verifico se progetto modificato, e chiedo se salvare If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return OpenProject(Nothing) End Sub Friend Sub OpenProject(TempCurrPd As ProdFileVM) m_TempCurrProd = TempCurrPd Dim sFilePath As String = "" ' se la string è vuota Dim OpenProjectFileDialogVM As OpenProjectFileDialogVM = Nothing If IsNothing(TempCurrProd) Then ' apro dialogo di scelta file OpenProjectFileDialogVM = New OpenProjectFileDialogVM Dim OpenFile As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM) Dim DialogResult As Boolean? = OpenFile.EgtShowDialog(ProjectType.PROD) If IsNothing(DialogResult) OrElse Not DialogResult Then Return sFilePath = OpenProjectFileDialogVM.SelProject.sProdPath TempCurrProd = OpenProjectFileDialogVM.SelProject Else sFilePath = If(Not IsNothing(TempCurrProd.sProdPath), TempCurrProd.sProdPath, "") End If If File.Exists(sFilePath) Then ' se la macchina del progetto in apertura non è tra le macchine disponibili lo segnalo e apro un progetto vuoto If IsNothing(Map.refMachinePanelVM.MachineList.FirstOrDefault(Function(x) x.Name = Map.refProdManagerVM.TempCurrProd.sMachine)) Then ' rimuovo il file in apertura dalla lista degli MRU Map.refProdManagerVM.m_MruFiles.Remove(sFilePath) MessageBox.Show(EgtMsg(61885), EgtMsg(10001), MessageBoxButton.OK, MessageBoxImage.Error) 'Error Map.refProjManagerVM.NewProject() Map.refProjectVM.MachGroupPanelVM = New MyMachGroupPanelVM(MyMachGroupPanelM.CreateMyMachGroupPanel(Map.refMachinePanelVM.MachineList.ToList())) Else If Map.refSceneHostVM.MainController.OpenProject(sFilePath, False) Then Map.refProjectVM.SetOptimizePanel_Visibility(Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.BEAM OrElse (Map.refProjectVM.BTLStructureVM.nPROJTYPE = BWType.WALL AndAlso Map.refMainWindowVM.MainWindowM.GetKeyOption(KEY_OPT.NESTING_AUTO))) Map.refTopPanelVM.UpdateQParameterVisibility() 'SectionXMaterial.SetType(Map.refProjectVM.BTLStructureVM.nPROJTYPE) '' aggiorno le colonne in base al tipo progetto 'Map.refRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE) 'Map.refPartInRawPartListVM.UpdateColumns(Map.refProjectVM.BTLStructureVM.nPROJTYPE) 'm_CurrProd = TempCurrProd 'DbControllers.m_ProdController.LockByProdId(m_CurrProd.nProdId, True) '' carico lista macchine e macchina del progetto per il pulsante Reset Macchina del CALCPanel 'Map.refCALCPanelVM.LoadMachineList() '' seleziono primo gruppo 'Map.refProjectVM.MachGroupPanelVM.SelFirstMachGroup() End If End If ' imposto flag secondo tipo di progetto (travi o pareti) Dim sBTLFlag As String = If( TempCurrProd.nType = Core.ConstBeam.BWType.BEAM, K_BTLFLAG, K_WALLBTLFLAG) Dim nFlag As Integer = GetMainPrivateProfileInt(S_IMPORT, sBTLFlag, EIB_FL.TS3_POS + EIB_FL.SORT + EIB_FL.USEUATTR) EgtBeamSetFlag( nFlag) Else MessageBox.Show(EgtMsg(61871)) Map.refSceneHostVM.MainController.NewProject() Map.refMainWindowVM.SetTitle("New - EgtBEAMWALL") End If ' aggiorno titolo Map.refMainWindowVM.UpdateTitle() NotifyPropertyChanged(NameOf(MruFileNames)) End Sub #End Region ' OpenCommand #Region "OpenMruFileCommand" ''' ''' Returns a command that do Open. ''' Public ReadOnly Property OpenMruFileCommand As ICommand Get If m_cmdOpenMruFile Is Nothing Then m_cmdOpenMruFile = New Command(AddressOf OpenMruFile) End If Return m_cmdOpenMruFile End Get End Property ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Public Sub OpenMruFile(ByVal param As Object) ' verifico se progetto modificato, e chiedo se salvare If ProdFileVM.VerifyProjectModification(CurrProd) = MessageBoxResult.Cancel Then Return ' ricavo l'Id e il progetto associato per l'apertura di quest'ultimo Dim PdId As Integer = 0 Dim arrStrPdId As String() = DirectCast(param, String).Split("|") Integer.TryParse(arrStrPdId(0), PdId) Dim PdFileM = DbControllers.m_ProdController.FindCoreByProdId(PdId) Dim PdFileVM = New ProdFileVM(PdFileM) OpenProject(PdFileVM) End Sub #End Region ' OpenMruFileCommand #Region "SaveCommand" ''' ''' Returns a command that do Save. ''' Public ReadOnly Property SaveCommand As ICommand Get If m_cmdSave Is Nothing Then m_cmdSave = New Command(AddressOf Save) End If Return m_cmdSave End Get End Property ''' ''' Execute the Save. This method is invoked by the SaveCommand. ''' Public Sub Save() If IsNothing(m_CurrProd) Then Return Map.refSceneHostVM.SaveProject() Map.refMainWindowVM.UpdateTitle() Dim MyMachGroupList As New List(Of MyMachGroupM) If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then For Each MachGroup In Map.refProjectVM.MachGroupPanelVM.m_MyMachGroupPanelM.MachGroupMList MyMachGroupList.Add(MachGroup) Next End If ' aggiorno pezzi su Db DbControllers.m_ProdController.UpdateMachGroup(CurrProd.nProdId, MyMachGroupList) ' verifico se Reset Macchina modificato e nel caso aggiorno DB e CurrProj If Map.refCALCPanelVM.IsMachineModified() Then DbControllers.m_ProdController.UpdateMachine(Map.refProdManagerVM.CurrProd.nProdId, Map.refCALCPanelVM.SelectedMachine.Name) Map.refProdManagerVM.CurrProd.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) ' ciclo sulla lista di ProjId associati For Each ProjId In Map.refProdManagerVM.CurrProd.nProjIdList ' aggiorno la Macchina per i ProjId associati sul DB DbControllers.m_ProjController.UpdateMachine(ProjId, Map.refCALCPanelVM.SelectedMachine.Name) ' se uno dei Proj interessati equivale al Proj correntemente aperto setto la Macchina dello stesso ' (poichè il progetto corrente non viene riaperto e riletto dal DB) If ProjId = Map.refProjManagerVM.CurrProj.nProjId Then Map.refProjManagerVM.CurrProj.SetMachine(Map.refCALCPanelVM.SelectedMachine.Name) Next Map.refCALCPanelVM.ResetMachineModified() End If ' se nuovo progetto If m_CurrProd.bIsNew Then ' resetto stato new ' DbControllers.m_ProdController.Reset(CurrProd.nProjId) m_CurrProd.bIsNew = False End If NotifyPropertyChanged(NameOf(MruFileNames)) End Sub #End Region ' SaveCommand #Region "GoToProj" ''' ''' Returns a command that do Open. ''' Public ReadOnly Property GoToProj_Command As ICommand Get If m_cmdGoToProj Is Nothing Then m_cmdGoToProj = New Command(AddressOf GoToProj) End If Return m_cmdGoToProj End Get End Property ''' ''' Execute the Open. This method is invoked by the OpenCommand. ''' Friend Sub GoToProj() If IsNothing(m_CurrProd) Then Return ' recupero Proj associati da Db Dim ProjFileMList As List(Of ProjFileM) = DbControllers.m_ProjController.GetByProdAsc(m_CurrProd.nProdId) Dim nProjId As Integer = 0 ' verifico se salvare progetto corrente Dim VerifyResult As MessageBoxResult = ProdFileVM.VerifyProjectModification(Map.refProdManagerVM.CurrProd) If VerifyResult = MessageBoxResult.Cancel Then Return ' se piu' di uno If IsNothing(ProjFileMList) Then Return ElseIf ProjFileMList.Count = 1 AndAlso ProjFileMList(0).nProjId > 0 Then nProjId = ProjFileMList(0).nProjId ElseIf ProjFileMList.Count > 1 Then Dim ProjFileVMList As New List(Of ProjectFileVM) For Each Project In ProjFileMList ProjFileVMList.Add(New ProjFileVM(Project)) Next ' apro finestra di scelta Dim OpenProjectFileDialogVM As New OpenProjectFileDialogVM Dim ChooseProjFileDialog As New OpenProjectFileDialogV(Application.Current.MainWindow, OpenProjectFileDialogVM) Dim DialogResult As Boolean? = ChooseProjFileDialog.EgtShowDialog(ProjectType.PROJ, ProjFileVMList) If IsNothing(DialogResult) OrElse Not DialogResult Then Return ' se proj selezionato If Not IsNothing(OpenProjectFileDialogVM.SelProject.nProdId) AndAlso OpenProjectFileDialogVM.SelProject.nProdId > 0 Then nProjId = OpenProjectFileDialogVM.SelProject.nProjId End If Else Return End If ' apro progetto proj Map.refProjManagerVM.SetCurrProj(nProjId) ' ricarico progetto se il prod e' nullo (quindi e' stato cancellato) Map.refProjManagerVM.CurrProj.SetReloadProject(IsNothing(CurrProd) OrElse VerifyResult = MessageBoxResult.No) ' vado in pagina proj Map.refMainMenuVM.SetSelPage(Pages.VIEW, False) End Sub #End Region ' GoToProj #End Region ' Commands End Class