diff --git a/GUIs.Common/Common.vbproj b/GUIs.Common/Common.vbproj index 26421b26..0e3ea5b8 100644 --- a/GUIs.Common/Common.vbproj +++ b/GUIs.Common/Common.vbproj @@ -112,6 +112,7 @@ Form + @@ -187,6 +188,10 @@ {25017513-0d97-49d3-98d7-ba76d9b251b0} EDMI.API + + {991d0231-4623-496d-8bd0-9ca906029cbc} + Filesystem + {d3c8cfed-d6f6-43a8-9bdf-454145d0352f} Language @@ -259,5 +264,8 @@ + + + \ No newline at end of file diff --git a/GUIs.Common/DocumentResultList/frmDocumentResultList.Designer.vb b/GUIs.Common/DocumentResultList/frmDocumentResultList.Designer.vb index 22a19878..e106fce6 100644 --- a/GUIs.Common/DocumentResultList/frmDocumentResultList.Designer.vb +++ b/GUIs.Common/DocumentResultList/frmDocumentResultList.Designer.vb @@ -84,8 +84,11 @@ Partial Class frmDocumentResultList Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1}) Me.RibbonControl.RepositoryItems.AddRange(New DevExpress.XtraEditors.Repository.RepositoryItem() {Me.RepositoryItemTextEdit1, Me.RepositoryItemTextEdit2}) Me.RibbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False] - Me.RibbonControl.Size = New System.Drawing.Size(1189, 157) + Me.RibbonControl.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide + Me.RibbonControl.ShowToolbarCustomizeItem = False + Me.RibbonControl.Size = New System.Drawing.Size(1189, 132) Me.RibbonControl.StatusBar = Me.RibbonStatusBar + Me.RibbonControl.Toolbar.ShowCustomizeItem = False ' 'SwitchMainContainerHorizontal ' @@ -245,10 +248,10 @@ Partial Class frmDocumentResultList Me.RibbonStatusBar.ItemLinks.Add(Me.labelResultCount) Me.RibbonStatusBar.ItemLinks.Add(Me.labelCriticalError) Me.RibbonStatusBar.ItemLinks.Add(Me.labelWarning) - Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 649) + Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 647) Me.RibbonStatusBar.Name = "RibbonStatusBar" Me.RibbonStatusBar.Ribbon = Me.RibbonControl - Me.RibbonStatusBar.Size = New System.Drawing.Size(1189, 22) + Me.RibbonStatusBar.Size = New System.Drawing.Size(1189, 24) ' 'SplitContainerControl1 ' @@ -260,7 +263,7 @@ Partial Class frmDocumentResultList Me.SplitContainerControl1.Panel1.Text = "Panel1" Me.SplitContainerControl1.Panel2.Controls.Add(Me.SplitContainerControl2) Me.SplitContainerControl1.Panel2.Text = "Panel2" - Me.SplitContainerControl1.Size = New System.Drawing.Size(762, 492) + Me.SplitContainerControl1.Size = New System.Drawing.Size(762, 515) Me.SplitContainerControl1.SplitterPosition = 382 Me.SplitContainerControl1.TabIndex = 2 Me.SplitContainerControl1.Text = "SplitContainerControl1" @@ -272,7 +275,7 @@ Partial Class frmDocumentResultList Me.GridControl1.MainView = Me.GridView1 Me.GridControl1.MenuManager = Me.RibbonControl Me.GridControl1.Name = "GridControl1" - Me.GridControl1.Size = New System.Drawing.Size(382, 492) + Me.GridControl1.Size = New System.Drawing.Size(382, 515) Me.GridControl1.TabIndex = 0 Me.GridControl1.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1}) ' @@ -313,7 +316,7 @@ Partial Class frmDocumentResultList Me.SplitContainerControl2.Panel1.Text = "Panel1" Me.SplitContainerControl2.Panel2.Controls.Add(Me.GridControl3) Me.SplitContainerControl2.Panel2.Text = "Panel2" - Me.SplitContainerControl2.Size = New System.Drawing.Size(370, 492) + Me.SplitContainerControl2.Size = New System.Drawing.Size(370, 515) Me.SplitContainerControl2.SplitterPosition = 223 Me.SplitContainerControl2.TabIndex = 0 Me.SplitContainerControl2.Text = "SplitContainerControl2" @@ -358,7 +361,7 @@ Partial Class frmDocumentResultList Me.GridControl3.MainView = Me.GridView3 Me.GridControl3.MenuManager = Me.RibbonControl Me.GridControl3.Name = "GridControl3" - Me.GridControl3.Size = New System.Drawing.Size(370, 259) + Me.GridControl3.Size = New System.Drawing.Size(370, 282) Me.GridControl3.TabIndex = 0 Me.GridControl3.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView3}) ' @@ -387,13 +390,13 @@ Partial Class frmDocumentResultList 'SplitContainerControl3 ' Me.SplitContainerControl3.Dock = System.Windows.Forms.DockStyle.Fill - Me.SplitContainerControl3.Location = New System.Drawing.Point(0, 157) + Me.SplitContainerControl3.Location = New System.Drawing.Point(0, 132) Me.SplitContainerControl3.Name = "SplitContainerControl3" Me.SplitContainerControl3.Panel1.Controls.Add(Me.SplitContainerControl1) Me.SplitContainerControl3.Panel1.Text = "Panel1" Me.SplitContainerControl3.Panel2.Controls.Add(Me.DocumentViewer1) Me.SplitContainerControl3.Panel2.Text = "Panel2" - Me.SplitContainerControl3.Size = New System.Drawing.Size(1189, 492) + Me.SplitContainerControl3.Size = New System.Drawing.Size(1189, 515) Me.SplitContainerControl3.SplitterPosition = 762 Me.SplitContainerControl3.TabIndex = 5 Me.SplitContainerControl3.Text = "SplitContainerControl3" @@ -404,7 +407,7 @@ Partial Class frmDocumentResultList Me.DocumentViewer1.FileLoaded = False Me.DocumentViewer1.Location = New System.Drawing.Point(0, 0) Me.DocumentViewer1.Name = "DocumentViewer1" - Me.DocumentViewer1.Size = New System.Drawing.Size(417, 492) + Me.DocumentViewer1.Size = New System.Drawing.Size(417, 515) Me.DocumentViewer1.TabIndex = 0 ' 'XtraSaveFileDialog @@ -421,8 +424,8 @@ Partial Class frmDocumentResultList Me.Controls.Add(Me.RibbonStatusBar) Me.Controls.Add(Me.RibbonControl) Me.IconOptions.Icon = CType(resources.GetObject("frmDocumentResultList.IconOptions.Icon"), System.Drawing.Icon) - Me.IconOptions.Image = Global.DigitalData.GUIs.Common.My.Resources.Resources.zoom_less Me.IconOptions.ShowIcon = False + Me.IconOptions.SvgImage = Global.DigitalData.GUIs.Common.My.Resources.Resources.grid Me.Name = "frmDocumentResultList" Me.Ribbon = Me.RibbonControl Me.StatusBar = Me.RibbonStatusBar diff --git a/GUIs.Common/DocumentResultList/frmDocumentResultList.vb b/GUIs.Common/DocumentResultList/frmDocumentResultList.vb index c4fd5b72..7526f329 100644 --- a/GUIs.Common/DocumentResultList/frmDocumentResultList.vb +++ b/GUIs.Common/DocumentResultList/frmDocumentResultList.vb @@ -1,23 +1,21 @@ -Imports System.Drawing +Imports System.ComponentModel Imports System.IO Imports System.Windows.Forms Imports DevExpress.Utils +Imports DevExpress.XtraEditors Imports DevExpress.XtraGrid Imports DevExpress.XtraGrid.Columns +Imports DevExpress.XtraGrid.Views.BandedGrid +Imports DevExpress.XtraGrid.Views.Base Imports DevExpress.XtraGrid.Views.Grid +Imports DevExpress.XtraGrid.Views.Grid.ViewInfo Imports DevExpress.XtraPrinting Imports DigitalData.Modules.Config -Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.ZooFlow -Imports DigitalData.Modules.Language Imports DigitalData.Modules.EDMI.API Imports DigitalData.Modules.EDMI.API.Client -Imports DevExpress.XtraGrid.Views.Base -Imports DevExpress.XtraGrid.Views.BandedGrid -Imports System.ComponentModel -Imports DevExpress.XtraGrid.Views.Grid.ViewInfo -Imports DevExpress.XtraEditors.ViewInfo -Imports DevExpress.XtraEditors +Imports DigitalData.Modules.Language +Imports DigitalData.Modules.Logging +Imports DigitalData.Modules.ZooFlow Public Class frmDocumentResultList Implements IResultForm @@ -29,9 +27,10 @@ Public Class frmDocumentResultList Private COLUMN_DOCID As String = "DocID" Private COLUMN_ICON As String = "ICON" - Private _IsLoading As Boolean = True - Private _IDBClient As Client + Private Const FILE_OPEN_TIMER_INTERVAL As Integer = 500 + ' Helper Classes + Private _IDBClient As Client Private _LogConfig As LogConfig Private _Logger As Logger Private _Config As ConfigManager(Of DocumentResultConfig) @@ -39,12 +38,21 @@ Public Class frmDocumentResultList Private _Params As DocumentResultParams Private _ResultLists As List(Of DocumentResult) Private _Helpers As DocumentResultList + Private _Filesystem As DigitalData.Modules.Filesystem.File + ' Runtime variables + 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 Property OperationMode As IResultForm.Mode Implements IResultForm.OperationMode Public Property ShouldReturnToPreviousForm As Boolean = False Implements IResultForm.ShouldReturnToPreviousForm @@ -64,10 +72,14 @@ Public Class frmDocumentResultList _Logger = LogConfig.GetLogger() _Config = New ConfigManager(Of DocumentResultConfig)(LogConfig, oConfigPath, oConfigPath) _Helpers = New DocumentResultList(LogConfig) + _Filesystem = New Modules.Filesystem.File(_LogConfig) _Environment = Environment _Params = Params _ResultLists = Params.Results + + _FileOpenTimer.Interval = FILE_OPEN_TIMER_INTERVAL + _FileOpenTimer.Start() End Sub Private Sub frmDocumentResultList_Load(sender As Object, e As EventArgs) Handles MyBase.Load @@ -140,21 +152,32 @@ Public Class frmDocumentResultList LoadFile_IDB(oRow) End If - If IsNothing(_DocumentInfo) Or DocumentViewer1.FileLoaded = False Then + If IsNothing(_DocumentInfo) Then Show_Warning("File could not be loaded!") End If If Not IsNothing(_DocumentInfo) Then - DocumentViewer1.LoadFile(_DocumentInfo.FullPath) - - If _DocumentInfo.AccessRight = Rights.AccessRight.VIEW_ONLY Then - DocumentViewer1.SetViewOnly(True) - RibbonPageGroup_Export.Visible = False + If _FileOpenList.ContainsValue(_DocumentInfo.FullPath) Then + Show_Warning("Die ausgewählte Datei befindet sich im Zugriff!") Else - DocumentViewer1.SetViewOnly(False) - RibbonPageGroup_Export.Visible = True + DocumentViewer1.LoadFile(_DocumentInfo.FullPath) + + 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 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 End If Catch ex As Exception _Logger.Error(ex) @@ -221,6 +244,10 @@ Public Class frmDocumentResultList End Try End Function + Private Sub ClearGridData() + GridControl1.DataSource = Nothing + End Sub + Private Sub LoadGridData(Result As DocumentResult) If Result.Datatable.Columns.Contains(COLUMN_DOCID) = False Then Throw New ApplicationException($"Datatable is missing DocId Column [{COLUMN_DOCID}] for search {Result.Title}!") @@ -556,17 +583,17 @@ Public Class frmDocumentResultList Private Sub OpenFile() Try - Dim oRow = GetActiveRow() - - If oRow IsNot Nothing Then - Dim oFilename = oRow.Item(COLUMN_FILEPATH) - Process.Start(oFilename) + 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() @@ -630,7 +657,8 @@ Public Class frmDocumentResultList OpenFile() End Sub - Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) Handles GridView2.PopupMenuShowing, GridView3.PopupMenuShowing + Private Sub GridView_PopupMenuShowing(sender As Object, e As PopupMenuShowingEventArgs) _ + Handles GridView2.PopupMenuShowing, GridView3.PopupMenuShowing, GridView1.PopupMenuShowing Try Dim oView As GridView = sender @@ -639,12 +667,7 @@ Public Class frmDocumentResultList Dim oRow As DataRow = oView.GetDataRow(oRowHandle) Dim oFilepath As String = oRow.Item(COLUMN_FILEPATH) Dim oObjectId As Long = oRow.Item(COLUMN_DOCID) - Dim oMenu As New DocumentPropertyMenu( - _LogConfig, - _Environment, - _IDBClient, - oFilepath, - oObjectId) + Dim oMenu As New DocumentPropertyMenu(_LogConfig, _Environment, _IDBClient, oFilepath, oObjectId) e.Menu.Items.Clear() @@ -653,7 +676,7 @@ Public Class frmDocumentResultList Next AddHandler oMenu.FileOpened, AddressOf DocumentPropertyMenu_FileOpened - AddHandler oMenu.FileClosed, AddressOf DocumentPropertyMenu_FileClosed + ' AddHandler oMenu.FileClosed, AddressOf DocumentPropertyMenu_FileClosed End If Catch ex As Exception _Logger.Error(ex) @@ -662,21 +685,55 @@ Public Class frmDocumentResultList 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 DocumentPropertyMenu_FileClosed(sender As Object, FilePath As String) + 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.Never + labelWarning.Visibility = DevExpress.XtraBars.BarItemVisibility.Always labelWarning.Caption = Message End Sub @@ -689,8 +746,8 @@ Public Class frmDocumentResultList If Not IsNothing(_ActiveGrid) Then Try Dim oFile = GetDevexpressGrid_LayoutName(_ActiveGrid.MainView) - If File.Exists(oFile) Then - File.Delete(oFile) + If IO.File.Exists(oFile) Then + IO.File.Delete(oFile) End If UpdateGridData() Catch ex As Exception diff --git a/GUIs.Common/My Project/Resources.Designer.vb b/GUIs.Common/My Project/Resources.Designer.vb index 8cf1092f..f41318df 100644 --- a/GUIs.Common/My Project/Resources.Designer.vb +++ b/GUIs.Common/My Project/Resources.Designer.vb @@ -130,6 +130,16 @@ Namespace My.Resources End Get End Property + ''' + ''' Sucht eine lokalisierte Ressource vom Typ DevExpress.Utils.Svg.SvgImage. + ''' + Friend ReadOnly Property grid() As DevExpress.Utils.Svg.SvgImage + Get + Dim obj As Object = ResourceManager.GetObject("grid", resourceCulture) + Return CType(obj,DevExpress.Utils.Svg.SvgImage) + End Get + End Property + ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. ''' diff --git a/GUIs.Common/My Project/Resources.resx b/GUIs.Common/My Project/Resources.resx index ef093278..cd9cb0fe 100644 --- a/GUIs.Common/My Project/Resources.resx +++ b/GUIs.Common/My Project/Resources.resx @@ -127,6 +127,9 @@ ..\Resources\tiff.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ZooFlow-Vergroessern.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v19.2, Version=19.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + ..\Resources\pdf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -148,28 +151,28 @@ ..\Resources\txt.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\Article_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\zoom_less.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\png.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\zoom_more.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_blank.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\xls.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\dxf.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\_blank.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Article_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\ZooFlow-Vergroessern.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v19.2, Version=19.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - - ..\Resources\zoom_less.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\zoom_more.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\grid.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v19.2, Version=19.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a \ No newline at end of file diff --git a/GUIs.Common/Resources/grid.svg b/GUIs.Common/Resources/grid.svg new file mode 100644 index 00000000..8e9d48b0 --- /dev/null +++ b/GUIs.Common/Resources/grid.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file