FileRBL.cs

// Copyright � 2007 Jeffrey Bazinet, http://www.vwd-cms.com/
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;

namespace VwdCms
{
    public class FileRBL : RadioButtonList
    {
        private string _extension;
        private string _folder;
        private string _itemCssClass = "listitemwithicon";
        private string _itemCssClassSelected = "listitemwithiconselected";
        private bool _addNoneItem = true;
        private string _imageUrl = VwdCms.Configuration.Utilities.ImageUrl;
        private bool _includeExtensionInFileName = false;
        private bool _filesLoaded = false;

        public FileRBL()
        {
            // default settings
            this.CssClass = "textboxtext";
            this.EnableViewState = true;
            this.AutoPostBack = false;
            this.RepeatColumns = 3;
            this.RepeatDirection = RepeatDirection.Vertical;
            this.BorderStyle = BorderStyle.None;
            this.CellPadding = 1;
            this.CellSpacing = 1;
        }

        protected override void OnLoad(EventArgs e)
        {
            this.RegisterSelectionChangedScript();
            this.SetListItemStyles();
            base.OnLoad(e);
        }

        protected override void OnPreRender(EventArgs e)
        {
            LoadFilesPrivate();

            base.OnPreRender(e);
        }

        public bool AddNoneItem
        {
            get { return _addNoneItem; }
            set { _addNoneItem = value; }
        }

        public bool IncludeExtensionInFileName
        {
            get { return _includeExtensionInFileName; }
            set { _includeExtensionInFileName = value; }
        }

        public string Extension
        {
            get { return _extension; }
            set { _extension = value; }
        }

        // folder is a virtual path
        public string Folder
        {
            get { return _folder; }
            set { _folder = value; }
        }

        public string SelectedFile
        {
            get 
            {
                if (_includeExtensionInFileName)
                {
                    return this.SelectedValue;
                }
                else
                {
                    string file = this.SelectedValue;
                    if (!string.IsNullOrEmpty(file))
                    {
                        if (file.ToLower().EndsWith(this.Extension))
                        {
                            file = file.Remove(file.Length - this.Extension.Length);
                        }
                    }
                    return file;
                }
            }
            set 
            {
                ListItem itm = this.Items.FindByValue(value);
                this.SelectedIndex = this.Items.IndexOf(itm);
                this.SetListItemStyles();
            }
        }

        public string ItemCssClass
        {
            get { return _itemCssClass; }
            set { _itemCssClass = value; }
        }

        public string ItemCssClassSelected
        {
            get { return _itemCssClassSelected; }
            set { _itemCssClassSelected = value; }
        }

        public string ImageUrl
        {
            get { return _imageUrl; }
            set 
            { 
                _imageUrl = value;
                if (!_imageUrl.EndsWith("/"))
                {
                    _imageUrl += "/";
                }
            }
        }

        private void LoadFilesPrivate()
        {
            if (!_filesLoaded)
            {
                LoadFiles();
                SetListItemStyles();
            }
        }

        public void LoadFiles()
        {
            _filesLoaded = true;

            string selectedFile = this.SelectedFile;
            this.Items.Clear();

            string extension = this.Extension;
            string lpFolder = VwdCms.Configuration.Utilities.GetLocalPath(this.Folder);
            DirectoryInfo di = new DirectoryInfo(lpFolder);
            FileInfo[] files = di.GetFiles("*" + extension);
            ListItem itm = null;

            if (this.AddNoneItem)
            {
                itm = new ListItem("None / Default", string.Empty);
                this.Items.Add(itm);
            }

            if (files != null  files.Length  0)
            {
                string displayname = null;
                string filename = null;

                foreach (FileInfo fi in files)
                {
                    filename = fi.Name;
                    displayname = filename;
                    if (displayname.ToLower().EndsWith(".exclude"))
                    {
                        displayname = displayname.Remove(displayname.Length - ".exclude".Length);
                    }
                    displayname = displayname.Remove(displayname.Length - extension.Length);

                    itm = new ListItem(displayname, filename);

                    if (filename == selectedFile)
                    {
                        itm.Selected = true;
                    }
                    this.Items.Add(itm);
                }
                SetListItemStyles();
            }
            if (this.SelectedItem == null)
            {
                if (this.Items.Count  0)
                {
                    this.SelectedIndex = 0;
                }
            }
        }

        private void SetListItemStyles()
        {
            string bgImage = "background-image:url(" 
                + this.ImageUrl 
                + this.Extension.Remove(0, 1) 
                + ".gif);";

            foreach (ListItem itm in this.Items)
            {
                if (itm.Selected)
                {
                    itm.Attributes.Add("class", this.ItemCssClassSelected);
                }
                else
                {
                    itm.Attributes.Add("class", this.ItemCssClass);
                }
                itm.Attributes.Add("style", bgImage);
                itm.Attributes.Add("onclick", this.ClientID + "_SelectionChanged(this);");
            }
        }

        private void RegisterSelectionChangedScript()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("<script type=\"text/javascript\">\r\n");

            sb.Append("function ");
            sb.Append(this.ClientID);
            sb.Append("_SelectionChanged(item)\r\n { \r\n");

            sb.Append("var radio = document.forms[0][item.name];\r\n");
            sb.Append("if ( radio ) \r\n { \r\n");
            sb.Append("for ( var i = 0; i < radio.length; i++ )\r\n { \r\n");

            sb.Append("if ( radio[i].checked ) \r\n { \r\n");

            sb.Append("radio[i].parentElement.className = \"");
            sb.Append(this.ItemCssClassSelected);
            sb.Append("\";\r\n");

            sb.Append("} \r\n else \r\n { \r\n ");

            sb.Append("radio[i].parentElement.className = \"");
            sb.Append(this.ItemCssClass);
            sb.Append("\";\r\n");

            sb.Append("} \r\n ");
            sb.Append("} \r\n ");
            sb.Append("} \r\n ");
            sb.Append("} \r\n ");

            sb.Append("</script> \r\n ");

            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
                this.ClientID + "_SelectionChangedScript", sb.ToString());
        }
    }// end class
} // end namespace