HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/wwwroot/CMSFormControls/Classes/AssemblyClassSelector.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Script.Serialization;

using CMS.FormControls;
using CMS.Helpers;
using CMS.Base;
using CMS.MacroEngine;


public partial class CMSFormControls_Classes_AssemblyClassSelector : FormEngineUserControl, ICallbackEventHandler
{
    #region "Private variables"

    private readonly string customClassString = ResHelper.GetString("general.customclasses");
    private readonly string noneValue = ResHelper.GetString("general.empty");
    private ClassTypeSettings mSettings;
    private bool mAllowEmpty;

    #endregion


    #region "Properties"

    /// <summary>
    /// Gets or sets value for form engine
    /// </summary>
    public override object Value
    {
        get
        {
            // Ensure data
            EnsureData();

            return AssemblyName;
        }
        set
        {
            // Set assembly name
            AssemblyName = ValidationHelper.GetString(value, noneValue);

            LoadOtherValues();
        }
    }


    /// <summary>
    /// Gets a column name for full class name
    /// </summary>
    public string ClassNameColumnName
    {
        get
        {
            return GetValue("ClassNameColumnName", String.Empty);
        }
        set
        {
            SetValue("ClassNameColumnName", value);
        }
    }


    /// <summary>
    /// Gets or sets file system filter for list assemblies.
    /// </summary>
    public string AssembliesFilter
    {
        get
        {
            return GetValue("AssembliesFilter", "");
        }
        set
        {
            SetValue("AssembliesFilter", value);
        }
    }


    /// <summary>
    /// Gets or sets base class names (separated by semi-colon) to filter classes.
    /// </summary>
    public string BaseClassNames
    {
        get
        {
            return GetValue("BaseClassName", String.Empty);
        }
        set
        {
            SetValue("BaseClassName", value);
            Settings.BaseClassNames = value;
        }
    }


    /// <summary>
    /// Gets or sets assembly name value to textbox. If 'custom class' is selected gets/sets App_Code.
    /// </summary>
    public string AssemblyName
    {
        get
        {
            string selectedValue = drpAssemblyName.SelectedValue;
            if (AllowEmpty && (selectedValue == noneValue))
            {
                return String.Empty;
            }

            return GetAssemblyName(selectedValue);
        }
        set
        {
            if (AllowEmpty && String.IsNullOrEmpty(value))
            {
                drpAssemblyName.SelectedValue = noneValue;
            }
            else
            {
                drpAssemblyName.SelectedValue = (value == ClassHelper.ASSEMBLY_APPCODE) ? customClassString : value;
            }
        }
    }


    /// <summary>
    /// Gets or sets full class name value to textbox.
    /// </summary>
    public string ClassName
    {
        get
        {
            return drpClassName.SelectedValue;
        }
        set
        {
            drpClassName.SelectedValue = value;
        }
    }


    /// <summary>
    /// Indicates if classes should be selected.
    /// </summary>
    public bool ShowClasses
    {
        get
        {
            return GetValue("ShowClasses", true);
        }
        set
        {
            SetValue("ShowClasses", value);
            Settings.ShowClasses = value;
        }
    }


    /// <summary>
    /// Indicates if enumerations should be selected.
    /// </summary>
    public bool ShowEnumerations
    {
        get
        {
            return GetValue("ShowEnumerations", false);
        }
        set
        {
            SetValue("ShowEnumerations", value);
            Settings.ShowEnumerations = value;
        }
    }


    /// <summary>
    /// Indicates if interfaces should be selected.
    /// </summary>
    public bool ShowInterfaces
    {
        get
        {
            return GetValue("ShowInterfaces", false);
        }
        set
        {
            SetValue("ShowInterfaces", value);
            Settings.ShowInterfaces = value;
        }
    }


    /// <summary>
    /// If true, the control will try to load the assembly and the class to validate it's availability. If false, this check is not done in Validate method.
    /// </summary>
    public bool ValidateAssembly
    {
        get
        {
            return GetValue("ValidateAssembly", true);
        }
        set
        {
            SetValue("ValidateAssembly", value);
        }
    }


    /// <summary>
    /// Indicates if empty value is allowed. Combines its value with FieldInfo.AllowEmpty
    /// </summary>
    public bool AllowEmpty
    {
        get
        {
            return mAllowEmpty || ((FieldInfo != null) && FieldInfo.AllowEmpty);
        }
        set
        {
            mAllowEmpty = value;
        }
    }


