Imports System.ComponentModel
Imports System.Text.RegularExpressions
Imports DD_LIB_Standards
Imports DevExpress.Utils
Imports DevExpress.XtraEditors
Imports DevExpress.XtraEditors.Controls
Imports DevExpress.XtraEditors.NavigatorButtons
Imports DevExpress.XtraEditors.Repository
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Views.Grid
Imports DigitalData.Controls.LookupGrid
Imports DigitalData.Modules.Language.Utils
Imports DigitalData.GUIs.Common
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Language
Imports DigitalData.Modules.EDMI.API.DatabaseWithFallback
Imports DigitalData.Modules.EDMI.API.Constants
Imports DigitalData.Modules.Language.DataTableEx
Imports DigitalData.Modules.Base

Public Class ClassControlCreator

    ''' <summary>
    ''' Konstanten
    ''' </summary>
    Private Const DEFAULT_TEXT = "Bezeichnung definieren"

    Private Const DEFAULT_FONT_SIZE As Integer = 10
    Private Const DEFAULT_FONT_FAMILY As String = "Arial"
    Private Const DEFAULT_FONT_STYLE As FontStyle = FontStyle.Regular
    Private Const DEFAULT_COLOR As Integer = 0
    Private Const DEFAULT_WIDTH As Integer = 170
    Private Const DEFAULT_HEIGHT As Integer = 20
    Private Const DEFAULT_HEIGHT_TABLE As Integer = 150

    Public Const PREFIX_TEXTBOX = "TXT"
    Public Const PREFIX_LABEL = "LBL"
    Public Const PREFIX_CHECKBOX = "CHK"
    Public Const PREFIX_COMBOBOX = "CMB"
    Public Const PREFIX_DATETIMEPICKER = "DTP"
    Public Const PREFIX_DATAGRIDVIEW = "DGV"
    Public Const PREFIX_LOOKUP = "LU"
    Public Const PREFIX_TABLE = "TB"
    Public Const PREFIX_LINE = "LINE"
    Public Const PREFIX_BUTTON = "BTN"

    Public Const AGGREGATE_NONE = "NONE"
    Public Const AGGREGATE_TOTAL_INTEGER = "TOTAL_INTEGER"
    Public Const AGGREGATE_TOTAL_FLOAT = "TOTAL_FLOAT"
    Public Const AGGREGATE_TOTAL_CURRENCY = "TOTAL_CURRENCY"
    Public Const AGGREGATE_TOTAL_MIN = "TOTAL_MIN"
    Public Const AGGREGATE_TOTAL_MAX = "TOTAL_MAX"
    Public Const AGGREGATE_TOTAL_AVG = "TOTAL_AVG"
    Public Const AGGREGATE_TOTAL_COUNT = "TOTAL_COUNT"

    Public Const CONTROL_TYPE_TEXT = "TEXT"
    Public Const CONTROL_TYPE_INTEGER = "INTEGER"
    Public Const CONTROL_TYPE_BOOLEAN = "BOOLEAN"
    Public Const CONTROL_TYPE_DOUBLE = "DOUBLE"
    Public Const CONTROL_TYPE_CURRENCY = "CURRENCY"
    Public Const CONTROL_TYPE_DATE = "DATE"
    Public Const CONTROL_TYPE_DATETIME = "DATETIME"


    Public ReadOnly Property Logger As Logger
    Public ReadOnly Property LogConfig As LogConfig

    ''' <summary>
    ''' Saves the column data for each grid and each column in that grid
    ''' </summary>
    Public Property GridTables As New Dictionary(Of Integer, Dictionary(Of String, RepositoryItem))
    Public Property GridColumns As New Dictionary(Of Integer, DataTable)

    ''' <summary>
    ''' Standard Eigenschaften für alle Controls
    ''' </summary>
    Private Class ControlDBProps
        Public Guid As Integer
        Public Name As String
        Public Attribute As String
        Public Location As Point
        Public [Font] As Font
        Public [Color] As Color
        Public [ReadOnly] As Boolean
    End Class

    Public Class ControlMetadata
        Public Guid As Integer
        Public Name As String
        Public Attribute As String
        Public [ReadOnly] As Boolean = False
        Public BackColor As Color = Color.White
    End Class

    Public Sub New(pLogConfig As LogConfig)
        LogConfig = pLogConfig
        Logger = pLogConfig.GetLogger()
    End Sub

    Private Function TransformDataRow(row As DataRow) As ControlDBProps
        Dim x As Integer = row.Item("X_LOC")
        Dim y As Integer = row.Item("Y_LOC")
        Dim style As FontStyle = NotNull(row.Item("FONT_STYLE"), DEFAULT_FONT_STYLE)
        Dim size As Single = NotNull(row.Item("FONT_SIZE"), DEFAULT_FONT_SIZE)
        Dim familyString As String = NotNull(row.Item("FONT_FAMILY"), DEFAULT_FONT_FAMILY)
        Dim family As FontFamily = New FontFamily(familyString)

        Dim oGuid As Integer = row.Item("GUID")
        Dim oName As String = NotNull(row.Item("NAME"), "")
        Dim oAttribute As String = NotNull(row.Item("INDEX_NAME"), "")
        Dim oLocation As New Point(x, y)
        Dim oFont As New Font(family, size, style, GraphicsUnit.Point)
        Dim oColor As Color = IntToColor(NotNull(row.Item("FONT_COLOR"), DEFAULT_COLOR))
        Dim oReadOnly As Boolean = row.Item("READ_ONLY")

        Return New ControlDBProps() With {
            .Guid = oGuid,
            .Name = oName,
            .Attribute = oAttribute,
            .Location = oLocation,
            .Font = oFont,
            .Color = oColor,
            .ReadOnly = oReadOnly
        }
    End Function

    Public Function CreateBaseControl(ctrl As Control, OControlRow As DataRow, designMode As Boolean) As Control
        Try
            Dim props As ControlDBProps = TransformDataRow(OControlRow)

            ctrl.Tag = New ControlMetadata() With {
                .Guid = props.Guid,
                .Attribute = props.Attribute,
                .ReadOnly = props.ReadOnly,
                .Name = props.Name
            }
            ctrl.Name = props.Name
            ctrl.Location = props.Location
            ctrl.Font = props.Font
            ctrl.ForeColor = props.Color


            If designMode Then
                ctrl.Cursor = Cursors.Hand
            End If

            If props.ReadOnly Then
                ctrl.BackColor = Color.LightGray
            End If

            Return ctrl
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try

    End Function

    ' ----------------------- NEW CONTROLS -----------------------

    Public Function CreateNewTextBox(location As Point) As TextEdit
        Dim control As New TextEdit With {
            .Name = $"{PREFIX_TEXTBOX}_{clsTools.ShortGuid()}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT),
            .Location = location,
            .ReadOnly = True,
            .BackColor = Color.White,
            .Cursor = Cursors.Hand
        }

        Return control
    End Function

    Public Function CreateNewLabel(location As Point) As Label
        Dim control As New Label With {
            .Name = $"{PREFIX_LABEL}_{clsTools.ShortGuid}",
            .Text = DEFAULT_TEXT,
            .AutoSize = True,
            .Location = location,
            .Cursor = Cursors.Hand
        }

        Return control
    End Function

    Public Function CreateNewCheckbox(location As Point) As CheckBox
        Dim control As New CheckBox With {
            .Name = $"{PREFIX_CHECKBOX}_{clsTools.ShortGuid}",
            .AutoSize = True,
            .Text = DEFAULT_TEXT,
            .Cursor = Cursors.Hand,
            .Location = location,
            .CheckState = CheckState.Indeterminate
        }

        Return control
    End Function

    Public Function CreateNewCombobox(location As Point) As Windows.Forms.ComboBox
        Dim control As New Windows.Forms.ComboBox With {
            .Name = $"{PREFIX_COMBOBOX}_{clsTools.ShortGuid}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT),
            .Cursor = Cursors.Hand,
            .Location = location
           }

        Return control
    End Function

    Public Function CreateNewDatetimepicker(location As Point) As DateTimePicker
        Dim control As New DateTimePicker With {
            .Name = $"{PREFIX_DATETIMEPICKER}_{clsTools.ShortGuid}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT),
            .Cursor = Cursors.Hand,
            .Location = location,
            .Format = DateTimePickerFormat.Short
        }

        Return control
    End Function

    Public Function CreateNewDatagridview(location As Point) As DataGridView
        Dim control As New DataGridView With {
            .Name = $"{PREFIX_DATAGRIDVIEW}_{clsTools.ShortGuid}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT_TABLE),
            .Cursor = Cursors.Hand,
            .Location = location,
            .AllowUserToAddRows = False,
            .AllowUserToDeleteRows = False,
            .AllowUserToResizeColumns = False,
            .AllowUserToResizeRows = False
        }

        control.Columns.Add(New DataGridViewTextBoxColumn With {
            .HeaderText = "",
            .Name = "column1"
        })

        Return control
    End Function

    Friend Function CreateNewLookupControl(location As Point) As LookupControl3
        Dim control As New LookupControl3 With {
            .Name = $"{PREFIX_LOOKUP}_{clsTools.ShortGuid}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT),
            .Cursor = Cursors.Hand,
            .Location = location
        }
        Return control
    End Function

    Public Function CreateNewTable(location As Point) As GridControl
        Dim oControl As New GridControl With {
            .Name = $"{PREFIX_TABLE}_{clsTools.ShortGuid}",
            .Size = New Size(DEFAULT_WIDTH, DEFAULT_HEIGHT_TABLE),
            .Cursor = Cursors.Hand,
            .Location = location,
            .UseEmbeddedNavigator = True
        }
        oControl.ForceInitialize()
        Dim oView As GridView = oControl.DefaultView
        oView.OptionsView.ShowGroupPanel = False

        Dim oDatatable As New DataTable()
        oDatatable.Columns.Add("column1", GetType(String))
        oDatatable.Columns.Add("column2", GetType(String))
        oControl.DataSource = oDatatable

        Return oControl
    End Function

    Public Function CreateNewLine(location As Point) As LineLabel
        Dim control As New LineLabel With {
            .Name = $"{PREFIX_LINE}_{clsTools.ShortGuid}",
            .Text = "---------------------------------",
            .Size = New Size(100, 5),
            .Location = location
        }

        Return control
    End Function
    Public Function CreateNewButton(location As Point) As Button
        Dim control As New Button With {
            .Name = $"{PREFIX_BUTTON}_{clsTools.ShortGuid}",
            .Size = New Size(108, 28),
            .Cursor = Cursors.Hand,
            .Location = location
           }

        Return control
    End Function

    ' ----------------------- EXISITING CONTROLS -----------------------

    Public Function CreateExistingTextbox(oControlRow As DataRow, designMode As Boolean) As BaseEdit
        Try
            Dim oHeight = oControlRow.ItemEx("HEIGHT", 0)
            Dim oWidth = oControlRow.ItemEx("WIDTH", 0)
            Dim oReadOnly = oControlRow.ItemEx("READ_ONLY", False)
            Dim oFormatString = oControlRow.ItemEx("FORMAT_STRING", String.Empty)
            Dim oBackColorIf = oControlRow.ItemEx("CTRL_BACKCOLOR_IF", String.Empty)

            Dim oControl As BaseEdit = Nothing

            If oHeight > 27 Then
                oControl = CreateBaseControl(New MemoEdit(), oControlRow, designMode)
            Else
                oControl = CreateBaseControl(New TextEdit(), oControlRow, designMode)
            End If

            Dim oMeta As ControlMetadata = oControl.Tag

            oControl.BackColor = Color.White
            oMeta.BackColor = Color.White

            oControl.Height = oHeight
            oControl.Width = oWidth

            If Not designMode Then
                oControl.ReadOnly = oReadOnly
                oControl.TabStop = Not oReadOnly
                oControl.BackColor = IIf(oReadOnly, Color.LightGray, Color.White)

                ' If there is a format string defined, set it for display only.
                ' Editing will be without format string, according to current user-culture.
                If oFormatString <> String.Empty Then
                    oControl.Properties.DisplayFormat.FormatType = FormatType.Custom
                    oControl.Properties.DisplayFormat.FormatString = ClassFormat.GetFormatString(oFormatString)
                End If

                ' For read only controls, don't show the raw value when a user clicks into it
                If oReadOnly Then
                    oControl.Properties.EditFormat.FormatType = FormatType.Custom
                    oControl.Properties.EditFormat.FormatString = ClassFormat.GetFormatString(oFormatString)
                End If
            Else
                oControl.ReadOnly = True
            End If

            Return oControl
        Catch ex As Exception
            Logger.Error(ex)
            Return Nothing
        End Try
    End Function

    Public Function CreateExistingLabel(row As DataRow, designMode As Boolean) As Label
        Dim control As Label = CreateBaseControl(New Label(), row, designMode)
        Try
            control.Text = row.Item("CTRL_CAPTION_LANG")
        Catch ex As Exception
            Logger.Warn("Label [{0}] does not have a translation!", control.Name)
            control.Text = row.Item("CTRL_TEXT")
        End Try

        control.AutoSize = True

        Return control
    End Function

    Public Function CreateExistingButton(row As DataRow, designMode As Boolean) As Button
        Dim oControl As Button = CreateBaseControl(New Button(), row, designMode)

        Dim ctrl_image As Bitmap = Nothing
        Dim oBitmap As Bitmap
        If Not IsDBNull(row.Item("IMAGE_CONTROL")) Then
            Dim obimg() As Byte = row.Item("IMAGE_CONTROL")
            oBitmap = ByteArrayToBitmap(obimg)
            ctrl_image = oBitmap
        End If

        Try
            oControl.Text = row.Item("CTRL_CAPTION_LANG")
        Catch ex As Exception
            oControl.Text = row.Item("CTRL_TEXT")
        End Try

        oControl.Height = row.Item("HEIGHT")
        oControl.Width = row.Item("WIDTH")

        If Not IsNothing(ctrl_image) And Not IsNothing(oBitmap) Then
            oControl.Image = oBitmap
            oControl.ImageAlign = ContentAlignment.MiddleLeft
            oControl.TextAlign = ContentAlignment.MiddleRight
        End If
        oControl.AutoSize = True

        Return oControl
    End Function
    Public Function CreateExistingCombobox(row As DataRow, designMode As Boolean) As Windows.Forms.ComboBox
        Dim control As Windows.Forms.ComboBox = CreateBaseControl(New Windows.Forms.ComboBox(), row, designMode)

        control.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT"))

        If Not designMode Then
            control.Enabled = Not row.Item("READ_ONLY")
            control.TabStop = Not row.Item("READ_ONLY")
            control.BackColor = IIf(row.Item("READ_ONLY"), Color.LightGray, Color.White)

            control.AutoCompleteMode = AutoCompleteMode.SuggestAppend
            control.AutoCompleteSource = AutoCompleteSource.ListItems
        End If

        Return control
    End Function

    Public Function CreateExistingDatepicker(row As DataRow, designMode As Boolean) As DateTimePicker
        Dim control As DateTimePicker = CreateBaseControl(New DateTimePicker(), row, designMode)

        control.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT"))
        control.Format = DateTimePickerFormat.Short

        If Not designMode Then
            control.Enabled = Not row.Item("READ_ONLY")
            control.TabStop = Not row.Item("READ_ONLY")
        End If

        Return control
    End Function

    Public Function CreateExisingCheckbox(row As DataRow, designMode As Boolean) As CheckBox
        Dim oCheckBox As CheckBox = CreateBaseControl(New CheckBox(), row, designMode)

        oCheckBox.AutoSize = True
        Try
            oCheckBox.Text = row.Item("CTRL_CAPTION_LANG")
        Catch ex As Exception
            oCheckBox.Text = row.Item("CTRL_TEXT")
        End Try
        oCheckBox.CheckState = CheckState.Indeterminate

        If Not designMode Then
            oCheckBox.Enabled = Not row.Item("READ_ONLY")
            oCheckBox.TabStop = Not row.Item("READ_ONLY")
        End If

        Return oCheckBox
    End Function

    Public Function CreateExistingDataGridView(row As DataRow, designMode As Boolean) As DataGridView
        Dim control As DataGridView = CreateBaseControl(New DataGridView(), row, designMode)

        control.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT"))
        control.AllowUserToAddRows = False
        control.AllowUserToDeleteRows = False
        control.AllowUserToResizeColumns = False
        control.AllowUserToResizeRows = False
        control.AlternatingRowsDefaultCellStyle.BackColor = Color.Aqua

        Dim col As New DataGridViewTextBoxColumn
        col.HeaderText = ""
        col.Name = "column1"
        col.Width = control.Width - 30
        control.Columns.Add(col)

        If Not designMode Then
            control.Enabled = Not row.Item("READ_ONLY")
            control.TabStop = Not row.Item("READ_ONLY")
        End If

        Return control
    End Function

    Public Function CreateExistingLookupControl(row As DataRow, designMode As Boolean) As LookupControl3
        Dim control As LookupControl3 = CreateBaseControl(New LookupControl3(), row, designMode)
        control.Properties.Name = control.Name
        control.Width = row.Item("WIDTH")
        control.ReadOnly = row.Item("READ_ONLY")

        If designMode Then
            control.Cursor = Cursors.Hand
        End If

        Return control
    End Function

    Public Function CreateExistingGridControl(row As DataRow, DT_MY_COLUMNS As DataTable, designMode As Boolean) As GridControl
        Dim oGridControlCreator = New ControlCreator.GridControl(LogConfig, GridTables)
        Dim oControl As GridControl = CreateBaseControl(New GridControl(), row, designMode)
        Dim oControlId = DirectCast(oControl.Tag, ControlMetadata).Guid
        Dim oView As GridView

        oControl.ForceInitialize()

        oView = oControl.MainView
        oView.OptionsView.ShowGroupPanel = False
        oControl.ContextMenu = Nothing

        Dim oGridBuilder As New GridBuilder(oView)
        oGridBuilder.WithClipboardHandler()

        If Not designMode Then
            oView.OptionsBehavior.Editable = Not row.Item("READ_ONLY")
            oView.OptionsBehavior.ReadOnly = row.Item("READ_ONLY")
            'oView.OptionsBehavior.EditorShowMode = EditorShowMode.Click

            oControl.UseEmbeddedNavigator = Not row.Item("READ_ONLY")

            oView.OptionsBehavior.EditorShowMode = EditorShowMode.MouseDown

            ' Copy single cell value in CTRL+C instead of whole row
            oView.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CellSelect
            oView.OptionsSelection.MultiSelect = True
            oView.OptionsClipboard.CopyColumnHeaders = DefaultBoolean.False


            If row.Item("VKT_ADD_ITEM") = True Then
                oView.OptionsBehavior.AllowAddRows = DefaultBoolean.True
                oView.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True
                oView.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom
            Else
                oView.OptionsBehavior.AllowAddRows = DefaultBoolean.False
                oView.OptionsBehavior.AllowDeleteRows = DefaultBoolean.False
                oView.OptionsView.NewItemRowPosition = NewItemRowPosition.None
            End If
        End If

        oControl.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT"))

        ' Add and configure navigator to delete rows
        oControl.UseEmbeddedNavigator = True
        With oControl.EmbeddedNavigator.Buttons
            .CancelEdit.Visible = False
            .Edit.Visible = False
            .EndEdit.Visible = False
            .First.Visible = False
            .Last.Visible = False
            .Next.Visible = False
            .NextPage.Visible = False
            .PrevPage.Visible = False
            .Prev.Visible = False

        End With

        If GridColumns.ContainsKey(oControlId) Then
            GridColumns.Item(oControlId) = DT_MY_COLUMNS
        Else
            GridColumns.Add(oControlId, DT_MY_COLUMNS)
        End If

        If GridTables.ContainsKey(oControlId) Then
            GridTables.Item(oControlId).Clear()
        Else
            GridTables.Add(oControlId, New Dictionary(Of String, RepositoryItem)())
        End If

        Dim oDataTable = oGridControlCreator.CreateGridColumns(DT_MY_COLUMNS)
        GridTables = oGridControlCreator.FillGridTables(DT_MY_COLUMNS, oControlId, oControl.Name)
        oView.PopulateColumns(oDatatable)
        oControl.DataSource = oDatatable
        oControl.RefreshDataSource()
        oControl.ForceInitialize()


        If row.Item("TABLE_ORDER_COLUMN") <> String.Empty Then
            Try
                Dim oSortTerm = row.Item("TABLE_ORDER_COLUMN").ToString
                Dim oSortOrder As DevExpress.Data.ColumnSortOrder = DevExpress.Data.ColumnSortOrder.Ascending
                If oSortTerm.Contains(" ASC") Then
                    oSortTerm = oSortTerm.Replace(" ASC", "")
                ElseIf oSortTerm.Contains(" DESC") Then
                    oSortOrder = DevExpress.Data.ColumnSortOrder.Descending
                    oSortTerm = oSortTerm.Replace(" DESC", "")
                End If
                oView.BeginDataUpdate()
                Try
                    oView.ClearSorting()
                    oView.Columns(oSortTerm).SortOrder = oSortOrder
                Finally
                    oView.EndDataUpdate()
                End Try
            Catch ex As Exception

            End Try
        End If

        oGridControlCreator.ConfigureViewColumns(DT_MY_COLUMNS, oView, oControl)
        oGridControlCreator.ConfigureViewEvents(DT_MY_COLUMNS, oView, oControl, oControlId)

        ' 08.11.2021: Fix editor being empty on first open
        oView.FocusInvalidRow()

        Return oControl
    End Function

    Private newRowModified As Boolean = False



    Public Function CreateExistingLine(row As DataRow, designMode As Boolean) As LineLabel
        Dim control As LineLabel = CreateBaseControl(New LineLabel(), row, designMode)
        control.Text = "------------------------------"
        control.BorderStyle = BorderStyle.None
        control.AutoSize = False
        control.BackColor = IntToColor(NotNull(row.Item("FONT_COLOR"), DEFAULT_COLOR))
        control.Size = New Size(row.Item("WIDTH"), row.Item("HEIGHT"))

        Return control
    End Function


    ' ----------------------- CUSTOM LABEL/LINE CLASS ----------------------- 

    Public Class LineLabel
        Inherits Label

        Protected Overrides Sub OnPaint(e As PaintEventArgs)
            'MyBase.OnPaint(e)

            Dim size As New Size(e.ClipRectangle.Width, 2)
            Dim rect As New Rectangle(New Point(0, 0), size)

            'ControlPaint.DrawBorder(e.Graphics, rect, Me.ForeColor, ButtonBorderStyle.Solid)
            e.Graphics.DrawLine(New Pen(ForeColor, 100), New Point(0, 0), New Point(e.ClipRectangle.Width, 2))
        End Sub
    End Class

    Public Function GET_CONTROL_PROPERTIES(DT_CONTROL As DataTable, ControlName As String)
        Try
            CURRENT_CONTROL_ID = 0
            CURR_CON_ID = 0
            CURR_SELECT_CONTROL = ""
            CURR_CHOICE_LIST = ""
            Dim dt As New DataTable
            dt = DT_CONTROL
            '  Define the filter
            Dim filter As String = "NAME = '" & ControlName & "'"
            ' Filter the rows using Select() method of DataTable
            Dim FilteredRows As DataRow() = dt.Select(filter)
            If FilteredRows.Count = 1 Then
                For Each row As DataRow In FilteredRows
                    CURRENT_CONTROL_ID = row("GUID")
                    CURR_CON_ID = IIf(IsDBNull(row("CONNECTION_ID")), 0, row("CONNECTION_ID"))
                    If CURR_CON_ID = 0 Then
                        Logger.Info("CONNECTION NOT DEFINED - CTRL_GUID:" & CURRENT_CONTROL_ID)
                    End If

                    CURR_SELECT_CONTROL = IIf(IsDBNull(row("SQL_UEBERPRUEFUNG")), "", row("SQL_UEBERPRUEFUNG"))
                    CURR_CHOICE_LIST = IIf(IsDBNull(row("CHOICE_LIST")), "", row("CHOICE_LIST"))
                Next
                Return 1
            Else
                Return 0
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Logger.Info("Unexpected Error in GET_CONTROL_PROPERTIES (" & ControlName & "):" & ex.Message)
            Return 0
        End Try

    End Function
    Public Function GET_CONTROL_PROPERTY(DT_CONTROL As DataTable, ControlGUID As Integer, ColNAME As String)
        Try
            CURRENT_CONTROL_ID = 0
            CURR_CON_ID = 0
            CURR_SELECT_CONTROL = ""
            CURR_CHOICE_LIST = ""
            Dim dt As New DataTable
            dt = DT_CONTROL
            '  Define the filter
            Dim filter As String = "GUID = " & ControlGUID
            ' Filter the rows using Select() method of DataTable
            Dim FilteredRows As DataRow() = dt.Select(filter)
            If FilteredRows.Count = 1 Then
                Dim oRESULT = FilteredRows(0).Item(ColNAME)
                If IsDBNull(oRESULT) Then Return Nothing

                Return oRESULT
            Else
                Return Nothing
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Logger.Info("Unexpected Error in GET_CONTROL_PROPERTY (" & ControlGUID & "#" & ColNAME & "):" & ex.Message)
            Return Nothing
        End Try

    End Function

    Public Function GetDependingControls(DT_CONTROLS As DataTable, ControlName As String) As Boolean
        Try
            Dim dt As New DataTable
            dt = DT_CONTROLS
            '  Define the filter
            Dim filter As String = String.Format("SQL_UEBERPRUEFUNG LIKE '%{0}%'", ControlName)
            Dim FilteredRows As DataRow() = dt.Select(filter)
            CURR_DT_DEPENDING_CONTROLS = Nothing
            If FilteredRows.Length > 0 Then
                CURR_DT_DEPENDING_CONTROLS = FilteredRows.CopyToDataTable
            End If

            Return True
        Catch ex As Exception
            Logger.Error(ex)
            Logger.Info("Unexpected Error in GET_DEPENDING_CONTROLS (" & ControlName & "):" & ex.Message)
            Return False
        End Try
    End Function

    Public Function GET_CONNECTION_INFO(CON_ID As Integer) As DataRow()
        Try
            Dim dt As New DataTable
            dt = BASEDATA_DT_TBDD_CONNECTION
            '  Define the filter
            Dim filter As String = "GUID = " & CON_ID
            ' Filter the rows using Select() method of DataTable
            Dim FilteredRows As DataRow() = dt.Select(filter)
            If FilteredRows.Count = 1 Then
                Return FilteredRows
            Else
                Return Nothing
            End If
        Catch ex As Exception
            Logger.Error(ex)
            Logger.Info("Unexpected Error in GET_CONNECTION_INFO (" & CON_ID.ToString & "):" & ex.Message)
            Return Nothing
        End Try
    End Function

    Public Sub GridTables_CacheDatatableForColumn(pControlId As Object, pColumnName As Object, pSqlStatement As Object, pConnectionId As Integer, pAdvancedLookup As Boolean)
        Try
            'Dim oTable As DataTable = ClassDatabase.Return_Datatable_ConId(pSqlStatement, pConnectionId)
            Dim oTable As DataTable = DatabaseFallback.GetDatatable(New GetDatatableOptions(pSqlStatement, DatabaseType.ECM) With {
                .ConnectionId = pConnectionId
            })

            ' If no columns for this control have been added, create an empty dict now
            If Not GridTables.ContainsKey(pControlId) Then
                GridTables.Add(pControlId, New Dictionary(Of String, RepositoryItem))
            End If

            Dim oRepositoryItem = GridTables_GetRepositoryItemForColumn(pColumnName, oTable, pAdvancedLookup)
            Dim oColumnDictionary = GridTables.Item(pControlId)

            If oColumnDictionary.ContainsKey(pColumnName) Then
                oColumnDictionary.Item(pColumnName) = oRepositoryItem
            Else
                oColumnDictionary.Add(pColumnName, oRepositoryItem)
            End If
        Catch ex As Exception
            Logger.Error(ex)
        End Try
    End Sub

    Public Function GridTables_GetRepositoryItemForColumn(pColumnName As String, pDataTable As DataTable, pIsAdvancedLookup As Boolean) As RepositoryItem
        If pIsAdvancedLookup Then

            Dim oEditor = New RepositoryItemLookupControl3

            If pDataTable IsNot Nothing Then
                oEditor.DisplayMember = pDataTable.Columns.Item(0).ColumnName
                oEditor.ValueMember = pDataTable.Columns.Item(0).ColumnName
                oEditor.DataSource = pDataTable
            End If

            Return oEditor
        Else
            Dim oEditor = New RepositoryItemComboBox()
            Dim oItems As New List(Of String)

            AddHandler oEditor.Validating, Sub(_sender As ComboBoxEdit, _e As CancelEventArgs)
                                               If oItems.Contains(_sender.EditValue) Then
                                                   _e.Cancel = False
                                               Else
                                                   _e.Cancel = True
                                               End If

                                           End Sub

            If pDataTable IsNot Nothing Then
                For Each oRow2 As DataRow In pDataTable.Rows
                    Dim oValue = oRow2.Item(0)

                    Try
                        If oRow2.ItemArray.Length > 1 Then
                            oValue &= $" | {oRow2.Item(1)}"
                        End If
                    Catch ex As Exception
                    End Try

                    oEditor.Items.Add(oValue)
                    oItems.Add(oValue)
                Next
            End If

            Return oEditor
        End If
    End Function

    Public Sub GridTables_HandleControlValueChange(pControlPanel As XtraScrollableControl, pColumnsWithSqlAndControlPlaceholders As DataTable)
        If Not IsNothing(pColumnsWithSqlAndControlPlaceholders) AndAlso pColumnsWithSqlAndControlPlaceholders.Rows.Count > 0 Then
            For Each oRow As DataRow In pColumnsWithSqlAndControlPlaceholders.Rows
                Try
                    Dim oSqlStatement = oRow.ItemEx("SQL_COMMAND", String.Empty)
                    Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", -1)
                    Dim oControlId = oRow.Item("CONTROL_ID")
                    Dim oColumnName = oRow.Item("SPALTENNAME")
                    Dim oAdvancedLookup = oRow.Item("ADVANCED_LOOKUP")

                    If oSqlStatement <> String.Empty And oConnectionId > -1 Then
                        oSqlStatement = clsPatterns.ReplaceAllValues(oSqlStatement, pControlPanel, True)

                        GridTables_CacheDatatableForColumn(oControlId, oColumnName, oSqlStatement, oConnectionId, oAdvancedLookup)


                        ' === Block to force setting the editor for GridColumns
                        Logger.Debug("Force-setting Editor for all Gridcells..")
                        For Each oControl As Control In pControlPanel.Controls
                            Try
                                Dim oMeta = DirectCast(oControl.Tag, ClassControlCreator.ControlMetadata)
                                If oMeta.Guid = oControlId AndAlso TypeOf oControl Is GridControl Then
                                    Dim oGrid As GridControl = DirectCast(oControl, GridControl)
                                    DirectCast(oGrid.FocusedView, GridView).FocusInvalidRow()
                                    Logger.Info("Force-setting Editor for Grid [{0}]", oGrid.Name)
                                    Exit For
                                End If
                            Catch ex As Exception
                                Logger.Error(ex)
                            End Try
                        Next
                        ' === End

                    End If
                Catch ex As Exception
                    Logger.Error(ex)
                    Logger.Info("Unexpected Error in Display SQL result for grid column: " & oRow.Item("CONTROL_ID") & " - ERROR: " & ex.Message)
                End Try
            Next
        End If
    End Sub





End Class
