Unterstützung für MSG/EML-Dateien hinzugefügt

Aktualisierung der `App.config` mit neuen `bindingRedirect`-Versionen und Hinzufügen von Abhängigkeiten wie `OpenMcdf` und `Microsoft.Bcl.AsyncInterfaces`.
Erweiterung von `DocumentViewer.vb` zur Unterstützung von `.MSG`- und `.EML`-Dateien, inklusive Konvertierung von `.MSG` zu HTML.
Verbesserte Fehlerbehandlung und Logging.
Einführung der Eigenschaft `SnappingEnabled` in `SnapPanel.vb` und Optimierung des Rasters.
Erweiterte Validierung und Logging in `frmDocumentResultList.vb`.
Aktualisierung der Projektdateien mit neuen Paketverweisen und Abhängigkeitsversionen.
Anpassung der Assembly-Versionen in `AssemblyInfo.vb`.
This commit is contained in:
Developer01
2026-10-26 11:23:37 +01:00
parent e1f670875a
commit 6aa691e1a0
8 changed files with 243 additions and 97 deletions

View File

@@ -31,7 +31,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Pkcs" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.12" newVersion="10.0.0.12" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Packaging" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
@@ -39,7 +39,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.12" newVersion="10.0.0.12" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
@@ -51,7 +51,15 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.5" newVersion="10.0.0.5" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.12" newVersion="10.0.0.12" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="OpenMcdf" publicKeyToken="fdbb1629d7c00800" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.3.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.12" newVersion="10.0.0.12" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -7,7 +7,7 @@ Imports GdPicture14
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Messaging
Imports DigitalData.Modules.Config
Imports MsgReader
Public Class DocumentViewer
Private Enum ZoomMode
Zoom50
@@ -513,12 +513,16 @@ Public Class DocumentViewer
End Sub
Public Sub DeleteTempFiles()
For Each oFile In _TempFiles
For Each oPath In _TempFiles
Try
_logger.Debug("Deleting temp file [{0}]", oFile)
File.Delete(oFile)
_logger.Debug("Deleting temp path [{0}]", oPath)
If Directory.Exists(oPath) Then
Directory.Delete(oPath, True)
ElseIf File.Exists(oPath) Then
File.Delete(oPath)
End If
Catch ex As Exception
_logger.Warn("Could not delete temp file [{0}]", oFile)
_logger.Warn("Could not delete temp path [{0}]", oPath)
End Try
Next
End Sub
@@ -530,7 +534,7 @@ Public Class DocumentViewer
Select Case Extension.ToUpper
Case ".CSV"
_ViewerMode = ViewerMode.Excel
Case ".DOC", ".DOCX", ".ODT", ".RTF", ".TXT"
Case ".DOC", ".DOCX", ".ODT", ".RTF", ".TXT", ".MSG", ".EML"
_ViewerMode = ViewerMode.Richtext
Case Else
_ViewerMode = ViewerMode.GDPicture
@@ -702,22 +706,109 @@ Public Class DocumentViewer
HideGdViewer()
End Sub
''' <summary>
''' Lädt eine Richtext-kompatible Datei in den RichEditControl.
''' MSG-Dateien werden vor dem Laden in HTML konvertiert.
''' </summary>
Private Function LoadRichtextFile(FilePath As String, Extension As String) As Boolean
Try
RichEditControl1.LoadDocument(FilePath, GetDocumentFormat(Extension))
' Eingabevalidierung
If String.IsNullOrEmpty(FilePath) Then
_logger.Warn("LoadRichtextFile: FilePath ist leer oder Nothing")
Return False
End If
If String.IsNullOrEmpty(Extension) Then
_logger.Warn("LoadRichtextFile: Extension ist leer oder Nothing für Datei [{0}]", FilePath)
Return False
End If
If Not IO.File.Exists(FilePath) Then
_logger.Warn("LoadRichtextFile: Datei existiert nicht [{0}]", FilePath)
ShowFileNotLoadedError(FilePath)
Return False
End If
_logger.Debug("LoadRichtextFile: Starte Laden von [{0}] mit Extension [{1}]", FilePath, Extension)
Dim oLoadPath As String = FilePath
Dim oFormat = GetDocumentFormat(Extension)
' MSG-Dateien müssen zuerst in HTML konvertiert werden
If Extension = ".MSG" Then
_logger.Info("LoadRichtextFile: MSG erkannt – starte Konvertierung zu HTML")
oLoadPath = ConvertMsgToMht(FilePath)
If String.IsNullOrEmpty(oLoadPath) Then
_logger.Warn("LoadRichtextFile: Konvertierung hat keinen Pfad zurückgegeben für [{0}]", FilePath)
ShowFileNotLoadedError(FilePath)
Return False
End If
If Not IO.File.Exists(oLoadPath) Then
_logger.Warn("LoadRichtextFile: Konvertierte HTML-Datei existiert nicht [{0}]", oLoadPath)
ShowFileNotLoadedError(FilePath)
Return False
End If
oFormat = XtraRichEdit.DocumentFormat.Html
_logger.Debug("LoadRichtextFile: MSG konvertiert zu [{0}], Format: Html", oLoadPath)
End If
_logger.Debug("LoadRichtextFile: Rufe RichEditControl1.LoadDocument auf – Pfad: [{0}], Format: [{1}]", oLoadPath, oFormat)
RichEditControl1.LoadDocument(oLoadPath, oFormat)
RichEditControl1.Visible = True
RichEditControl1.Dock = DockStyle.Fill
_ViewOverride = "Richtext"
_ViewerMode = ViewerMode.Richtext
lblInfo.Visible = True
lblInfo.Text = "This docx-file contains a generic error and will be displayed in a reduced viewer. Please try to open the file in WORD"
_ViewOverride = ""
lblInfo.Visible = False
_logger.Info("LoadRichtextFile: Erfolgreich geladen [{0}]", FilePath)
Return True
Catch ex As Exception
_logger.Error(ex)
ShowFileNotLoadedError(FilePath)
Return False
End Try
End Function
''' <summary>
''' Konvertiert eine MSG-Datei in eine temporäre MHT-Datei und gibt deren Pfad zurück.
''' </summary>
Private Function ConvertMsgToMht(MsgFilePath As String) As String
Try
_logger.Info("Converting MSG to MHT: [{0}]", MsgFilePath)
Dim oTempDir = Path.Combine(Path.GetTempPath(), "DocViewer_" & Guid.NewGuid().ToString("N"))
Directory.CreateDirectory(oTempDir)
Dim oReader As New MsgReader.Reader()
oReader.ExtractToFolder(MsgFilePath, oTempDir)
' MsgReader erzeugt eine .htm/.html Datei im Zielordner
Dim oHtmlFile = Directory.GetFiles(oTempDir, "*.htm").FirstOrDefault()
If oHtmlFile Is Nothing Then
oHtmlFile = Directory.GetFiles(oTempDir, "*.html").FirstOrDefault()
End If
If String.IsNullOrEmpty(oHtmlFile) Then
_logger.Warn("MSG conversion produced no HTML file in [{0}]", oTempDir)
Return String.Empty
End If
' Temporäres Verzeichnis für späteres Aufräumen merken
_TempFiles.Add(oTempDir)
_logger.Info("MSG converted to [{0}]", oHtmlFile)
Return oHtmlFile
Catch ex As Exception
_logger.Error(ex)
Return String.Empty
End Try
End Function
Private Function LoadSpreadsheetFile(FilePath As String, Extension As String) As Boolean
Try
_logger.Debug("Loading Spreadsheet: {0}", FilePath)
@@ -742,14 +833,22 @@ Public Class DocumentViewer
Try
_logger.Debug("Loading GdPicture: {0}", FilePath)
' Set force temporary mode for specific file types
' DWG/DXF: Spezielle GdPicture-Einstellungen für bessere CAD-Darstellung
If Extension = ".DWG" OrElse Extension = ".DXF" Then
_logger.Info("LoadGdPictureFile: CAD-Datei erkannt – setze optimierte Darstellungsoptionen")
MyGDPViewer.BackColor = Color.White
MyGDPViewer.ZoomMode = ViewerZoomMode.ZoomModeFitToViewer
MyGDPViewer.DocumentAlignment = ViewerDocumentAlignment.DocumentAlignmentMiddleCenter
Else
MyGDPViewer.DocumentAlignment = ViewerDocumentAlignment.DocumentAlignmentTopCenter
End If
Select Case Extension
Case ".EML", ".DOC", ".DOCX", ".XLS", ".XLSX", ".ODT", ".RTF", ".TXT"
Case ".EML", ".MSG", ".DOC", ".DOCX", ".XLS", ".XLSX", ".ODT", ".RTF", ".TXT"
MyGDPViewer.ForceTemporaryMode = True
_logger.Info("ForceTemporaryMode enabled for extension [{0}]", Extension)
End Select
MyGDPViewer.DocumentAlignment = ViewerDocumentAlignment.DocumentAlignmentTopCenter
If Viewer_ForceTemporaryMode Then
MyGDPViewer.ForceTemporaryMode = True
End If
@@ -759,8 +858,6 @@ Public Class DocumentViewer
If oGDPState <> GdPictureStatus.OK Then
_logger.Warn("GdPictureStatus: {0}", oGDPState)
' Fallback to Richtext for corrupted DOCX
If Extension = ".DOCX" AndAlso oGDPState = GdPictureStatus.GenericError Then
HideGdViewer()
Return LoadRichtextFile(FilePath, Extension)
@@ -927,6 +1024,7 @@ Public Class DocumentViewer
Select Case Extension.ToUpper
Case ".EML" : oFormat = XtraRichEdit.DocumentFormat.Mht
Case ".MSG" : oFormat = XtraRichEdit.DocumentFormat.Mht
Case ".DOC" : oFormat = XtraRichEdit.DocumentFormat.Doc
Case ".DOCX" : oFormat = XtraRichEdit.DocumentFormat.OpenXml
Case ".ODT" : oFormat = XtraRichEdit.DocumentFormat.OpenDocument

View File

@@ -56,99 +56,75 @@
</Reference>
<Reference Include="DevExpress.Charts.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Data.Desktop.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Data.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.DataAccess.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.DataAccess.v25.2.UI, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.DataVisualization.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Images.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Office.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Pdf.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Printing.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.RichEdit.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Spreadsheet.v25.2.Core, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Utils.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.Utils.v25.2.UI, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraBars.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraCharts.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraEditors.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraGrid.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraLayout.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraNavBar.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraPrinting.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraRichEdit.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraSpreadsheet.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DevExpress.XtraTreeList.v25.2, Version=25.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="DigitalData.Modules.Base">
<HintPath>..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
@@ -241,16 +217,22 @@
<Reference Include="Google.Protobuf, Version=3.33.2.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>packages\Google.Protobuf.3.33.2\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Bcl.AsyncInterfaces.10.0.5\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.10.0.12\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.Cryptography, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Bcl.Cryptography.10.0.5\lib\net462\Microsoft.Bcl.Cryptography.dll</HintPath>
<Reference Include="Microsoft.Bcl.Cryptography, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.Cryptography.10.0.12\lib\net462\Microsoft.Bcl.Cryptography.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.HashCode, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\Microsoft.Bcl.HashCode.6.0.0\lib\net462\Microsoft.Bcl.HashCode.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.3.0.1\lib\netstandard2.0\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
</Reference>
<Reference Include="MsgReader, Version=6.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MsgReader.6.2.0\lib\net462\MsgReader.dll</HintPath>
</Reference>
<Reference Include="NativeSDK.Exceptions, Version=14.4.4.0, Culture=neutral, PublicKeyToken=f52a2e60ad468dbb, processorArchitecture=MSIL">
<HintPath>packages\GdPicture.14.4.4\lib\net462\NativeSDK.Exceptions.dll</HintPath>
</Reference>
@@ -263,8 +245,8 @@
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>packages\NLog.5.0.5\lib\net46\NLog.dll</HintPath>
</Reference>
<Reference Include="OpenMcdf, Version=3.1.4.0, Culture=neutral, PublicKeyToken=fdbb1629d7c00800, processorArchitecture=MSIL">
<HintPath>packages\OpenMcdf.3.1.4\lib\netstandard2.0\OpenMcdf.dll</HintPath>
<Reference Include="OpenMcdf, Version=3.3.0.0, Culture=neutral, PublicKeyToken=fdbb1629d7c00800, processorArchitecture=MSIL">
<HintPath>..\packages\OpenMcdf.3.3.0\lib\netstandard2.0\OpenMcdf.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
@@ -288,15 +270,18 @@
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Formats.Asn1, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Formats.Asn1.10.0.5\lib\net462\System.Formats.Asn1.dll</HintPath>
<Reference Include="System.Drawing.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.10.0.12\lib\net462\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Formats.Asn1, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Formats.Asn1.10.0.12\lib\net462\System.Formats.Asn1.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Packaging, Version=10.0.0.5, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Packaging.10.0.5\lib\net462\System.IO.Packaging.dll</HintPath>
</Reference>
<Reference Include="System.IO.Pipelines, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.IO.Pipelines.10.0.5\lib\net462\System.IO.Pipelines.dll</HintPath>
<Reference Include="System.IO.Pipelines, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.10.0.12\lib\net462\System.IO.Pipelines.dll</HintPath>
</Reference>
<Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
@@ -311,15 +296,18 @@
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Security" />
<Reference Include="System.Security.Cryptography.Pkcs, Version=10.0.0.5, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>packages\System.Security.Cryptography.Pkcs.10.0.5\lib\net462\System.Security.Cryptography.Pkcs.dll</HintPath>
<Reference Include="System.Security.Cryptography.Pkcs, Version=10.0.0.12, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Pkcs.10.0.12\lib\net462\System.Security.Cryptography.Pkcs.dll</HintPath>
</Reference>
<Reference Include="System.ServiceModel" />
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Text.Encodings.Web.10.0.5\lib\net462\System.Text.Encodings.Web.dll</HintPath>
<Reference Include="System.Text.Encoding.CodePages, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encoding.CodePages.4.7.1\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Text.Json.10.0.5\lib\net462\System.Text.Json.dll</HintPath>
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encodings.Web.10.0.12\lib\net462\System.Text.Encodings.Web.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=10.0.0.12, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Json.10.0.12\lib\net462\System.Text.Json.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Channels, Version=10.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.Threading.Channels.10.0.5\lib\net462\System.Threading.Channels.dll</HintPath>
@@ -329,7 +317,7 @@
</Reference>
<Reference Include="System.Transactions" />
<Reference Include="System.ValueTuple, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>packages\System.ValueTuple.4.6.1\lib\net462\System.ValueTuple.dll</HintPath>
<HintPath>..\packages\System.ValueTuple.4.6.2\lib\net462\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
@@ -337,6 +325,9 @@
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="UtfUnknown, Version=2.0.0.0, Culture=neutral, PublicKeyToken=90217ce7a23260d4, processorArchitecture=MSIL">
<HintPath>..\packages\UTF.Unknown.2.7.0\lib\netstandard2.0\UtfUnknown.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
@@ -446,9 +437,10 @@
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('packages\GdPicture.runtimes.windows.14.4.4\build\net462\GdPicture.runtimes.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\GdPicture.runtimes.windows.14.4.4\build\net462\GdPicture.runtimes.windows.targets'))" />
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
</Target>
<ItemGroup>
<Analyzer Include="D:\ProgramFiles\DevExpress 25.2\Components\Offline Packages\devexpress.data\25.2.3\analyzers\dotnet\DevExpress.Generator.dll" Visible="false" Condition="Exists('D:\ProgramFiles\DevExpress 25.2\Components\Offline Packages\devexpress.data\25.2.3\analyzers\dotnet\DevExpress.Generator.dll')" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
</Project>

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' übernehmen, indem Sie "*" eingeben:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("2.7.4.0")>
<Assembly: AssemblyFileVersion("2.7.4.0")>
<Assembly: AssemblyVersion("2.7.5.0")>
<Assembly: AssemblyFileVersion("2.7.5.0")>

View File

@@ -7,28 +7,35 @@
<package id="GdPicture.runtimes.windows" version="14.4.4" targetFramework="net462" />
<package id="GdPicture.WinForms" version="14.4.4" targetFramework="net462" />
<package id="Google.Protobuf" version="3.33.2" targetFramework="net462" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.5" targetFramework="net462" />
<package id="Microsoft.Bcl.Cryptography" version="10.0.5" targetFramework="net462" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="10.0.12" targetFramework="net462" />
<package id="Microsoft.Bcl.Cryptography" version="10.0.12" targetFramework="net462" />
<package id="Microsoft.Bcl.HashCode" version="6.0.0" targetFramework="net462" />
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net462" />
<package id="Microsoft.IO.RecyclableMemoryStream" version="3.0.1" targetFramework="net462" />
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net462" />
<package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net462" />
<package id="MsgReader" version="6.2.0" targetFramework="net462" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="net462" />
<package id="NLog" version="5.0.5" targetFramework="net461" />
<package id="OpenMcdf" version="3.1.4" targetFramework="net462" />
<package id="OpenMcdf" version="3.3.0" targetFramework="net462" />
<package id="protobuf-net" version="3.2.46" targetFramework="net462" />
<package id="protobuf-net.Core" version="3.2.46" targetFramework="net462" />
<package id="RtfPipe" version="2.0.7677.4303" targetFramework="net462" />
<package id="System.Buffers" version="4.6.1" targetFramework="net462" />
<package id="System.Collections.Immutable" version="10.0.5" targetFramework="net462" />
<package id="System.Formats.Asn1" version="10.0.5" targetFramework="net462" />
<package id="System.Drawing.Common" version="10.0.12" targetFramework="net462" />
<package id="System.Formats.Asn1" version="10.0.12" targetFramework="net462" />
<package id="System.IO.Packaging" version="10.0.5" targetFramework="net462" />
<package id="System.IO.Pipelines" version="10.0.5" targetFramework="net462" />
<package id="System.IO.Pipelines" version="10.0.12" targetFramework="net462" />
<package id="System.Memory" version="4.6.3" targetFramework="net462" />
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net462" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net462" />
<package id="System.Security.Cryptography.Pkcs" version="10.0.5" targetFramework="net462" />
<package id="System.Text.Encodings.Web" version="10.0.5" targetFramework="net462" />
<package id="System.Text.Json" version="10.0.5" targetFramework="net462" />
<package id="System.Security.Cryptography.Pkcs" version="10.0.12" targetFramework="net462" />
<package id="System.Text.Encoding.CodePages" version="4.7.1" targetFramework="net462" />
<package id="System.Text.Encodings.Web" version="10.0.12" targetFramework="net462" />
<package id="System.Text.Json" version="10.0.12" targetFramework="net462" />
<package id="System.Threading.Channels" version="10.0.5" targetFramework="net462" />
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net462" />
<package id="System.ValueTuple" version="4.6.1" targetFramework="net462" />
<package id="System.ValueTuple" version="4.6.2" targetFramework="net462" />
<package id="UTF.Unknown" version="2.7.0" targetFramework="net462" />
</packages>

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' indem Sie "*" wie unten gezeigt eingeben:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("2.2.0.0")>
<Assembly: AssemblyFileVersion("2.2.0.0")>
<Assembly: AssemblyVersion("2.3.0.0")>
<Assembly: AssemblyFileVersion("2.3.0.0")>

View File

@@ -8,12 +8,22 @@ Public Class ClassSnapPanel
Private _ShowGrid As Boolean = True
Private _GridSize As Integer = 16
Private _NeedsScrollUpdate As Boolean = False
Private _SnappingEnabled As Boolean = True ' ← Neu: Snapping deaktivierbar
Public Sub New()
Me.AutoScroll = True
Me.DoubleBuffered = True ' Flackern reduzieren
End Sub
''' <summary>
''' Deaktiviert das Snapping temporär (z.B. beim Laden von Controls aus der DB)
''' </summary>
Public Property SnappingEnabled As Boolean
Get
Return _SnappingEnabled
End Get
Set(value As Boolean)
_SnappingEnabled = value
End Set
End Property
Public Property GridSize As Integer
Get
Return _GridSize
@@ -40,15 +50,11 @@ Public Class ClassSnapPanel
Protected Overrides Sub OnControlAdded(e As ControlEventArgs)
MyBase.OnControlAdded(e)
AddHandler e.Control.LocationChanged, AddressOf AlignToGrid
AddHandler e.Control.MouseUp, AddressOf AlignToGrid
ScheduleScrollUpdate()
End Sub
Protected Overrides Sub OnControlRemoved(e As ControlEventArgs)
MyBase.OnControlRemoved(e)
RemoveHandler e.Control.LocationChanged, AddressOf AlignToGrid
RemoveHandler e.Control.MouseUp, AddressOf AlignToGrid
ScheduleScrollUpdate()
End Sub
@@ -56,19 +62,38 @@ Public Class ClassSnapPanel
MyBase.OnLayout(levent)
ScheduleScrollUpdate()
End Sub
''' <summary>
''' Snappt ein Control manuell auf das Grid - wird von frmFormDesigner nach einem echten Drag aufgerufen
''' </summary>
Public Sub SnapControlToGrid(ctrl As Control)
If Not _SnappingEnabled OrElse Not _ShowGrid OrElse Me.DesignMode Then Return
Dim x As Integer = Math.Floor(ctrl.Left / _GridSize) * _GridSize
Dim y As Integer = Math.Floor(ctrl.Top / _GridSize) * _GridSize
ctrl.Location = New Point(x, y)
ScheduleScrollUpdate()
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
If Not Me.DesignMode AndAlso _ShowGrid Then
Dim scrollOffset As Point = Me.AutoScrollPosition
Dim gridRect As New Rectangle(-scrollOffset.X, -scrollOffset.Y, Me.ClientSize.Width, Me.ClientSize.Height)
Dim scroll As Point = Me.AutoScrollPosition
' Grid-Ursprung am virtuellen Canvas (0,0) ausrichten
' AutoScrollPosition ist negativ → Modulo ergibt positiven Offset im sichtbaren Bereich
Dim offsetX As Integer = ((scroll.X Mod _GridSize) + _GridSize) Mod _GridSize
Dim offsetY As Integer = ((scroll.Y Mod _GridSize) + _GridSize) Mod _GridSize
' Rechteck um je eine Rasterzelle vergrößern damit keine Lücken entstehen
Dim gridRect As New Rectangle(
offsetX - _GridSize,
offsetY - _GridSize,
Me.ClientSize.Width + _GridSize * 2,
Me.ClientSize.Height + _GridSize * 2)
ControlPaint.DrawGrid(e.Graphics, gridRect, New Size(_GridSize, _GridSize), Me.BackColor)
End If
End Sub
Private Sub AlignToGrid(sender As Object, e As EventArgs)
If Not _ShowGrid OrElse Me.DesignMode Then Return
' ← Snapping nur wenn aktiv
If Not _SnappingEnabled OrElse Not _ShowGrid OrElse Me.DesignMode Then Return
Dim ctrl As Control = CType(sender, Control)
Dim x As Integer = Math.Floor(ctrl.Left / _GridSize) * _GridSize
@@ -87,6 +112,11 @@ Public Class ClassSnapPanel
End Sub))
End If
End Sub
Protected Overrides Sub OnScroll(se As ScrollEventArgs)
MyBase.OnScroll(se)
' Nach dem Scrollen vollständig neu zeichnen
Invalidate()
End Sub
Private Sub UpdateScrollArea()
Dim maxWidth As Integer = 0

View File

@@ -380,26 +380,32 @@ Public Class frmDocumentResultList
oDocument = Documentloader.Load(oObjectId, oFullPath)
If oDocument Is Nothing Then
_Logger.Warn("GridView_FocusedRowChanged: Documentloader returned Nothing for ObjectId [{0}], FullPath [{1}]", oObjectId, oFullPath)
Exit Sub
End If
UpdateRibbonActions(oDocument)
If IsNothing(oDocument) Then
DocumentViewer1.CloseDocument()
FormHelper.ShowErrorMessage(New IOException("File could not be loaded!"), "GridView_FocusedRowChanged")
Exit Sub
End If
' Save reference to current document
_CurrentDocument = oDocument
' Load Document in Document Viewer
Dim oFileName = $"{oObjectId}.{oDocument.Extension}"
If Not IsNothing(oDocument.Contents) And CopyWM2Temp = False Then
_Logger.Debug("Loading document into viewer with MemoryStream handler (LoadFile_FromStream). ObjectId: [{0}], Filename: [{1}], FullPath: [{2}]", oObjectId, oFileName, oFullPath)
' Stream-Pfad: Inhalt liegt bereits im Speicher
_Logger.Debug("Loading document via MemoryStream. ObjectId: [{0}], Filename: [{1}]", oObjectId, oFileName)
DocumentViewer1.LoadFile_FromStream(oFileName, New MemoryStream(oDocument.Contents))
Else
' Datei-Pfad: Pfad auflösen und vorab prüfen
Dim oResolvedFilename As String = oFullPath
If CopyWM2Temp = True AndAlso Not String.IsNullOrWhiteSpace(oResolvedFilename) Then
' Pfad-Validierung: Leer oder nicht gesetzt?
If String.IsNullOrWhiteSpace(oResolvedFilename) Then
_Logger.Warn("GridView_FocusedRowChanged: FullPath ist leer für ObjectId [{0}] – Dokument wird nicht geladen.", oObjectId)
DocumentViewer1.CloseDocument()
Exit Sub
End If
If CopyWM2Temp = True Then
Dim options As New DocumentPathHandler.DocumentPathOptions With {
.EnableMapping = True,
.WMSuffix = WM_SUFFIX,
@@ -411,19 +417,24 @@ Public Class frmDocumentResultList
}
Dim result = _documentPathHandler.ProcessDocumentPath(oResolvedFilename, options)
If result.Success AndAlso Not String.IsNullOrWhiteSpace(result.FinalPath) AndAlso File.Exists(result.FinalPath) Then
_Logger.Info($"✓ Zusatzdokument via Temp aufgelöst: [{result.FinalPath}]")
_Logger.Info("✓ Dokument via Temp aufgelöst: [{0}]", result.FinalPath)
oResolvedFilename = result.FinalPath
Else
_Logger.Warn($"⚠️ Temp-Auflösung fehlgeschlagen für [{oResolvedFilename}]: {result.ErrorMessage} - Fallback auf Originalpfad")
_Logger.Warn("⚠️ Temp-Auflösung fehlgeschlagen für [{0}]: {1} – Fallback auf Originalpfad", oResolvedFilename, result.ErrorMessage)
oResolvedFilename = oFullPath
End If
Else
_Logger.Debug("Keine Temp-Kopie für Dokument erforderlich oder möglich. Originalpfad wird verwendet. ObjectId: [{0}], Filename: [{1}], FullPath: [{2}]", oObjectId, oFileName, oFullPath)
End If
_Logger.Debug("Loading document into viewer from filepath (LoadFile_FromPath). ObjectId: [{0}], Filename: [{1}], FullPath: [{2}]", oObjectId, oFileName, oResolvedFilename)
' Pfad-Validierung: Existiert die Datei?
If Not File.Exists(oResolvedFilename) Then
_Logger.Warn("GridView_FocusedRowChanged: Datei existiert nicht [{0}] für ObjectId [{1}] – Dokument wird nicht geladen.", oResolvedFilename, oObjectId)
DocumentViewer1.CloseDocument()
Exit Sub
End If
_Logger.Debug("Loading document from filepath. ObjectId: [{0}], Filename: [{1}], FullPath: [{2}]", oObjectId, oFileName, oResolvedFilename)
DocumentViewer1.LoadFile_FromPath(oResolvedFilename)
End If
'End If
If OperationMode = OperationMode.ZooFlow Or OperationMode = OperationMode.WithAppServer Then
Await CtrlObjectPropertyDialog.LoadObject(oObjectId)