diff --git a/GUIs.Common/Common.vbproj b/GUIs.Common/Common.vbproj index 0f2ae57b..230330ad 100644 --- a/GUIs.Common/Common.vbproj +++ b/GUIs.Common/Common.vbproj @@ -104,6 +104,7 @@ + @@ -112,6 +113,7 @@ Form + diff --git a/GUIs.Common/DocumentResultList/DocumentResultCache.vb b/GUIs.Common/DocumentResultList/DocumentResultCache.vb new file mode 100644 index 00000000..0edd3291 --- /dev/null +++ b/GUIs.Common/DocumentResultList/DocumentResultCache.vb @@ -0,0 +1,117 @@ +Imports DigitalData.Modules.EDMI.API.Client + +Public Class DocumentResultCache + Implements ICollection(Of DocumentResultInfo) + + Private Const _DefaultCapacity As Long = 1000 + + Public Shared ReadOnly Property DefaultCapacity As Long + Get + Return _DefaultCapacity + End Get + End Property + + Friend ReadOnly List As New LinkedList(Of DocumentResultInfo) + Private ReadOnly Index As New Dictionary(Of String, LinkedListNode(Of DocumentResultInfo)) + Private ReadOnly Lock As New Object + + Public Sub New() + Me.New(_DefaultCapacity) + End Sub + + Public Sub New(capacity As Long) + If capacity < 0 Then + Throw New InvalidOperationException("DocumentResultCache capacity must be positive.") + End If + + Me.Capacity = capacity + End Sub + + Public Event DiscardingOldestItem As EventHandler + Public Property Capacity As Long + Public Property Count As Integer Implements ICollection(Of DocumentResultInfo).Count + + Public ReadOnly Property Oldest As DocumentResultInfo + Get + Return List.First.Value + End Get + End Property + + Public Sub Add(item As DocumentResultInfo) Implements ICollection(Of DocumentResultInfo).Add + SyncLock Lock + If Index.ContainsKey(item.FullPath) Then + List.Remove(Index(item.FullPath)) + Index(item.FullPath) = List.AddLast(item) + Return + End If + + If Count >= Capacity AndAlso Capacity <> 0 Then + RaiseEvent DiscardingOldestItem(Me, New EventArgs()) + Remove(Oldest) + End If + + Index.Add(item.FullPath, List.AddLast(item)) + + If item.Contents IsNot Nothing Then + Count = Count + item.Contents?.Length + End If + End SyncLock + End Sub + + Public Function Contains(item As DocumentResultInfo) As Boolean Implements ICollection(Of DocumentResultInfo).Contains + Return Index.ContainsKey(item.FullPath) + End Function + + Public Sub CopyTo(array As DocumentResultInfo(), ByVal arrayIndex As Integer) Implements ICollection(Of DocumentResultInfo).CopyTo + SyncLock Lock + + For Each item As DocumentResultInfo In Me + array(Math.Min(System.Threading.Interlocked.Increment(arrayIndex), arrayIndex - 1)) = item + Next + End SyncLock + End Sub + + Public Sub Clear() Implements ICollection(Of DocumentResultInfo).Clear + SyncLock Lock + List.Clear() + Index.Clear() + End SyncLock + End Sub + + Public ReadOnly Property IsReadOnly As Boolean Implements ICollection(Of DocumentResultInfo).IsReadOnly + Get + Return False + End Get + End Property + + Public Function Remove(item As DocumentResultInfo) As Boolean Implements ICollection(Of DocumentResultInfo).Remove + SyncLock Lock + + If Index.ContainsKey(item.FullPath) Then + List.Remove(Index(item.FullPath)) + Index.Remove(item.FullPath) + + If item.Contents IsNot Nothing Then + Count -= item.Contents.Length + End If + + Return True + End If + + Return False + End SyncLock + End Function + + Private Iterator Function GetEnumerator() As IEnumerator(Of DocumentResultInfo) Implements ICollection(Of DocumentResultInfo).GetEnumerator + Dim node As LinkedListNode(Of DocumentResultInfo) = List.First + + While node IsNot Nothing + Yield node.Value + node = node.[Next] + End While + End Function + + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return DirectCast(List, IEnumerable).GetEnumerator() + End Function +End Class diff --git a/GUIs.Common/DocumentResultList/DocumentResultInfo.vb b/GUIs.Common/DocumentResultList/DocumentResultInfo.vb new file mode 100644 index 00000000..d6e90ef8 --- /dev/null +++ b/GUIs.Common/DocumentResultList/DocumentResultInfo.vb @@ -0,0 +1,8 @@ +Imports DigitalData.Modules.EDMI.API.Client + +Public Class DocumentResultInfo + Inherits DocumentInfo + + Public Contents As Byte() + Public LastWriteTime As Date +End Class \ No newline at end of file diff --git a/GUIs.Common/DocumentResultList/frmDocumentResultList.vb b/GUIs.Common/DocumentResultList/frmDocumentResultList.vb index edc23abb..0871b086 100644 --- a/GUIs.Common/DocumentResultList/frmDocumentResultList.vb +++ b/GUIs.Common/DocumentResultList/frmDocumentResultList.vb @@ -45,14 +45,14 @@ Public Class frmDocumentResultList Private _IsLoading As Boolean = True Private _ActiveGrid As GridControl = Nothing Private _ActiveGridBand As GridBand = Nothing - Private _DocumentInfo As DocumentInfo = Nothing ' TODO: Hashes for checking if the opened file was modified externally Private _HashOriginalFile As String = Nothing Private _HashOpenedFile As String = Nothing Private WithEvents _FileOpenTimer As New Timer - Private _FileOpenList As New Dictionary(Of Integer, String) + Private _OpenDocuments As New DocumentResultCache(50000000) + Private _CurrentDocument As DocumentResultInfo = Nothing Private Property OperationMode As IResultForm.Mode Implements IResultForm.OperationMode @@ -79,8 +79,8 @@ Public Class frmDocumentResultList _Params = Params _ResultLists = Params.Results - _FileOpenTimer.Interval = FILE_OPEN_TIMER_INTERVAL - _FileOpenTimer.Start() + '_FileOpenTimer.Interval = FILE_OPEN_TIMER_INTERVAL + '_FileOpenTimer.Start() End Sub Private Sub frmDocumentResultList_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -145,40 +145,45 @@ Public Class frmDocumentResultList If e.FocusedRowHandle >= 0 Then Dim oRow = sender.GetDataRow(e.FocusedRowHandle) + Dim oDocumentInfo As DocumentResultInfo = Nothing + DocumentViewer1.CloseDocument() If OperationMode = IResultForm.Mode.NoAppServer Then - LoadFile_Legacy(oRow) + oDocumentInfo = LoadFile_Legacy(oRow) ElseIf OperationMode = IResultForm.Mode.WithAppServer Then - LoadFile_IDB(oRow) + oDocumentInfo = LoadFile_IDB(oRow) End If - If IsNothing(_DocumentInfo) Then + If IsNothing(oDocumentInfo) Then Show_Warning("File could not be loaded!") + Exit Sub End If - If Not IsNothing(_DocumentInfo) Then - If _FileOpenList.ContainsValue(_DocumentInfo.FullPath) Then - Show_Warning("Die ausgewählte Datei befindet sich im Zugriff!") - Else - DocumentViewer1.LoadFile(_DocumentInfo.FullPath) + If Not File.Exists(oDocumentInfo.FullPath) Then + Show_Warning("File does not exist!") + _HashOriginalFile = Nothing + Exit Sub + End If - If _DocumentInfo.AccessRight = Rights.AccessRight.VIEW_ONLY Then - DocumentViewer1.SetViewOnly(True) - RibbonPageGroup_Export.Visible = False - Else - DocumentViewer1.SetViewOnly(False) - RibbonPageGroup_Export.Visible = True - End If - End If + If oDocumentInfo.Contents IsNot Nothing Then + Dim oFileInfo As New FileInfo(oDocumentInfo.FullPath) + + DocumentViewer1.LoadFile(oFileInfo.Name, New MemoryStream(oDocumentInfo.Contents)) + Else + DocumentViewer1.LoadFile(oDocumentInfo.FullPath) + End If + + If oDocumentInfo.AccessRight = Rights.AccessRight.VIEW_ONLY Then + DocumentViewer1.SetViewOnly(True) + RibbonPageGroup_Export.Visible = False + Else + DocumentViewer1.SetViewOnly(False) + RibbonPageGroup_Export.Visible = True End If ' TODO: Create checksum after closing, compare and take action - If File.Exists(_DocumentInfo.FullPath) Then - _HashOriginalFile = _Filesystem.GetChecksum(_DocumentInfo.FullPath) - Else - _HashOriginalFile = Nothing - End If + _HashOriginalFile = _Filesystem.GetChecksum(oDocumentInfo.FullPath) End If Catch ex As Exception _Logger.Error(ex) @@ -203,31 +208,160 @@ Public Class frmDocumentResultList Return True End Function - Private Sub LoadFile_Legacy(GridRow As DataRow) + Private Function LoadFile_Legacy(GridRow As DataRow) As DocumentResultInfo Try Dim oFullPath = GridRow.Item(COLUMN_FILEPATH) - - _DocumentInfo = New DocumentInfo() With { + Dim oDocumentInfo = New DocumentResultInfo() With { .AccessRight = Rights.AccessRight.FULL, .FullPath = oFullPath } + + If File.Exists(oDocumentInfo.FullPath) Then + oDocumentInfo = LoadFile_AsByteArray(oDocumentInfo) + _OpenDocuments.Add(oDocumentInfo) + _CurrentDocument = oDocumentInfo + End If + + Return oDocumentInfo Catch ex As Exception _Logger.Error(ex) - MsgBox("Error while loading file", MsgBoxStyle.Critical, Text) + Return Nothing End Try - End Sub + End Function - Private Sub LoadFile_IDB(GridRow As DataRow) + Private Function LoadFile_IDB(GridRow As DataRow) As DocumentResultInfo Try Dim oObjectId = GridRow.Item(COLUMN_DOCID) - _Logger.Debug($"Gettin' Infor for oObjectId: {oObjectId}") + _Logger.Debug($"Getting Information for oObjectId: {oObjectId}") ' This needs to be Sync bc otherwise the PopupMenuShowing event will fire before this method loaded the Document Info - _DocumentInfo = _IDBClient.GetDocumentInfo(_Environment.User.UserId, oObjectId) + Dim oDocumentInfo As DocumentInfo = _IDBClient.GetDocumentInfo(_Environment.User.UserId, oObjectId) + Dim oResultDocumentInfo As New DocumentResultInfo() With { + .AccessRight = oDocumentInfo.AccessRight, + .FullPath = oDocumentInfo.FullPath + } + + If File.Exists(oResultDocumentInfo.FullPath) Then + oResultDocumentInfo = LoadFile_AsByteArray(oResultDocumentInfo) + _OpenDocuments.Add(oResultDocumentInfo) + _CurrentDocument = oResultDocumentInfo + End If + + Return oResultDocumentInfo Catch ex As Exception _Logger.Error(ex) + Return Nothing End Try - End Sub + End Function + + Private Function LoadFile_AsByteArray(DocumentInfo As DocumentResultInfo) As DocumentResultInfo + Try + Dim oFullPath As String = DocumentInfo.FullPath + Dim oPathExists = From oFile In _OpenDocuments + Where oFile.FullPath = oFullPath And oFile.Contents IsNot Nothing + Select oFile + Dim oExistsInCache = oPathExists.Count() > 0 + Dim oSizeChanged = False + Dim oWriteTimeChanged = False + + ' Get Information about the file on the filesystem + Dim oFileInfo As New FileInfo(oFullPath) + + If oExistsInCache Then + Dim oCachedItem = oPathExists.First() + + If oCachedItem.Contents Is Nothing Then + oSizeChanged = False + Else + oSizeChanged = Not (oFileInfo.Length = oCachedItem.Contents.Length) + End If + + If oCachedItem.LastWriteTime = Nothing Then + oWriteTimeChanged = False + Else + oWriteTimeChanged = Not oFileInfo.LastWriteTime.Equals(oCachedItem.LastWriteTime) + End If + + If oSizeChanged Or oWriteTimeChanged Then + Using oStream = File.OpenRead(DocumentInfo.FullPath) + Using oMemoryStream = New MemoryStream() + oStream.CopyTo(oMemoryStream) + DocumentInfo.Contents = oMemoryStream.ToArray() + DocumentInfo.LastWriteTime = oFileInfo.LastWriteTime + End Using + End Using + + Return DocumentInfo + Else + Return oCachedItem + End If + + Else + Using oStream = File.OpenRead(DocumentInfo.FullPath) + Using oMemoryStream = New MemoryStream() + oStream.CopyTo(oMemoryStream) + DocumentInfo.Contents = oMemoryStream.ToArray() + DocumentInfo.LastWriteTime = oFileInfo.LastWriteTime + End Using + End Using + + Return DocumentInfo + End If + + Catch ex As Exception + + End Try + End Function + + 'Private Function LoadFile_AsByteArray(DocumentInfo As DocumentResultInfo) + ' Try + ' Dim oLoadedInfo As DocumentResultInfo = Nothing + + ' Dim oFileContents As Byte() + ' Dim oFullPath As String = DocumentInfo.FullPath + ' Dim oPathExists = From oFile In _OpenDocuments + ' Where oFile.FullPath = oFullPath And oFile.Contents IsNot Nothing + ' Select oFile + + ' If oPathExists.Count > 0 Then + ' Dim oDocumentInfo = oPathExists.First() + ' Dim oFileInfo As New FileInfo(DocumentInfo.FullPath) + ' Dim oSizeChanged = False + ' Dim oWriteTimeChanged = False + + ' If DocumentInfo.Contents Is Nothing Then + ' oSizeChanged = False + ' Else + ' oSizeChanged = Not oFileInfo.Length.Equals(DocumentInfo.Contents?.Length) + ' End If + + ' If DocumentInfo.LastWriteTime = Nothing Then + ' oWriteTimeChanged = False + ' Else + ' oWriteTimeChanged = Not oFileInfo.LastWriteTime.Equals(DocumentInfo.LastWriteTime) + ' End If + + ' If oSizeChanged Or oWriteTimeChanged Then + + ' Else + ' Using oStream = File.OpenRead(oFullPath) + ' Using oMemoryStream = New MemoryStream() + ' oStream.CopyTo(oMemoryStream) + ' oFileContents = oMemoryStream.ToArray() + ' End Using + ' End Using + ' End If + ' End If + + ' DocumentInfo.Contents = oFileContents + ' DocumentInfo.LastWriteTime = oFileInfo.LastWriteTime + + ' Return DocumentInfo + ' Catch ex As Exception + ' _Logger.Error(ex) + ' Return Nothing + ' End Try + 'End Function Public Function RefreshResults(pResults As IEnumerable(Of BaseResult)) As Boolean Implements IResultForm.RefreshResults _IsLoading = True @@ -465,344 +599,343 @@ Public Class frmDocumentResultList _Config.Config.SplitContainer2Horizontal = SwitchDetailContainerHorizontal.Checked _Config.Save() End If - End Sub + End Sub - Private Sub BarButtonItemExportGrid1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemExportGrid1.ItemClick - Dim oActiveGrid = GetActiveGridControl() + Private Sub BarButtonItemExportGrid1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItemExportGrid1.ItemClick + Dim oActiveGrid = GetActiveGridControl() - If oActiveGrid IsNot Nothing Then - Dim oGridBand = _ActiveGridBand + If oActiveGrid IsNot Nothing Then + Dim oGridBand = _ActiveGridBand - XtraSaveFileDialog.FileName = Utils.ConvertTextToSlug(oGridBand.Caption) & ".xlsx" - XtraSaveFileDialog.DefaultExt = ".xlsx" + XtraSaveFileDialog.FileName = Utils.ConvertTextToSlug(oGridBand.Caption) & ".xlsx" + XtraSaveFileDialog.DefaultExt = ".xlsx" - If XtraSaveFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then - Dim oOptions As New XlsxExportOptions() With { + If XtraSaveFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then + Dim oOptions As New XlsxExportOptions() With { .ExportMode = XlsxExportMode.SingleFile } - oActiveGrid.ExportToXlsx(XtraSaveFileDialog.FileName, oOptions) - End If - - Else - MessageBox.Show("Bitte wählen Sie eine Tabelle aus, die Sie exportieren möchten", Text, MessageBoxButtons.OK) - End If - End Sub - - Private Sub SplitContainerControl1_SplitterPositionChanged(sender As Object, e As EventArgs) Handles SplitContainerControl1.SplitterPositionChanged - If _IsLoading = False Then - _Config.Config.SplitContainer1Distance = SplitContainerControl1.SplitterPosition - _Config.Save() - End If - End Sub - - Private Sub SplitContainerControl2_SplitterPositionChanged(sender As Object, e As EventArgs) Handles SplitContainerControl2.SplitterPositionChanged - If _IsLoading = False Then - _Config.Config.SplitContainer2Distance = SplitContainerControl2.SplitterPosition - _Config.Save() - End If - End Sub - - Private Function GetActiveRow() As DataRow - Dim oActiveGrid = GetActiveGridControl() - Dim oActiveRowhandle = _Helpers.ActiveRowHandle - - If oActiveGrid IsNot Nothing And oActiveRowhandle <> Constants.NO_ROW_HANDLE Then - Dim oView = DirectCast(oActiveGrid.DefaultView, GridView) - Dim oRow = oView.GetDataRow(oActiveRowhandle) - Return oRow - Else - Return Nothing - End If - End Function - Private Function GetDevexpressGrid_LayoutName(pGridView As GridView) - Dim Filename As String = $"DevExpressGridViewDocResult_{pGridView.Name}UserLayout.xml" - Return Path.Combine(_Config.UserConfigPath.Replace("UserConfig.xml", ""), Filename) - End Function - Private Function GetActiveGridControl() As GridControl - If _ActiveGrid Is Nothing Then - Return Nothing - End If - - Return _ActiveGrid - End Function - - Private Sub GridViewSave_Layout(pGridView As GridView) - Try - Dim oXml As String = GetDevexpressGrid_LayoutName(pGridView) - pGridView.SaveLayoutToXml(oXml, OptionsLayoutBase.FullLayout) - Catch ex As Exception - _Logger.Error(ex) - _Logger.Info("Error while saving GridLayout: " & ex.Message) - End Try - End Sub - Private Sub RestoreLayout(pGridView As GridView) - Try - Dim oLayoutFile As String = GetDevexpressGrid_LayoutName(pGridView) - If File.Exists(oLayoutFile) Then - pGridView.RestoreLayoutFromXml(oLayoutFile, OptionsLayoutBase.FullLayout) - End If - Catch ex As Exception - _Logger.Error(ex) - _Logger.Info("Error while restoring layout: " & ex.Message) - End Try - End Sub - - Private Sub GridControl_Enter(sender As GridControl, e As EventArgs) Handles GridControl1.Enter, GridControl2.Enter, GridControl3.Enter - _ActiveGrid = sender - BarButtonItem5.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - BarButtonItemExportGrid1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - SetActiveGridBand() - End Sub - - Private Sub GridView1_FocusedRowChanged(sender As GridView, e As FocusedRowChangedEventArgs) Handles GridView1.FocusedRowChanged, GridView2.FocusedRowChanged, GridView3.FocusedRowChanged - Dim oGrid As GridControl = sender.GridControl - _ActiveGrid = oGrid - End Sub - - Private Sub SetActiveGridBand() - If _ActiveGrid.Equals(GridControl1) Then - _ActiveGridBand = GridBand1 - ElseIf _ActiveGrid.Equals(GridControl2) Then - _ActiveGridBand = GridBand2 - ElseIf _ActiveGrid.Equals(GridControl3) Then - _ActiveGridBand = GridBand3 - Else - _ActiveGridBand = Nothing - End If - End Sub - - Private Sub OpenFolderPath() - Try - Dim oRow = GetActiveRow() - - If oRow IsNot Nothing Then - Dim oFilename = _DocumentInfo.FullPath - Dim oDirectory = IO.Path.GetDirectoryName(oFilename) - Process.Start(oDirectory) - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub - - Private Sub OpenFile() - Try - If _DocumentInfo IsNot Nothing Then - Dim oFilename = _DocumentInfo.FullPath - DocumentPropertyMenu_FileOpened(Me, oFilename) - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub - - - - Private Sub CopyFileName() - Try - Dim oRow = GetActiveRow() - - If oRow IsNot Nothing Then - Dim oFilename = _DocumentInfo.FullPath - Clipboard.SetText(oFilename) - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub - - Private Sub OpenProperties() - Try - Dim oRow = GetActiveRow() - - If oRow IsNot Nothing Then - Dim oObjectId = oRow.Item(COLUMN_DOCID) - Dim oPropertyDialog As New frmObjectPropertyDialog(_LogConfig, _Environment, _IDBClient, oObjectId) - oPropertyDialog.Show() - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub - - Private Sub GridView1_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView1.ColumnFilterChanged - Dim oRowCount = sender.RowCount - UpdateGridHeader(_ResultLists, 0, oRowCount) - End Sub - - Private Sub GridView2_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView2.ColumnFilterChanged - Dim oRowCount = sender.RowCount - UpdateGridHeader(_ResultLists, 1, oRowCount) - End Sub - - Private Sub GridView3_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView3.ColumnFilterChanged - Dim oRowCount = sender.RowCount - UpdateGridHeader(_ResultLists, 2, oRowCount) - End Sub - - Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonBack.ItemClick - ShouldReturnToPreviousForm = True - Close() - End Sub - - Private Sub frmDocumentResultList_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing - Try - _Config.Config.WindowLocation = Location - _Config.Config.WindowSize = Size - _Config.Save() - - DocumentViewer1.Done() - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub - - Private Sub GridControl_DoubleClick(sender As Object, e As EventArgs) Handles GridControl1.DoubleClick, GridControl2.DoubleClick, GridControl3.DoubleClick - If _DocumentInfo IsNot Nothing And _DocumentInfo.AccessRight > Rights.AccessRight.VIEW_ONLY Then - OpenFile() - End If - End Sub - - Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) _ - Handles GridView2.PopupMenuShowing, GridView3.PopupMenuShowing, GridView1.PopupMenuShowing - Try - Dim oView As GridView = sender - - If e.MenuType = GridMenuType.Row Then - Dim oRowHandle = e.HitInfo.RowHandle - Dim oRow As DataRow = oView.GetDataRow(oRowHandle) - Dim oFilepath As String = _DocumentInfo.FullPath - Dim oObjectId As Long = oRow.Item(COLUMN_DOCID) - Dim oMenu As New DocumentPropertyMenu(_LogConfig, _Environment, _IDBClient, oFilepath, oObjectId) - - e.Menu.Items.Clear() - - For Each oItem In oMenu.GetMenuItems(OperationMode, _DocumentInfo.AccessRight) - e.Menu.Items.Add(oItem) - Next - - AddHandler oMenu.FileOpened, AddressOf DocumentPropertyMenu_FileOpened - ' AddHandler oMenu.FileClosed, AddressOf DocumentPropertyMenu_FileClosed - End If - Catch ex As Exception - _Logger.Error(ex) - MsgBox("Unexpected Error while preparing context menu", MsgBoxStyle.Critical, Text) - End Try - End Sub - - Public Sub DocumentPropertyMenu_FileOpened(sender As Object, FilePath As String) - DocumentViewer1.CloseDocument() - - Dim oProcess = Process.Start(New ProcessStartInfo With { - .FileName = FilePath - }) - _FileOpenList.Add(oProcess.Id, FilePath) - End Sub - - Public Sub FileOpenTimer_Elapsed() Handles _FileOpenTimer.Tick - Try - Dim oProcesses = Process.GetProcesses() - Dim oIds = (From oProc In oProcesses - Select oProc.Id). - ToList() - - Dim oNewFileOpenList As New Dictionary(Of Integer, String) - For Each oOpenFile In _FileOpenList - If oIds.Contains(oOpenFile.Key) Then - oNewFileOpenList.Add(oOpenFile.Key, oOpenFile.Value) - End If - Next - - If oNewFileOpenList.Count < _FileOpenList.Count Then - Dim oClosedFiles = _FileOpenList. - Except(oNewFileOpenList). - ToList() - - If oClosedFiles.Count = 1 Then - Dim oOpenFile = oClosedFiles.First() - DocumentViewer1.LoadFile(oOpenFile.Value) - Else - ClearGridData() - UpdateGridData() + oActiveGrid.ExportToXlsx(XtraSaveFileDialog.FileName, oOptions) End If - _FileOpenList = oNewFileOpenList + Else + MessageBox.Show("Bitte wählen Sie eine Tabelle aus, die Sie exportieren möchten", Text, MessageBoxButtons.OK) End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End Sub + End Sub - Public Sub Show_CriticalError(Message As String) - labelCriticalError.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - labelCriticalError.Caption = Message - End Sub + Private Sub SplitContainerControl1_SplitterPositionChanged(sender As Object, e As EventArgs) Handles SplitContainerControl1.SplitterPositionChanged + If _IsLoading = False Then + _Config.Config.SplitContainer1Distance = SplitContainerControl1.SplitterPosition + _Config.Save() + End If + End Sub - Public Sub Show_Warning(Message As String) - labelWarning.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - labelWarning.Caption = Message - End Sub + Private Sub SplitContainerControl2_SplitterPositionChanged(sender As Object, e As EventArgs) Handles SplitContainerControl2.SplitterPositionChanged + If _IsLoading = False Then + _Config.Config.SplitContainer2Distance = SplitContainerControl2.SplitterPosition + _Config.Save() + End If + End Sub - Public Sub Reset_Errors() - labelCriticalError.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - labelWarning.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - End Sub + Private Function GetActiveRow() As DataRow + Dim oActiveGrid = GetActiveGridControl() + Dim oActiveRowhandle = _Helpers.ActiveRowHandle - Private Sub BarButtonItem5_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem5.ItemClick - If Not IsNothing(_ActiveGrid) Then + If oActiveGrid IsNot Nothing And oActiveRowhandle <> Constants.NO_ROW_HANDLE Then + Dim oView = DirectCast(oActiveGrid.DefaultView, GridView) + Dim oRow = oView.GetDataRow(oActiveRowhandle) + Return oRow + Else + Return Nothing + End If + End Function + Private Function GetDevexpressGrid_LayoutName(pGridView As GridView) + Dim Filename As String = $"DevExpressGridViewDocResult_{pGridView.Name}UserLayout.xml" + Return Path.Combine(_Config.UserConfigPath.Replace("UserConfig.xml", ""), Filename) + End Function + Private Function GetActiveGridControl() As GridControl + If _ActiveGrid Is Nothing Then + Return Nothing + End If + + Return _ActiveGrid + End Function + + Private Sub GridViewSave_Layout(pGridView As GridView) Try - Dim oFile = GetDevexpressGrid_LayoutName(_ActiveGrid.MainView) - If File.Exists(oFile) Then - File.Delete(oFile) + Dim oXml As String = GetDevexpressGrid_LayoutName(pGridView) + pGridView.SaveLayoutToXml(oXml, OptionsLayoutBase.FullLayout) + Catch ex As Exception + _Logger.Error(ex) + _Logger.Info("Error while saving GridLayout: " & ex.Message) + End Try + End Sub + Private Sub RestoreLayout(pGridView As GridView) + Try + Dim oLayoutFile As String = GetDevexpressGrid_LayoutName(pGridView) + If File.Exists(oLayoutFile) Then + pGridView.RestoreLayoutFromXml(oLayoutFile, OptionsLayoutBase.FullLayout) + End If + Catch ex As Exception + _Logger.Error(ex) + _Logger.Info("Error while restoring layout: " & ex.Message) + End Try + End Sub + + Private Sub GridControl_Enter(sender As GridControl, e As EventArgs) Handles GridControl1.Enter, GridControl2.Enter, GridControl3.Enter + _ActiveGrid = sender + BarButtonItem5.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + BarButtonItemExportGrid1.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + SetActiveGridBand() + End Sub + + Private Sub GridView1_FocusedRowChanged(sender As GridView, e As FocusedRowChangedEventArgs) Handles GridView1.FocusedRowChanged, GridView2.FocusedRowChanged, GridView3.FocusedRowChanged + Dim oGrid As GridControl = sender.GridControl + _ActiveGrid = oGrid + End Sub + + Private Sub SetActiveGridBand() + If _ActiveGrid.Equals(GridControl1) Then + _ActiveGridBand = GridBand1 + ElseIf _ActiveGrid.Equals(GridControl2) Then + _ActiveGridBand = GridBand2 + ElseIf _ActiveGrid.Equals(GridControl3) Then + _ActiveGridBand = GridBand3 + Else + _ActiveGridBand = Nothing + End If + End Sub + + Private Sub OpenFolderPath() + Try + Dim oRow = GetActiveRow() + + If oRow IsNot Nothing Then + Dim oFilename = _CurrentDocument.FullPath + Dim oDirectory = IO.Path.GetDirectoryName(oFilename) + Process.Start(oDirectory) End If - UpdateGridData() Catch ex As Exception _Logger.Error(ex) End Try - End If - End Sub + End Sub - Private Sub frmDocumentResultList_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing - GridViewSave_Layout(_ActiveGrid.MainView) - End Sub + Private Sub OpenFile() + Try + If _CurrentDocument IsNot Nothing Then + Dim oFilename = _CurrentDocument.FullPath + DocumentPropertyMenu_FileOpened(Me, oFilename) + End If + Catch ex As Exception + _Logger.Error(ex) + End Try + End Sub - Private _DragBoxFromMouseDown As Rectangle - Private _ScreenOffset As Point - Private Sub GridView1_MouseDown(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseDown - If sender.FocusedRowHandle >= 0 Then - Dim oDragSize As Size = SystemInformation.DragSize - _DragBoxFromMouseDown = New Rectangle(New Point(e.X - (oDragSize.Width / 2), + Private Sub CopyFileName() + Try + Dim oRow = GetActiveRow() + + If oRow IsNot Nothing Then + Dim oFilename = _CurrentDocument.FullPath + Clipboard.SetText(oFilename) + End If + Catch ex As Exception + _Logger.Error(ex) + End Try + End Sub + + Private Sub OpenProperties() + Try + Dim oRow = GetActiveRow() + + If oRow IsNot Nothing Then + Dim oObjectId = oRow.Item(COLUMN_DOCID) + Dim oPropertyDialog As New frmObjectPropertyDialog(_LogConfig, _Environment, _IDBClient, oObjectId) + oPropertyDialog.Show() + End If + Catch ex As Exception + _Logger.Error(ex) + End Try + End Sub + + Private Sub GridView1_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView1.ColumnFilterChanged + Dim oRowCount = sender.RowCount + UpdateGridHeader(_ResultLists, 0, oRowCount) + End Sub + + Private Sub GridView2_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView2.ColumnFilterChanged + Dim oRowCount = sender.RowCount + UpdateGridHeader(_ResultLists, 1, oRowCount) + End Sub + + Private Sub GridView3_ColumnFilterChanged(sender As GridView, e As EventArgs) Handles GridView3.ColumnFilterChanged + Dim oRowCount = sender.RowCount + UpdateGridHeader(_ResultLists, 2, oRowCount) + End Sub + + Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonBack.ItemClick + ShouldReturnToPreviousForm = True + Close() + End Sub + + Private Sub frmDocumentResultList_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + Try + _Config.Config.WindowLocation = Location + _Config.Config.WindowSize = Size + _Config.Save() + + DocumentViewer1.Done() + Catch ex As Exception + _Logger.Error(ex) + End Try + End Sub + + Private Sub GridControl_DoubleClick(sender As Object, e As EventArgs) Handles GridControl1.DoubleClick, GridControl2.DoubleClick, GridControl3.DoubleClick + If _CurrentDocument IsNot Nothing AndAlso _CurrentDocument.AccessRight > Rights.AccessRight.VIEW_ONLY Then + OpenFile() + End If + End Sub + + Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) _ + Handles GridView2.PopupMenuShowing, GridView3.PopupMenuShowing, GridView1.PopupMenuShowing + Try + Dim oView As GridView = sender + + If e.MenuType = GridMenuType.Row Then + Dim oRowHandle = e.HitInfo.RowHandle + Dim oRow As DataRow = oView.GetDataRow(oRowHandle) + Dim oFilepath As String = _CurrentDocument.FullPath + Dim oObjectId As Long = oRow.Item(COLUMN_DOCID) + Dim oMenu As New DocumentPropertyMenu(_LogConfig, _Environment, _IDBClient, oFilepath, oObjectId) + + e.Menu.Items.Clear() + + For Each oItem In oMenu.GetMenuItems(OperationMode, _CurrentDocument.AccessRight) + e.Menu.Items.Add(oItem) + Next + + AddHandler oMenu.FileOpened, AddressOf DocumentPropertyMenu_FileOpened + ' AddHandler oMenu.FileClosed, AddressOf DocumentPropertyMenu_FileClosed + End If + Catch ex As Exception + _Logger.Error(ex) + MsgBox("Unexpected Error while preparing context menu", MsgBoxStyle.Critical, Text) + End Try + End Sub + + Public Sub DocumentPropertyMenu_FileOpened(sender As Object, FilePath As String) + 'DocumentViewer1.CloseDocument() + + Dim oProcess = Process.Start(New ProcessStartInfo With { + .FileName = FilePath + }) + End Sub + + Public Sub FileOpenTimer_Elapsed() Handles _FileOpenTimer.Tick + 'Try + ' Dim oProcesses = Process.GetProcesses() + ' Dim oIds = (From oProc In oProcesses + ' Select oProc.Id). + ' ToList() + + ' Dim oNewFileOpenList As New Dictionary(Of Integer, String) + ' For Each oOpenFile In _FileOpenList + ' If oIds.Contains(oOpenFile.Key) Then + ' oNewFileOpenList.Add(oOpenFile.Key, oOpenFile.Value) + ' End If + ' Next + + ' If oNewFileOpenList.Count < _FileOpenList.Count Then + ' Dim oClosedFiles = _FileOpenList. + ' Except(oNewFileOpenList). + ' ToList() + + ' If oClosedFiles.Count = 1 Then + ' Dim oOpenFile = oClosedFiles.First() + ' DocumentViewer1.LoadFile(oOpenFile.Value) + ' Else + ' ClearGridData() + ' UpdateGridData() + ' End If + + ' _FileOpenList = oNewFileOpenList + ' End If + 'Catch ex As Exception + ' _Logger.Error(ex) + 'End Try + End Sub + + Public Sub Show_CriticalError(Message As String) + labelCriticalError.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + labelCriticalError.Caption = Message + End Sub + + Public Sub Show_Warning(Message As String) + labelWarning.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + labelWarning.Caption = Message + End Sub + + Public Sub Reset_Errors() + labelCriticalError.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + labelWarning.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + End Sub + + Private Sub BarButtonItem5_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem5.ItemClick + If Not IsNothing(_ActiveGrid) Then + Try + Dim oFile = GetDevexpressGrid_LayoutName(_ActiveGrid.MainView) + If File.Exists(oFile) Then + File.Delete(oFile) + End If + UpdateGridData() + Catch ex As Exception + _Logger.Error(ex) + End Try + End If + End Sub + + Private Sub frmDocumentResultList_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing + GridViewSave_Layout(_ActiveGrid.MainView) + End Sub + + Private _DragBoxFromMouseDown As Rectangle + Private _ScreenOffset As Point + + Private Sub GridView1_MouseDown(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseDown + If sender.FocusedRowHandle >= 0 Then + Dim oDragSize As Size = SystemInformation.DragSize + + _DragBoxFromMouseDown = New Rectangle(New Point(e.X - (oDragSize.Width / 2), e.Y - (oDragSize.Height / 2)), oDragSize) - Else + Else + _DragBoxFromMouseDown = Rectangle.Empty + End If + End Sub + + Private Sub GridView1_MouseUp(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseUp _DragBoxFromMouseDown = Rectangle.Empty - End If - End Sub + End Sub - Private Sub GridView1_MouseUp(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseUp - _DragBoxFromMouseDown = Rectangle.Empty - End Sub + Private Sub GridView1_MouseMove(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseMove + If e.Button AndAlso e.Button = MouseButtons.Left Then + If _DragBoxFromMouseDown <> Rectangle.Empty And Not _DragBoxFromMouseDown.Contains(e.X, e.Y) Then - Private Sub GridView1_MouseMove(sender As GridView, e As MouseEventArgs) Handles GridView1.MouseMove - If e.Button AndAlso e.Button = MouseButtons.Left Then - If _DragBoxFromMouseDown <> Rectangle.Empty And Not _DragBoxFromMouseDown.Contains(e.X, e.Y) Then + Dim oHitInfo = sender.CalcHitInfo(e.Location) - Dim oHitInfo = sender.CalcHitInfo(e.Location) + If oHitInfo.InRow Then + If _CurrentDocument IsNot Nothing AndAlso _CurrentDocument.AccessRight >= Rights.AccessRight.VIEW_EXPORT Then + _ScreenOffset = SystemInformation.WorkingArea.Location - If oHitInfo.InRow Then - If _DocumentInfo IsNot Nothing AndAlso _DocumentInfo.AccessRight >= Rights.AccessRight.VIEW_EXPORT Then - _ScreenOffset = SystemInformation.WorkingArea.Location + Dim oFullPath As String = _CurrentDocument.FullPath + Dim oFiles As String() = {oFullPath} + Dim oData As New DataObject(DataFormats.FileDrop, oFiles) - Dim oFullPath As String = _DocumentInfo.FullPath - Dim oFiles As String() = {oFullPath} - Dim oData As New DataObject(DataFormats.FileDrop, oFiles) - - sender.GridControl.DoDragDrop(oData, DragDropEffects.All) + sender.GridControl.DoDragDrop(oData, DragDropEffects.All) + End If End If End If End If - End If - End Sub -End Class \ No newline at end of file + End Sub + End Class \ No newline at end of file