Files
ClipboardWatcher/app/DD_Clipboard_Searcher/frmProfileMatch.vb
2019-10-08 16:04:35 +02:00

377 lines
14 KiB
VB.net

Imports DD_Clipboard_Watcher.ClassProfileFilter
Imports DD_Clipboard_Watcher.ClassConstants
Imports DevExpress.XtraEditors
Imports DigitalData.GUIs.Common
Imports DigitalData.Modules
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Language
Imports DigitalData.Modules.ZooFlow
Public Class frmProfileMatch
Private PrimaryFont As New Font("Segoe UI", 12, FontStyle.Bold)
Private SecondaryFont As New Font("Segoe UI", 10)
Private OpenForms As New List(Of IResultForm)
Private ShouldHideInitially As Boolean = False
Public Class DocumentSearch
Public Guid As Integer
Public DataTable As DataTable
Public TabIndex As Integer
Public TabCaption As String
Public ProfileId As Integer
Public SQLCommand As String
End Class
Private Enum ProfileType
ANY = 0
DOCS_ONLY = 1
DATA_ONLY = 2
End Enum
Private Sub frmProfileMatch_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not ConfigManager.Config.MatchWindowLocation.IsEmpty Then
Location = ConfigManager.Config.MatchWindowLocation
End If
If Not ConfigManager.Config.MatchWindowSize.IsEmpty Then
Size = ConfigManager.Config.MatchWindowSize
End If
Dim oCreatedTiles = CreateTiles()
If oCreatedTiles = -1 Then
Exit Sub
End If
If oCreatedTiles = 0 Then
Logger.Warn("No Results found for ""{0}""", CURRENT_CLIPBOARD_CONTENTS)
Me.Close()
End If
Dim oMatchString = IIf(oCreatedTiles = 1, "1 Match", $"{oCreatedTiles} Matches")
Label1.Text = String.Format(Label1.Text, oMatchString, CURRENT_CLIPBOARD_CONTENTS)
' Open Result Forms directly if only one match found
If oCreatedTiles = 1 Then
Dim oProfile As ProfileData = CURRENT_MATCHING_PROFILES.First()
OpenResultForms(oProfile.Guid, oProfile.ProfileType)
ShouldHideInitially = True
End If
End Sub
Private Sub frmProfileMatch_Shown(sender As Object, e As EventArgs) Handles Me.Shown
If ShouldHideInitially Then
Hide()
End If
End Sub
Function CreateTiles() As Integer
Try
Dim oCreatedTiles 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 CURRENT_MATCHING_PROFILES
If oProfile.ProfileType = PROFILE_TYPE_DATA_DOCS 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
If oProfile.ProfileType = PROFILE_TYPE_DATA_DOCS Or oProfile.ProfileType = PROFILE_TYPE_DOCS_ONLY Then
If oProfile.CountDocs > 0 Then
Dim oItem = CreateTile(oProfile, $"{oProfile.CountDocs} Dokumente")
oDocumentGroup.Items.Add(oItem)
oCreatedTiles += 1
End If
End If
If oProfile.ProfileType = PROFILE_TYPE_DATA_DOCS Or oProfile.ProfileType = PROFILE_TYPE_DATA_ONLY Then
If oProfile.CountData > 0 Then
Dim oItem = CreateTile(oProfile, $"{oProfile.CountData} Datensätze")
oDataGroup.Items.Add(oItem)
oCreatedTiles += 1
End If
End If
Next
Return oCreatedTiles
Catch ex As Exception
Logger.Error(ex)
MsgBox("Error while creating profile tiles!" & vbNewLine & ex.Message)
Return -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.Elements.Clear()
Dim oNameElement = New TileItemElement With {
.Text = Profile.Name,
.TextAlignment = TileItemContentAlignment.TopLeft
}
oNameElement.Appearance.Normal.Font = PrimaryFont
oItem.Elements.Add(oNameElement)
Dim oCommentElement = New TileItemElement With {
.Text = Profile.Comment,
.TextAlignment = TileItemContentAlignment.MiddleLeft
}
oCommentElement.Appearance.Normal.Font = SecondaryFont
oItem.Elements.Add(oCommentElement)
Dim oCountElement = New TileItemElement With {
.Text = GetCountText(Profile, CountText),
.TextAlignment = TileItemContentAlignment.BottomRight
}
oCountElement.Appearance.Normal.Font = SecondaryFont
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 frmProfileMatch_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Try
ConfigManager.Config.MatchWindowSize = Size
ConfigManager.Config.MatchWindowLocation = Location
ConfigManager.Save()
CURRENT_CLIPBOARD_CONTENTS = Nothing
Catch ex As Exception
Logger.Error(ex)
Logger.Info("Error in Save FormLayout: " & ex.Message)
End Try
End Sub
Private Sub TileControlMatch_ItemClick(sender As Object, e As TileItemEventArgs) Handles TileControlMatch.ItemClick
Dim oItem As TileItem = e.Item
Dim oProfileId As Integer = oItem.Tag
Select Case oItem.Group.Name
Case TileGroupData.Name
OpenResultForms(oProfileId, ProfileType.DATA_ONLY)
Case TileGroupDocuments.Name
OpenResultForms(oProfileId, ProfileType.DOCS_ONLY)
Case Else
OpenResultForms(oProfileId, ProfileType.ANY)
End Select
Hide()
End Sub
Private Async Function LoadSearchesAsync(MatchingProfiles As List(Of ProfileData)) As Task(Of List(Of DocumentSearch))
Return Await Task.Run(Function()
Return DoLoadSearches(MatchingProfiles)
End Function)
End Function
Private Function DoLoadSearches(MatchingProfiles As List(Of ProfileData)) As List(Of DocumentSearch)
Dim oMatchingIds = String.Join(",", MatchingProfiles.Select(Function(p) p.Guid).ToArray())
Dim oSQL As String = $"SELECT * FROM TBCW_PROF_DOC_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID in ({oMatchingIds}) ORDER BY TAB_INDEX"
Dim oSearchesDataTable = Database.GetDatatable(oSQL)
Dim oDocSearches As New List(Of DocumentSearch)
For Each oRow As DataRow In oSearchesDataTable.Rows
Dim oGuid As Integer = oRow.Item("GUID")
Dim oProfileId As Integer = oRow.Item("PROFILE_ID")
Dim oTabTitle As String = oRow.Item("TAB_TITLE")
Dim oConnectionId As Integer = oRow.Item("CONN_ID")
oSQL = oRow.Item("SQL_COMMAND")
oSQL = clsPatterns.ReplaceAllValues(oSQL, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_EMAIL, USER_ID, oProfileId)
Dim oDatatable As DataTable = GetDatatable(oSQL, oConnectionId)
oDocSearches.Add(New DocumentSearch() With {
.Guid = oGuid,
.DataTable = oDatatable,
.ProfileId = oProfileId,
.TabCaption = oTabTitle,
.SQLCommand = oSQL
})
Next
Return oDocSearches
End Function
Private Async Sub OpenResultForms(ProfileId As Integer, OpenType As ProfileType)
Dim oMatchingProfiles As New List(Of ProfileData)
' TODO: Implement Show All
' Click on specific profile
Dim oProfile As ProfileData = CURRENT_MATCHING_PROFILES.
Where(Function(p) p.Guid = ProfileId).
First()
oMatchingProfiles.Add(oProfile)
Dim oSearches As List(Of DocumentSearch) = Await LoadSearchesAsync(oMatchingProfiles)
Dim oEnvironment = GetEnvironment()
Dim oParams = GetParams(oProfile, oSearches)
If OpenType = ProfileType.ANY Or OpenType = ProfileType.DOCS_ONLY Then
' Show Result Document Form
Dim oForm As New frmDocumentResultList(LogConfig, oEnvironment, oParams)
' TODO: Reopen match form
'AddHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
'OpenForms.Add(oForm)
'Dim oForm As New frmResultDoc(Me, oMatchingProfiles)
'AddHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
'OpenForms.Add(oForm)
oForm.Show()
End If
If OpenType = ProfileType.ANY Or OpenType = ProfileType.DATA_ONLY Then
' Show Result Data Form
Dim oForm As New frmResultSQL(Me, oMatchingProfiles)
AddHandler oForm.FormClosed, AddressOf ProfileResultForm_Closed
OpenForms.Add(oForm)
oForm.Show()
End If
End Sub
Private Function GetParams(Profile As ProfileData, DocumentSearches As List(Of DocumentSearch)) As DocumentResultParams
Dim oResults As New List(Of DocumentResult)
For Each oSearch In DocumentSearches
oResults.Add(New DocumentResult() With {
.Datatable = oSearch.DataTable,
.Title = oSearch.TabCaption
})
Next
Dim oParams As New DocumentResultParams() With {
.WindowGuid = GetWindowId(Profile, DocumentSearches),
.Results = oResults
}
Return oParams
End Function
Private Function GetWindowId(Profile As ProfileData, Searches As List(Of DocumentSearch)) As String
Dim oNameSlug = Utils.ConvertTextToSlug(Profile.Name)
Dim oSearchGuids = Searches.Select(Function(s) s.Guid).ToArray
Dim oWindowGuid = $"{Profile.Guid}-{oNameSlug}-{String.Join("-", oSearchGuids)}"
Return oWindowGuid
End Function
Private Function GetEnvironment() As Environment
Dim oUser As New State.UserState() With {
.DateFormat = USER_DATE_FORMAT,
.Email = USER_EMAIL,
.GivenName = USER_PRENAME,
.Language = USER_LANGUAGE,
.MachineName = System.Environment.MachineName,
.ShortName = USER_SHORTNAME,
.Surname = USER_SURNAME,
.UserId = USER_ID,
.UserName = USER_USERNAME
}
Dim oSettings As New State.SettingsState() With {
.GdPictureKey = ""
}
Dim oEnvironment As New Environment() With {
.Database = Nothing,
.Modules = Nothing,
.User = oUser,
.Settings = oSettings
}
Return oEnvironment
End Function
Private Function GetDatatable(SqlCommand As String, ConnectionId As Integer)
Try
Dim oRow As MyDataset.TBDD_CONNECTIONRow = DT_CONNECTIONS.AsEnumerable().
Where(Function(r) r.GUID = ConnectionId).
FirstOrDefault()
Dim oConnectionType As String = oRow.SQL_PROVIDER
Select Case oRow.SQL_PROVIDER
Case Constants.PROVIDER_MSSQL
Dim oSQL As New MSSQLServer(LogConfig, oRow.SERVER, oRow.DATENBANK, oRow.USERNAME, oRow.PASSWORD)
Return oSQL.GetDatatable(SqlCommand)
Case Constants.PROVIDER_ODBC
Dim oODBC As New ODBC(LogConfig, oRow.SERVER, oRow.USERNAME, oRow.PASSWORD)
Return oODBC.GetDatatable(SqlCommand)
Case Else
Dim oOracle As New Database.Oracle(LogConfig, oRow.SERVER, oRow.DATENBANK, oRow.USERNAME, oRow.PASSWORD)
Return oOracle.GetDatatable(SqlCommand)
End Select
Catch ex As Exception
Logger.Error(ex)
Return Nothing
End Try
End Function
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 frmResultDoc Or TypeOf sender Is frmResultSQL Then
For Each oForm As IResultForm In OpenForms
' Determine if frmProfileMatch should be shown
If oForm.ShouldReturnToMatchForm 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
Private Sub AblaufSucheAnzeigenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AblaufSucheAnzeigenToolStripMenuItem.Click
frmTreeView.ShowDialog()
End Sub
End Class