Imports System.Collections.ObjectModel Imports System.Data.SQLite Imports System.IO Imports EgtUILib Imports EgtWPFLib5 Public Class Slab Inherits VMBase #Region "FIELDS & PROPERTIES" Public Const DB_SLABS As String = "Slabs" Public Const DB_ID As String = "Id" Public Const DB_IMAGEPATH As String = "ImagePath" Public Const DB_STATE As String = "State" Public Const DB_PROJASSIGNEDTO As String = "ProjectAssignedTo" Public Const DB_MATERIAL As String = "Material" Public Const DB_THICKNESS As String = "Thickness" Public Const DB_WAREHOUSEPOS As String = "WarehousePosition" Public Const DB_ADDEDDATE As String = "AddedDate" Friend Shared m_IsEnabledBtn As Action(Of Boolean) Public Enum StateOpt As Integer AVAILABLE = 1 ASSIGNED = 2 TAKEN = 3 End Enum Private m_IsModifiedId As Boolean = False Friend ReadOnly Property IsModifiedId As Boolean Get Return m_IsModifiedId End Get End Property Private m_OrigId As String Friend ReadOnly Property OrigId As String Get Return m_OrigId End Get End Property Private m_Id As String Public Property Id As String Get Return m_Id End Get Set(value As String) If Not String.IsNullOrWhiteSpace(value) Then m_Id = value m_IsModifiedId = m_Id <> m_OrigId Else NotifyPropertyChanged("Id") End If m_IsEnabledBtn(IsValid And IsModified) If Not String.IsNullOrWhiteSpace(m_IdError) Then Map.refStatusBarVM.SetOutputMessage(m_IdError, 5, MSG_TYPE.ERROR_) End If End Set End Property Public ReadOnly Property GraphicalImagePath As BitmapImage Get Dim src As BitmapImage = New BitmapImage() src.BeginInit() src.DecodePixelWidth = 256 src.CacheOption = BitmapCacheOption.OnLoad src.UriSource = New Uri(m_ImagePath, UriKind.Absolute) src.EndInit() Return src End Get End Property Private m_IsModifiedImagePath As Boolean = False Friend ReadOnly Property IsModifiedImagePath As Boolean Get Return m_IsModifiedImagePath End Get End Property Private m_OrigImagePath As String Private m_ImagePath As String Public Property ImagePath As String Get Return m_ImagePath End Get Set(value As String) If Not String.IsNullOrWhiteSpace(value) Then m_ImagePath = value m_IsModifiedImagePath = m_ImagePath <> m_OrigImagePath Else NotifyPropertyChanged("ImagePath") End If m_IsEnabledBtn(IsValid And IsModified) If Not String.IsNullOrWhiteSpace(m_ImagePathError) Then Map.refStatusBarVM.SetOutputMessage(m_ImagePathError, 5, MSG_TYPE.ERROR_) End If End Set End Property Private m_IsModifiedState As Boolean = False Friend ReadOnly Property IsModifiedState As Boolean Get Return m_IsModifiedState End Get End Property Private m_OrigState As StateOpt Private m_State As StateOpt Public Property State As StateOpt Get Return m_State End Get Set(value As StateOpt) m_State = value m_IsModifiedState = m_State <> m_OrigState m_IsEnabledBtn(IsValid And IsModified) End Set End Property Private m_IsModifiedProjectAssignedTo As Boolean = False Friend ReadOnly Property IsModifiedProjectAssignedTo As Boolean Get Return m_IsModifiedProjectAssignedTo End Get End Property Private m_OrigProjectAssignedTo As String Private m_ProjectAssignedTo As String Public Property ProjectAssignedTo As String Get Return m_ProjectAssignedTo End Get Set(value As String) m_ProjectAssignedTo = value m_IsModifiedProjectAssignedTo = m_ProjectAssignedTo <> m_OrigProjectAssignedTo m_IsEnabledBtn(IsValid And IsModified) End Set End Property Private m_IsModifiedMaterial As Boolean = False Friend ReadOnly Property IsModifiedMaterial As Boolean Get Return m_IsModifiedMaterial End Get End Property Private m_OrigMaterial As String Private m_Material As String Public Property Material As String Get Return m_Material End Get Set(value As String) m_Material = value m_IsModifiedMaterial = m_Material <> m_OrigMaterial m_IsEnabledBtn(IsValid And IsModified) End Set End Property Private m_IsModifiedThickness As Boolean = False Friend ReadOnly Property IsModifiedThickness As Boolean Get Return m_IsModifiedThickness End Get End Property Private m_OrigThickness As Double Private m_Thickness As Double Public Property Thickness As String Get If m_Thickness < EPS_SMALL Then Return "" Return LenToString(m_Thickness, -2) End Get Set(value As String) Dim dThickness As Double = 0 If StringToLen(value, dThickness) And dThickness > -EPS_ZERO Then m_Thickness = dThickness m_IsModifiedThickness = m_Thickness <> m_OrigThickness Else NotifyPropertyChanged("Thickness") End If m_IsEnabledBtn(IsValid) If Not String.IsNullOrWhiteSpace(m_ThicknessError) Then Map.refStatusBarVM.SetOutputMessage(m_ThicknessError, 5, MSG_TYPE.ERROR_) End If End Set End Property Friend Function GetThickness() As Double Return m_Thickness End Function Private m_IsModifiedWarehousePosition As Boolean = False Friend ReadOnly Property IsModifiedWarehousePosition As Boolean Get Return m_IsModifiedWarehousePosition End Get End Property Private m_OrigWarehousePosition As String Private m_WarehousePosition As String Public Property WarehousePosition As String Get Return m_WarehousePosition End Get Set(value As String) m_WarehousePosition = value m_IsModifiedWarehousePosition = m_WarehousePosition <> m_OrigWarehousePosition m_IsEnabledBtn(IsValid And IsModified) End Set End Property Private m_AddedDate As Date Public Property AddedDate As Date Get Return m_AddedDate End Get Set(value As Date) m_AddedDate = value End Set End Property Private m_IsLoaded As Boolean Public Property IsLoaded As Boolean Get Return m_IsLoaded End Get Set(value As Boolean) m_IsLoaded = value NotifyPropertyChanged("IsLoaded") End Set End Property Public ReadOnly Property Slab_Tooltip As String Get Dim CurrState As String = String.Empty For Index = 0 To Map.refProjectVM.StateList.Count - 1 If Map.refProjectVM.StateList(Index).Id = m_State Then CurrState = Map.refProjectVM.StateList(Index).Name End If Next Dim Tooltip As String = EgtMsg(MSG_SLAB + 1) & ": " & m_Id & Environment.NewLine & EgtMsg(MSG_SLAB + 3) & ": " & CurrState & Environment.NewLine & EgtMsg(MSG_SLAB + 4) & ": " & m_ProjectAssignedTo & Environment.NewLine & EgtMsg(MSG_RAWPARTPAGEUC + 9) & ": " & m_Material & Environment.NewLine & EgtMsg(MSG_RAWPARTPAGEUC + 5) & ": " & Thickness & Environment.NewLine & EgtMsg(MSG_SLAB + 5) & ": " & m_WarehousePosition & Environment.NewLine & EgtMsg(MSG_SLAB + 6) & ": " & m_AddedDate Return Tooltip End Get End Property #End Region ' FIELDS & PROPERTIES #Region "CONSTRUCTOR" Sub New(sId As String, sPath As String, State As StateOpt, sProjectAssignedTo As String, Material As String, dThickness As Double, sWarehousePosition As String) m_Id = sId m_ImagePath = sPath m_State = State m_ProjectAssignedTo = sProjectAssignedTo m_Material = Material m_Thickness = dThickness m_WarehousePosition = sWarehousePosition m_AddedDate = Date.Today m_IsLoaded = False End Sub Sub New(SlabReader As SQLiteDataReader) m_Id = SlabReader(DB_ID) Dim TempPath As String = SlabReader(DB_IMAGEPATH) If Not File.Exists(TempPath) Then TempPath = Map.refMainWindowVM.MainWindowM.sPhotoDir & "\" & CStr(SlabReader(DB_IMAGEPATH)) m_ImagePath = TempPath m_State = SlabReader(DB_STATE) m_ProjectAssignedTo = If(SlabReader(DB_PROJASSIGNEDTO) Is DBNull.Value, Nothing, SlabReader(DB_PROJASSIGNEDTO)) Dim MaterialName As String = SlabReader(DB_MATERIAL) m_Material = If(Not String.IsNullOrWhiteSpace(MaterialName), MaterialName, Nothing) m_Thickness = SlabReader(DB_THICKNESS) m_WarehousePosition = SlabReader(DB_WAREHOUSEPOS) m_AddedDate = Date.Today End Sub #End Region ' CONSTRUCTOR #Region "METHODS" Private m_IdError As String Public ReadOnly Property IdErrorMsg As String Get Return m_IdError End Get End Property Private m_ImagePathError As String Public ReadOnly Property ImagePathErrorMsg As String Get Return m_ImagePathError End Get End Property Private m_ThicknessError As String Public ReadOnly Property ThicknessErrorMsg As String Get Return m_ThicknessError End Get End Property Private Function GetValidationError(propertyName As String) As Boolean Dim bOk As Boolean = True Select Case propertyName Case "Id" bOk = Me.ValidateId() Case "ImagePath" bOk = Me.ValidateImagePath() Case "Thickness" bOk = Me.ValidateThickness() End Select Return bOk End Function ''' ''' Returns true if this object has no validation errors. ''' Public ReadOnly Property IsValid() As Boolean Get For Each [property] As String In ValidatedProperties If Not GetValidationError([property]) Then Return False End If Next [property] Return True End Get End Property Private Shared ReadOnly ValidatedProperties() As String = {"Id", "ImagePath", "Thickness"} Private Function ValidateId() As Boolean m_IdError = String.Empty If Not String.IsNullOrEmpty(m_Id) Then For Each Slab In Map.refProjectVM.SlabList If Slab IsNot Me AndAlso Slab.Id = m_Id Then ' Nome già utilizzato m_IdError = EgtMsg(MSG_SLAB + 1) 'Map.refStatusBarVM.SetOutputMessage(sMsg, 3, MSG_TYPE.ERROR_) Return False End If Next Return True Else ' Il nome è obbligatorio m_IdError = EgtMsg(MSG_SLAB + 2) 'Map.refStatusBarVM.SetOutputMessage(sMsg, 3, MSG_TYPE.ERROR_) Return False End If End Function Private Function ValidateImagePath() As Boolean m_ImagePathError = String.Empty If Not String.IsNullOrEmpty(m_ImagePath) Then Return True ' Il nome immagine è obbligatorio m_ImagePathError = EgtMsg(MSG_SLAB + 3) Return False End Function Private Function ValidateThickness() As Boolean m_ThicknessError = String.Empty If Not IsNothing(m_Thickness) Then Dim dThickness As Double = 0 StringToLen(m_Thickness, dThickness) If dThickness > EPS_SMALL Then Return True ' Non sono ammessi spessori negativi m_ThicknessError = EgtMsg(MSG_RAWPARTPAGEUC + 18) 'Map.refStatusBarVM.SetOutputMessage(sMsg, 3, MSG_TYPE.ERROR_) Return False End If Return False End Function Public ReadOnly Property IsModified() As Boolean Get Return m_IsModifiedId OrElse m_IsModifiedImagePath OrElse m_IsModifiedState OrElse m_IsModifiedProjectAssignedTo OrElse m_IsModifiedMaterial OrElse m_IsModifiedThickness OrElse m_IsModifiedWarehousePosition End Get End Property Friend Sub ResetIsModified() m_IsModifiedId = False m_IsModifiedImagePath = False m_IsModifiedState = False m_IsModifiedProjectAssignedTo = False m_IsModifiedMaterial = False m_IsModifiedThickness = False m_IsModifiedWarehousePosition = False End Sub Friend Sub SetOrigValues() m_OrigId = m_Id m_OrigImagePath = m_ImagePath m_OrigState = m_State m_OrigProjectAssignedTo = m_ProjectAssignedTo m_OrigMaterial = m_Material m_OrigThickness = m_Thickness m_OrigWarehousePosition = m_WarehousePosition End Sub #End Region ' METHODS End Class Public Class Material Private m_nId As Integer Private m_sName As String Public ReadOnly Property nId As Integer Get Return m_nId End Get End Property Public Property sName As String Get Return m_sName End Get Set(value As String) m_sName = value End Set End Property Sub New(sName As String, MaterialList As ObservableCollection(Of Material)) Dim nMaxId As Integer = 0 For Each Material In MaterialList If Material.nId > nMaxId Then nMaxId = Material.nId End If Next m_nId = nMaxId + 1 m_sName = sName End Sub Sub New(nId As Integer, sName As String) m_nId = nId m_sName = sName End Sub End Class ''' ''' Class that represent a Converter that convert mm in inch if necessary for the param depth. ''' Public Class StateIndexConverter Implements IMultiValueConverter Dim StateList As List(Of IdNameStruct) Public Function Convert(value() As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IMultiValueConverter.Convert If Not TypeOf value(1) Is List(Of IdNameStruct) Then Return value(0) StateList = DirectCast(value(1), List(Of IdNameStruct)) Dim SelState As Slab.StateOpt If Not TypeOf value(0) Is Slab.StateOpt Then Return value(0) SelState = DirectCast(value(0), Slab.StateOpt) For Index = 0 To StateList.Count - 1 If StateList(Index).Id = SelState Then Return Index End If Next Return value End Function Public Function ConvertBack(value As Object, targetType() As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack Return {StateList(value).Id} End Function End Class