TaskFlow/app/DD_PM_WINDREAM/ClassRefreshHelper.vb
2022-07-27 09:31:44 +02:00

288 lines
9.4 KiB
VB.net

Imports System
Imports System.Collections
Imports DevExpress.XtraGrid
Imports DevExpress.Utils
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraGrid.Views.Grid
Imports DigitalData.Modules.Logging
Public Class RefreshHelper
'<Serializable>
'Public Structure RowInfo
' Public Id As Object
' Public Level As Integer
'End Structure
''' <summary>
''' Saves information about the current row, like the level and row handle
''' </summary>
<Serializable>
Public Class RowInfo
Public Property Id As Object
Public Property Level As Integer
Public Property Handle As Integer
End Class
Private Property _View As GridView
Private Property _KeyFieldName As String
Private Property _Logger As Logger
Private Property _VisibleRowIndex As Integer = -1
Private ReadOnly Property ExpansionViewInfoList() As New List(Of RowInfo)
Private ReadOnly Property SelectionViewInfoList() As New List(Of RowInfo)
Private ReadOnly Property ExpandedMasterRowList() As New List(Of Object)
Public Sub New(pLogConfig As LogConfig, pView As GridView, pKeyFieldName As String)
_View = pView
_KeyFieldName = pKeyFieldName
_Logger = pLogConfig.GetLogger()
End Sub
Public Sub SaveViewInfo()
Try
SaveExpandedMasterRows()
SaveExpansionViewInfo()
SaveSelectionViewInfo()
SaveVisibleIndex()
Catch ex As Exception
_Logger.Error(ex)
End Try
End Sub
Public Sub LoadViewInfo()
Try
LoadExpandedMasterRows()
LoadExpansionViewInfo()
LoadSelectionViewInfo()
LoadVisibleIndex()
Catch ex As Exception
_Logger.Error(ex)
End Try
End Sub
Private Function FindParentRowHandle(pRowInfo As RowInfo, oRowHandle As Integer) As Integer
Dim oParentRowHandle As Integer = _View.GetParentRowHandle(oRowHandle)
' Fixes endless loop when parent row handle is below zero
If oParentRowHandle < 0 Then
Return oParentRowHandle
End If
Do While _View.GetRowLevel(oParentRowHandle) <> pRowInfo.Level
oParentRowHandle = _View.GetParentRowHandle(oParentRowHandle)
Loop
Return oParentRowHandle
End Function
Private Function GetKeyColumn() As GridColumn
Return _View.Columns(_KeyFieldName)
End Function
Private Function GetKeyColumnValue(pRowHandle As Integer) As Object
Return _View.GetRowCellValue(pRowHandle, GetKeyColumn())
End Function
Private Sub ExpandRowByRowInfo(pRowInfo As RowInfo)
'Dim oDataRowHandle As Integer = _View.LocateByValue(0, GetKeyColumn(), rowInfo.Id)
Dim oDataRowHandle As Integer = pRowInfo.Handle
If oDataRowHandle <> GridControl.InvalidRowHandle Then
Dim parentRowHandle As Integer = FindParentRowHandle(pRowInfo, oDataRowHandle)
_View.SetRowExpanded(parentRowHandle, True, False)
End If
End Sub
Private Function GetRowHandleToSelect(pRowInfo As RowInfo) As Integer
'Dim oDataRowHandle As Integer = _View.LocateByValue(0, GetKeyColumn(), rowInfo.Id)
Dim oDataRowHandle As Integer = pRowInfo.Handle
If oDataRowHandle <> GridControl.InvalidRowHandle Then
If _View.GetRowLevel(oDataRowHandle) <> pRowInfo.Level Then
Return FindParentRowHandle(pRowInfo, oDataRowHandle)
End If
End If
Return oDataRowHandle
End Function
Private Sub SelectRowByRowInfo(pRowInfo As RowInfo, pIsFocused As Boolean)
If pIsFocused Then
_View.FocusedRowHandle = GetRowHandleToSelect(pRowInfo)
Else
_View.SelectRow(GetRowHandleToSelect(pRowInfo))
End If
End Sub
Private Sub SaveSelectionViewInfo()
SelectionViewInfoList.Clear()
Dim oSelectionArray() As Integer = _View.GetSelectedRows()
If oSelectionArray IsNot Nothing Then ' otherwise we have a single focused but not selected row
Dim oRowInfo As New RowInfo
For oIndex As Integer = 0 To oSelectionArray.Length - 1
Dim oDataRowHandle As Integer = oSelectionArray(oIndex)
oRowInfo.Level = _View.GetRowLevel(oDataRowHandle)
If oDataRowHandle < 0 Then ' group row
oDataRowHandle = _View.GetDataRowHandleByGroupRowHandle(oDataRowHandle)
End If
oRowInfo.Id = GetKeyColumnValue(oDataRowHandle)
oRowInfo.Handle = oDataRowHandle
SelectionViewInfoList.Add(oRowInfo)
Next
Else
SelectionViewInfoList.Add(New RowInfo With {
.Id = GetKeyColumnValue(_View.FocusedRowHandle),
.Level = _View.GetRowLevel(_View.FocusedRowHandle),
.Handle = _View.FocusedRowHandle
})
End If
End Sub
Private Sub SaveExpansionViewInfo()
' Dont do anything if the current view does not have any grouped columns
If _View.GroupedColumns.Count = 0 Then
Return
End If
' Clear the list first
ExpansionViewInfoList.Clear()
For oIndex As Integer = -1 To Integer.MinValue + 1 Step -1
If Not _View.IsValidRowHandle(oIndex) Then
Exit For
End If
If _View.GetRowExpanded(oIndex) Then
Dim oDataRowHandle As Integer = _View.GetDataRowHandleByGroupRowHandle(oIndex)
ExpansionViewInfoList.Add(New RowInfo With {
.Id = GetKeyColumnValue(oDataRowHandle),
.Level = _View.GetRowLevel(oIndex),
.Handle = oDataRowHandle
})
End If
Next
End Sub
Private Sub SaveExpandedMasterRows()
If _View.GridControl.Views.Count = 1 Then
Return
End If
ExpandedMasterRowList.Clear()
For oIndex As Integer = 0 To _View.DataRowCount - 1
If _View.GetMasterRowExpanded(oIndex) Then
ExpandedMasterRowList.Add(GetKeyColumnValue(oIndex))
End If
Next
End Sub
Private Sub SaveVisibleIndex()
_VisibleRowIndex = _View.GetVisibleIndex(_View.FocusedRowHandle) - _View.TopRowIndex
End Sub
Private Sub LoadVisibleIndex()
Try
_View.MakeRowVisible(_View.FocusedRowHandle, True)
_View.TopRowIndex = _View.GetVisibleIndex(_View.FocusedRowHandle) - _VisibleRowIndex
Catch ex As Exception
_Logger.Error(ex)
End Try
End Sub
Private Sub LoadSelectionViewInfo()
_View.BeginSelection()
Try
_View.ClearSelection()
For i As Integer = 0 To SelectionViewInfoList.Count - 1
SelectRowByRowInfo(DirectCast(SelectionViewInfoList(i), RowInfo), i = SelectionViewInfoList.Count - 1)
Next i
Catch ex As Exception
_Logger.Error(ex)
Finally
_View.EndSelection()
End Try
End Sub
Private Sub LoadExpansionViewInfo()
If _View.GroupedColumns.Count = 0 Then
Return
End If
_View.BeginUpdate()
Try
_View.CollapseAllGroups()
For Each info As RowInfo In ExpansionViewInfoList
ExpandRowByRowInfo(info)
Next info
Catch ex As Exception
_Logger.Error(ex)
Finally
_View.EndUpdate()
End Try
End Sub
Private Sub LoadExpandedMasterRows()
_View.BeginUpdate()
Try
_View.CollapseAllDetails()
Dim oColumn As GridColumn = GetKeyColumn()
For oIndex As Integer = 0 To ExpandedMasterRowList.Count - 1
Dim oRowHandle As Integer = _View.LocateByValue(0, oColumn, ExpandedMasterRowList(oIndex))
_View.SetMasterRowExpanded(oRowHandle, True)
Next oIndex
Catch ex As Exception
_Logger.Error(ex)
Finally
_View.EndUpdate()
End Try
End Sub
Public Class SW
Public label As String
Public stopwatch As Stopwatch
Public Sub New(label As String)
Me.label = label
stopwatch = New Stopwatch()
stopwatch.Start()
End Sub
Public Function Done() As Long
If LOGCONFIG.Debug = False Then
Return 0
End If
stopwatch.Stop()
Dim ts As TimeSpan = stopwatch.Elapsed
Dim timespan_ = String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
If ts.Minutes > 0 Then
timespan_ = String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
ElseIf ts.Seconds > 0 And (ts.Minutes > 0) = False Then
timespan_ = String.Format("{0:00}.{1:00} seconds", ts.Seconds, ts.Milliseconds / 10)
ElseIf (ts.Seconds > 0) = False And ts.Milliseconds > 0 Then
timespan_ = String.Format("{0:00}.{1:00} seconds", ts.Seconds, ts.Milliseconds / 10)
End If
If timespan_ <> "00:00.00" Then
Dim message = String.Format("PerformanceWatch {0} || {1}", timespan_, label)
If LOGCONFIG.Debug = True Then
LOGGER.Debug(message)
End If
End If
Return stopwatch.ElapsedMilliseconds
End Function
End Class
End Class