Imports System.Collections.ObjectModel
Imports EgtUILib
Imports EgtWPFLib5

Public Class PositionGroup

   ' Lista delle posizioni
   Private m_PositionList As New ObservableCollection(Of Position)
   Public Property PositionList As ObservableCollection(Of Position)
      Get
         Return m_PositionList
      End Get
      Set(value As ObservableCollection(Of Position))
         m_PositionList = value
      End Set
   End Property

   Sub New()
   End Sub

   Sub New(PositionList As ObservableCollection(Of Position))
      m_PositionList = PositionList
   End Sub

End Class

Public Class Position

   Private Const INVALIDPOS As String = ""

   Private m_TcPos As String
   Public Property TcPos As String
      Get
         Return m_TcPos
      End Get
      Set(value As String)
         m_TcPos = value
      End Set
   End Property

   Friend m_IsModifiedHead As Boolean = False
   Friend m_IsAppliedHead As Boolean = True
   Private m_OrigHead As String = Nothing
   Friend Property OrigHead As String
      Get
         Return m_OrigHead
      End Get
      Set(value As String)
         m_OrigHead = value
         m_IsAppliedHead = True
      End Set
   End Property
   Private m_Head As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Head
   ''' </summary>
   Friend Property Head As String
      Get
         Return m_Head
      End Get
      Set(value As String)
         If value = String.Empty Or value <> m_Head Then
            m_Head = value
            If Not IsNothing(m_Head) And Not IsNothing(m_OrigHead) Then
               m_IsAppliedHead = (m_Head = m_OrigHead)
            Else
               m_IsAppliedHead = IsNothing(m_Head) And IsNothing(m_OrigHead)
            End If
            m_IsModifiedHead = True
         End If
      End Set
   End Property
   Friend Sub SetHead(value As String)
      If value = String.Empty Or value <> m_Head Then
         m_Head = value
         m_IsModifiedHead = False
      End If
   End Sub

   ' Lista delle uscite con relativi utensili associati
   Private m_ExitToolAssociationList As New ObservableCollection(Of ExitToolAssociation)
   Public Property ExitToolAssociationList As ObservableCollection(Of ExitToolAssociation)
      Get
         Return m_ExitToolAssociationList
      End Get
      Set(value As ObservableCollection(Of ExitToolAssociation))
         m_ExitToolAssociationList = value
      End Set
   End Property

#Region "METHODS"

   Friend Sub SetIsValidPosFromTool(TUuid As String)
      EgtLuaSetGlobStringVar("STU.TUUID", TUuid)
      EgtLuaSetGlobStringVar("STU.TCPOS", m_TcPos)
      EgtLuaCallFunction("STU.GetValidHeadExitForPos")
      ' Leggo variabili
      Dim sHead As String = String.Empty
      EgtLuaGetGlobStringVar("STU.HEAD", sHead)
      Dim nExit As Integer = 0
      EgtLuaGetGlobIntVar("STU.EXIT", nExit)
      Dim nErr As Integer = 999
      EgtLuaGetGlobIntVar("STU.ERR", nErr)
      If nErr <> 0 Then
         ' disattivo tutte le uscite tranne quelle attrezzate
         For ExitIndex = 0 To ExitToolAssociationList.Count - 1
            If ExitToolAssociationList(ExitIndex).IsOccupied Then
               ExitToolAssociationList(ExitIndex).IsEnabledPos = True
               ExitToolAssociationList(ExitIndex).IsValidPos = False
            Else
               ExitToolAssociationList(ExitIndex).IsEnabledPos = False
            End If
         Next
         Dim sToolName As String = String.Empty
         EgtTdbGetToolFromUUID(TUuid, sToolName)
         EgtOutLog("Error in setup! Tool:" & sToolName & " TcPos: " & m_TcPos)
         Return
      End If
      ' verifico se la posizione è libera o c'è un utensile attrezzato
      Dim PosIsOccupied As Boolean = False
      For ExitIndex = 0 To ExitToolAssociationList.Count - 1
         If ExitToolAssociationList(ExitIndex).IsOccupied Then
            PosIsOccupied = True
            Exit For
         End If
      Next
      ' se la posizione non è valida, disattivo tutte le uscite tranne quelle attrezzate
      If sHead = INVALIDPOS Then
         For ExitIndex = 0 To ExitToolAssociationList.Count - 1
            If ExitToolAssociationList(ExitIndex).IsOccupied Then
               ExitToolAssociationList(ExitIndex).IsEnabledPos = True
               ExitToolAssociationList(ExitIndex).IsValidPos = False
            Else
               ExitToolAssociationList(ExitIndex).IsEnabledPos = False
            End If
         Next
         ' altrimenti, se la posizione nell'attrezzaggio è vuota
      ElseIf Not PosIsOccupied Then
         ' se l'uscita restituita esiste 
         If ExitToolAssociationList.Count >= nExit Then
            ' disattivo tutte le uscite tranne quella restituita
            For ExitIndex = 0 To ExitToolAssociationList.Count - 1
               If ExitIndex + 1 = nExit Then
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                  ExitToolAssociationList(ExitIndex).IsValidPos = True
               Else
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = False
               End If
            Next
            ' altrimenti lascio attiva solo la prima uscita
         Else
            ExitToolAssociationList(0).IsEnabledPos = True
            For ExitIndex = 1 To ExitToolAssociationList.Count - 1
               ExitToolAssociationList(ExitIndex).IsEnabledPos = False
            Next
         End If
         ' altrimenti, se le teste coincidono
      ElseIf sHead = Head Then
         ' se l'uscita restituita è libera la attivo e disattivo tutte le altre non occupate
         If Not ExitToolAssociationList(nExit - 1).IsOccupied Then
            For ExitIndex = 0 To ExitToolAssociationList.Count - 1
               If ExitIndex = nExit - 1 Then
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                  ExitToolAssociationList(ExitIndex).IsValidPos = True
               ElseIf ExitToolAssociationList(ExitIndex).IsOccupied Then
                  ExitToolAssociationList(ExitIndex).IsValidPos = False
               Else
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = False
               End If
            Next
            ' altrimenti le disattivo tutte tranne quelle occupate
         Else
            For ExitIndex = 0 To ExitToolAssociationList.Count - 1
               If ExitToolAssociationList(ExitIndex).IsOccupied Then
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                  If ExitIndex = nExit - 1 Then
                     ExitToolAssociationList(ExitIndex).IsValidPos = True
                  Else
                     ExitToolAssociationList(ExitIndex).IsValidPos = False
                  End If
               Else
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = False
               End If
            Next
         End If
         ' se le teste non coincidono
      Else
         EgtLuaSetGlobStringVar("STU.HEAD1", sHead)
         EgtLuaSetGlobStringVar("STU.HEAD2", Head)
         EgtLuaCallFunction("STU.IsCompatibleHeads")
         ' Leggo variabili
         Dim bIsValid As Boolean = False
         EgtLuaGetGlobBoolVar("STU.ISVALID", bIsValid)
         nErr = 999
         EgtLuaGetGlobIntVar("STU.ERR", nErr)
         If nErr <> 0 Then
            ' disattivo tutte le uscite tranne quelle attrezzate
            For ExitIndex = 0 To ExitToolAssociationList.Count - 1
               If ExitToolAssociationList(ExitIndex).IsOccupied Then
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                  ExitToolAssociationList(ExitIndex).IsValidPos = False
               Else
                  ExitToolAssociationList(ExitIndex).IsEnabledPos = False
               End If
            Next
            Dim sToolName As String = String.Empty
            EgtTdbGetToolFromUUID(TUuid, sToolName)
            EgtOutLog("Error in setup! Tool:" & sToolName & " TcPos: " & m_TcPos)
            Return
         End If
         ' se le teste sono compatibili
         If bIsValid Then
            ' se l'uscita restituita è libera la attivo e disattivo tutte le altre non occupate
            If nExit < ExitToolAssociationList.Count - 1 AndAlso Not ExitToolAssociationList(nExit - 1).IsOccupied Then
               For ExitIndex = 0 To ExitToolAssociationList.Count - 1
                  If ExitIndex = nExit - 1 Then
                     ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                     ExitToolAssociationList(ExitIndex).IsValidPos = True
                  ElseIf ExitToolAssociationList(ExitIndex).IsOccupied Then
                     ExitToolAssociationList(ExitIndex).IsValidPos = False
                  Else
                     ExitToolAssociationList(ExitIndex).IsEnabledPos = False
                  End If
               Next
               ' altrimenti le disattivo tutte tranne quelle occupate
            Else
               For ExitIndex = 0 To ExitToolAssociationList.Count - 1
                  If ExitToolAssociationList(ExitIndex).IsOccupied Then
                     ExitToolAssociationList(ExitIndex).IsEnabledPos = True
                     If ExitIndex = nExit - 1 Then
                        ExitToolAssociationList(ExitIndex).IsValidPos = True
                     Else
                        ExitToolAssociationList(ExitIndex).IsValidPos = False
                     End If
                  Else
                     ExitToolAssociationList(ExitIndex).IsEnabledPos = False
                  End If
               Next
            End If
            ' se le teste non sono compatibili
         Else
            ' disabilito tutte le uscite
            For ExitIndex = 0 To ExitToolAssociationList.Count - 1
               ExitToolAssociationList(ExitIndex).IsEnabledPos = False
            Next
         End If
      End If

   End Sub

   Friend Sub SetNotValidPos()
      ' le disattivo tutte tranne quelle occupate
      For ExitIndex = 0 To ExitToolAssociationList.Count - 1
         If ExitToolAssociationList(ExitIndex).IsOccupied Then
            ExitToolAssociationList(ExitIndex).IsEnabledPos = True
            ExitToolAssociationList(ExitIndex).IsValidPos = Nothing
         Else
            ExitToolAssociationList(ExitIndex).IsEnabledPos = False
         End If
      Next
   End Sub

#End Region    ' Methods

   Sub New(TcPos As String, Head As String, ExitNum As Integer)
      Me.TcPos = TcPos
      Me.SetHead(Head)
      For ExitIndex = 1 To ExitNum
         ExitToolAssociationList.Add(New ExitToolAssociation(ExitIndex.ToString, Me))
      Next
   End Sub

End Class

Public Class ExitToolAssociation
   Inherits VMBase

   ' Riferimento alla lista utensili
   Friend Shared sh_ToolsList As ObservableCollection(Of FamilyToolItem)
   ' riferimento alla lista posizioni
   Friend Shared sh_PositionGroupList As ObservableCollection(Of PositionGroup)
   ' Actions
   Friend Shared m_delIsModifiedSetUp As Action

   ' Riferimento alla posizione di questa uscita
   Private m_MyPos As Position

   Private m_IsOccupied As Boolean
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Public Property IsOccupied As Boolean
      Get
         Return m_IsOccupied
      End Get
      Set(value As Boolean)
         If value <> m_IsOccupied Then
            m_IsOccupied = value
            NotifyPropertyChanged("IsOccupied")
         End If
      End Set
   End Property

   Private m_IsEnabledPos As Boolean
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Public Property IsEnabledPos As Boolean
      Get
         Return m_IsEnabledPos
      End Get
      Set(value As Boolean)
         If value <> m_IsEnabledPos Then
            m_IsEnabledPos = value
            NotifyPropertyChanged("IsEnabledPos")
         End If
      End Set
   End Property

   Private m_IsValidPos As Boolean?
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Public Property IsValidPos As Boolean?
      Get
         Return m_IsValidPos
      End Get
      Set(value As Boolean?)
         m_IsValidPos = value
         NotifyPropertyChanged("ExitBtnBackgroundCol")
      End Set
   End Property

   Public ReadOnly Property ExitBtnBackgroundCol As SolidColorBrush
      Get
         If IsNothing(m_IsValidPos) Then
            Return New SolidColorBrush(Color.FromArgb(255, 221, 221, 221))
         ElseIf m_IsValidPos Then
            If m_IsOccupied Then
               Return New SolidColorBrush(Color.FromArgb(255, 255, 255, 0))         ' yellow
            Else
               Return New SolidColorBrush(Color.FromArgb(255, 0, 255, 0))           ' green
            End If
         Else
            Return New SolidColorBrush(Color.FromArgb(255, 221, 221, 221))
         End If
      End Get
   End Property

   Private m_Exit As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Public Property ExitPar As String
      Get
         Return m_Exit
      End Get
      Set(value As String)
         If value <> m_Exit Then
            m_Exit = value
         End If
      End Set
   End Property

   Friend m_IsModifiedTool As Boolean = False
   Friend m_IsAppliedTool As Boolean = True
   Private m_OrigTool As ToolItem = Nothing
   Friend Property OrigTool As ToolItem
      Get
         Return m_OrigTool
      End Get
      Set(value As ToolItem)
         m_OrigTool = value
         m_IsAppliedTool = True
      End Set
   End Property
   Private m_Tool As ToolItem
   ''' <summary>
   ''' Property that read and write to the tool's database the Uuid
   ''' </summary>
   Public Property Tool As ToolItem
      Get
         Return m_Tool
      End Get
      Set(value As ToolItem)
         m_Tool = value
         If Not IsNothing(m_Tool) And Not IsNothing(m_OrigTool) Then
            m_IsAppliedTool = (m_Tool.Uuid = m_OrigTool.Uuid)
         Else
            m_IsAppliedTool = IsNothing(m_Tool) And IsNothing(m_OrigTool)
         End If
         m_IsModifiedTool = True
         NotifyPropertyChanged("Tool")
         m_delIsModifiedSetUp()
      End Set
   End Property
   Friend Sub SetTool(ToolItem As ToolItem)
      m_Tool = ToolItem
      If Not IsNothing(m_Tool) And Not IsNothing(m_OrigTool) Then
         m_IsAppliedTool = (m_Tool.Uuid = m_OrigTool.Uuid)
      Else
         m_IsAppliedTool = IsNothing(m_Tool) And IsNothing(m_OrigTool)
      End If
      m_IsModifiedTool = False
      NotifyPropertyChanged("Tool")
   End Sub

