using System; 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 umbraco.DataLayer; using umbraco.BusinessLogic; using umbraco.editorControls; using umbraco.IO; using System.Collections.Generic; using umbraco.cms.businesslogic.datatype; namespace umbraco.editorControls.userControlGrapper { public class usercontrolPrevalueEditor : System.Web.UI.WebControls.PlaceHolder, umbraco.interfaces.IDataPrevalue { public ISqlHelper SqlHelper { get { return Application.SqlHelper; } } #region IDataPrevalue Members // referenced datatype private umbraco.cms.businesslogic.datatype.BaseDataType _datatype; private DropDownList _dropdownlist; private DropDownList _dropdownlistUserControl; private PlaceHolder _phSettings; private Dictionary dtSettings = new Dictionary(); public usercontrolPrevalueEditor(umbraco.cms.businesslogic.datatype.BaseDataType DataType) { // state it knows its datatypedefinitionid _datatype = DataType; setupChildControls(); } private void setupChildControls() { _dropdownlist = new DropDownList(); _dropdownlist.ID = "dbtype"; _dropdownlist.Items.Add(DBTypes.Date.ToString()); _dropdownlist.Items.Add(DBTypes.Integer.ToString()); _dropdownlist.Items.Add(DBTypes.Ntext.ToString()); _dropdownlist.Items.Add(DBTypes.Nvarchar.ToString()); _dropdownlistUserControl = new DropDownList(); _dropdownlistUserControl.ID = "usercontrol"; _phSettings = new PlaceHolder(); _phSettings.ID = "settings"; // put the childcontrols in context - ensuring that // the viewstate is persisted etc. Controls.Add(_dropdownlist); Controls.Add(_dropdownlistUserControl); Controls.Add(_phSettings); // populate the usercontrol dropdown _dropdownlistUserControl.Items.Add(new ListItem(ui.Text("choose"), "")); populateUserControls( IOHelper.MapPath( SystemDirectories.Usercontrols) ); } private void populateUserControls(string path) { DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo uc in di.GetFiles("*.ascx")) { string root = IOHelper.MapPath(SystemDirectories.Root); _dropdownlistUserControl.Items.Add( new ListItem( uc.FullName.Substring(root.Length).Replace(IOHelper.DirSepChar, '/')) /* new ListItem( uc.FullName.Substring( uc.FullName.IndexOf(root), uc.FullName.Length - uc.FullName.IndexOf(root)).Replace(IOHelper.DirSepChar, '/')) */ ); } foreach (DirectoryInfo dir in di.GetDirectories()) populateUserControls(dir.FullName); } public Control Editor { get { return this; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!Page.IsPostBack) { string config = Configuration; if (config != "") { _dropdownlistUserControl.SelectedValue = config; } _dropdownlist.SelectedValue = _datatype.DBType.ToString(); } //check for settings if (!string.IsNullOrEmpty(Configuration)) LoadSetttings(Configuration); } private Dictionary GetSettings(Type t) { Dictionary settings = new Dictionary(); foreach (System.Reflection.PropertyInfo p in t.GetProperties()) { object[] o = p.GetCustomAttributes(typeof(DataEditorSetting), true); if (o.Length > 0) settings.Add(p.Name, (DataEditorSetting)o[0]); } return settings; } private bool HasSettings(Type t) { bool hasSettings = false; foreach (System.Reflection.PropertyInfo p in t.GetProperties()) { object[] o = p.GetCustomAttributes(typeof(DataEditorSetting), true); if (o.Length > 0) { hasSettings = true; break; } } return hasSettings; } private void LoadSetttings(string fileName) { if (System.IO.File.Exists(IOHelper.MapPath("~/" + fileName))) { UserControl oControl = (UserControl)this.Page.LoadControl(@"~/" + fileName); Type type = oControl.GetType(); Dictionary settings = GetSettings(type); foreach (KeyValuePair kv in settings) { DataEditorSettingType dst = kv.Value.GetDataEditorSettingType(); dtSettings.Add(kv.Key, dst); DataEditorPropertyPanel panel = new DataEditorPropertyPanel(); panel.Text = kv.Value.GetName(); panel.Text += "
" + kv.Value.description + ""; if (HasSettings(type)) { DataEditorSettingsStorage ss = new DataEditorSettingsStorage(); List> s = ss.GetSettings(_datatype.DataTypeDefinitionId); ss.Dispose(); if (s.Find(set => set.Key == kv.Key).Value != null) dst.Value = s.Find(set => set.Key == kv.Key).Value; } panel.Controls.Add(dst.RenderControl(kv.Value)); _phSettings.Controls.Add(panel); } } } public void Save() { _datatype.DBType = (umbraco.cms.businesslogic.datatype.DBTypes)Enum.Parse(typeof(umbraco.cms.businesslogic.datatype.DBTypes), _dropdownlist.SelectedValue, true); // Generate data-string string data = _dropdownlistUserControl.SelectedValue; // If the add new prevalue textbox is filled out - add the value to the collection. IParameter[] SqlParams = new IParameter[] { SqlHelper.CreateParameter("@value",data), SqlHelper.CreateParameter("@dtdefid",_datatype.DataTypeDefinitionId)}; SqlHelper.ExecuteNonQuery("delete from cmsDataTypePreValues where datatypenodeid = @dtdefid", SqlParams); SqlHelper.ExecuteNonQuery("insert into cmsDataTypePreValues (datatypenodeid,[value],sortorder,alias) values (@dtdefid,@value,0,'')", SqlParams); //settings DataEditorSettingsStorage ss = new DataEditorSettingsStorage(); //ss.ClearSettings(_datatype.DataTypeDefinitionId); int i = 0; foreach (KeyValuePair k in dtSettings) { ss.InsertSetting(_datatype.DataTypeDefinitionId, k.Key, k.Value.Value, i); i++; } ss.Dispose(); if (dtSettings.Count == 0) { if (!string.IsNullOrEmpty(Configuration)) LoadSetttings(Configuration); } } protected override void Render(HtmlTextWriter writer) { writer.WriteLine("
"); writer.WriteLine("
Database datatype
"); writer.WriteLine("
"); _dropdownlist.RenderControl(writer); writer.Write("
"); writer.WriteLine("
"); writer.WriteLine("
Usercontrol:
"); writer.WriteLine("
"); _dropdownlistUserControl.RenderControl(writer); writer.Write("
"); _phSettings.RenderControl(writer); } public string Configuration { get { object conf = SqlHelper.ExecuteScalar("select value from cmsDataTypePreValues where datatypenodeid = @datatypenodeid", SqlHelper.CreateParameter("@datatypenodeid", _datatype.DataTypeDefinitionId)); if (conf != null) return conf.ToString(); else return ""; } } #endregion } }