Files
EgtCAM5/ProjectPage/OptionPanel/DrawOptionPanel/ManageLayerExpander/ManageLayerExpanderViewModel.vb
T
Emmanuele Sassi f8b17066de EgtCAM5 :
- Migliorie varie.
2016-07-10 11:34:07 +00:00

502 lines
19 KiB
VB.net

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"
''' <summary>
''' Returns a command that do Point.
''' </summary>
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
''' <summary>
''' Execute the Point. This method is invoked by the PointCommand.
''' </summary>
Public Sub NewPart(ByVal param As Object)
Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.NEWPART)
End Sub
''' <summary>
''' Returns always true.
''' </summary>
Private Function CanNewPart(ByVal param As Object) As Boolean
Return True
End Function
#End Region ' NewPartCommand
#Region "NewLayerCommand"
''' <summary>
''' Returns a command that do Point.
''' </summary>
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
''' <summary>
''' Execute the Point. This method is invoked by the PointCommand.
''' </summary>
Public Sub NewLayer(ByVal param As Object)
Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.NEWLAYER)
End Sub
''' <summary>
''' Returns always true.
''' </summary>
Private Function CanNewLayer(ByVal param As Object) As Boolean
Return True
End Function
#End Region ' NewLayerCommand
#Region "LayerColorCommand"
''' <summary>
''' Returns a command that do Point.
''' </summary>
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
''' <summary>
''' Execute the Point. This method is invoked by the PointCommand.
''' </summary>
Public Sub LayerColor(ByVal param As Object)
Application.Msn.NotifyColleagues(Application.EXECUTECOMMAND, Controller.CMD.LAYERCOLOR)
End Sub
''' <summary>
''' Returns always true.
''' </summary>
Private Function CanLayerColor(ByVal param As Object) As Boolean
Return True
End Function
#End Region ' LayerColorCommand
#Region "TreeViewDoubleClickCommand"
''' <summary>
''' Returns a command that do Point.
''' </summary>
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
''' <summary>
''' Execute the Point. This method is invoked by the PointCommand.
''' </summary>
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
''' <summary>
''' Returns always true.
''' </summary>
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 New Color3d(0, 0, 0, 0)
EgtGetColor(nId, 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_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