Imports System.Collections.ObjectModel Imports EgtUILib Imports EgtCAM5.IniFile Namespace EgtCAM5 Public Class ManageLayerExpanderViewModel Inherits ViewModelBase #Region "FIELDS & PROPERTIES" ' Expander Header Properties Private m_HeaderName As String Public Property HeaderName As String Get Return m_HeaderName End Get Set(value As String) m_HeaderName = value OnPropertyChanged("HeaderName") End Set End Property Private m_HeaderColor As SolidColorBrush Public Property HeaderColor As SolidColorBrush Get Return m_HeaderColor End Get Set(value As SolidColorBrush) m_HeaderColor = value OnPropertyChanged("HeaderColor") End Set End Property ' Definizione comandi Private m_cmdNewPart As ICommand Private m_cmdNewLayer As ICommand Private m_cmdLayerColor As ICommand Private m_cmdTreeViewDoubleClick As ICommand ' Lista dei layer Private m_LayerList As New ObservableCollection(Of LayerTreeViewItem) Public Property LayerList As ObservableCollection(Of LayerTreeViewItem) Get Return m_LayerList End Get Set(value As ObservableCollection(Of LayerTreeViewItem)) m_LayerList = value End Set End Property #End Region #Region "CONSTRUCTOR" Sub New() Application.Msn.Register(Application.LOADOBJTREE, Sub() LoadObjTree() End Sub) Application.Msn.Register(Application.UPDATEOBJINOBJTREE, Sub(nId As Integer) UpdateObjInObjTree(nId) End Sub) Application.Msn.Register(Application.SELECTIDINOBJTREE, Sub(nId As Integer) SelectIdInObjTree(nId) End Sub) Application.Msn.Register(Application.CLEAROBJTREE, Sub() ClearObjTree() End Sub) Application.Msn.Register(Application.UPDATEOBJTREE, Sub() UpdateObjTree() End Sub) Application.Msn.Register(Application.UPDATEHEADERNAME, Sub(HeaderName As String) Me.HeaderName = HeaderName End Sub) Application.Msn.Register(Application.UPDATEHEADERCOLOR, Sub(HeaderColor As Color3d) Me.HeaderColor = New SolidColorBrush(Color.FromArgb(HeaderColor.A, HeaderColor.R, HeaderColor.G, HeaderColor.B)) End Sub) Application.Msn.Register(Application.UPDATEOBJTREEOLDID, Sub(ObjTreeOldId As Integer) Me.m_nObjTreeOldId = ObjTreeOldId End Sub) End Sub #End Region ' Constructor #Region "COMMANDS" #Region "NewPartCommand" ''' ''' Returns a command that do Point. ''' Public ReadOnly Property NewPartCommand As ICommand Get If m_cmdNewPart Is Nothing Then m_cmdNewPart = New RelayCommand(AddressOf NewPart, AddressOf CanNewPart) End If Return m_cmdNewPart End Get End Property ''' ''' Execute the Point. This method is invoked by the PointCommand. ''' Public Sub NewPart(ByVal param As Object) Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.NEWPART) End Sub ''' ''' Returns always true. ''' Private Function CanNewPart(ByVal param As Object) As Boolean Return True End Function #End Region ' NewPartCommand #Region "NewLayerCommand" ''' ''' Returns a command that do Point. ''' Public ReadOnly Property NewLayerCommand As ICommand Get If m_cmdNewLayer Is Nothing Then m_cmdNewLayer = New RelayCommand(AddressOf NewLayer, AddressOf CanNewLayer) End If Return m_cmdNewLayer End Get End Property ''' ''' Execute the Point. This method is invoked by the PointCommand. ''' Public Sub NewLayer(ByVal param As Object) Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.NEWLAYER) End Sub ''' ''' Returns always true. ''' Private Function CanNewLayer(ByVal param As Object) As Boolean Return True End Function #End Region ' NewLayerCommand #Region "LayerColorCommand" ''' ''' Returns a command that do Point. ''' Public ReadOnly Property LayerColorCommand As ICommand Get If m_cmdLayerColor Is Nothing Then m_cmdLayerColor = New RelayCommand(AddressOf LayerColor, AddressOf CanLayerColor) End If Return m_cmdLayerColor End Get End Property ''' ''' Execute the Point. This method is invoked by the PointCommand. ''' Public Sub LayerColor(ByVal param As Object) Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.LAYERCOLOR) End Sub ''' ''' Returns always true. ''' Private Function CanLayerColor(ByVal param As Object) As Boolean Return True End Function #End Region ' LayerColorCommand #Region "TreeViewDoubleClickCommand" ''' ''' Returns a command that do Point. ''' Public ReadOnly Property TreeViewDoubleClickCommand As ICommand Get If m_cmdTreeViewDoubleClick Is Nothing Then m_cmdTreeViewDoubleClick = New RelayCommand(AddressOf TreeViewDoubleClick, AddressOf CanTreeViewDoubleClick) End If Return m_cmdTreeViewDoubleClick End Get End Property ''' ''' Execute the Point. This method is invoked by the PointCommand. ''' Public Sub TreeViewDoubleClick(ByVal param As Object) If m_nObjTreeOldId <> GDB_ID.NULL Then Application.Msn.NotifyColleagues(Application.SETLASTINTEGER, m_nObjTreeOldId) Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.SETCURRPARTLAYER) End If End Sub ''' ''' Returns always true. ''' Private Function CanTreeViewDoubleClick(ByVal param As Object) As Boolean Return True End Function #End Region ' TreeViewDoubleClickCommand #End Region ' Commands #Region "METHODS" Private WithEvents ObjTreeTimer As New System.Windows.Threading.DispatcherTimer Private m_nObjTreeOldId As Integer = GDB_ID.NULL Private m_nObjTreeMenuId As Integer = GDB_ID.NULL Private Sub ObjTreeTickEvent(source As Object, e As EventArgs) Handles ObjTreeTimer.Tick If m_nObjTreeOldId <> GDB_ID.NULL Then EgtResetMark(m_nObjTreeOldId) EgtDraw() End If ObjTreeTimer.Stop() End Sub Public Sub LoadObjTree() Dim nOldId As Integer = ClearObjTree() AddGroupInObjTree(GDB_ID.ROOT, GDB_LV.USER, 0, LayerList) If nOldId <> GDB_ID.NULL Then SelectIdInObjTree(nOldId) 'UpdateObjDataInObjTree(m_nObjTreeOldId) Else 'tBoxInfo.Text = String.Empty End If End Sub Private Function ClearObjTree() As Integer Dim nOldId As Integer = RevertOldIdInObjTree() LayerList.Clear() Return nOldId End Function Private Sub AddGroupInObjTree(ByVal nGroupId As Integer, ByVal nLevel As Integer, ByVal nDepth As Integer, ByRef PrevNodColl As ObservableCollection(Of LayerTreeViewItem)) Dim CurrNodColl As ObservableCollection(Of LayerTreeViewItem) If nGroupId = GDB_ID.ROOT Then CurrNodColl = PrevNodColl Else ' livello Dim nObjLev As Integer = GDB_LV.USER EgtGetLevel(nGroupId, nObjLev) If nObjLev = GDB_LV.TEMP Then nLevel = GDB_LV.TEMP ElseIf nLevel = GDB_LV.USER Then nLevel = nObjLev End If ' tipo Dim nGroupType As Integer = 0 ' 0=gruppo generico, 1=pezzo, 2=layer If nLevel = GDB_LV.USER Then nGroupType = nDepth End If ' nome Dim sName As String = String.Empty Dim sText As String = String.Empty If EgtGetName(nGroupId, sName) Then If nGroupType = 1 Then sText = sName + " (Part " + nGroupId.ToString + ")" ElseIf nGroupType = 2 Then sText = sName + " (Layer " + nGroupId.ToString + ")" Else sText = sName + " (Group " + nGroupId.ToString + ")" End If Else If nGroupType = 1 Then sText = "Part " + nGroupId.ToString ElseIf nGroupType = 2 Then sText = "Layer " + nGroupId.ToString Else sText = "Group " + nGroupId.ToString End If End If ' per visualizzare oggetti di livello diverso da utente, si deve avere il permesso If nLevel <> GDB_LV.USER And nUserLevel() < 5 Then Return End If ' inserisco il nodo nell'albero Dim CurrColor As Color3d EgtGetCalcColor(nGroupId, CurrColor) Dim sImage As String = TypeToImageInObjTree(GDB_TY.GROUP, nGroupType) Dim CurrNod As LayerTreeViewItem = New LayerTreeViewItem(nGroupId, sText, sImage, CurrColor) PrevNodColl.Add(CurrNod) CurrNodColl = CurrNod.Items Dim nStat As Integer = GDB_ST.ON_ EgtGetStatus(nGroupId, nStat) CurrNod.OnOff = (nStat <> GDB_ST.OFF) End If Dim nObjs As Integer = EgtGetGroupObjs(nGroupId) If (nObjs > 20000) Then Dim sText As String = "Too many entities (" + nObjs.ToString() + ")" CurrNodColl.Add(New LayerTreeViewItem(GDB_ID.NULL, sText)) Return End If Dim nId As Integer = EgtGetFirstInGroup(nGroupId) While nId <> GDB_ID.NULL 'recupero il tipo di nodo Dim nType As Integer = EgtGetType(nId) 'se gruppo If nType = GDB_TY.GROUP Then AddGroupInObjTree(nId, nLevel, nDepth + 1, CurrNodColl) 'se oggetto geometrico ElseIf nType >= GDB_TY.GEO_VECTOR Then Dim sTitle As String = String.Empty EgtGetTitle(nId, sTitle) Dim sName As String = String.Empty Dim sText As String = String.Empty If EgtGetName(nId, sName) Then sText = sName + " (" + sTitle + " " + nId.ToString + ")" Else sText = sTitle + " " + nId.ToString End If Dim CurrColor As Color3d EgtGetCalcColor(nGroupId, CurrColor) Dim sImage As String = TypeToImageInObjTree(nType, nDepth) Dim CurrNod As LayerTreeViewItem = New LayerTreeViewItem(nId, sText, sImage, CurrColor) CurrNodColl.Add(CurrNod) Dim nStat As Integer = GDB_ST.ON_ EgtGetStatus(nId, nStat) CurrNod.OnOff = (nStat <> GDB_ST.OFF) End If 'passo al successivo nId = EgtGetNext(nId) End While End Sub Private Function TypeToImageInObjTree(ByVal nType As Integer, ByVal nSubType As Integer) As String Select Case nType Case GDB_TY.GROUP If nSubType = 1 Then Return "/Resources/TreeView/Folder.png" ElseIf nSubType = 2 Then Return "/Resources/TreeView/Folder.png" Else Return "/Resources/TreeView/Group.ico" End If Case GDB_TY.GEO_VECTOR Return "/Resources/TreeView/Vector.ico" Case GDB_TY.GEO_POINT Return "/Resources/TreeView/Point.ico" Case GDB_TY.GEO_FRAME Return "/Resources/TreeView/Frame.ico" Case GDB_TY.CRV_LINE Return "/Resources/TreeView/Line.ico" Case GDB_TY.CRV_ARC Return "/Resources/TreeView/Arc.ico" Case GDB_TY.CRV_BEZ Return "/Resources/TreeView/CBezier.ico" Case GDB_TY.CRV_COMPO Return "/Resources/TreeView/CCompo.ico" Case GDB_TY.SRF_MESH Return "/Resources/TreeView/STriMesh.ico" Case GDB_TY.SRF_FRGN Return "/Resources/TreeView/Folder.png" Case GDB_TY.EXT_TEXT Return "/Resources/TreeView/Text.ico" End Select Return "" End Function Private Sub UpdateObjTree() ' per aggiornare l'albero senza ricostruirlo da capo ' se c'è una entità corrente, ne aggiorno i dati If m_nObjTreeOldId <> GDB_ID.NULL Then 'UpdateObjDataInObjTree(m_nObjTreeOldId) End If End Sub 'Private Sub ObjTree_AfterSelect(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterSelect ' ' verifico che il select derivi da azione utente ' If e.Action = TreeViewAction.Unknown Then ' Return ' End If ' ' recupero l'Id del nuovo oggetto selezionato ' Dim nId As Integer ' If Not Int32.TryParse(e.Node.Name, nId) Then ' Return ' End If ' UpdateObjInObjTree(nId) 'End Sub 'Private Sub ObjTree_MouseUp(ByVal sender As Object, e As MouseEventArgs) Handles TreeView1.MouseUp ' ' determino Id di eventuale item sotto il mouse ' Dim nId As Integer = GDB_ID.NULL ' Dim TNode As TreeNode = TreeView1.GetNodeAt(e.Location) ' If TNode IsNot Nothing Then ' Int32.TryParse(TNode.Name, nId) ' End If ' ' se Id coincide con il corrente ' If nId <> GDB_ID.NULL And nId = m_nObjTreeOldId Then ' ' evidenzio ' EgtSetMark(m_nObjTreeOldId) ' EgtDraw() ' ' lancio timer per successiva de-evidenziazione ' ObjTreeTimer.Stop() ' ObjTreeTimer.Start() ' End If ' ' se rilascio tasto destro ' If e.Button = Windows.Forms.MouseButtons.Right Then ' ' Id pezzo sotto il mouse ' m_nObjTreeMenuId = nId ' ' verifico stato visualizzazione per abilitare voci menù ' Dim nStat As GDB_ST = GDB_ST.ON_ ' Dim bOn As Boolean = EgtGetCalcStatus(m_nObjTreeMenuId, nStat) And nStat <> GDB_ST.OFF ' For Each Item As ToolStripItem In ContextMenuTreeView1.Items ' If Item.Name = "cmdSetName" Or Item.Name = "cmdSetInfo" Then ' Item.Enabled = True ' Else ' Item.Enabled = bOn ' End If ' Next ' ContextMenuTreeView1.Show(TreeView1, e.Location) ' End If 'End Sub Private Sub UpdateObjInObjTree(ByVal nId As Integer) ' ripristino eventuale vecchio oggetto selezionato RevertOldIdInObjTree() ' stampa dei dati del nuovo oggetto 'UpdateObjDataInObjTree(nId) ' evidenzio l'oggetto EgtSetMark(nId) m_nObjTreeOldId = nId ' imposto il ridisegno della scena EgtDraw() ' lancio timer per successiva de-evidenziazione ObjTreeTimer.Stop() ObjTreeTimer.Start() End Sub Private Function RevertOldIdInObjTree() As Integer ' salvo il vecchio Id Dim nOldId As Integer = m_nObjTreeOldId ' se non nullo... If EgtExistsObj(m_nObjTreeOldId) Then ' smarco l'oggetto EgtResetMark(m_nObjTreeOldId) ' annullo oggetto da ripristinare m_nObjTreeOldId = GDB_ID.NULL End If Return nOldId End Function Private Function SelectIdInObjTree(ByVal nId As Integer) As Boolean Dim tNode As LayerTreeViewItem = SearchIdInLayerList(nId) If Not IsNothing(tNode) Then tNode.IsSelected = True tNode.IsExpanded = True m_nObjTreeOldId = nId Return True Else m_nObjTreeOldId = GDB_ID.NULL Return False End If End Function Private Function SearchIdInLayerList(nId As Integer) As LayerTreeViewItem For Each Item In LayerList If Item.Id = nId Then Return Item Else Return SearchIdInLayerList(Item.Id) End If Next Return Nothing End Function 'Private Sub MenuObjTree_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ContextMenuTreeView1.ItemClicked ' If e.ClickedItem.Name = "cmdSelectPartLayObj" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.SELECTPARTLAYEROBJ) ' ElseIf e.ClickedItem.Name = "cmdDeselectPartLayObj" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.DESELECTPARTLAYEROBJ) ' ElseIf e.ClickedItem.Name = "cmdSetName" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.SETNAME) ' ElseIf e.ClickedItem.Name = "cmdSetInfo" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.SETINFO) ' ElseIf e.ClickedItem.Name = "cmdRelocatePartLayObj" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.RELOCATEPARTLAYEROBJ) ' ElseIf e.ClickedItem.Name = "cmdCopyPartLayObj" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.COPYPARTLAYEROBJ) ' ElseIf e.ClickedItem.Name = "cmdDeletePartLayObj" Then ' m_Controller.SetLastInteger(m_nObjTreeMenuId) ' m_Controller.ExecuteCommand(CMD.DELETE) ' ElseIf e.ClickedItem.Name = "cmdSavePartLay" Then ' ContextMenuTreeView1.Close() ' Dim sDir As String = String.Empty ' GetPrivateProfileString(S_GENERAL, K_LASTNGEOBJDIR, "", sDir, m_sIniFile) ' Dim nType As NGE = GetPrivateProfileInt(S_GEOMDB, K_SAVETYPE, NGE.CMPTEXT, m_sIniFile) ' m_Controller.SaveObject(m_nObjTreeMenuId, sDir, nType) ' End If 'End Sub #End Region ' Methods End Class End Namespace