    /// <summary>
    /// Gets error message.
    /// </summary>
    public override string ErrorMessage
    {
        get
        {
            return GetString("AssemblySelector.BadAssemblyOrClass");
        }
    }


    /// <summary>
    /// Gets current class selection settings.
    /// </summary>
    private ClassTypeSettings Settings
    {
        get
        {
            return mSettings ?? (mSettings = new ClassTypeSettings
            {
                BaseClassNames = BaseClassNames,
                ShowClasses = ShowClasses,
                ShowEnumerations = ShowEnumerations,
                ShowInterfaces = ShowInterfaces
            });
        }
    }

    #endregion


    #region "Public methods"

    /// <summary>
    /// Loads the other fields values to the state of the form control
    /// </summary>
    public override void LoadOtherValues()
    {
        string classNameValue = (Form != null) ? ValidationHelper.GetString(Form.Data.GetValue(ClassNameColumnName), String.Empty) : String.Empty;
        ClassName = classNameValue;
    }


    /// <summary>
    /// Returns other values related to this form control.
    /// </summary>
    /// <returns>Returns an array where first dimension is attribute name and the second dimension is its value.</returns>
    public override object[,] GetOtherValues()
    {
        if (!String.IsNullOrEmpty(ClassNameColumnName))
        {
            // Set properties names
            object[,] values = new object[1, 2];
            values[0, 0] = ClassNameColumnName;
            values[0, 1] = drpClassName.SelectedValue;
            return values;
        }
        return null;
    }


    /// <summary>
    /// Checks validity of inputs
    /// </summary>
    public override bool IsValid()
    {
        if (!ValidateAssembly)
        {
            return true;
        }

        // Do not validate if macros are used
        if (MacroProcessor.ContainsMacro(AssemblyName) || MacroProcessor.ContainsMacro(ClassName))
        {
            return true;
        }

        // Check allow empty setting
        if (AllowEmpty && (String.IsNullOrEmpty(AssemblyName) || String.IsNullOrEmpty(ClassName)))
        {
            return true;
        }

        try
        {
            // Check assembly and class
            Type classObject = ClassHelper.GetClassType(AssemblyName, ClassName);
            if (classObject != null)
            {
                // Check base class
                if (String.IsNullOrEmpty(BaseClassNames) || (ClassHelper.IsAllowed(classObject, Settings)))
                {
                    return true;
                }
            }
        }
        catch
        {
        }

        // Set validation error message
        ValidationError = ErrorMessage;

        return false;
    }

    #endregion


    #region "Page events"