#Region "Messages"

   Public ReadOnly Property ToolTipMsg As String
      Get
         If IsNothing(m_Tool) Then Return ""
         EgtTdbSetCurrTool(m_Tool.Name)
         Dim dValue As Double = 0
         Dim nType As Integer
         EgtTdbGetCurrToolParam(MCH_TP.TYPE, nType)
         EgtTdbGetCurrToolParam(MCH_TP.DIAM, dValue)
         Dim sDiam As String = LenToString(dValue, 4)
         EgtTdbGetCurrToolParam(MCH_TP.LEN, dValue)
         Dim sLen As String = LenToString(dValue, 4)
         EgtTdbGetCurrToolParam(MCH_TP.MAXMAT, dValue)
         Dim MaxMat As String = LenToString(dValue, 4)
         Return (EgtMsg(6053) & ": " & ConvertToolTypeToString(nType) & Environment.NewLine &
                 EgtMsg(6056) & ": " & sDiam & Environment.NewLine &
                 EgtMsg(6062) & ": " & sLen & Environment.NewLine &
                 EgtMsg(6064) & ": " & MaxMat)
      End Get
   End Property

   Private Function ConvertToolTypeToString(ToolType As Integer) As String
      Select Case ToolType
         Case MCH_TY.DRILL_STD
            Return EgtMsg(6001)
         Case MCH_TY.DRILL_LONG
            Return EgtMsg(6006)
         Case MCH_TY.SAW_STD
            Return EgtMsg(6002)
         Case MCH_TY.SAW_FLAT
            Return EgtMsg(6007)
         Case MCH_TY.MILL_STD
            Return EgtMsg(6003)
         Case MCH_TY.MILL_NOTIP
            Return EgtMsg(6008)
         Case MCH_TY.MORTISE_STD
            Return EgtMsg(6004)
         Case MCH_TY.COMPO
            Return EgtMsg(6005)
         Case Else
            Return String.Empty
      End Select
   End Function

