Option Explicit On Imports System.IO Imports System.Runtime.InteropServices Imports DevExpress.XtraSplashScreen Imports DigitalData.GUIs.ClipboardWatcher Imports DigitalData.GUIs.ZooFlow.ClassConstants Imports DigitalData.GUIs.ZooFlow.ClipboardWatcher Imports DigitalData.Modules Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Language.Utils Imports DigitalData.Modules.Messaging Imports DigitalData.Modules.Windows Public Class frmFlowForm ' Constants Private Const OPACITY_INITIAL = 0 Private Const OPACITY_HIDDEN = 0.65 Private Const OPACITY_SHOWN = 0.85 Private DTIDB_SEARCHES As DataTable ' Common Helpers Classes Private Init As ClassInit Private AppServerOrDB As ClassDataASorDB Private FileClass As Filesystem.File ' Globix Helper Classes Private FileDrop As ClassFileDrop Private FileHandle As ClassFilehandle Private FolderWatch As ClassFolderwatcher ' ClipboardWatcher Helper Classes Private ClassWindow As Window Private ProfileFilter As ProfileFilter Private ProfileLoader As ClassProfileLoader Private Animator As New Animator() With { .PopupColor = Color.FromArgb(255, 214, 49), .PopupOpacity = 0.8, .PopupSize = New Size(100, 30) } ' Runtime Flags Private ApplicationLoading As Boolean = True Private IDBSearchActive As Boolean = False ' Runtime Variables Private ESCHitCount As Integer = 0 Private IndexForm As frmGlobix_Index Private AdminForm As frmAdmin_Start Private Const mSnapOffset As Integer = 35 ' Events Public Event ClipboardChanged As EventHandler(Of IDataObject) Private WithEvents HotkeyClass As Hotkey Private WithEvents Watcher As ClipboardWatcher.Watcher = ClipboardWatcher.Watcher.Singleton Public Sub New() MyBase.New(My.LogConfig) ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() ' === Hide form initially === Opacity = OPACITY_INITIAL End Sub Private Sub frmFlowForm_Load(sender As Object, e As EventArgs) Handles Me.Load ' === Show Splash Screen === SplashScreenManager.ShowForm(Me, GetType(frmSplash), False, False) ' === Clean up logfiles === FileClass = New Filesystem.File(My.LogConfig) FileClass.RemoveFiles(My.LogConfig.LogDirectory, 30, String.Empty, "log") ' === Initialize AppServer Database Connection with Failover AppServerOrDB = New ClassDataASorDB(My.LogConfig) ' === Initialization === Init = New ClassInit(My.LogConfig, Me) AddHandler Init.Completed, AddressOf Init_Completed Init.InitializeApplication() End Sub Protected Overrides Sub WndProc(ByRef m As Message) ' Listen for operating system messages Select Case m.Msg Case WM_WINDOWPOSCHANGING SnapToDesktopBorder(Me, m.LParam, 0) End Select MyBase.WndProc(m) End Sub Public Shared Sub SnapToDesktopBorder(ByVal clientForm As Form, ByVal LParam As IntPtr, ByVal widthAdjustment As Integer) If clientForm Is Nothing Then ' Satisfies rule: Validate parameters Throw New ArgumentNullException("clientForm") End If ' Snap client to the top, left, bottom or right desktop border ' as the form is moved near that border. Try ' Marshal the LPARAM value which is a WINDOWPOS struct Dim NewPosition As New NativeMethods.WINDOWPOS NewPosition = CType(Marshal.PtrToStructure(LParam, GetType(NativeMethods.WINDOWPOS)), NativeMethods.WINDOWPOS) If NewPosition.y = 0 OrElse NewPosition.x = 0 Then Return ' Nothing to do! End If ' Adjust the client size for borders and caption bar Dim ClientRect As Rectangle = clientForm.RectangleToScreen(clientForm.ClientRectangle) ClientRect.Width += SystemInformation.FrameBorderSize.Width - widthAdjustment ClientRect.Height += (SystemInformation.FrameBorderSize.Height + SystemInformation.CaptionHeight) ' Now get the screen working area (without taskbar) Dim WorkingRect As Rectangle = System.Windows.Forms.Screen.GetWorkingArea(clientForm.ClientRectangle) ' Left border If NewPosition.x >= WorkingRect.X - mSnapOffset AndAlso NewPosition.x <= WorkingRect.X + mSnapOffset Then NewPosition.x = WorkingRect.X End If ' Get screen bounds and taskbar height ' (when taskbar is horizontal) Dim ScreenRect As Rectangle = System.Windows.Forms.Screen.GetBounds(System.Windows.Forms.Screen.PrimaryScreen.Bounds) Dim TaskbarHeight As Integer = ScreenRect.Height - WorkingRect.Height ' Top border (check if taskbar is on top ' or bottom via WorkingRect.Y) If NewPosition.y >= -mSnapOffset AndAlso (WorkingRect.Y > 0 AndAlso NewPosition.y <= (TaskbarHeight + mSnapOffset)) OrElse (WorkingRect.Y <= 0 AndAlso NewPosition.y <= (mSnapOffset)) Then If TaskbarHeight > 0 Then NewPosition.y = WorkingRect.Y ' Horizontal Taskbar Else NewPosition.y = 0 ' Vertical Taskbar End If End If ' Right border If NewPosition.x + ClientRect.Width <= WorkingRect.Right + mSnapOffset AndAlso NewPosition.x + ClientRect.Width >= WorkingRect.Right - mSnapOffset Then NewPosition.x = WorkingRect.Right - (ClientRect.Width + SystemInformation.FrameBorderSize.Width) End If ' Bottom border If NewPosition.y + ClientRect.Height <= WorkingRect.Bottom + mSnapOffset AndAlso NewPosition.y + ClientRect.Height >= WorkingRect.Bottom - mSnapOffset Then NewPosition.y = WorkingRect.Bottom - (ClientRect.Height + SystemInformation.FrameBorderSize.Height) End If ' Marshal it back Marshal.StructureToPtr(NewPosition, LParam, True) Catch ex As ArgumentException End Try End Sub Private Sub Init_Completed(sender As Object, e As EventArgs) Me.Cursor = Cursors.WaitCursor ' === Initialization Complete === ApplicationLoading = False SplashScreenManager.CloseForm(False) ' === Setup Timers === AddHandler TimerRefreshData.Tick, AddressOf TimerRefreshData_Tick TimerRefreshData.Enabled = True ' === Register As Event Listener === EventBus.Instance.Register(Me) ' === Set Form Properties === TopMost = True AllowDrop = True ShowInTaskbar = False Opacity = OPACITY_HIDDEN Location = My.UIConfig.FlowForm.Location ' === Setup Event Handlers === AddHandler KeyDown, AddressOf frmFlowForm_KeyDown AddHandler KeyUp, AddressOf frmFlowForm_KeyDown For Each oControl As Control In Controls AddHandler oControl.MouseEnter, AddressOf frmFlowForm_MouseEnter AddHandler oControl.MouseLeave, AddressOf frmFlowForm_MouseLeave Next AddHandler Watcher.ClipboardChanged, AddressOf Watcher_ClipboardChanged Dim oSQL = My.Queries.Common.FNIDB_GET_SEARCH_PROFILES(My.Application.User.UserId, My.Application.User.Language) Dim oDatatable As DataTable = My.DatabaseIDB.GetDatatable(oSQL) PictureBoxSearch1.Visible = False If Not IsNothing(oDatatable) OrElse oDatatable.Rows.Count > 0 Then IDBSearchActive = True DTIDB_SEARCHES = oDatatable PictureBoxSearch1.Visible = True End If If My.Application.ModulesActive.Contains(MODULE_CLIPBOARDWATCHER) Then Try ClassWindow = New Window(My.LogConfig) HotkeyClass = New Hotkey(Me) 'Add Toggle Hotkey HotkeyClass.AddHotKey(Keys.T, Hotkey.ModfierKey.MOD_CONTROL, HOTKEY_TOGGLE_WATCHER) ' Add Trigger Hotkey 'TODO: Configure Hotkey Dim oSearchKey As String = "D" Dim oFunctionKey As String = "CTRL" Dim oConverter As New KeysConverter Dim oObject As Object = oConverter.ConvertFromString(oSearchKey) Dim oKeyCode As Keys = oObject Select Case oFunctionKey Case "CTRL" HotkeyClass.AddHotKey(oKeyCode, Hotkey.ModfierKey.MOD_CONTROL, HOTKEY_TRIGGER_WATCHER) Case "SHIFT" HotkeyClass.AddHotKey(oKeyCode, Hotkey.ModfierKey.MOD_SHIFT, HOTKEY_TRIGGER_WATCHER) Case "ALT" HotkeyClass.AddHotKey(oKeyCode, Hotkey.ModfierKey.MOD_ALT, HOTKEY_TRIGGER_WATCHER) Case "WIN" HotkeyClass.AddHotKey(oKeyCode, Hotkey.ModfierKey.MOD_WIN, HOTKEY_TRIGGER_WATCHER) End Select AddHandler HotkeyClass.HotKeyPressed, AddressOf HotkeyClass_HotKeyPressed ProfileLoader = New ClassProfileLoader(My.LogConfig, My.Database) ProfileLoader.LoadProfiles() Catch ex As Exception ShowErrorMessage(ex) End Try Else My.Application.ClipboardWatcher.MonitoringActive = False Logger.Info("Clipboard Watcher Module is not active. Hotkey Monitoring will be disabled!") End If If My.Application.ModulesActive.Contains(MODULE_GLOBAL_INDEXER) Then FileDrop = New ClassFileDrop(My.LogConfig) FileHandle = New ClassFilehandle() FolderWatch = New ClassFolderwatcher Refresh_RegexTable() Dim oFileExclusions As New ClassExclusions() If oFileExclusions.Load(My.Application.Globix.PATH_FileExclusions) = False Then If My.Application.User.Language = "de-DE" Then MsgBox("Die Ausschlusskriterien für Dateien in Folderwatch konnten nicht angelegt werden!", MsgBoxStyle.Information) Else MsgBox("File-Exclusions in Folderwatch could not be created!", MsgBoxStyle.Information) End If End If Init_Folderwatch() Start_Folderwatch() GlobixToolStripMenuItem.Visible = True End If oSQL = "SELECT * FROM TBIDB_ATTRIBUTE" My.Tables.DTIDB_ATTRIBUTE = AppServerOrDB.GetDatatable("IDB", oSQL, "TBIDB_ATTRIBUTE", "", "") Me.Cursor = Cursors.Default End Sub Public Sub Init_Folderwatch() Try Dim oSql As String = "SELECT FOLDER_PATH FROM TBGI_FOLDERWATCH_USER WHERE FOLDER_TYPE = 'DEFAULT' AND USER_ID = " & My.Application.User.UserId Dim oDT As DataTable = AppServerOrDB.GetDatatable("DD_ECM", oSql, "TBGI_FOLDERWATCH_USER", $"FOLDER_TYPE = 'DEFAULT' AND USER_ID = {My.Application.User.UserId}") If oDT.Rows.Count = 0 Then 'Throw New ApplicationException("No Default Path configured for User!") Logger.Warn("No Default Path configured for User. Skipping.") Exit Sub End If Dim oFolderWatchPath = oDT.Rows.Item(0).Item("FOLDER_PATH") oFolderWatchPath = NotNull(oFolderWatchPath, String.Empty).ToString If oFolderWatchPath = String.Empty Then Logger.Info("Init_Folderwatch: folderwatchPath is empty") My.Application.Globix.Folderwatchstarted = False 'SaveConfigValue("my.Application.Globix.Folderwatchstarted", "False") My.UIConfig.Globix.FolderWatchStarted = False My.UIConfigManager.Save() End If If Not IO.Directory.Exists(oFolderWatchPath) Then Logger.Info("Init_Folderwatch: folderwatchPath does not exists or is invalid path") My.Application.Globix.Folderwatchstarted = False 'SaveConfigValue("my.Application.Globix.Folderwatchstarted", "False") My.UIConfig.Globix.FolderWatchStarted = False My.UIConfigManager.Save() End If My.Application.Globix.CurrentFolderWatchPath = oFolderWatchPath My.Application.Globix.Folderwatchstarted = True 'FWFunction_STARTED = True FolderWatch.StartStop_FolderWatch() Catch ex As Exception ShowErrorMessage(ex) End Try Try Dim oSql As String = "SELECT FOLDER_PATH FROM TBGI_FOLDERWATCH_USER WHERE FOLDER_TYPE = 'SCAN' AND USER_ID = " & My.Application.User.UserId Dim oFolderwatchScanPath = My.DatabaseECM.GetScalarValue(oSql) oFolderwatchScanPath = IIf(IsDBNull(oFolderwatchScanPath), "", oFolderwatchScanPath) If oFolderwatchScanPath = String.Empty Then Logger.Info("Init_Folderwatch: folderwatchScanPath is empty") My.UIConfig.Globix.FolderWatchStarted = False My.UIConfigManager.Save() Exit Sub End If If Not IO.Directory.Exists(oFolderwatchScanPath) Then Logger.Info("Init_Folderwatch: folderwatchScanPath does not exists or is invalid path") My.UIConfig.Globix.FolderWatchStarted = False My.UIConfigManager.Save() Exit Sub End If My.Application.Globix.CURRENT_SCAN_FOLDERWATCH = oFolderwatchScanPath 'FWFunction_STARTED = True FolderWatch.StartStop_FolderWatchSCAN() Catch ex As Exception ShowErrorMessage(ex) End Try End Sub Private Sub TimerRefreshData_Tick(sender As Object, e As EventArgs) 'TODO: Refresh Data End Sub Private Sub frmFlowForm_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave Opacity = OPACITY_HIDDEN End Sub Private Sub frmFlowForm_MouseEnter(sender As Object, e As EventArgs) Handles Me.MouseEnter Opacity = OPACITY_SHOWN End Sub Private Sub frmFlowForm_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseMove, PictureBoxDragDrop.MouseMove If e.Button = MouseButtons.Left Then NativeMethods.ReleaseCapture() NativeMethods.SendMessage(Handle, NativeMethods.WM_NCLBUTTONDOWN, NativeMethods.HTCAPTION, 0) End If End Sub Private Sub frmFlowForm_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) If e.KeyCode = Keys.Escape Then If ESCHitCount > 0 Then ExitZooflow() Else ESCHitCount += 1 End If ElseIf e.KeyCode = Keys.D AndAlso (e.Control) Then If My.Application.ModulesActive.Contains(ClassConstants.MODULE_ZOOFLOW) Then MsgBox("Search") End If End If End Sub Sub ExitZooflow() Dim oResult As DialogResult = MessageBox.Show("Exit Zooflow", "Are you sure you want to close ZooFlow", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If oResult = DialogResult.Yes Then Application.Exit() Else ESCHitCount = 0 End If End Sub Public Sub OnEvent(Params As Object) Logger.Debug("OnEvent called!") End Sub Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click Open_FlowSearch() End Sub Sub Open_FlowSearch() Cursor = Cursors.WaitCursor If TheFormIsAlreadyLoaded("frmFlowSearch") Then Cursor = Cursors.Default Exit Sub End If Dim oSQLFlowSearch As String = "" For Each oRow As DataRow In My.Tables.DTIDB_COMMON_SQL.Rows If oRow.Item("TITLE") = SQLCMD_FLOW_SEARCH_LOWER_LIMIT Then oSQLFlowSearch = oRow.Item("SQL_COMMAND") End If Next If oSQLFlowSearch <> String.Empty Then oSQLFlowSearch = oSQLFlowSearch.Replace("@USER_ID", My.Application.User.UserId) oSQLFlowSearch = oSQLFlowSearch.Replace("@LANGUAGE_ID", My.Application.User.LanguageID) oSQLFlowSearch = oSQLFlowSearch.Replace("@LANGUAGE", My.Application.User.Language) Dim oForm As New frmFlowSearch(oSQLFlowSearch) oForm.Show() oForm.BringToFront() End If Cursor = Cursors.Default End Sub Private Sub PictureBoxSearch1_Click(sender As Object, e As EventArgs) Handles PictureBoxSearch1.Click Open_FlowSearch() 'Cursor = Cursors.WaitCursor 'If TheFormIsAlreadyLoaded("frmSearchStart") Then ' Cursor = Cursors.Default ' Exit Sub 'End If 'Dim oForm As New frmSearchStart(DTIDB_SEARCHES) 'frmFlowSearch(osql) 'oForm.Show() 'Cursor = Cursors.Default 'If TimerCheckActiveForms.Enabled = False Then ' TimerCheckActiveForms.Enabled = True 'End If End Sub Private Sub ZooFlowBeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ZooFlowBeendenToolStripMenuItem.Click ExitZooflow() End Sub Private Sub VerwaltungToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles VerwaltungToolStripMenuItem.Click Me.Cursor = Cursors.WaitCursor AdminForm = New frmAdmin_Start() frmAdmin_Start.Show() If TimerCheckActiveForms.Enabled = False Then TimerCheckActiveForms.Enabled = True End If Me.Cursor = Cursors.Default End Sub Private Sub frmFlowForm_DragEnter(sender As Object, e As DragEventArgs) Handles MyBase.DragEnter PictureBoxDragDrop.Image = My.Resources._1_LOGO_ZOO_FLOW_DROP3 e.Effect = DragDropEffects.Copy Drag_Enter(sender, e) End Sub Private Sub frmFlowForm_DragDrop(sender As Object, e As DragEventArgs) Handles MyBase.DragDrop DragDropForm(e) End Sub Private Sub frmFlowForm_DragLeave(sender As Object, e As EventArgs) Handles Me.DragLeave PictureBoxDragDrop.Image = My.Resources._1_LOGO_ZOO_FLOW1 End Sub Private Sub PictureBoxAbo_MouseEnter(sender As Object, e As EventArgs) Handles PictureBoxAbo.MouseEnter PictureBoxAbo.Image = My.Resources._2_ZOO_FLOW_Abo_MouseOver End Sub Private Sub PictureBoxAbo_MouseLeave(sender As Object, e As EventArgs) Handles PictureBoxAbo.MouseLeave PictureBoxAbo.Image = My.Resources._2_ZOO_FLOW_Abo End Sub Private Sub PictureBoxAbo_Click(sender As Object, e As EventArgs) Handles PictureBoxAbo.Click Cursor = Cursors.WaitCursor If TheFormIsAlreadyLoaded("frmPreSearch") Then Cursor = Cursors.Default Exit Sub End If Dim oForm2 As New frmSearchPredefined() oForm2.Show() Cursor = Cursors.Default End Sub Private Function TheFormIsAlreadyLoaded(ByVal pFormName As String) As Boolean TheFormIsAlreadyLoaded = False For Each frm As Form In Application.OpenForms If frm.Name.Equals(pFormName) Then TheFormIsAlreadyLoaded = True Exit Function End If Next End Function Private Function FormLoaded_Visible() As Boolean For Each frm As Form In Application.OpenForms If frm.Name.Equals("frmSearchStart") Or frm.Name.Equals("frmGlobix_Index") Or frm.Name.Equals("frmAdmin_Start") Then Return False End If Next TimerCheckActiveForms.Enabled = False Return True End Function Private Sub DatenbankverbindungToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DatenbankverbindungToolStripMenuItem.Click frmConfigDatabase.ShowDialog() End Sub Private Sub TimerCheckActiveForms_Tick(sender As Object, e As EventArgs) Handles TimerCheckActiveForms.Tick Visible = FormLoaded_Visible() If Visible = False Then Exit Sub End Sub Private Sub NotifyIcon_DoubleClick(sender As Object, e As EventArgs) Handles NotifyIcon.DoubleClick If Visible = False Then Visible = True TimerCheckActiveForms.Enabled = False End If End Sub Private Sub PictureBox1_DragEnter(sender As Object, e As DragEventArgs) Handles PictureBoxDragDrop.DragEnter Drag_Enter(sender, e) End Sub Sub Drag_Enter(sender As Object, e As DragEventArgs) If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.All ' Console.WriteLine("DragEnter ...DragDrop") ElseIf e.Data.GetDataPresent("FileGroupDescriptor") Then 'handle a message dragged from Outlook e.Effect = DragDropEffects.Copy ' Console.WriteLine("DragEnter ...OutlookMessage") ElseIf e.Data.GetDataPresent("aryFileGroupDescriptor") AndAlso (e.Data.GetDataPresent("FileContents")) Then e.Effect = DragDropEffects.Copy ' Console.WriteLine("DragEnter ...Attachment from Outlook") Else 'otherwise, do not handle e.Effect = DragDropEffects.None End If End Sub Sub DragDropForm(e As DragEventArgs) If Not My.Application.ModulesActive.Contains(ClassConstants.MODULE_GLOBAL_INDEXER) Then Exit Sub End If If TheFormIsAlreadyLoaded("frmIndexFileList") Then Cursor = Cursors.Default MsgBox("Please index the active file first!", MsgBoxStyle.Exclamation, "Drag 'n Drop not allowed!") Exit Sub End If 'Erstmal alles löschen My.DatabaseECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") If FileDrop.Drop_File(e) = True Then TimerCheckDroppedFiles.Start() Me.Cursor = Cursors.WaitCursor End If PictureBoxDragDrop.Image = My.Resources._1_LOGO_ZOO_FLOW1 End Sub Private Sub PictureBox1_DragDrop(sender As Object, e As DragEventArgs) Handles PictureBoxDragDrop.DragDrop DragDropForm(e) End Sub Private Sub TimerCheckDroppedFiles_Tick(sender As Object, e As EventArgs) Handles TimerCheckDroppedFiles.Tick If Not My.Application.ModulesActive.Contains(ClassConstants.MODULE_GLOBAL_INDEXER) Then Exit Sub End If TimerCheckDroppedFiles.Stop() Globix_Check_Dropped_Files() Me.Cursor = Cursors.Default End Sub Sub Globix_Check_Dropped_Files() Try My.DatabaseECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE WORKED = 1 AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") Dim i As Integer For Each Str As Object In FileDrop.files_dropped If Not Str Is Nothing Then Logger.Info(" Check Drop-File: " & Str.ToString) Dim handleType As String = Str.Substring(0, Str.LastIndexOf("|") + 1) Dim filename As String = Str.Substring(Str.LastIndexOf("|") + 1) If FileHandle.CheckDuplicateFiles(filename, "Manuelle Ablage") Then FileHandle.Decide_FileHandle(filename, handleType) i += 1 Else ' Console.WriteLine("File gibt es bereits") End If End If Next Dim sql As String = "SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')" My.Application.Globix.DTACTUAL_FILES = Nothing My.Application.Globix.DTACTUAL_FILES = My.DatabaseECM.GetDatatable(sql) My.Application.Globix.ABORT_INDEXING = False Dim oOnlyFilesFromFilesystem = True For Each oRow As DataRow In My.Application.Globix.DTACTUAL_FILES.Rows If oRow.Item("HANDLE_TYPE").ToString <> "|DROPFROMFSYSTEM|" Then oOnlyFilesFromFilesystem = False Exit For End If Next If My.Application.Globix.DTACTUAL_FILES.Rows.Count > 1 And oOnlyFilesFromFilesystem = False Then frmGlobix_IndexFileList.ShowDialog() My.Application.Globix.DTACTUAL_FILES = Nothing My.Application.Globix.DTACTUAL_FILES = My.DatabaseECM.GetDatatable(sql) End If For Each oFileRow As DataRow In My.Application.Globix.DTACTUAL_FILES.Rows Dim filestring As String = oFileRow.Item("FILENAME2WORK").ToString My.Application.Globix.CURRENT_FILENAME = oFileRow.Item("FILENAME2WORK").ToString My.Application.Globix.CURRENT_WORKFILE_GUID = oFileRow.Item(0) My.Application.Globix.CURRENT_WORKFILE = oFileRow.Item("FILENAME2WORK").ToString Logger.Info(" CURRENT_WORKFILE: " & My.Application.Globix.CURRENT_WORKFILE) If IO.File.Exists(My.Application.Globix.CURRENT_WORKFILE) = True And My.Application.Globix.DTACTUAL_FILES.Rows.Count > 0 Then Globix_Open_IndexDialog() End If Next Show() Catch ex As Exception ShowErrorMessage(ex) Show() End Try End Sub Sub Globix_Open_IndexDialog() Try IndexForm = New frmGlobix_Index(My.LogConfig) NotifyIconReset() AddHandler IndexForm.FormClosed, AddressOf GlobixClosed IndexForm.Show() Cursor = Cursors.Default If TimerCheckActiveForms.Enabled = False Then TimerCheckActiveForms.Enabled = True End If Catch ex As Exception ShowErrorMessage(ex) End Try End Sub Sub NotifyIconReset() NI_TYPE = "INFO" NI_MESSAGE = String.Empty End Sub Sub GlobixClosed() Try If NI_MESSAGE = String.Empty Then Exit Sub End If Dim oNIType = 1 Select Case NI_TYPE Case "INFO" oNIType = 1 Case "ERROR" oNIType = 3 End Select NotifyIcon.ShowBalloonTip(30000, NI_TITLE, NI_MESSAGE, oNIType) Catch ex As Exception ShowErrorMessage(ex) End Try End Sub Sub Start_Folderwatch() If My.Application.Globix.CurrentFolderWatchPath = String.Empty Then My.Application.Globix.Folderwatchstarted = False End If If My.Application.Globix.CURRENT_SCAN_FOLDERWATCH = String.Empty Then My.UIConfigManager.Config.Globix.FolderWatchScanStarted = False My.UIConfigManager.Save() End If If My.Application.Globix.CurrentFolderWatchPath <> "" Or My.Application.Globix.CURRENT_SCAN_FOLDERWATCH <> "" Then 'If My.Application.Globix.Folderwatchstarted = True Then ' tslblFW.Visible = True 'Else ' tslblFW.Visible = False 'End If Try If My.UIConfigManager.Config.Globix.FolderWatchScanStarted = True Then Logger.Info("FWSCAN started - Checking file:" & My.Application.Globix.CURRENT_SCAN_FOLDERWATCH) Dim fileEntries As String() = Directory.GetFiles(My.Application.Globix.CURRENT_SCAN_FOLDERWATCH) ' Process the list of files found in the directory. Dim fileName As String For Each fileName In fileEntries Logger.Info("Scanfolder after startup: Checking file:" & fileName) For Each row As DataRow In My.Application.Globix.DTEXCLUDE_FILES.Rows Dim content As String = row.Item(0).ToString.ToLower If fileName.ToLower.Contains(content) Then Exit Sub End If Next Dim handleType As String If fileName.ToLower.EndsWith(".msg") Then handleType = "|FW_OUTLOOK_MESSAGE|" Else handleType = "|FW_SIMPLEINDEXER|" End If 'Die Datei übergeben Logger.Info(" Adding file from Scanfolder after startup:" & fileName) If FileHandle.CheckDuplicateFiles(fileName, "FolderWatch/Scan") Then FileHandle.Decide_FileHandle(fileName, handleType) Else Logger.Info("Scanfolder Startup: File already exists:" & fileName) End If Next fileName Else Logger.Info("FWSCAN not started") End If Catch ex As Exception ShowErrorMessage(ex) End Try Try If My.Application.Globix.Folderwatchstarted = True Then Logger.Info("Folderwatchstarted - Checking file:" & My.Application.Globix.CurrentFolderWatchPath) Dim fileEntries As String() = Directory.GetFiles(My.Application.Globix.CurrentFolderWatchPath) ' Process the list of files found in the directory. Dim fileName As String For Each fileName In fileEntries Logger.Info("Folderwach after startup: Checking file:" & fileName) For Each row As DataRow In My.Application.Globix.DTEXCLUDE_FILES.Rows Dim content As String = row.Item(0).ToString.ToLower If fileName.ToLower.Contains(content) Then Exit Sub End If Next Dim handleType As String If fileName.ToLower.EndsWith(".msg") Then handleType = "|FW_OUTLOOK_MESSAGE|" Else handleType = "|FW_SIMPLEINDEXER|" End If 'Die Datei übergeben Logger.Info("Adding file from Folderwatch after startup:" & fileName) If FileHandle.CheckDuplicateFiles(fileName, "FolderWatch/Scan") Then FileHandle.Decide_FileHandle(fileName, handleType) Else Logger.Info("Folderwatch Startup: File already exists:" & fileName) End If Next fileName Else Logger.Info("Folderwatch not started") End If Catch ex As Exception ShowErrorMessage(ex) End Try If TimerFolderwatch.Enabled = False Then TimerFolderwatch.Start() End If End If End Sub Private Sub frmFlowForm_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd My.UIConfig.FlowForm.Location = Location My.UIConfigManager.Save() End Sub Private Sub TimerFolderwatch_Tick_1(sender As Object, e As EventArgs) Handles TimerFolderwatch.Tick Try ' JenneJ, 11.02.2019: ' Keine Folderwatch Dateien verarbeiten, wenn gerade Indexiert wird, ' dadurch würden die Globalen Variablen überschrieben ' und in Folge die falschen Dateien Indexiert! If My.Application.Globix.INDEXING_ACTIVE Or My.Application.Globix.MULTIINDEXING_ACTIVE Then Exit Sub End If If My.Application.Globix.Folderwatchstarted = True Or My.UIConfig.Globix.FolderWatchScanStarted = True Then 'Prüfen ob alle Files abgearbeitet wurden Dim sql = "SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND HANDLE_TYPE like '%|FW%' AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')" My.Application.Globix.DTACTUAL_FILES = My.DatabaseECM.GetDatatable(sql) If My.Application.Globix.DTACTUAL_FILES.Rows.Count > 0 Then My.Application.Globix.ABORT_INDEXING = False ' Dim fil As String Me.TimerFolderwatch.Stop() For Each row As DataRow In My.Application.Globix.DTACTUAL_FILES.Rows Dim FILEGUID = row.Item("GUID") If My.Application.Globix.ABORT_INDEXING = True Then Exit For End If Dim FileForWork As String = row.Item(1).ToString Logger.Info(" In Timer Folderwatch - File: " & FileForWork) Dim fileInUse As Boolean = FileHandle.IsFileInUse(FileForWork) Dim fileexists As Boolean = System.IO.File.Exists(FileForWork) If fileInUse = False Then If fileexists = True Then My.Application.Globix.CURRENT_WORKFILE = FileForWork My.Application.Globix.CURRENT_FILENAME = FileForWork My.Application.Globix.CURRENT_WORKFILE_GUID = DirectCast(row.Item("GUID"), Integer) Globix_Open_IndexDialog() Else Logger.Info(" File not existing - Row will be deleted!") Dim oDel = String.Format("DELETE FROM TBGI_FILES_USER WHERE GUID = {0}", FILEGUID) My.DatabaseECM.ExecuteNonQuery(oDel) End If Else Logger.Info(" file '" & row.Item(1).ToString & "' could not be opened exclusively - fileInUse!") End If Next Me.TimerFolderwatch.Start() End If 'tslblFW.Visible = True Else 'tslblFW.Visible = False End If Catch ex As Exception If ex.Message.Contains("Sammlung wurde geändert") Or ex.Message.Contains("Enumeration") Then Else MsgBox("Error in Work FolderWatch-File:" & vbNewLine & ex.Message, MsgBoxStyle.Critical) End If End Try End Sub Private Sub TsiGlobixConfig_Click(sender As Object, e As EventArgs) Handles TsiGlobixConfig.Click frmGlobixBasicConfig.ShowDialog() End Sub Private Sub Watcher_ClipboardChanged(sender As Object, e As IDataObject) Dim ClipboardContents As String = Clipboard.GetText().Trim() Dim oState = My.Application.ClipboardWatcher oState.CurrentClipboardContents = ClipboardContents If oState.MonitoringActive = False Then Dim oMessage As String = "Clipboard Watcher is not active!" Logger.Info(oMessage) MsgBox(oMessage, MsgBoxStyle.Critical, Text) Exit Sub End If If oState.UserProfiles Is Nothing Then Dim oMessage As String = "User Profiles are empty!" Logger.Info(oMessage) MsgBox(oMessage, MsgBoxStyle.Critical, Text) Exit Sub End If If oState.ProfileProcesses Is Nothing OrElse oState.ProfileProcesses.Rows.Count = 0 Then Dim oMessage As String = "Profile Processes are empty!" Logger.Info(oMessage) MsgBox(oMessage, MsgBoxStyle.Critical, Text) Exit Sub End If If oState.ProfileWindows Is Nothing OrElse oState.ProfileWindows.Rows.Count = 0 Then Dim oMessage As String = "Profile Processes are empty!" Logger.Info(oMessage) MsgBox(oMessage, MsgBoxStyle.Critical, Text) Exit Sub End If If oState.ProfileProcesses Is Nothing OrElse oState.ProfileProcesses.Rows.Count = 0 Then Dim oMessage As String = "Profile Processes are empty!" Logger.Info(oMessage) MsgBox(oMessage, MsgBoxStyle.Critical, Text) Exit Sub End If Dim oWindowInfo = ClassWindow.GetWindowInfo() Try ' Tree View zurücksetzen oState.MatchTreeView.Nodes.Clear() ProfileFilter = New ProfileFilter(My.LogConfig, oState.UserProfiles, oState.ProfileProcesses, oState.ProfileWindows, oState.ProfileControls, oState.MatchTreeView) Catch ex As Exception Logger.Error(ex) MsgBox("Fehler beim Laden der Profile. Möglicherweise liegt ein Konfigurationsfehler vor. Fehlermeldung: " & ex.Message, MsgBoxStyle.Critical, Text) End Try Try Dim oProfiles = ProfileFilter.Profiles Dim oEnvironment = ClassEnvironment.GetEnvironment() ' Filter by Clipboard Contents oProfiles = ProfileFilter.FilterProfilesByClipboardRegex(oProfiles, ClipboardContents) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "FilterProfilesByClipboardRegex") ' Filter by Process Name oProfiles = ProfileFilter.FilterProfilesByProcess(oProfiles, oWindowInfo.ProcessName) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "FilterProfilesByProcess") ' Filter by Window Title oProfiles = ProfileFilter.FilterWindowsByWindowTitleRegex(oProfiles, oWindowInfo.WindowTitle) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "FilterWindowsByWindowTitleRegex") ' Filter by Focused Control oProfiles = ProfileFilter.FilterProfilesByFocusedControl(oProfiles, ClipboardContents, Handle) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "FilterProfilesByFocusedControl") oState.CurrentMatchingProfiles = oProfiles.ToList() ' Filter by Search Results oProfiles = ProfileFilter.FilterProfilesBySearchResults(oProfiles, oEnvironment.Database, oEnvironment.User, ClipboardContents) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "FilterProfilesBySearchResults") ' Clean up Profiles oProfiles = ProfileFilter.ClearNotMatchedProfiles(oProfiles) oProfiles = ProfileFilter.ClearDuplicateProfiles(oProfiles) oProfiles = ProfileFilter.LogRemainingProfiles(oProfiles, "CleanUp") oState.CurrentProfilesWithResults = oProfiles.ToList() Catch ex As Exception Logger.Error(ex) MsgBox("Fehler beim Auswerten der Profile. Mehr Informationen im Log.", MsgBoxStyle.Critical, Text) End Try End Sub Private Sub HotkeyClass_HotKeyPressed(HotKeyID As String) Dim oState = My.Application.ClipboardWatcher Select Case HotKeyID Case HOTKEY_TRIGGER_WATCHER Animator.Highlight(Cursor.Position) If oState.CurrentClipboardContents = String.Empty Then Logger.Info("Current Clipboard Contents is empty. Exiting.") Exit Sub End If If oState.MonitoringActive = False Then Logger.Info("Monitoring is inactive. Exiting.") Exit Sub End If If oState.UserProfiles.Rows.Count = 0 Then NotifyIcon.ShowBalloonTip(NOTIFICATION_DELAY, "ClipboardWatcher", "Es wurden keine Profile für Sie gefunden.", ToolTipIcon.Warning) ElseIf oState.CurrentMatchingProfiles.Count = 0 Then NotifyIcon.ShowBalloonTip(NOTIFICATION_DELAY, "ClipboardWatcher", "Es wurden keine passenden Profile gefunden.", ToolTipIcon.Warning) ElseIf oState.CurrentProfilesWithResults.Count = 0 Then NotifyIcon.ShowBalloonTip(NOTIFICATION_DELAY, "ClipboardWatcher", "Es wurden weder Dokumente noch Daten gefunden!", ToolTipIcon.Warning) Else Dim oProfiles = oState.CurrentProfilesWithResults Dim oEnvironment = My.Application.GetEnvironment() Dim oParams As New DigitalData.Modules.ZooFlow.ClipboardWatcherParams With { .ClipboardContents = oState.CurrentClipboardContents, .MatchingProfiles = oProfiles, .MatchTreeView = oState.MatchTreeView } Dim oForm As New frmMatch(My.LogConfig, oEnvironment, oParams) oForm.Show() End If Case HOTKEY_TOGGLE_WATCHER If oState.MonitoringActive = True Then NotifyIcon.ShowBalloonTip(NOTIFICATION_DELAY, "ClipboardWatcher", "Clipboard-Watcher wurde deaktiviert!", ToolTipIcon.Info) Else NotifyIcon.ShowBalloonTip(NOTIFICATION_DELAY, "ClipboardWatcher", "Clipboard-Watcher wurde aktiviert!", ToolTipIcon.Info) End If oState.MonitoringActive = Not oState.MonitoringActive End Select End Sub Private Sub PictureBoxPM1_Click(sender As Object, e As EventArgs) Handles PictureBoxPM1.Click ToastNotificationsManager1.ShowNotification(ToastNotificationsManager1.Notifications(1)) End Sub Private Sub TestToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TestToolStripMenuItem.Click frmtest.Show() End Sub End Class