Imports System.Collections.ObjectModel Imports System.Threading Imports System.Windows.Threading Imports EgtUILib Imports System.IO Class MainWindow ' Mutex per avere una sola istanza del programma in esecuzione Private m_objMutex As New Mutex ' Dichiarazione delle Page UserControl Friend m_ImportPageUC As ImportPageUC Friend m_DrawPageUC As DrawPageUC Friend m_PlacePageUC As PlacePageUC Friend m_OptionsPageUC As OptionsPageUC Friend m_OpenPageUC As OpenPageUC Friend m_NumericKeyboardWD As NumericKeyboardWD Friend m_AboutBoxWD As AboutBoxWD ' Dichiarazione variabili direttori Private m_sDataRoot As String = String.Empty Private m_sConfigDir As String = String.Empty Private m_sTempDir As String = String.Empty Private m_sDataDir As String = String.Empty Private Shared m_sIniFile As String = String.Empty Private m_nDebug As Integer = 0 'Dichiarazione variabile contenente la lingua corrente Friend m_CurrLanguage As Language ' Dichiarazione liste per ListBox della ImportPage e della OpenPage Friend ImportItemList As New ObservableCollection(Of IconListBoxItem) Friend OpenItemList As New ObservableCollection(Of IconListBoxItem) 'Dichiarazione lista delle lingue disponibili e lingua corrente Friend m_LanguagesList As New List(Of Language) ' Riferimento alla pagina correntemente attiva Friend m_ActivePage As Pages Enum Pages Import Draw Place Options Open End Enum Public Function GetIniFile() As String Return m_sIniFile End Function Public Function GetTempDir() As String Return m_sTempDir End Function Public Function GetDataDir() As String Return m_sDataDir End Function Private Sub MainWindow_Initialized(sender As Object, e As EventArgs) ' Verifico sia l'unica istanza ManageSingleIstance() ' Impostazione path radice per i dati m_sDataRoot = System.AppDomain.CurrentDomain.BaseDirectory.Substring(0, System.AppDomain.CurrentDomain.BaseDirectory.Length - 1) If GetPrivateProfileString(S_DATA, K_DATAROOT, "", m_sDataRoot, m_sDataRoot & "\" & DAT_FILE_NAME) = 0 Then m_sDataRoot = System.AppDomain.CurrentDomain.BaseDirectory.Substring(0, System.AppDomain.CurrentDomain.BaseDirectory.Length - 1) End If ' Impostazione direttorio di configurazione m_sConfigDir = m_sDataRoot & "\" & CONF_DIR ' Impostazione direttorio per file temporanei m_sTempDir = m_sDataRoot & "\" & TEMP_DIR ' Impostazione path Ini file m_sIniFile = m_sConfigDir & "\" & INI_FILE_NAME ' Impostazione direttorio per file di dati If GetPrivateProfileString(S_GENERAL, K_SAVEDIR, "", m_sDataDir, m_sIniFile) = 0 Or Not Directory.Exists(m_sDataDir) Then m_sDataDir = m_sDataRoot & "\" & DATA_DIR End If ' Leggo e imposto chiave di protezione Dim sLicFileName As String = String.Empty GetPrivateProfileString(S_GENERAL, K_LICENCE, LIC_FILE_NAME, sLicFileName, m_sIniFile) Dim sLicFile As String = m_sConfigDir & "\" & sLicFileName Dim sKey As String = String.Empty GetPrivateProfileString(S_LICENCE, K_KEY, "", sKey, sLicFile) EgtSetKey(sKey) 'Inizializzazione generale di EgtInterface m_nDebug = GetPrivateProfileInt(S_GENERAL, K_DEBUG, 0, m_sIniFile) Dim sLogFile As String = m_sTempDir & "\" & GENLOG_FILE_NAME Dim sLogMsg As String = My.Application.Info.Description.ToString() & " ver. " & My.Application.Info.Version.ToString() EgtInit(m_nDebug, sLogFile, sLogMsg) ' Leggo direttorio dei messaggi (se manca uso direttorio di configurazione) Dim sMsgDir As String = String.Empty If GetPrivateProfileString(S_GENERAL, K_MESSAGESDIR, "", sMsgDir, m_sIniFile) = 0 Then sMsgDir = m_sConfigDir End If 'Leggo elenco lingue disponibili da file ini Dim index As Integer = 1 Dim ReadLanguage As Language = GetPrivateProfileLanguage(S_LANGUAGES, K_LANGUAGE & index, GetIniFile) While Not IsNothing(ReadLanguage) m_LanguagesList.Add(ReadLanguage) index += 1 ReadLanguage = GetPrivateProfileLanguage(S_LANGUAGES, K_LANGUAGE & index, GetIniFile) End While ' Leggo file messaggi Dim sMsgFile As String = String.Empty GetPrivateProfileString(S_GENERAL, K_MESSAGES, "", sMsgFile, m_sIniFile) For i As Integer = 0 To m_LanguagesList.Count - 1 If m_LanguagesList(i).LanguageName = sMsgFile Then m_CurrLanguage = m_LanguagesList(i) End If Next Dim sMsgFilePath As String = sMsgDir & "\EgalTechIta.txt" If Not IsNothing(m_CurrLanguage) Then sMsgFilePath = sMsgDir & "\" & m_CurrLanguage.FileName End If If Not EgtLoadMessages(sMsgFilePath) Then EgtOutLog("Error in EgtLoadMessages") End If ' imposto dir font Nfe e font default Dim sNfeDir As String = String.Empty GetPrivateProfileString(S_GEOMDB, K_NFEFONTDIR, "", sNfeDir, m_sIniFile) Dim sDefFont As String = String.Empty GetPrivateProfileString(S_GEOMDB, K_DEFAULTFONT, "", sDefFont, m_sIniFile) EgtSetFont(sNfeDir, sDefFont) ' imposto dir di default per libreria Lua e lancio libreria di base Dim sLuaLibsDir As String = String.Empty GetPrivateProfileString(S_LUA, K_LIBSDIR, "", sLuaLibsDir, m_sIniFile) EgtSetLuaLibs(sLuaLibsDir) Dim sLuaBaseLib As String = String.Empty GetPrivateProfileString(S_LUA, K_BASELIB, "EgtBase", sLuaBaseLib, m_sIniFile) EgtLuaRequire(sLuaBaseLib) ' Imposto posizione e dimensioni della MainWindow Dim nFlag As Integer Dim nLeft As Integer Dim nTop As Integer Dim nWidth As Integer Dim nHeight As Integer GetPrivateProfileWinPos(S_GENERAL, K_WINPLACE, nFlag, nLeft, nTop, nWidth, nHeight, m_sIniFile) Me.WindowStartupLocation = Windows.WindowStartupLocation.Manual Me.Top = nTop Me.Left = nLeft Me.Height = nHeight Me.Width = nWidth WindowState = If(nFlag = 1, WindowState.Maximized, WindowState.Normal) 'Creazione delle Page UserControl m_ImportPageUC = New ImportPageUC m_DrawPageUC = New DrawPageUC m_PlacePageUC = New PlacePageUC m_OptionsPageUC = New OptionsPageUC m_OpenPageUC = New OpenPageUC m_NumericKeyboardWD = New NumericKeyboardWD 'Posizionemento nella griglia delle Page UserControl m_ImportPageUC.SetValue(Grid.ColumnProperty, 0) m_ImportPageUC.SetValue(Grid.RowProperty, 1) m_DrawPageUC.SetValue(Grid.ColumnProperty, 0) m_DrawPageUC.SetValue(Grid.RowProperty, 1) m_PlacePageUC.SetValue(Grid.ColumnProperty, 0) m_PlacePageUC.SetValue(Grid.RowProperty, 1) m_OptionsPageUC.SetValue(Grid.ColumnProperty, 0) m_OptionsPageUC.SetValue(Grid.RowProperty, 1) m_OpenPageUC.SetValue(Grid.ColumnProperty, 0) m_OpenPageUC.SetValue(Grid.RowProperty, 1) 'Disabilita la possibilità di imitare il click del tasto destro del mouse tenendo premuto il dito sul touch 'NB: Se abilitato impedisce di utilizzare lo stato Pressed dei Button che quindi non si evidenziano quando premuti Stylus.SetIsPressAndHoldEnabled(Me, False) 'Imposto i messaggi letti dal file dei messaggi ImportBtn.Content = EgtMsg(MSG_GENERAL + 1) 'Import - Importa DrawBtn.Content = EgtMsg(MSG_GENERAL + 2) 'Draw - Disegna PlaceBtn.Content = EgtMsg(MSG_GENERAL + 3) 'Place - Posiziona OptionsBtn.Content = EgtMsg(MSG_GENERAL + 4) 'Options - Opzioni 'AddHandler OpenTimer.Tick, AddressOf OpenTimer_tick 'OpenTimer.Interval = TimeSpan.FromMilliseconds(1) 'OpenTimer.Start() 'AddHandler OpenTimer2.Tick, AddressOf OpenTimer2_tick 'OpenTimer2.Interval = TimeSpan.FromMilliseconds(2) 'OpenTimer2.Start() End Sub Private Sub ManageSingleIstance() Dim bCreated As Boolean Try m_objMutex = New Mutex(False, "Global\SarmaxWall", bCreated) Catch bCreated = False End Try If Not bCreated Then ' porto in primo piano la prima istanza Dim bFound As Boolean = False ' processi del programma a 32 bit Dim localProc As Process() = Process.GetProcessesByName("SarmaxWallR32") For Each p As Process In localProc If p.Id <> Process.GetCurrentProcess().Id Then bFound = True ShowWindow(p.MainWindowHandle, 1) Exit For End If Next ' se non trovati processi a 32 bit provo a 64 bit If Not bFound Then localProc = Process.GetProcessesByName("SarmaxWallR64") For Each p As Process In localProc If p.Id <> Process.GetCurrentProcess().Id Then bFound = True ShowWindow(p.MainWindowHandle, SW.RESTORE) Exit For End If Next End If ' esco dal programma End End If End Sub Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) 'Assegno NumericKeyboardWD come child della MainWindow m_NumericKeyboardWD.Owner = Me 'Seleziono la Tab e la Page di apertura MainWindowGrid.Children.Add(m_PlacePageUC) m_ActivePage = Pages.Place PlaceBtn.IsChecked = True End Sub Private Sub Border_MouseDown(sender As Object, e As MouseButtonEventArgs) m_AboutBoxWD = New AboutBoxWD m_AboutBoxWD.Owner = Me m_AboutBoxWD.Top = Me.Top + (Me.Height / 2 - m_AboutBoxWD.Height / 2) m_AboutBoxWD.Left = Me.Left + (Me.Width / 2 - m_AboutBoxWD.Width / 2) m_AboutBoxWD.Show() End Sub Private Sub ImportBtn_Click(sender As Object, e As RoutedEventArgs) Handles ImportBtn.Click Select Case m_ActivePage Case Pages.Import ImportBtn.IsChecked = True Case Pages.Draw ImportBtn.IsChecked = False DrawBtn.IsChecked = True Case Pages.Place ImportBtn.IsChecked = True PlaceBtn.IsChecked = False MainWindowGrid.Children.Remove(m_PlacePageUC) MainWindowGrid.Children.Add(m_ImportPageUC) m_ActivePage = Pages.Import Case Pages.Options ImportBtn.IsChecked = False OptionsBtn.IsChecked = True Case Pages.Open ImportBtn.IsChecked = False OpenBtn.IsChecked = True End Select End Sub Private Sub DrawBtn_Click(sender As Object, e As RoutedEventArgs) Handles DrawBtn.Click Select Case m_ActivePage Case Pages.Import ImportBtn.IsChecked = True DrawBtn.IsChecked = False Case Pages.Draw DrawBtn.IsChecked = True Case Pages.Place DrawBtn.IsChecked = True PlaceBtn.IsChecked = False MainWindowGrid.Children.Remove(m_PlacePageUC) MainWindowGrid.Children.Add(m_DrawPageUC) m_ActivePage = Pages.Draw Case Pages.Options DrawBtn.IsChecked = False OptionsBtn.IsChecked = True Case Pages.Open DrawBtn.IsChecked = False OpenBtn.IsChecked = True End Select End Sub Private Sub PlaceBtn_Click(sender As Object, e As RoutedEventArgs) Handles PlaceBtn.Click Select Case m_ActivePage Case Pages.Import ImportBtn.IsChecked = True PlaceBtn.IsChecked = False Case Pages.Draw DrawBtn.IsChecked = True PlaceBtn.IsChecked = False Case Pages.Place PlaceBtn.IsChecked = True Case Pages.Options PlaceBtn.IsChecked = False OptionsBtn.IsChecked = True Case Pages.Open PlaceBtn.IsChecked = False OpenBtn.IsChecked = True End Select End Sub Private Sub OptionsBtn_Click(sender As Object, e As RoutedEventArgs) Handles OptionsBtn.Click Select Case m_ActivePage Case Pages.Import ImportBtn.IsChecked = True OptionsBtn.IsChecked = False Case Pages.Draw DrawBtn.IsChecked = True OptionsBtn.IsChecked = False Case Pages.Place OptionsBtn.IsChecked = True PlaceBtn.IsChecked = False MainWindowGrid.Children.Remove(m_PlacePageUC) MainWindowGrid.Children.Add(m_OptionsPageUC) m_ActivePage = Pages.Options Case Pages.Options OptionsBtn.IsChecked = True Case Pages.Open OptionsBtn.IsChecked = False OpenBtn.IsChecked = True End Select End Sub Private Sub OpenBtn_Click(sender As Object, e As RoutedEventArgs) Handles OpenBtn.Click Select Case m_ActivePage Case Pages.Import ImportBtn.IsChecked = True OpenBtn.IsChecked = False Case Pages.Draw DrawBtn.IsChecked = True OpenBtn.IsChecked = False Case Pages.Place OpenBtn.IsChecked = True PlaceBtn.IsChecked = False MainWindowGrid.Children.Remove(m_PlacePageUC) MainWindowGrid.Children.Add(m_OpenPageUC) m_ActivePage = Pages.Open Case Pages.Options OptionsBtn.IsChecked = True OpenBtn.IsChecked = False Case Pages.Open OpenBtn.IsChecked = True End Select End Sub 'Impedisce di clickare fuori dalla calcolatrice quando questa è attiva Private Sub MainWindow_PreviewMouseDown(sender As Object, e As MouseButtonEventArgs) If (m_NumericKeyboardWD.IsVisible And Not m_NumericKeyboardWD.IsMouseOver) Then e.Handled = True End If End Sub Private Sub MinimizeBtn_Click(sender As Object, e As RoutedEventArgs) Me.WindowState = Windows.WindowState.Minimized End Sub Private Sub ExitBtn_Click(sender As Object, e As RoutedEventArgs) ' Recupero flag di modificato, per salvarlo nel progetto Dim bModif As Boolean = EgtGetModified() Dim nMarkId As Integer = EgtGetFirstNameInGroup(GDB_ID.ROOT, NAME_PROJMARK) EgtSetInfo(nMarkId, INFO_MODIF, IIf(bModif, 1, 0)) ' Salvo il progetto corrente Dim sPath As String = GetDataDir() & "\0000.nge" If Not EgtSaveFile(sPath, NGE.CMPTEXT) Then Dim sOut As String = "Error saving file " & sPath EgtOutLog(sOut) End If ' Chiudo tutto MainWindow_Unloaded(sender, e) Me.Close() End Sub Private Sub MainWindow_Unloaded(sender As Object, e As RoutedEventArgs) ' Terminazione generale di EgtInterface EgtExit() ' Rilascio mutex m_objMutex.Close() End Sub Public Function GetPrivateProfileLanguage( ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpFileName As String) As Language Dim sVal As String = String.Empty GetPrivateProfileString(lpAppName, lpKeyName, "", sVal, lpFileName) Dim sItems() As String = sVal.Split(",".ToCharArray) If sItems.Count() = 2 Then Return New Language(sItems(0), sItems(1)) End If Return Nothing End Function End Class Public Class Language Private m_sLanguageName As String Private m_sFileName As String Public Property LanguageName As String Get Return m_sLanguageName End Get Set(value As String) m_sLanguageName = value End Set End Property Public Property FileName As String Get Return m_sFileName End Get Set(value As String) m_sFileName = value End Set End Property Sub New(LanguageName As String, FileName As String) Me.LanguageName = LanguageName Me.FileName = FileName End Sub End Class