using System; using System.Text; using System.Web.UI.WebControls; using System.Xml; using CMS.CMSHelper; using CMS.DocumentEngine; using CMS.ExtendedControls; using CMS.ExtendedControls.ActionsConfig; using CMS.FormControls; using CMS.GlobalHelper; using CMS.IO; using CMS.PortalEngine; using CMS.SettingsProvider; using CMS.UIControls; using CMS.VirtualPathHelper; public partial class CMSModules_PortalEngine_Controls_Layout_General : CMSPreviewControl { #region "Variables" protected string aliasPath = QueryHelper.GetString("aliaspath", ""); protected string webpartId = QueryHelper.GetString("webpartid", ""); protected string zoneId = QueryHelper.GetString("zoneid", ""); protected Guid instanceGuid = QueryHelper.GetGuid("instanceguid", Guid.Empty); protected int templateId = QueryHelper.GetInteger("templateid", 0); protected bool isNewVariant = QueryHelper.GetBoolean("isnewvariant", false); protected int variantId = QueryHelper.GetInteger("variantid", 0); protected int zoneVariantId = QueryHelper.GetInteger("zonevariantid", 0); protected string culture = QueryHelper.GetString("culture", CMSContext.PreferredCultureCode); protected VariantModeEnum variantMode = VariantModeFunctions.GetVariantModeEnum(QueryHelper.GetString("variantmode", string.Empty)); protected bool isSiteManager = false; bool isNew = false; bool isDefault = false; protected bool startWithFullScreen = true; CurrentUserInfo currentUser = null; private WebPartInfo webPartInfo = null; /// /// Current page info. /// private PageInfo pi = null; /// /// Page template info. /// private PageTemplateInfo pti = null; WebPartLayoutInfo wpli = null; WebPartInfo wpi = null; /// /// Current web part. /// private WebPartInstance webPart = null; private string mLayoutCodeName = null; int previewState = 0; int layoutID = 0; #endregion #region "Properties" /// /// Gets code name of edited layout. /// private string LayoutCodeName { get { return mLayoutCodeName ?? (mLayoutCodeName = QueryHelper.GetString("layoutcodename", string.Empty)); } set { mLayoutCodeName = value; } } /// /// Returns true if object is checked out or 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; } } /// /// Messages placeholder /// public override MessagesPlaceHolder MessagesPlaceHolder { get { return editMenuElem.MessagesPlaceHolder; } } #endregion #region "Methods" /// /// OnLoad override, setup access denied page with dependence on current usage. /// protected override void OnLoad(EventArgs e) { if (ShowPreview) { previewState = GetPreviewStateFromCookies(WEBPARTLAYOUT); } if (!RequestHelper.IsPostBack() && IsChecked) { ShowMessage(); } if (previewState != 0) { etaCode.TopOffset = 40; } // Add preview action if (!isNew) { HeaderAction preview = new HeaderAction() { ControlType = HeaderActionTypeEnum.LinkButton, Text = GetString("general.preview"), OnClientClick = "performToolbarAction('split');return false;", ImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/Preview.png"), SmallImageUrl = GetImageUrl("CMSModules/CMS_Content/EditMenu/16/Preview.png"), Visible = (previewState == 0), Tooltip = GetString("preview.tooltip") }; editMenuElem.ObjectEditMenu.AddExtraAction(preview); } editMenuElem.ObjectEditMenu.PreviewMode = true; editMenuElem.MenuPanel.CssClass = "PreviewMenu"; editMenuElem.ObjectManager.OnBeforeAction += ObjectManager_OnBeforeAction; editMenuElem.ObjectManager.OnAfterAction += ObjectManager_OnAfterAction; editMenuElem.ObjectManager.OnSaveData += ObjectManager_OnSaveData; if (!currentUser.IsAuthorizedPerResource("CMS.Design", "EditCode")) { editMenuElem.MessagesPlaceHolder.WrapperControlClientID = pnlBody.ClientID; etaCode.Editor.ReadOnly = true; } base.OnLoad(e); } /// /// Init event handler. /// protected override void OnInit(EventArgs e) { // Do not check changes DocumentManager.RegisterSaveChangesScript = false; EditForm.OnBeforeSave += EditForm_OnBeforeSave; etaCode.Editor.Language = LanguageEnum.HTML; etaCSS.Editor.Language = LanguageEnum.CSS; wpli = CMSContext.EditedObject as WebPartLayoutInfo; layoutID = QueryHelper.GetInteger("layoutid", 0); isSiteManager = ((CMSContext.CurrentUser.IsGlobalAdministrator && layoutID != 0) || QueryHelper.GetBoolean("sitemanager", false)); isNew = (LayoutCodeName == "|new|"); isDefault = (LayoutCodeName == "|default|") || (!isSiteManager && string.IsNullOrEmpty(LayoutCodeName)); if ((wpli == null) && isSiteManager) { isNew = true; } if (wpli == null) { editMenuElem.ObjectManager.ObjectType = PredefinedObjectType.WEBPARTLAYOUT; } ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "PreviewHierarchyPerformAction", ScriptHelper.GetScript("function actionPerformed(action) { if (action == 'saveandclose') { document.getElementById('" + hdnClose.ClientID + "').value = '1'; } " + editMenuElem.ObjectManager.GetJSFunction(ComponentEvents.SAVE, null, null) + "; }")); RegisterResizeHeaders(); currentUser = CMSContext.CurrentUser; // Get webpart instance (if edited in CMSDesk) if ((webpartId != "") && !isSiteManager) { // Get pageinfo pi = CMSWebPartPropertiesPage.GetPageInfo(aliasPath, templateId, culture); if (pi == null) { ShowInformation(GetString("WebPartProperties.WebPartNotFound"), null, false); } // Get page template pti = pi.UsedPageTemplateInfo; if ((pti != null) && ((pti.TemplateInstance != null))) { webPart = pti.TemplateInstance.GetWebPart(instanceGuid, zoneVariantId, variantId) ?? pti.GetWebPart(webpartId); } } // If the web part is not found, try webpart ID if (webPart == null) { // Site manager wpi = WebPartInfoProvider.GetWebPartInfo(ValidationHelper.GetInteger(webpartId, 0)); if (wpi == null) { ShowError(GetString("WebPartProperties.WebPartNotFound"), null, null); startWithFullScreen = false; return; } } else { // CMS desk wpi = WebPartInfoProvider.GetWebPartInfo(webPart.WebPartType); if (string.IsNullOrEmpty(LayoutCodeName)) { // Get the current layout name LayoutCodeName = ValidationHelper.GetString(webPart.GetValue("WebPartLayout"), ""); } } if (wpi != null) { if (CMSObjectHelper.UseCheckinCheckout && (!isNew || isSiteManager)) { pnlFormArea.CssClass = "PreviewDefaultContentLarge"; } else { pnlFormArea.CssClass = "PreviewDefaultContent"; } // Load the web part information webPartInfo = wpi; bool loaded = false; if (!RequestHelper.IsPostBack()) { if (wpli != null) { editMenuElem.MenuPanel.Visible = true; // Read-only code text area etaCode.Editor.ReadOnly = false; loaded = true; } if (!loaded) { string fileName = webPartInfo.WebPartFileName; if (webPartInfo.WebPartParentID > 0) { WebPartInfo pwpi = WebPartInfoProvider.GetWebPartInfo(webPartInfo.WebPartParentID); if (pwpi != null) { fileName = pwpi.WebPartFileName; } } if (!fileName.StartsWithCSafe("~")) { fileName = "~/CMSWebparts/" + fileName; } // Check if filename exist if (!FileHelper.FileExists(fileName)) { ShowError(GetString("WebPartProperties.FileNotExist"), null, null); plcContent.Visible = false; } else { // Load default web part layout code etaCode.Text = File.ReadAllText(Server.MapPath(fileName)); // Load default web part CSS etaCSS.Text = wpi.WebPartCSS; startWithFullScreen = false; } } } } if ((wpli == null) && isSiteManager) { pnlFormArea.CssClass += " NewPreviewContent"; var breadcrumbs = new string[2, 3]; breadcrumbs[0, 0] = GetString("WebParts.Layout"); breadcrumbs[0, 1] = ResolveUrl("~/CMSModules/PortalEngine/UI/WebParts/Development/WebPart_Edit_Layout.aspx?webpartid=" + QueryHelper.GetInteger("webpartid", 0)); breadcrumbs[1, 0] = GetString("webparts_layout_newlayout"); editMenuElem.PageTitleBreadcrumbs = breadcrumbs; } ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ApplyButton", ScriptHelper.GetScript( "function SetRefresh(refreshpage) { document.getElementById('" + hidRefresh.ClientID + @"').value = refreshpage; } function OnApplyButton(refreshpage) { SetRefresh(refreshpage); actionPerformed('save');refreshPreview(); } function OnOKButton(refreshpage) { SetRefresh(refreshpage); actionPerformed('saveandclose'); } ")); InitLayoutForm(); plcCssLink.Visible = string.IsNullOrEmpty(etaCSS.Text.Trim()); base.OnInit(e); } /// /// Display info message /// public void ShowMessage() { // Check the edit code permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Design", "EditCode")) { ShowWarning(GetString("EditCode.NotAllowed"), null, null); } } /// /// Handles the OnBeforeAction event of the ObjectManager control. /// protected void ObjectManager_OnBeforeAction(object sender, SimpleObjectManagerEventArgs e) { switch (e.ActionName) { case ComponentEvents.SAVE: if ((webPart != null) && isDefault) { if (!isSiteManager) { SetCurrentLayout(true); // Reload the parent page after save EnsureParentPageRefresh(); if (ValidationHelper.GetBoolean(hdnClose.Value, false)) { // If window to close, register close script CloseDialog(); } else { ShowChangesSaved(); } } // Do not save default layout e.IsValid = false; } break; case ComponentEvents.CHECKOUT: ShowMessage(); break; } } /// /// Handles the OnAfterAction event of the ObjectManager control. /// protected void ObjectManager_OnAfterAction(object sender, SimpleObjectManagerEventArgs e) { wpli = EditForm.EditedObject as WebPartLayoutInfo; if (wpli != null) { LayoutCodeName = wpli.WebPartLayoutCodeName; } if (e.ActionName == ComponentEvents.SAVE) { if (EditForm.ValidateData()) { if (!isSiteManager) { SetCurrentLayout(true); } if (ValidationHelper.GetBoolean(hdnClose.Value, false)) { // If window to close, register close script CloseDialog(); } else { // Redirect parent for new if (isNew) { if (isSiteManager) { URLHelper.Redirect("WebPart_Edit_Layout_Frameset.aspx?layoutID=" + wpli.WebPartLayoutID + "&webpartID=" + webPartInfo.WebPartID); } else { var codeName = (wpli != null) ? wpli.WebPartLayoutCodeName : string.Empty; var redirectUrl = ResolveUrl("~/CMSModules/PortalEngine/UI/WebParts/WebPartProperties_layout_frameset.aspx") + URLHelper.UpdateParameterInUrl(URLHelper.Url.Query, "layoutcodename", codeName); ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "RefreshHeader", ScriptHelper.GetScript("parent.location ='" + redirectUrl + "'")); } } else { if (!isSiteManager) { // Reload the parent page after save EnsureParentPageRefresh(); } // If all ok show changes saved ShowChangesSaved(); RegisterRefreshScript(); } } } // Clear warning text editMenuElem.MessagesPlaceHolder.WarningText = ""; } if (DialogMode) { switch (e.ActionName) { case ComponentEvents.SAVE: case ComponentEvents.CHECKOUT: case ComponentEvents.UNDO_CHECKOUT: case ComponentEvents.CHECKIN: ScriptHelper.RegisterStartupScript(Page, typeof(string), "wopenerRefresh", ScriptHelper.GetScript("if (wopener && wopener.refresh) { wopener.refresh(); }")); break; } } if (isSiteManager && (e.ActionName != ComponentEvents.CHECKOUT)) { ScriptHelper.RefreshTabHeader(Page, null); } } /// /// Handles the OnBeforeSave event of the EditForm control. /// protected void EditForm_OnBeforeSave(object sender, EventArgs e) { // Remove "." due to virtual path provider replacement txtCodeName.Text = txtCodeName.Text.Replace(".", ""); WebPartLayoutInfo li = EditForm.EditedObject as WebPartLayoutInfo; if (li != null) { if (!currentUser.IsAuthorizedPerResource("CMS.Design", "EditCode")) { li.WebPartLayoutCode = GetDefaultCode(); } if (webPartInfo != null) { li.WebPartLayoutWebPartID = webPartInfo.WebPartID; } } } /// /// Handles the OnSaveData event of the ObjectManager control. /// protected void ObjectManager_OnSaveData(object sender, SimpleObjectManagerEventArgs e) { try { ComponentEvents.RequestEvents.RaiseComponentEvent(this, e, ComponentName, DocumentComponentEvents.SAVE_DATA, e.ActionName); } catch (WebPartLayoutException ex) { ShowError(ex.Message); } } /// /// PreRender event handler. /// protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); startWithFullScreen = ((previewState != 0) && editMenuElem.ObjectManager.IsObjectChecked()); // Wrong calculation for these browsers, when div is hidden. bool hide = (BrowserHelper.IsSafari() || BrowserHelper.IsChrome()); pnlBody.Attributes["style"] = (startWithFullScreen && !hide) ? "display:none" : "display:block"; // Check whether virtual objects are allowed if (!VirtualPathHelper.VirtualObjectsAllowed) { ShowWarning(GetString("VirtualPathProvider.NotRunning"), null, null); } RegisterInitScripts(pnlBody.ClientID, editMenuElem.MenuPanel.ClientID, startWithFullScreen); } /// /// Selected index changed. /// private void InitLayoutForm() { if (wpli == null) { if (!RequestHelper.IsPostBack()) { // Prefill with default layout etaCode.Text = GetDefaultCode(); } if ((LayoutCodeName == "|new|") || isSiteManager) { // New layout plcDescription.Visible = true; plcValues.Visible = true; etaCode.Editor.ReadOnly = false; etaCSS.Editor.ReadOnly = false; etaCode.Editor.Height = Unit.Pixel(200); editMenuElem.MenuPanel.Visible = true; lnkStyles.Visible = true; if (!RequestHelper.IsPostBack()) { etaCSS.Text = webPartInfo.WebPartCSS; } } else { // Default layout etaCode.Editor.ReadOnly = true; etaCSS.Editor.ReadOnly = true; lnkStyles.Visible = false; editMenuElem.MenuPanel.Visible = false; pnlFormArea.Attributes["style"] = ""; // Tell parent preview hierarchy control to hide preview ShowPreview = false; previewState = 0; pnlFormArea.CssClass = ""; etaCode.Editor.Height = Unit.Pixel(300); } } else { etaCode.Editor.Height = Unit.Pixel(300); plcDescription.Visible = true; plcValues.Visible = (layoutID != 0); etaCode.Editor.ReadOnly = false; editMenuElem.MenuPanel.Visible = true; if (wpli != null) { etaCSS.Editor.ReadOnly = false; } } // Ensure that hidden fields are truly hidden and not validated foreach (var field in EditForm.Fields) { var formControl = EditForm.FieldControls[field]; if (!formControl.Visible) { EditForm.FieldsToHide.Add(field); } } } /// /// Gets the default layout code for the web part /// protected string GetDefaultCode() { string fileName = webPartInfo.WebPartFileName; if (webPartInfo.WebPartParentID > 0) { WebPartInfo pwpi = WebPartInfoProvider.GetWebPartInfo(webPartInfo.WebPartParentID); if (pwpi != null) { fileName = pwpi.WebPartFileName; } } if (!fileName.StartsWithCSafe("~")) { fileName = "~/CMSWebparts/" + fileName; } string fileFullPath = Server.MapPath(fileName); if (File.Exists(fileFullPath)) { return File.ReadAllText(fileFullPath); } return null; } /// /// Sets current layout. /// protected void SetCurrentLayout(bool saveToWebPartInstance) { if ((webPart != null) && (LayoutCodeName != "|new|")) { if (saveToWebPartInstance) { if (LayoutCodeName == "|default|") { webPart.SetValue("WebPartLayout", ""); } else { webPart.SetValue("WebPartLayout", LayoutCodeName); } bool isWebPartVariant = (variantId > 0) || (zoneVariantId > 0) || isNewVariant; if (!isWebPartVariant) { // Update page template PageTemplateInfoProvider.SetPageTemplateInfo(pti); } else { // Save the variant properties if ((webPart != null) && (webPart.ParentZone != null) && (webPart.ParentZone.ParentTemplateInstance != null) && (webPart.ParentZone.ParentTemplateInstance.ParentPageTemplate != null)) { XmlDocument doc = new XmlDocument(); XmlNode xmlWebParts = null; if (zoneVariantId > 0) { // This webpart is in a zone variant therefore save the whole variant webparts xmlWebParts = webPart.ParentZone.GetXmlNode(doc); if (webPart.VariantMode == VariantModeEnum.MVT) { ModuleCommands.OnlineMarketingSaveMVTVariantWebParts(zoneVariantId, xmlWebParts); } else if (webPart.VariantMode == VariantModeEnum.ContentPersonalization) { ModuleCommands.OnlineMarketingSaveContentPersonalizationVariantWebParts(zoneVariantId, xmlWebParts); } } else if (variantId > 0) { // This webpart is a web part variant xmlWebParts = webPart.GetXmlNode(doc); if (webPart.VariantMode == VariantModeEnum.MVT) { ModuleCommands.OnlineMarketingSaveMVTVariantWebParts(variantId, xmlWebParts); } else if (webPart.VariantMode == VariantModeEnum.ContentPersonalization) { ModuleCommands.OnlineMarketingSaveContentPersonalizationVariantWebParts(variantId, xmlWebParts); } } } } } string parameters = aliasPath + "/" + zoneId + "/" + webpartId; string cacheName = "CMSVirtualWebParts|" + parameters.ToLowerCSafe().TrimStart('/'); CacheHelper.Remove(cacheName); } } /// /// Registers the client script to close the dialog. /// private void CloseDialog() { bool refresh = ValidationHelper.GetBoolean(hidRefresh.Value, false); var script = new StringBuilder(); if (refresh) { // Reload the parent page after save script.AppendLine("SendEvent('setrefreshpage');"); } script.AppendLine("SendEvent('close');"); ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "closeDialog", script.ToString(), true); } /// /// Refreshes the parent page. /// private void EnsureParentPageRefresh() { ScriptHelper.RegisterClientScriptBlock(Page, typeof(string), "LayoutRefreshParent", "SendEvent('setrefreshpage');", true); } #endregion }