Imports System.Collections.ObjectModel Imports System.ComponentModel Imports System.IO Imports EgtUILib Imports EgtWPFLib5 Imports Ionic.zip Public Class ProjectManagerVM Implements INotifyPropertyChanged #Region "FIELDS & PROPERTIES" Friend m_CurrProject As Project ' Definizione comandi Private m_cmdNew As ICommand Private m_cmdOpen As ICommand Private m_cmdSave As ICommand Private m_cmdSaveAs As ICommand Private m_cmdInsert As ICommand Private m_cmdImport As ICommand Private m_cmdExport As ICommand Private m_cmdOptions As ICommand Private m_CmdLastProject As ICommand Private m_cmdSendFeedback As ICommand Private m_CmdCreateTemplate As ICommand Private m_cmdGuide As ICommand #Region "ToolTip" 'Proprietà ToolTip Public ReadOnly Property NewToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 1) End Get End Property 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 SaveAsToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 4) End Get End Property Public ReadOnly Property InsertToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 5) End Get End Property Public ReadOnly Property ImportToolTip As String Get Return EgtMsg(MSG_TOPCOMMANDBAR + 6) End Get End Property Public ReadOnly Property SendFeedbackToolTip As String Get Return EgtMsg(50046) End Get End Property Public ReadOnly Property OptionsToolTip As String Get Return EgtMsg(MSG_MAINWINDOW + 209) End Get End Property Public ReadOnly Property TemplateDoorToolTip As String Get Return EgtMsg(MSG_MAINWINDOW + 223) End Get End Property Public ReadOnly Property GuideToolTip As String Get Return EgtMsg(50305) End Get End Property Public ReadOnly Property Help As String Get Return EgtMsg(50305) End Get End Property #End Region ' ToolTip #End Region ' Fields & Properties #Region "CONSTRUCTOR" Sub New() Map.SetRefProjectManagerVM(Me) End Sub #End Region ' Constructor #Region "COMMANDS" #Region "NewCommand" ''' ''' Returns a command that do New. ''' Public ReadOnly Property NewCommand As ICommand Get If m_cmdNew Is Nothing Then m_cmdNew = New Command(AddressOf NewCmd) End If Return m_cmdNew End Get End Property ''' ''' Execute the New. This method is invoked by the NewCommand. ''' Public Sub NewCmd() ' Gestisco porta corrente modificata If Not Map.refAssemblyManagerVM.ManageModified() Then Return ' Richiedo il nome del progetto (cioè la directory da creare) Dim SaveFileDialog As New EgtWPFLib5.EgtSaveFileDialog SaveFileDialog.Title = EgtMsg(50304) SaveFileDialog.Directory = IniFile.m_MyProjectDir & "\" SaveFileDialog.Extension = "\" If Not SaveFileDialog.EgtShowDialog Then Map.refAssemblyManagerVM.Open(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) Return End If ' Creo nuovo progetto Map.refMainWindowVM.SelectedPage = MainWindowVM.ListPageEnum.nNothingSelected Directory.CreateDirectory(SaveFileDialog.FileName) Dim CurrProject As Project = Map.refAssemblyManagerVM.CurrProject ' salvo il riferimento al progetto corrente m_CurrProject = CurrProject ' salvo path progetto CurrProject.Name = SaveFileDialog.FileName ' Ripulisco lista porte CurrProject.AssemblyList.Clear() EgtNewFile() EgtZoom(ZM.ALL) Map.refMainWindowVM.ProjectNameMsg = Map.refMainWindowVM.SetTitle(m_CurrProject.Name) Map.refMainWindowVM.ModifyTitle(True) ' Creo nuova porta Map.refAssemblyManagerVM.AddAssembly() End Sub #End Region ' NewCommand #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. ''' Public Sub Open() ' verifico se selezionato esiste e modificato If Not IsNothing(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) AndAlso Map.refAssemblyManagerVM.CurrProject.SelAssemblyName.IsModified Then Dim sText As String = String.Format(EgtMsg(50109), Path.GetFileNameWithoutExtension(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName.Name)) Select Case MessageBox.Show(sText, "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) Case MessageBoxResult.Yes Map.refAssemblyManagerVM.Save(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) Case MessageBoxResult.No Map.refAssemblyManagerVM.Delete(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) Case MessageBoxResult.Cancel Return End Select End If Dim FolderBrowserDialog As New System.Windows.Forms.FolderBrowserDialog FolderBrowserDialog.SelectedPath = IniFile.m_MyProjectDir ' mostriamo la finestra di dialogo aperta fino alla directory MyProjects If FolderBrowserDialog.ShowDialog <> Forms.DialogResult.OK Then ' se la risposta è diversa da OK esce Return End If Dim CurrProject As Project = Map.refAssemblyManagerVM.CurrProject ' salvo il riferimento al progetto corrente m_CurrProject = CurrProject ' salvo path progetto CurrProject.Name = FolderBrowserDialog.SelectedPath ' Ripulisco lista porte CurrProject.AssemblyList.Clear() ' Aggiungo porte trovate nella cartella ad un vettore Dim DDFFileArray() As String = Directory.GetFiles(FolderBrowserDialog.SelectedPath) ' ripulisco il nome della porta (cancello tutto il percorso del file lasciando solo il nome del file) For DDFIndex = 0 To DDFFileArray.Count - 1 If Path.GetExtension(DDFFileArray(DDFIndex)).ToLower = ".ddf" Then ' lo aggiungo alla lista delle porte Dim Local_Assembly As New AssemblyName Local_Assembly.Name = DDFFileArray(DDFIndex) Local_Assembly.IsModified = False CurrProject.AssemblyList.Add(Local_Assembly) End If Next ' Notifico aggiornamento DoorList e Name per aggiornare la grafica CurrProject.NotifyPropertyChanged("Name") CurrProject.NotifyPropertyChanged("AssemblyList") ' Se c'è almeno una porta la visualizzo If CurrProject.AssemblyList.Count > 0 Then Map.refAssemblyManagerVM.Open(CurrProject.AssemblyList(0)) Else Map.refPartPageVM.CurrPart = Nothing EgtNewFile() EgtZoom(ZM.ALL) End If Map.refMainWindowVM.ProjectNameMsg = CurrProject.Name End Sub #End Region ' OpenCommand '#Region "OpenMruFileCommand" ' ''' ' ''' Returns a command that do Open. ' ''' ' Public Shared ReadOnly Property OpenMruFileCommand As ICommand ' Get ' If m_cmdOpenMruFile Is Nothing Then ' m_cmdOpenMruFile = New RelayCommand(AddressOf OpenMruFile) ' End If ' Return m_cmdOpenMruFile ' End Get ' End Property ' ''' ' ''' Execute the Open. This method is invoked by the OpenCommand. ' ''' ' Public Shared Sub OpenMruFile(ByVal param As Object) ' Application.Msn.NotifyColleagues(Application.OPENPROJECT, DirectCast(param, String).Replace("__", "_")) ' 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() ' Verifico esista elemento selezionato If IsNothing(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) Then ' Impossibile savare un file se non esiste una porta! Errore MessageBox.Show(EgtMsg(50128), EgtMsg(50101), MessageBoxButton.OK, MessageBoxImage.Exclamation) Return End If ' Eseguo salvataggio Map.refAssemblyManagerVM.Save(Map.refAssemblyManagerVM.CurrProject.SelAssemblyName) End Sub #End Region ' SaveCommand #Region "OptionsCommand" ''' ''' Returns a command that do Export. ''' Public ReadOnly Property OptionsCommand As ICommand Get If m_cmdOptions Is Nothing Then m_cmdOptions = New Command(AddressOf Options) End If Return m_cmdOptions End Get End Property ''' ''' Execute the Export. This method is invoked by the ExportCommand. ''' Public Sub Options(ByVal param As Object) Dim OptionsWindow As New OptionsV OptionsWindow.Height = 550 OptionsWindow.Width = 650 OptionsWindow.DataContext = New OptionsVM(Map.refMainWindowVM) OptionsWindow.Owner = Application.Current.MainWindow OptionsWindow.ShowDialog() End Sub #End Region ' OptionsCommand #Region "LastProject" Public ReadOnly Property LastProjectCommand As ICommand Get If m_CmdLastProject Is Nothing Then m_CmdLastProject = New Command(AddressOf OpenLastProject) End If Return m_CmdLastProject End Get End Property Public Sub OpenLastProject() ' Apro l'ultimo progetto Dim CurrProject As Project = Map.refAssemblyManagerVM.CurrProject ' carico il percorso dell'ultimo progetto salvato (sul file Config.ini) CurrProject.Name = OptionModule.m_sLastProject ' ripulisco la lista di porte CurrProject.AssemblyList.Clear() ' verifico che esista la cartella If Directory.Exists(CurrProject.Name) Then ' Aggiungo porte trovate nella cartella ad un vettore Dim DDFFileArray() As String = Directory.GetFiles(CurrProject.Name) ' ripulisco il nome della porta (cancello tutto il percorso del file lasciando solo il nome del file) For DDFIndex = 0 To DDFFileArray.Count - 1 If Path.GetExtension(DDFFileArray(DDFIndex)).ToLower = ".ddf" Then ' lo aggiungo alla lista delle porte Dim Local_Assembly As New AssemblyName Local_Assembly.Name = DDFFileArray(DDFIndex) Local_Assembly.IsModified = False CurrProject.AssemblyList.Add(Local_Assembly) End If Next ' Notifico aggiornamento DoorList e Name per aggiornare la grafica CurrProject.NotifyPropertyChanged("Name") CurrProject.NotifyPropertyChanged("AssemblyList") Map.refMainWindowVM.ProjectNameMsg = CurrProject.Name Map.refMainWindowVM.ModifyTitle(False) ' Se c'è almeno una porta la visualizzo If CurrProject.AssemblyList.Count > 0 Then Map.refAssemblyManagerVM.Open(CurrProject.AssemblyList(0)) End If End If End Sub #End Region ' LastProject #Region "SendFeedbackCommand" ''' ''' Returns a command that do SendFeedback. ''' Public ReadOnly Property SendFeedbackCommand As ICommand Get If m_cmdSendFeedback Is Nothing Then m_cmdSendFeedback = New Command(AddressOf SendFeedback) End If Return m_cmdSendFeedback End Get End Property ''' ''' Execute the SendFeedback. This method is invoked by the SendFeedbackCommand. ''' Public Sub SendFeedback() ' Recupero indirizzo a cui spedire la mail Dim sSupportAddress As String = String.Empty GetMainPrivateProfileString(S_GENERAL, K_SUPPORT, "support@egaltech.com", sSupportAddress) ' se vuoto do messaggio di errore ed esco If String.IsNullOrWhiteSpace(sSupportAddress) Then MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 10), EgtMsg(50101), MessageBoxButton.OK, MessageBoxImage.Error) Return End If ' Recupero numero chiave Dim sKey As String = String.Empty EgtGetKeyInfo(sKey) ' Recupero file del progetto corrente (tipo file .nge) Dim sCurrProject As String = String.Empty EgtGetCurrFilePath(sCurrProject) ' se nome file vuoto, chiedo se si vuole salvare (file .nge) If String.IsNullOrWhiteSpace(sCurrProject) Then If MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 11), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then Save() End If EgtGetCurrFilePath(sCurrProject) ' se modificato, chiedo se si vuole salvare Else If EgtGetModified() Then If MessageBox.Show(EgtMsg(MSG_TOPCOMMANDBAR + 11), "", MessageBoxButton.YesNo, MessageBoxImage.Question) = MessageBoxResult.Yes Then Save() End If End If End If ' recuro il file DDF associato al file .nge Dim sCurrProjectDDF As String = String.Empty sCurrProjectDDF = IniFile.m_sTempDir & "\CurrDoor.ddf" ' recupero il file di log Dim sFileLog As String = String.Empty sFileLog = IniFile.m_sTempDir & "\EgtDOORCreatorLog1.txt" ' Creo zip file da allegare Dim sZipToCreate As String = IniFile.m_sTempDir & "\Feedback.zip" If File.Exists(sZipToCreate) Then File.Delete(sZipToCreate) End If Try Using zip As New Ionic.Zip.ZipFile(sZipToCreate, Console.Out) ' aggiungo progetto corrente .nge If Not String.IsNullOrWhiteSpace(sCurrProject) Then zip.AddItem(sCurrProject, "") End If ' aggiungo progetto corrente .ddf If Not String.IsNullOrWhiteSpace(sCurrProjectDDF) Then zip.AddItem(sCurrProjectDDF, "") End If ' aggiungo file log If Not String.IsNullOrWhiteSpace(sFileLog) Then zip.AddItem(sFileLog, "") End If ' aggiungo la cartella Doors If Directory.Exists(IniFile.m_sDoorsDirPath) Then zip.AddItem(IniFile.m_sDoorsDirPath, "Doors") End If zip.Save() End Using Catch ex1 As Exception EgtOutLog("Exception in zip: " & ex1.ToString()) End Try ' preparo la mail per il supporto Dim bEx As Boolean = False Try Dim SendFeedbackWindow As New EgtWPFLib5.MapiMailMessage("EgtDOORCreator Feedback - " & sKey) SendFeedbackWindow.Recipients.Add(sSupportAddress) If Not String.IsNullOrWhiteSpace(sZipToCreate) AndAlso File.Exists(sZipToCreate) Then SendFeedbackWindow.Files.Add(IniFile.m_sTempDir & "\Feedback.zip") End If SendFeedbackWindow.ShowDialog() Catch ex As Exception EgtOutLog("Feedback exception: " & ex.ToString) bEx = True End Try If bEx OrElse EgtWPFLib5.MapiMailMessage.m_ErrorCode <> 0 Then MessageBox.Show(String.Format(EgtMsg(MSG_TOPCOMMANDBAR + 12), sSupportAddress, sZipToCreate), EgtMsg(MSG_EGTDOORCREATOR + 118), MessageBoxButton.OK, MessageBoxImage.Information) ' stampo il messaggio nella StatusBar Map.refStatusBarVM.StatusOutput = EgtMsg(MSG_TOPCOMMANDBAR + 14) Else ' stampo il messaggio nella StatusBar Map.refStatusBarVM.StatusOutput = EgtMsg(MSG_TOPCOMMANDBAR + 14) End If End Sub #End Region ' SendFeedbackCommand #Region "CreateTemplate" Public ReadOnly Property CreateTemplateCommand As ICommand Get If m_CmdCreateTemplate Is Nothing Then m_CmdCreateTemplate = New Command(AddressOf CreateTemplate) End If Return m_CmdCreateTemplate End Get End Property Public Sub CreateTemplate() ' se esite una porta, allora rendo possibile la creazione di un template della porta corrente If Not IsNothing(Map.refPartPageVM.CurrPart) Then ' Stampo il file correte nella cartella Template Dim SaveFileDialog As New EgtWPFLib5.EgtSaveFileDialog SaveFileDialog.Title = K_NEWTEMPLATE SaveFileDialog.Directory = IniFile.m_TemplateDir & "\" SaveFileDialog.Extension = K_DDTEXTENSION 'SaveFileDialog.FileName = m_CurrProject.Name & "\" ' se decido di chiuedere la finestra If Not SaveFileDialog.EgtShowDialog Then Return End If ' Controllo se ha estensione il nome della porta If Path.HasExtension(SaveFileDialog.FileName) Then Dim sExtension As String = Path.GetExtension(SaveFileDialog.FileName) If Not sExtension.ToLower = K_DDTEXTENSION Then SaveFileDialog.FileName = SaveFileDialog.FileName.Replace(sExtension, K_DDTEXTENSION) End If Else SaveFileDialog.FileName &= K_DDTEXTENSION End If If OptionModule.m_ConfigurationSoftware = ConfigType.Door Then DdfFile.WriteDDFPart(Map.refPartPageVM.CurrPart, SaveFileDialog.FileName, False, True) Else DdfFile.WriteDDFAssembly(Map.refAssemblyPageVM.CurrAssembly, SaveFileDialog.FileName, False) End If Else MessageBox.Show(EgtMsg(50155), EgtMsg(50101), MessageBoxButton.OK, MessageBoxImage.Exclamation) End If End Sub #End Region ' CreateTemplate #Region "Guide" Public ReadOnly Property GuideCommand As ICommand Get If m_CmdGuide Is Nothing Then m_cmdGuide = New Command(AddressOf Guide) End If Return m_cmdGuide End Get End Property Public Sub Guide() Dim GuideWindow As New GuideV(Application.Current.MainWindow, New GuideVM) GuideWindow.Show() End Sub #End Region ' Guide #End Region ' Commands Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Public Sub NotifyPropertyChanged(propName As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName)) End Sub End Class