#End Region    ' Messages

   ' Definizione comandi
   Private m_cmdSetUpTool As ICommand

#Region "CONSTRUCTORS"

   Sub New(ExitPar As String, MyPos As Position)
      Me.ExitPar = ExitPar
      m_MyPos = MyPos
   End Sub

#End Region    ' Constructors

#Region "COMMANDS"

#Region "SetUpToolCommand"

   ''' <summary>
   ''' Returns a command that do Exec.
   ''' </summary>
   Public ReadOnly Property SetUpToolCommand As ICommand
      Get
         If m_cmdSetUpTool Is Nothing Then
            m_cmdSetUpTool = New Command(AddressOf SetUpTool)
         End If
         Return m_cmdSetUpTool
      End Get
   End Property

   ''' <summary>
   ''' Execute the Exec.  This method is invoked by the ExecCommand.
   ''' </summary>
   Public Sub SetUpTool(param As Object)
      If m_IsOccupied Then
         ' se quello selezionato nella lista non è un utensile esco
         If Not TypeOf param Is ToolItem Then
            m_IsOccupied = False
            NotifyPropertyChanged("IsOccupied")
            Return
         End If
         Dim SelTool As ToolItem = DirectCast(param, ToolItem)
         ' verifico se devo cambiare la testa
         EgtLuaSetGlobStringVar("STU.TUUID", SelTool.Uuid)
         EgtLuaSetGlobStringVar("STU.TCPOS", m_MyPos.TcPos)
         EgtLuaCallFunction("STU.GetValidHeadExitForPos")
         ' Leggo variabili
         Dim sHead As String = String.Empty
         EgtLuaGetGlobStringVar("STU.HEAD", sHead)
         Dim nExit As Integer = 0
         EgtLuaGetGlobIntVar("STU.EXIT", nExit)
         Dim nErr As Integer = 999
         EgtLuaGetGlobIntVar("STU.ERR", nErr)
         If nErr <> 0 Then
            Dim sToolName As String = String.Empty
            EgtTdbGetToolFromUUID(SelTool.Uuid, sToolName)
            EgtOutLog("Error in setup! Tool:" & sToolName & " TcPos: " & m_MyPos.TcPos)
            m_IsOccupied = False
            NotifyPropertyChanged("IsOccupied")
            Return
         End If
         ' se la testa restituita non coincide con quella della posizione
         If m_MyPos.Head <> sHead Then
            ' aggiorno testa ed uscite
            m_MyPos.Head = sHead
            For ExitIndex = m_MyPos.ExitToolAssociationList.Count + 1 To EgtGetHeadExitCount(sHead)
               m_MyPos.ExitToolAssociationList.Add(New ExitToolAssociation(ExitIndex.ToString, m_MyPos))
            Next
            For ExitIndex = m_MyPos.ExitToolAssociationList.Count - 1 To EgtGetHeadExitCount(sHead) Step -1
               m_MyPos.ExitToolAssociationList.RemoveAt(ExitIndex)
            Next
         End If
         ' lo aggiungo alla posizione di attrezzaggio
         Tool = SelTool
         IsOccupied = True
         ' e lo tolgo dalla lista
         For Index = 0 To sh_ToolsList.Count - 1
            If (SelTool.Type And sh_ToolsList(Index).Type) > 0 Then
               sh_ToolsList(Index).Items.Remove(SelTool)
               Exit For
            End If
         Next
         NotifyPropertyChanged("ToolTipMsg")
      Else
         ' lo rimetto nella lista utensili
         For Index = 0 To sh_ToolsList.Count - 1
            If (Tool.Type And sh_ToolsList(Index).Type) > 0 Then
               ' creo una copia della lista di utensili della famiglia
               Dim TempList As New List(Of String)
               Dim ToolIndex As Integer
               For ToolIndex = 0 To sh_ToolsList(Index).Items.Count - 1
                  TempList.Add(sh_ToolsList(Index).Items(ToolIndex).Name)
               Next
               ' aggiungo l'utensile da inserire
               TempList.Add(Tool.Name)
               ' riordino la lista 
               TempList.Sort()
               ' ricavo l'indice dell'utensile inserito
               ToolIndex = TempList.IndexOf(Tool.Name)
               ' lo inserisco nel posto giusto
               sh_ToolsList(Index).Items.Insert(ToolIndex, Tool)
               ' espando la famiglia in cui l'ho messo
               sh_ToolsList(Index).IsExpanded = True
               Exit For
            End If
         Next

         ' abilito e disabilito tutte le uscite in base all'utensile selezionato 
         For GroupIndex = 0 To sh_PositionGroupList.Count - 1
            For PosIndex = 0 To sh_PositionGroupList(GroupIndex).PositionList.Count - 1
               sh_PositionGroupList(GroupIndex).PositionList(PosIndex).SetIsValidPosFromTool(Tool.Uuid)
            Next
         Next

         ' seleziono utensile rimesso in lista
         m_Tool.IsSelected = True
         Tool.NotifyPropertyChanged("IsSelected")
         ' e lo tolgo dalla posizione di attrezzaggio
         Tool = Nothing
         IsOccupied = False

      End If
   End Sub

