using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.FormControls; using CMS.GlobalHelper; using CMS.IO; using CMS.PortalEngine; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; using CMS.VirtualPathHelper; public partial class CMSFormControls_Layouts_TransformationCode : FormEngineUserControl, IPostBackEventHandler { #region "Variables" int transformationID = QueryHelper.GetInteger("transformationid", 0); TransformationInfo ti = null; CurrentUserInfo user; #endregion #region "Properties" /// /// Value of code control. /// public override object Value { get { return TransformationCode; } set { if (TransformationType == TransformationTypeEnum.Html) { tbWysiwyg.ResolvedValue = ValidationHelper.GetString(value, String.Empty); } else { txtCode.Text = ValidationHelper.GetString(value, String.Empty); } } } /// /// Name of the edited transformation /// public String TransformationName { get; set; } /// /// Transformation's class name /// public String ClassName { get; set; } /// /// Transformation's class ID /// public int ClassID { get; set; } /// /// Property returning transformation code (based on transformation type) /// public String TransformationCode { get { return (txtCode.Visible) ? txtCode.Text : tbWysiwyg.ResolvedValue; } } /// /// Returns true, if transformation type is ASCX /// public bool IsAscx { get { return (TransformationType == TransformationTypeEnum.Ascx); } } /// /// Returns transformation type /// public TransformationTypeEnum TransformationType { get { return TransformationInfoProvider.GetTransformationTypeEnum(drpType.SelectedValue.ToLowerCSafe()); } } /// /// Determines whether the code is in the fullscreen mode. /// public bool FullscreenMode { get; set; } /// /// Returns true if object is checked out or use checkin/out is not used /// public bool IsChecked { get { CMSObjectManager om = ControlsHelper.GetChildControl(Page, typeof(CMSObjectManager)) as CMSObjectManager; if (om != null) { return om.IsObjectChecked(); } return false; } } #endregion #region "Methods" /// /// Returns additional object data /// public override object[,] GetOtherValues() { object[,] values = new object[3, 2]; values[0, 0] = "TransformationCode"; values[0, 1] = TransformationCode; values[1, 0] = "TransformationType"; String type = (drpType.SelectedValue == null ? TransformationTypeEnum.Ascx.ToString() : drpType.SelectedValue.ToLowerCSafe()); // For users not authorized to change ascx, do not allow to change transf. type if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.design", "editcode")) { TransformationInfo ti = CMSContext.EditedObject as TransformationInfo; if ((ti != null) && (type == "ascx")) { type = ti.TransformationType.ToString(); } } values[1, 1] = type; values[2, 0] = "TransformationCSS"; values[2, 1] = txtCSS.Text; return values; } /// /// Checks whether XSLT transformation text is valid. /// /// XML text protected string XMLValidator(string xmlText) { // Creates memory stream from transformation text Stream stream = MemoryStream.New(); StreamWriter writer = StreamWriter.New(stream); writer.Write(xmlText); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); // New xml text reader from the stream XmlTextReader tr = new XmlTextReader(stream.SystemStream); try { // Need to read the data to validate while (tr.Read()) { ; } } catch (Exception ex) { return ex.Message; } return string.Empty; } /// /// Initializes labels. /// private void LabelsInit() { // Initializes labels string lang = DataHelper.GetNotEmpty(SettingsHelper.AppSettings["CMSProgrammingLanguage"], "C#"); lblDirectives.Text = string.Concat("<%@ Control Language=\"", lang, "\" AutoEventWireup=\"true\" Inherits=\"CMS.Controls.CMSAbstractTransformation\" %>
<%@ Register TagPrefix=\"cc1\" Namespace=\"CMS.Controls\" Assembly=\"CMS.Controls\" %>"); } /// /// Returns true, if all entered values are valid /// public override bool IsValid() { String result = String.Empty; if (TransformationType == TransformationTypeEnum.Xslt) { // Validates XSLT transformation text result = XMLValidator(txtCode.Text); if (result != String.Empty) { ShowError(String.Format("{0}'{1}'", GetString("DocumentType_Edit_Transformation_Edit.XSLTTransformationError"), result)); return false; } } return true; } protected override void OnPreRender(EventArgs e) { string script = @" function GenerateDefaultCode(type){ " + ControlsHelper.GetPostBackEventReference(this, "#").Replace("'#'", "type") + @" }"; ScriptHelper.RegisterStartupScript(this, typeof(string), "TransformationCodeGenerate", ScriptHelper.GetScript(script)); // Init transformation help link lnkHelp.NavigateUrl = helpElem.DocumentationUrl + "newedit_transformation_methods.htm"; lnkHelp.Target = "_target"; lnkHelp.Text = GetString("documenttype_edit_transformation.help"); // Init transformation help icon helpElem.HelpName = "helpTopic"; helpElem.TopicName = "newedit_transformation_methods"; helpElem.Tooltip = GetString("documenttype_edit_transformation.help"); pnlDirectives.Visible = IsAscx; txtCode.ReadOnly = !Enabled; tbWysiwyg.Enabled = Enabled; lblDirectives.Visible = IsAscx; // Check whether virtual objects are allowed if (!VirtualPathHelper.VirtualObjectsAllowed) { ShowWarning(GetString("VirtualPathProvider.NotRunning"), null, null); } base.OnPreRender(e); } protected override void OnInit(EventArgs e) { base.OnInit(e); ti = CMSContext.EditedObject as TransformationInfo; user = CMSContext.CurrentUser; if (!RequestHelper.IsPostBack()) { DropDownListInit(); if (ti != null) { // Fills form with transformation information drpType.SelectedValue = ti.TransformationType.ToString(); txtCSS.Text = ti.TransformationCSS; if (ti.TransformationType == TransformationTypeEnum.Html) { tbWysiwyg.ResolvedValue = ti.TransformationCode; tbWysiwyg.Visible = true; } else { txtCode.Text = ti.TransformationCode; txtCode.Visible = true; } } else { txtCode.Visible = true; } } } protected void Page_Load(object sender, EventArgs e) { CMSMasterPage currentMaster = Page.Master as CMSMasterPage; if (FullscreenMode) { txtCode.TopOffset = 40; } // Check master page if (currentMaster == null) { throw new Exception("Page using this control must have CMSMasterPage master page."); } LabelsInit(); // Set correct help topic for custom tables if (!string.IsNullOrEmpty(ClassName)) { DataClassInfo classInfo = DataClassInfoProvider.GetDataClass(ClassName); if ((classInfo != null) && classInfo.ClassIsCustomTable) { currentMaster.Title.HelpTopicName = "customtable_edit_newedit_transformation"; } } txtCode.Editor.Width = new Unit("99%"); txtCode.Editor.Height = new Unit("300px"); txtCode.NamespaceUsings = new List { "Transformation" }; DataClassInfo resolverClassInfo = DataClassInfoProvider.GetDataClass(ClassID); if (resolverClassInfo != null) { if (resolverClassInfo.ClassIsCustomTable) { if (IsAscx) { txtCode.ASCXRootObject = CustomTableItem.New(resolverClassInfo.ClassName); } } else { CMS.DocumentEngine.TreeNode node = CMS.DocumentEngine.TreeNode.New(resolverClassInfo.ClassName); ContextResolver resolver = ContextResolver.GetInstance(); if (IsAscx) { txtCode.ASCXRootObject = node; // Prioritize doc. types fields foreach (string prop in node.Generalized.PrioritizedProperties) { resolver.PrioritizeProperty(prop); } } else { // Prioritize doc. types fields foreach (string prop in node.Generalized.Properties) { if (node.Generalized.PrioritizedProperties.Contains(prop)) { resolver.PrioritizeProperty(prop); } else { resolver.SetNamedSourceData(prop, "", false); } } } txtCode.Resolver = resolver; } } if (IsAscx) { if (!RequestHelper.IsPostBack() && IsChecked) { ShowMessage(); } } txtCode.Resolver.SetNamedSourceData("DataItemCount", ""); txtCode.Resolver.SetNamedSourceData("DataItemIndex", ""); txtCode.Resolver.SetNamedSourceData("DisplayIndex", ""); // Hide/Display CSS section plcCssLink.Visible = String.IsNullOrEmpty(txtCSS.Text.Trim()); SetEditor(); } public void GenerateDefaultTransformation(DefaultTransformationTypeEnum transformCode) { if (String.IsNullOrEmpty(ClassName)) { ClassName = DataClassInfoProvider.GetClassName(ClassID); } // Gets Xml schema of the document type DataClassInfo dci = DataClassInfoProvider.GetDataClass(ClassName); string formDef = string.Empty; if (dci != null) { formDef = dci.ClassFormDefinition; } // Gets transformation type TransformationTypeEnum transformType = TransformationInfoProvider.GetTransformationTypeEnum(drpType.SelectedValue); // Writes the result to the text box if (transformType == TransformationTypeEnum.Html) { txtCode.Visible = false; tbWysiwyg.Visible = true; tbWysiwyg.ResolvedValue = TransformationInfoProvider.GenerateTransformationCode(formDef, transformType, ClassName, transformCode); } else { tbWysiwyg.Visible = false; txtCode.Visible = true; txtCode.Text = TransformationInfoProvider.GenerateTransformationCode(formDef, transformType, ClassName, transformCode); } } /// /// Sets code editor based on transformation type /// private void SetEditor() { if (IsAscx) { txtCode.Editor.Language = LanguageEnum.ASPNET; // Check the edit code permission if (!user.IsAuthorizedPerResource("CMS.Design", "EditCode")) { txtCode.Editor.Enabled = false; lblDirectives.Visible = false; } } else { txtCode.Editor.Enabled = true; txtCode.Editor.Language = LanguageEnum.HTMLMixed; } } /// /// Display info message /// public void ShowMessage() { if (IsAscx) { // Check the edit code permission if (!user.IsAuthorizedPerResource("CMS.Design", "EditCode")) { ShowWarning(GetString("EditCode.NotAllowed"), null, null); } } } protected void drpTransformationType_SelectedIndexChanged(object sender, EventArgs e) { // Get the current code string code = TransformationCode; switch (drpType.SelectedValue.ToLowerCSafe()) { case "ascx": // Convert to ASCX syntax if (CMSString.Equals(drpType.SelectedValue, "ascx", true)) { code = MacroResolver.RemoveSecurityParameters(code, false, null); code = code.Replace("{% Register", "<%@ Register").Replace("{%", "<%#").Replace("%}", "%>"); } ShowMessage(); break; case "xslt": // No transformation break; default: // Convert to macro syntax code = code.Replace("<%@", "{%").Replace("<%#", "{%").Replace("<%=", "{%").Replace("<%", "{%").Replace("%>", "%}"); break; } // Move the content if necessary if (CMSString.Equals(drpType.SelectedValue, "html", true)) { // Move from text to WYSIWYG if (txtCode.Visible) { tbWysiwyg.ResolvedValue = code; tbWysiwyg.Visible = true; txtCode.Text = string.Empty; txtCode.Visible = false; } } else { // Move from WYSIWYG to text if (tbWysiwyg.Visible) { code = HttpUtility.HtmlDecode(code); txtCode.Text = code; txtCode.Visible = true; tbWysiwyg.ResolvedValue = string.Empty; tbWysiwyg.Visible = false; } else { txtCode.Text = code; } } SetEditor(); } /// /// Initializes dropdown lists. /// private void DropDownListInit() { // Initialize if ((transformationID > 0) || !String.IsNullOrEmpty(TransformationName) || user.IsAuthorizedPerResource("CMS.Design", "EditCode")) { drpType.Items.Add(new ListItem(GetString("TransformationType.Ascx"), TransformationTypeEnum.Ascx.ToString())); } drpType.Items.Add(new ListItem(GetString("TransformationType.Text"), TransformationTypeEnum.Text.ToString())); drpType.Items.Add(new ListItem(GetString("TransformationType.Html"), TransformationTypeEnum.Html.ToString())); drpType.Items.Add(new ListItem(GetString("TransformationType.Xslt"), TransformationTypeEnum.Xslt.ToString())); drpType.Items.Add(new ListItem(GetString("TransformationType.jQuery"), TransformationTypeEnum.jQuery.ToString())); } #endregion #region "IPostBackEventHandler members" /// /// Process postback action /// void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { switch (eventArgument.ToLowerCSafe()) { case "xml": GenerateDefaultTransformation(DefaultTransformationTypeEnum.XML); break; case "atom": GenerateDefaultTransformation(DefaultTransformationTypeEnum.Atom); break; case "rss": GenerateDefaultTransformation(DefaultTransformationTypeEnum.RSS); break; default: GenerateDefaultTransformation(DefaultTransformationTypeEnum.Default); break; } } #endregion }