360 lines
14 KiB
VB.net
360 lines
14 KiB
VB.net
Imports System.Drawing
|
|
Imports System.Windows.Forms
|
|
Imports DevExpress.XtraEditors
|
|
Imports DigitalData.GUIs.Common
|
|
Imports DigitalData.Modules.Logging
|
|
Imports DigitalData.Modules.Windows
|
|
Imports DigitalData.Modules.Language
|
|
Imports DigitalData.Modules.ZooFlow
|
|
Imports DigitalData.Modules.ZooFlow.Params
|
|
Imports DigitalData.Modules
|
|
|
|
''' <summary>
|
|
'''
|
|
''' Selfcontained:
|
|
''' - Config (Location of Window)
|
|
'''
|
|
''' Environment:
|
|
''' - Pattern Replacement Values
|
|
''' - User Info (isAdmin, etc)
|
|
''' - License Info?
|
|
''' - ConnectionString
|
|
'''
|
|
''' Parameters:
|
|
''' - Matching Profiles as List Of ProfileData
|
|
''' - Clipboard Content as String
|
|
''' </summary>
|
|
Public Class frmMatch
|
|
Private _LogConfig As LogConfig
|
|
Private _Logger As Logger
|
|
Private _Environment As Environment
|
|
Private _Params As ClipboardWatcherParams
|
|
|
|
Private PrimaryFont As New Font("Segoe UI", 12, FontStyle.Bold)
|
|
Private SecondaryFont As New Font("Segoe UI", 10)
|
|
Private TileForeColor As Color = Color.Black
|
|
Private TileBackColor As Color = Color.FromArgb(255, 214, 47)
|
|
|
|
Private OpenForms As New List(Of IResultForm)
|
|
Private ShouldHideInitially As Boolean = False
|
|
|
|
Private Const NO_COUNT_SQL As Integer = 99998
|
|
Private Const INVALID_COUNT_SQL As Integer = 99999
|
|
|
|
Private Enum ProfileType
|
|
ANY = 0
|
|
DOCS_ONLY = 1
|
|
DATA_ONLY = 2
|
|
End Enum
|
|
|
|
Public Sub New(LogConfig As LogConfig, Environment As Environment, Params As ClipboardWatcherParams)
|
|
' Dieser Aufruf ist für den Designer erforderlich.
|
|
InitializeComponent()
|
|
|
|
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
|
|
_LogConfig = LogConfig
|
|
_Logger = LogConfig.GetLogger()
|
|
_Environment = Environment
|
|
_Params = Params
|
|
End Sub
|
|
|
|
Private Function GetResultString(CreatedTiles, MatchedProfiles, ClipboardContents) As String
|
|
Dim oResultString = IIf(CreatedTiles = 1, "wurde ein Ergebnis", $"wurden {CreatedTiles} Ergebnisse")
|
|
Dim oProfileString = IIf(MatchedProfiles = 1, "einem Profil", $"{MatchedProfiles} Profilen")
|
|
Dim oBase = "Es {0} in {1} für Ihre Suche nach '{2}' gefunden:"
|
|
|
|
Return String.Format(oBase, oResultString, oProfileString, _Params.ClipboardContents)
|
|
End Function
|
|
|
|
Private Async Sub frmMatch_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
|
Dim oResult As Tuple(Of Integer, Integer) = CreateTiles()
|
|
Dim oCreatedTiles As Integer = oResult.Item1
|
|
Dim oMatchedProfiles As Integer = oResult.Item2
|
|
|
|
Try
|
|
SplashScreenManager1.ShowWaitForm()
|
|
TileControlMatch.Enabled = False
|
|
|
|
If oCreatedTiles = -1 Then
|
|
Exit Sub
|
|
End If
|
|
|
|
If oCreatedTiles = 0 Then
|
|
_Logger.Warn("No Tiles Created: No Results found for ""{0}""", _Params.ClipboardContents)
|
|
Close()
|
|
End If
|
|
|
|
Label1.Text = GetResultString(oCreatedTiles, oMatchedProfiles, _Params.ClipboardContents)
|
|
_Logger.Debug($"Created Tiles: {oCreatedTiles} ")
|
|
_Logger.Debug($"Matched Profiles: {oMatchedProfiles}")
|
|
|
|
If oCreatedTiles = 1 Then
|
|
Dim oProfile As ProfileData = _Params.MatchingProfiles.First()
|
|
Dim oProfileSearch As New ProfileSearches(_LogConfig, _Environment, _Params)
|
|
|
|
If oProfile.CountDocs > 0 And oProfile.CountData = 0 Then
|
|
_Logger.Debug($"ONLY Docs")
|
|
'ONLY DOCS AND NÒ DATA
|
|
Dim oSearches = Await oProfileSearch.LoadDocumentSearchesAsync(oProfile.Guid)
|
|
OpenDocumentResults(oProfile, oSearches)
|
|
Hide()
|
|
ElseIf oProfile.CountDocs > 0 And oProfile.CountData > 0 Then
|
|
_Logger.Debug($"Docs AND Data")
|
|
ElseIf oProfile.CountDocs = 0 And oProfile.CountData > 0 Then
|
|
_Logger.Debug($"ONLY Data")
|
|
Dim oSearches = Await oProfileSearch.LoadDataSearchesAsync(oProfile.Guid)
|
|
OpenDataResults(oProfile, oSearches)
|
|
Hide()
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Finally
|
|
TileControlMatch.Enabled = True
|
|
SplashScreenManager1.CloseWaitForm()
|
|
End Try
|
|
End Sub
|
|
|
|
Private Sub frmMatch_Activated(sender As Object, e As EventArgs) Handles Me.Activated
|
|
TopMost = True
|
|
End Sub
|
|
|
|
Function CreateTiles() As Tuple(Of Integer, Integer)
|
|
Try
|
|
Dim oCreatedTiles As Integer = 0
|
|
Dim oMatchedProfiles As Integer = 0
|
|
|
|
Dim oDocumentGroup = TileControlMatch.Groups.Item("TileGroupDocuments")
|
|
Dim oDataGroup = TileControlMatch.Groups.Item("TileGroupData")
|
|
Dim oDataDocumentsGroup = TileControlMatch.Groups.Item("TileGroupDocumentsData")
|
|
|
|
oDocumentGroup.Items.Clear()
|
|
oDataGroup.Items.Clear()
|
|
|
|
For Each oProfile As ProfileData In _Params.MatchingProfiles
|
|
'TODO: Add Support for Combined Result Lists
|
|
'If oProfile.ProfileType = ProfileType.ANY Then
|
|
' If oProfile.CountData > 0 And oProfile.CountDocs > 0 Then
|
|
' Dim oCountText = oProfile.CountData + oProfile.CountDocs
|
|
' Dim oItem = CreateTile(oProfile, $"{oCountText} Ergebnisse")
|
|
' oDataDocumentsGroup.Items.Add(oItem)
|
|
' oCreatedTiles += 1
|
|
' End If
|
|
'End If
|
|
|
|
Dim oProfileMatch As Boolean = False
|
|
|
|
_Logger.NewBlock($"Profile {oProfile.Name}")
|
|
|
|
If oProfile.ProfileType = ProfileType.ANY Or oProfile.ProfileType = ProfileType.DOCS_ONLY Then
|
|
_Logger.Debug("ProfileType: DOCS_ONLY or ANY")
|
|
|
|
If oProfile.CountDocs > 0 Then
|
|
Dim oItem = CreateTile(oProfile, $"{oProfile.CountDocs} Dateien")
|
|
oDocumentGroup.Items.Add(oItem)
|
|
oCreatedTiles += 1
|
|
oProfileMatch = True
|
|
|
|
_Logger.Debug("{0} Doc-Results!", oProfile.CountDocs)
|
|
Else
|
|
_Logger.Debug("NO Doc-Results!")
|
|
End If
|
|
End If
|
|
|
|
If oProfile.ProfileType = ProfileType.ANY Or oProfile.ProfileType = ProfileType.DATA_ONLY Then
|
|
_Logger.Debug("ProfileType: DATA_ONLY or ANY")
|
|
|
|
If oProfile.CountData > 0 Then
|
|
Dim oItem = CreateTile(oProfile, $"{oProfile.CountData} Datensätze")
|
|
oDataGroup.Items.Add(oItem)
|
|
oCreatedTiles += 1
|
|
oProfileMatch = True
|
|
|
|
_Logger.Debug("{0} Data-Results!", oProfile.CountData)
|
|
Else
|
|
_Logger.Debug("NO Data-Results!")
|
|
End If
|
|
End If
|
|
|
|
If oProfileMatch Then
|
|
oMatchedProfiles += 1
|
|
End If
|
|
Next
|
|
|
|
Return New Tuple(Of Integer, Integer)(oCreatedTiles, oMatchedProfiles)
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
MsgBox("Error while creating profile tiles!" & vbNewLine & ex.Message)
|
|
Return New Tuple(Of Integer, Integer)(-1, -1)
|
|
End Try
|
|
End Function
|
|
|
|
Private Function CreateTile(Profile As ProfileData, CountText As String) As TileItem
|
|
Dim oItem As New TileItem() With {.Tag = Profile.Guid}
|
|
oItem.AppearanceItem.Normal.BackColor = TileBackColor
|
|
oItem.Elements.Clear()
|
|
|
|
Dim oNameElement = New TileItemElement With {
|
|
.Text = Profile.Name,
|
|
.TextAlignment = TileItemContentAlignment.TopLeft
|
|
}
|
|
oNameElement.Appearance.Normal.Font = PrimaryFont
|
|
oNameElement.Appearance.Normal.ForeColor = TileForeColor
|
|
oItem.Elements.Add(oNameElement)
|
|
|
|
Dim oCommentElement = New TileItemElement With {
|
|
.Text = Profile.Comment,
|
|
.TextAlignment = TileItemContentAlignment.MiddleLeft
|
|
}
|
|
oCommentElement.Appearance.Normal.Font = SecondaryFont
|
|
oCommentElement.Appearance.Normal.ForeColor = TileForeColor
|
|
oItem.Elements.Add(oCommentElement)
|
|
|
|
Dim oCountElement = New TileItemElement With {
|
|
.Text = GetCountText(Profile, CountText),
|
|
.TextAlignment = TileItemContentAlignment.BottomRight
|
|
}
|
|
oCountElement.Appearance.Normal.Font = SecondaryFont
|
|
oCountElement.Appearance.Normal.ForeColor = TileForeColor
|
|
oItem.Elements.Add(oCountElement)
|
|
|
|
Return oItem
|
|
End Function
|
|
|
|
Private Function GetCountText(Profile As ProfileData, CountText As String) As String
|
|
Dim oText As String = "No implemented"
|
|
|
|
If Profile.CountData = INVALID_COUNT_SQL Then
|
|
oText = "Invalid SQL!"
|
|
ElseIf Profile.CountData = NO_COUNT_SQL Then
|
|
oText = "No SQL!"
|
|
Else
|
|
oText = CountText
|
|
End If
|
|
|
|
If Profile.CountDocs = INVALID_COUNT_SQL Then
|
|
oText = "Invalid SQL!"
|
|
ElseIf Profile.CountDocs = NO_COUNT_SQL Then
|
|
oText = "No SQL!"
|
|
Else
|
|
oText = CountText
|
|
End If
|
|
|
|
Return oText
|
|
End Function
|
|
|
|
Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click
|
|
Dim oForm As New frmTreeView(_Params.MatchTreeView.Nodes) With {
|
|
.StartPosition = FormStartPosition.Manual,
|
|
.Left = Left + Width,
|
|
.Top = Top
|
|
}
|
|
oForm.ShowDialog()
|
|
End Sub
|
|
|
|
Private Async Sub TileControlMatch_ItemClick(sender As Object, e As TileItemEventArgs) Handles TileControlMatch.ItemClick
|
|
Try
|
|
SplashScreenManager1.ShowWaitForm()
|
|
TileControlMatch.Enabled = False
|
|
|
|
Dim oItem As TileItem = e.Item
|
|
Dim oProfileId As Integer = oItem.Tag
|
|
|
|
Dim oProfileSearch As New ProfileSearches(_LogConfig, _Environment, _Params)
|
|
Dim oProfile As ProfileData = _Params.MatchingProfiles.
|
|
Where(Function(p) p.Guid = oProfileId).
|
|
ToList().
|
|
First()
|
|
|
|
Select Case oItem.Group.Name
|
|
Case TileGroupData.Name
|
|
Dim oSearches = Await oProfileSearch.LoadDataSearchesAsync(oProfileId)
|
|
OpenDataResults(oProfile, oSearches)
|
|
|
|
Case TileGroupDocuments.Name
|
|
Dim oSearches = Await oProfileSearch.LoadDocumentSearchesAsync(oProfileId)
|
|
OpenDocumentResults(oProfile, oSearches)
|
|
|
|
Case Else
|
|
' TODO: Load combined results
|
|
'OpenResultForms(oProfileId, ProfileType.ANY)
|
|
End Select
|
|
|
|
Hide()
|
|
Catch ex As Exception
|
|
MsgBox($"Error while loading Searches: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, Text)
|
|
_Logger.Error(ex)
|
|
Finally
|
|
SplashScreenManager1.CloseWaitForm()
|
|
TileControlMatch.Enabled = True
|
|
End Try
|
|
End Sub
|
|
|
|
Private Sub OpenDocumentResults(Profile As ProfileData, Searches As List(Of ProfileSearches.Search))
|
|
Dim oNameSlug = Language.Utils.ConvertTextToSlug(Profile.Name)
|
|
Dim oSearchGuids = Searches.Select(Function(s) s.Guid).ToArray
|
|
Dim oWindowGuid = $"{Profile.Guid}-{oNameSlug}-{String.Join("-", oSearchGuids)}"
|
|
Dim oParams = New DocumentResultParams() With {
|
|
.WindowGuid = oWindowGuid
|
|
}
|
|
|
|
For Each oSearch In Searches
|
|
oParams.Results.Add(New DocumentResult() With {
|
|
.Title = oSearch.TabCaption,
|
|
.Datatable = oSearch.DataTable
|
|
})
|
|
Next
|
|
|
|
Dim oForm As New frmDocumentResultList(_LogConfig, _Environment, oParams)
|
|
AddHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
|
|
OpenForms.Add(oForm)
|
|
oForm.Show()
|
|
End Sub
|
|
|
|
Private Sub OpenDataResults(Profile As ProfileData, Searches As List(Of ProfileSearches.Search))
|
|
Dim oNameSlug = Language.Utils.ConvertTextToSlug(Profile.Name)
|
|
Dim oSearchGuids = Searches.Select(Function(s) s.Guid).ToArray
|
|
Dim oWindowGuid = $"{Profile.Guid}-{oNameSlug}-{String.Join("-", oSearchGuids)}"
|
|
Dim oParams = New DataResultParams() With {
|
|
.WindowGuid = oWindowGuid
|
|
}
|
|
|
|
For Each oSearch In Searches
|
|
oParams.Results.Add(New DataResult() With {
|
|
.Title = oSearch.TabCaption,
|
|
.Datatable = oSearch.DataTable
|
|
})
|
|
Next
|
|
|
|
Dim oForm As New frmDataResultList(_LogConfig, _Environment, oParams)
|
|
AddHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
|
|
OpenForms.Add(oForm)
|
|
oForm.Show()
|
|
End Sub
|
|
|
|
Private Sub ProfileResultForm_Closed(sender As Object, e As FormClosedEventArgs)
|
|
Dim oShouldOpenAgain As Boolean = False
|
|
Dim oThisForm = New List(Of IResultForm) From {sender}
|
|
|
|
If TypeOf sender Is frmDataResultList Or TypeOf sender Is frmDocumentResultList Then
|
|
For Each oForm As IResultForm In OpenForms
|
|
' Determine if frmProfileMatch should be shown
|
|
If oForm.ShouldReturnToPreviousForm Then
|
|
oShouldOpenAgain = True
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
' If frmProfileMatch should be shown, close all windows of this profile
|
|
If oShouldOpenAgain Then
|
|
For Each oForm As Form In OpenForms.Except(oThisForm)
|
|
' Remove the Handler to prevent a loop
|
|
RemoveHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
|
|
oForm.Close()
|
|
Next
|
|
|
|
Show()
|
|
End If
|
|
End Sub
|
|
End Class
|