#End Region    ' SetUpToolCommand

#End Region    ' Commands

End Class

Public Class FamilyToolItem
   Inherits InheritableTreeViewItem

   ' riferimento alla lista posizioni
   Friend Shared m_PositionGroupList As ObservableCollection(Of PositionGroup)

   Public Overrides Property IsSelected As Boolean
      Get
         Return m_IsSelected
      End Get
      Set(value As Boolean)
         If (value <> m_IsSelected) Then
            m_IsSelected = value
            If value Then
               ' disabilito tutte le uscite tranne quelle occupate
               For GroupIndex = 0 To m_PositionGroupList.Count - 1
                  For PosIndex = 0 To m_PositionGroupList(GroupIndex).PositionList.Count - 1
                     m_PositionGroupList(GroupIndex).PositionList(PosIndex).SetNotValidPos()
                  Next
               Next
            End If
         End If
      End Set
   End Property

   Public ReadOnly Property FamilyColor As SolidColorBrush
      Get
         If m_HaveToolsInCurrMachGroup Then
            Return Brushes.Red
         Else
            Return Brushes.Transparent
         End If
      End Get
   End Property

   Private m_HaveToolsInCurrMachGroup As Boolean
   Friend ReadOnly Property HaveToolsInCurrMachGroup As Boolean
      Get
         Return m_HaveToolsInCurrMachGroup
      End Get
   End Property

   Private m_Type As MCH_TF
   ''' <summary>
   ''' Property that determines the tool type of the family
   ''' </summary>
   Public ReadOnly Property Type As MCH_TF
      Get
         Return m_Type
      End Get
   End Property

   Sub New(Name As String, Type As MCH_TF)
      MyBase.New(Name)
      Me.PictureString = "/Resources/TreeView/Folder.png"
      m_Type = Type
      ' Aggiungo il gestore d'evento di modifica lista degli item per poter mettere e togliere il pallino che indica se ci sono utensili da attrezzare
      AddHandler Items.CollectionChanged, AddressOf ManageObservableCollection
   End Sub

   Private Sub ManageObservableCollection(sender As Object, e As System.Collections.Specialized.NotifyCollectionChangedEventArgs)
      m_HaveToolsInCurrMachGroup = False
      For Index = 0 To Items.Count - 1
         Dim ToolItem As ToolItem = DirectCast(Items(Index), ToolItem)
         If ToolItem.m_IsInCurrMachGroup Then
            m_HaveToolsInCurrMachGroup = True
         End If
      Next
      NotifyPropertyChanged("FamilyColor")
   End Sub

End Class

Public Class ToolItem
   Inherits InheritableTreeViewItem

   ' riferimento alla lista posizioni
   Friend Shared m_PositionGroupList As ObservableCollection(Of PositionGroup)

   Public Overrides Property IsSelected As Boolean
      Get
         Return m_IsSelected
      End Get
      Set(value As Boolean)
         If (value <> m_IsSelected) Then
            m_IsSelected = value
            If value Then
               ' abilito e disabilito tutte le uscite in base all'utensile selezionato 
               For GroupIndex = 0 To m_PositionGroupList.Count - 1
                  For PosIndex = 0 To m_PositionGroupList(GroupIndex).PositionList.Count - 1
                     m_PositionGroupList(GroupIndex).PositionList(PosIndex).SetIsValidPosFromTool(Uuid)
                  Next
               Next
            End If
         End If
      End Set
   End Property

   Public ReadOnly Property ToolColor As SolidColorBrush
      Get
         If m_IsInCurrMachGroup Then
            Return Brushes.Red
         Else
            Return Brushes.Transparent
         End If
      End Get
   End Property

   Friend m_IsInCurrMachGroup As Boolean
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Public Property IsInCurrMachGroup As Boolean
      Get
         Return m_IsInCurrMachGroup
      End Get
      Set(value As Boolean)
         If value <> m_IsInCurrMachGroup Then
            m_IsInCurrMachGroup = value
            'NotifyPropertyChanged("IsInCurrMachGroup")
         End If
      End Set
   End Property

   Private m_Exit As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Exit
   ''' </summary>
   Friend Property ExitPar As String
      Get
         Return m_Exit
      End Get
      Set(value As String)
         If value <> m_Exit Then
            m_Exit = value
         End If
      End Set
   End Property

   Private m_Type As MCH_TY
   ''' <summary>
   ''' Property that determines the tool type of the family
   ''' </summary>
   Public ReadOnly Property Type As MCH_TY
      Get
         Return m_Type
      End Get
   End Property

   Private m_Head As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Head
   ''' </summary>
   Friend Property Head As String
      Get
         Return m_Head
      End Get
      Set(value As String)
         If value = String.Empty Or value <> m_Head Then
            m_Head = value
         End If
      End Set
   End Property

   Private m_TcPos As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Tc Pos
   ''' </summary>
   Friend Property TcPos As String
      Get
         Return m_TcPos
      End Get
      Set(value As String)
         If value = String.Empty Or value <> m_TcPos Then
            m_TcPos = value
         End If
      End Set
   End Property

   Private m_Uuid As String
   ''' <summary>
   ''' Property that read and write to the tool's database the Uuid
   ''' </summary>
   Friend ReadOnly Property Uuid As String
      Get
         Return m_Uuid
      End Get
   End Property

#Region "Messages"

   Public ReadOnly Property ToolTipMsg As String
      Get
         Return (EgtMsg(6075) & ": " & m_Name & Environment.NewLine &
                 EgtMsg(6078) & ": " & m_TcPos & Environment.NewLine &
                 EgtMsg(6074) & ": " & m_Head & "." & m_Exit)
      End Get
   End Property

#End Region    ' Messages

   Sub New(Name As String, ExitPar As String, Type As Integer, Head As String, TcPos As String, Uuid As String, IsInCurrMachGroup As Boolean)
      MyBase.New(Name)
      m_Exit = ExitPar
      m_Type = DirectCast(Type, MCH_TY)
      m_Head = Head
      m_TcPos = TcPos
      m_Uuid = Uuid
      m_IsInCurrMachGroup = IsInCurrMachGroup
   End Sub

End Class