    /// <summary>
    /// Page_Load event handler.
    /// </summary>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!StopProcessing && !RequestHelper.IsCallback())
        {
            SetupControl();
        }
    }


    /// <summary>
    /// Render event handler.
    /// </summary>
    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);

        foreach (ListItem item in drpAssemblyName.DropDownList.Items)
        {
            // Get assembly name
            string assemblyName = GetAssemblyName(item.Value);

            // Get classes
            var classes = ClassHelper.GetClasses(assemblyName, Settings);
            if (classes != null)
            {
                foreach (string className in classes)
                {
                    // Register all possible values for event validation
                    Page.ClientScript.RegisterForEventValidation(drpClassName.DropDownList.UniqueID, className);
                }
            }
        }
    }

    #endregion


    #region "Private methods"

    /// <summary>
    /// Gets Assembly name from given value.
    /// </summary>
    /// <param name="value"></param>
    private string GetAssemblyName(string value)
    {
        // Get assembly name
        string assemblyName = value;
        if ((!AllowEmpty && String.IsNullOrEmpty(assemblyName)) || (assemblyName == customClassString))
        {
            assemblyName = ClassHelper.ASSEMBLY_APPCODE;
        }

        return assemblyName;
    }


    /// <summary>
    /// Ensures Assembly selector drop down.
    /// </summary>
    private void EnsureAssemblyData()
    {
        if (drpAssemblyName.DropDownList.Items.Count == 0)
        {
            FillAssemblySelector();
        }
    }


    /// <summary>
    /// Ensures Class selector drop down.
    /// </summary>
    private void EnsureClassData()
    {
        if (drpClassName.DropDownList.Items.Count == 0)
        {
            FillClassNameSelector(AssemblyName);
        }
    }


    /// <summary>
    /// Ensures selector data.
    /// </summary>
    private void EnsureData()
    {
        EnsureAssemblyData();
        EnsureClassData();
    }


    /// <summary>
    /// Setups control.
    /// </summary>
    private void SetupControl()
    {
        EnsureData();
        
        // Register scripts
        ScriptHelper.RegisterJQueryUI(Page);
        StringBuilder sb = new StringBuilder();

        sb.AppendFormat(@"
$cmsj(function() {{
    $cmsj('#{0}_txtCombo').on('autocompleteselect', function(event, ui) {{
        var assemblyName = ui.item.value;
        {1}
    }})

    $cmsj('#{0}_txtCombo').on('autocompletesearch', function(event, ui) {{        
        var assemblyName = $cmsj('#{0}_txtCombo').val();
        {1}
    }})

    function fillClassInput(returnedArrayAsJSON) {{
        var returnedArray = JSON.parse(returnedArrayAsJSON);
        $cmsj('#{2}_txtCombo').val(returnedArray[0]);
        $cmsj('#{2}_txtCombo').autocomplete('option', 'source', returnedArray);
    }}
}});
", drpAssemblyName.ClientID, Page.ClientScript.GetCallbackEventReference(this, "assemblyName", "fillClassInput", null), drpClassName.ClientID);

        ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "acsDelayedLoad" + ClientID, ScriptHelper.GetScript(sb.ToString()));
    }


    /// <summary>
    /// Fills assembly selector with data.
    /// </summary>
    private void FillAssemblySelector()
    {
        if (AllowEmpty)
        {
            drpAssemblyName.DropDownList.Items.Add(noneValue);
        }

        var classes = ClassHelper.GetClasses(ClassHelper.ASSEMBLY_APPCODE, Settings);
        if ((classes != null) && (classes.Count > 0))
        {
            drpAssemblyName.DropDownList.Items.Add(customClassString);
        }

        // Get assembly names filtered by given restriction settings
        var assemblies = ClassHelper.GetAssemblyNames(AssembliesFilter, Settings);

        // Fill assemblies list
        foreach (string assemblyName in assemblies)
        {
            drpAssemblyName.DropDownList.Items.Add(assemblyName);
        }

        // Include macro value if specified
        if (!String.IsNullOrEmpty(AssemblyName) && MacroProcessor.ContainsMacro(AssemblyName))
        {
            drpAssemblyName.DropDownList.Items.Insert(0, AssemblyName);
        }

        // Clear selected value if drop down is empty
        if (drpAssemblyName.DropDownList.Items.Count == 0)
        {
            drpAssemblyName.SelectedValue = String.Empty;
        }
        else
        {
            // Select first item if nothing was selected
            if (drpAssemblyName.SelectedIndex < 0 && String.IsNullOrEmpty(drpAssemblyName.SelectedValue))
            {
                drpAssemblyName.SelectedIndex = 0;
            }
        }
    }


    /// <summary>
    /// Fills class name selector with data.
    /// </summary>
    private void FillClassNameSelector(string assemblyName)
    {
        // Clear items
        drpClassName.DropDownList.Items.Clear();

        if (String.IsNullOrEmpty(assemblyName))
        {
            return;
        }

        if (MacroProcessor.ContainsMacro(assemblyName))
        {
            // Include macro value if specified
            drpClassName.DropDownList.Items.Add(ClassName);
            return;
        }

        var classes = ClassHelper.GetClasses(assemblyName, Settings);

        if (classes != null)
        {
            // Fill drop-down list
            foreach (string className in classes)
            {
                drpClassName.DropDownList.Items.Add(className);
            }

            // Select first item if nothing was selected
            if ((classes.Count > 0) && !AllowEmpty && (drpClassName.SelectedIndex < 0) && String.IsNullOrEmpty(drpClassName.SelectedValue))
            {
                drpClassName.SelectedIndex = 0;
            }
        }
        else
        {
            drpClassName.DropDownList.Items.Add(drpClassName.SelectedValue);
        }
    }

    #endregion


    #region "ICallbackEventHandler"

    public string GetCallbackResult()
    {
        List<string> array = new List<string>();

        foreach (var item in drpClassName.DropDownList.Items)
        {
            array.Add(((ListItem)item).Text);
        }

        return new JavaScriptSerializer().Serialize(array);
    }


    public void RaiseCallbackEvent(string eventArgument)
    {
        string assemblyName = GetAssemblyName(eventArgument);

        FillClassNameSelector(assemblyName);
    }

    #endregion
}