using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.UIControls;
using CMS.GlobalHelper;
using CMS.CMSHelper;
public partial class CMSModules_AdminControls_Controls_Preview_PreviewHierarchy : CMSPreviewControl
{
#region "Variables"
UILayoutPane panePreview = null;
UILayoutPane paneToolbar = null;
int previewValue = 0;
bool mStorePreviewScrollPosition = false;
bool registerScrollScript = false;
#endregion
#region "Properties"
///
/// Gets or sets the key under which the preview state is stored in the cookies
///
public String CookiesPreviewStateName
{
get;
set;
}
///
/// Path for content (edit) control. Must be set, before page load.
///
public String ContentControlPath
{
get;
set;
}
///
/// Indicates whether show panel separator (used in vertical mode)
///
public bool ShowPanelSeparator
{
get;
set;
}
///
/// Gets or sets a value indicating whether the preview control should display the "Save" and "Save and close" buttons.
///
public bool ShowSaveButtons
{
get;
set;
}
///
/// If true, scroll position is stored between save requests
///
public bool StorePreviewScrollPosition
{
get
{
return mStorePreviewScrollPosition;
}
set
{
mStorePreviewScrollPosition = value;
}
}
///
/// Return UILayoutPane control.
///
public UILayoutPane LayoutPane
{
get
{
return paneContent;
}
}
#endregion
#region "Methods"
protected override void OnInit(EventArgs e)
{
paneContent.ControlPath = ContentControlPath;
paneContent.Values.Add(new UILayoutValue("DialogMode", DialogMode));
base.OnInit(e);
}
///
/// Adds content envelope ClientID. Must be added after page Init event to calculate right ClientID but before OnLoad event.
///
public void RegisterEnvelopeClientID()
{
paneContent.Values.Add(new UILayoutValue("ParentClientID", paneContent.ClientID));
}
protected override void OnLoad(EventArgs e)
{
ICMSMasterPage master = Page.Master as ICMSMasterPage;
if ((master != null) && (master.FooterContainer != null))
{
master.FooterContainer.Visible = false;
}
ScriptHelper.RegisterScriptFile(Page, "Controls/CodePreview.js");
imgProgress.ImageUrl = GetImageUrl("/Design/Preloaders/preload16.gif");
paneToolbar = new UILayoutPane();
if (!DialogMode)
{
paneFooter.Visible = false;
}
previewValue = GetPreviewStateFromCookies(CookiesPreviewStateName);
if (CMSContext.EditedObject == null)
{
previewValue = 0;
}
// Change preview state handling
string args = Request["__EVENTARGUMENT"];
string target = Request["__EVENTTARGET"];
if (target == btnHidden.UniqueID)
{
switch (args)
{
case "vertical":
previewValue = 1;
break;
case "horizontal":
previewValue = 2;
break;
case "split":
previewValue = (previewValue == 0) ? 1 : 0;
if (previewValue != 0)
{
RegisterFullScreen();
PreviewInitialized = true;
paneToolbar.Values.Add(new UILayoutValue("PreviewInitialized", true));
}
break;
}
SetPreviewStateToCookies(CookiesPreviewStateName, previewValue);
paneToolbar.Values.Add(new UILayoutValue("SetControls", true));
}
UILayout subLayout = paneContentMain.FindControl("layoutElem") as UILayout;
panePreview = subLayout.FindControl("panePreview") as UILayoutPane;
// Pane toolbar
paneToolbar.ID = "paneToolbar";
paneToolbar.Direction = PaneDirectionEnum.North;
paneToolbar.ControlPath = "~/CMSModules/AdminControls/Controls/Preview/PreviewNavigationButtons.ascx";
paneToolbar.Resizable = false;
paneToolbar.Slidable = false;
paneToolbar.RenderAs = HtmlTextWriterTag.Div;
paneToolbar.SpacingOpen = 0;
if (AddTitleToToolbar && (previewValue != 0))
{
// Add toolbar padding to show title
paneToolbar.PaneClass = "PreviewTitlePadding";
}
paneToolbar.Values.Add(new UILayoutValue("PreviewURLSuffix", PreviewURLSuffix));
paneToolbar.Values.Add(new UILayoutValue("CookiesPreviewStateName", CookiesPreviewStateName));
paneToolbar.Values.Add(new UILayoutValue("PreviewObjectName", PreviewObjectName));
paneToolbar.Values.Add(new UILayoutValue("DefaultAliasPath", DefaultAliasPath));
paneToolbar.Values.Add(new UILayoutValue("DialogMode", DialogMode));
paneToolbar.Values.Add(new UILayoutValue("IgnoreSessionValues", IgnoreSessionValues));
paneToolbar.Values.Add(new UILayoutValue("DefaultPreviewPath", DefaultPreviewPath));
paneContentMain.Visible = true;
subLayout.StopProcessing = false;
paneFooter.SpacingOpen = 0;
paneFooter.Values.Add(new UILayoutValue("ShowSaveButtons", ShowSaveButtons));
// Check if inner control denied displaying preview
CMSPreviewControl pw = paneContent.UserControl as CMSPreviewControl;
if (pw != null)
{
if (!pw.ShowPreview)
{
previewValue = 0;
}
}
switch (previewValue)
{
// No split
case 0:
subLayout.StopProcessing = true;
paneContentMain.Visible = false;
paneContent.Direction = PaneDirectionEnum.Center;
break;
// Vertical
case 1:
int additionalSize = AddTitleToToolbar ? 38 : 0;
paneContent.SpacingOpen = 14;
paneContent.SpacingClosed = 14;
paneContent.ResizerClass = "TransformationVerticalResizer";
paneToolbar.Values.Add(new UILayoutValue("ShowPanelSeparator", ShowPanelSeparator));
paneToolbar.SpacingOpen = 0;
paneToolbar.Size = ShowPanelSeparator ? (41 + additionalSize).ToString() : (35 + additionalSize).ToString();
layoutElem.Controls.Add(paneToolbar);
layoutElem.Panes.Add(paneToolbar);
paneContent.Direction = PaneDirectionEnum.West;
break;
// Horizontal
case 2:
paneToolbar.PaneClass = "HorizontalToolbar";
paneContent.ResizerClass = "GrayResizer";
paneToolbar.Size = "30";
subLayout.Controls.Add(paneToolbar);
subLayout.Panes.Add(paneToolbar);
break;
}
if ((previewValue != 0) && !RequestHelper.IsPostBack())
{
RegisterFullScreen();
}
base.OnLoad(e);
}
///
/// Registers javascript for layout communication
///
private void RegisterHierarchyScripts()
{
String refresh = @"
function refreshPreview() {
var preview = document.getElementById('" + panePreview.ClientID + @"');
var scrollTop = 0 ;
var scrollLeft = 0;
if ('" + registerScrollScript.ToString() + @"' == 'True') {
var jpreview = $j(preview);
scrollTop = $j(jpreview).contents().scrollTop();
scrollLeft = $j(jpreview).contents().scrollLeft();
}
var state = " + previewValue + @";
if (preview != null) {
var loc = preview.src;
preview.src = preventCacheLocation(preview.src, preview.src);
}
if (state != 0) {
showProgressBar(preview, scrollTop, scrollLeft);
}
}
function showProgressBar(preview, scrollTop, scrollLeft) {
var pr = $j('#" + paneContentMain.ClientID + @"');
var pnlProgress = $j('#" + pnlProgress.ClientID + @"');
var jpreview = $j(preview);
var isRTL = $j('body').hasClass('RTL');
pnlProgress.show();
var left = isRTL ? pr.width() : pr.offset().left;
pnlProgress.offset({ top: pr.offset().top, left: left });
var pnlBackground = $j('#" + pnlBackGround.ClientID + @"');
pnlBackground.width(pr.width());
pnlBackground.height(pr.height());
$j(jpreview).load(function()
{
if ((scrollTop != 0) || (scrollLeft != 0)) {
$j(jpreview).contents().scrollTop(scrollTop);
$j(jpreview).contents().scrollLeft(scrollLeft);
}
pnlProgress.hide();
// Prevent multiple load events
$j(jpreview).unbind('load');
});
}
function refreshPreviewParam(src) {
var preview = document.getElementById('" + panePreview.ClientID + @"');
var state = " + previewValue + @";
if (preview != null) {
preview.src = preventCacheLocation(src, preview.src);
}
if (state != 0) {
showProgressBar(preview, 0, 0);
}
}
function performToolbarAction(action) {
" + Page.ClientScript.GetPostBackEventReference(btnHidden, "#").Replace("'#'", "action") + @"
}
function preventCacheLocation(src,contentSrc) {
var newLocation = src;
if (src == contentSrc) {
if (newLocation.indexOf('refreshtoken=0') != -1) {
newLocation = newLocation.replace('refreshtoken=0','refreshtoken=1');
} else {
newLocation = newLocation.replace('refreshtoken=1','refreshtoken=0');
}
}
return newLocation;
}
";
// For page title, add resize scripts for content
if (AddTitleToToolbar)
{
if (previewValue != 1)
{
refresh +=
@"
function resizePreviewContent(setMargin) {
var delimiters = " + (previewValue == 0 ? 0 : 4) + @";
var title = $j('.DialogsPageHeader');
var panel = $j('#" + paneContent.ClientID + @"');
var toolbar = $j('#" + paneToolbar.ClientID + @"');
var footer = $j('#" + paneFooter.ClientID + @"');
var preview = $j('#" + panePreview.ClientID + @"');
if (title != null) {
var titleHeight = title.height();
if (setMargin) {
panel.css('margin-top', titleHeight);;
}
panel.height($j(window).height() - toolbar.height() - preview.height() - titleHeight - footer.height() - delimiters);
CM_FullScreen(IsFullScreen, EditorElem);
}
}
$j(window).ready(function () {
resizePreviewContent(true);
});
$j(window).resize(function() {
setTimeout(function(){
resizePreviewContent(false);
}, 300);
});
";
}
}
ScriptHelper.RegisterClientScriptBlock(Page, typeof(String), "RefreshWindow", ScriptHelper.GetScript(refresh));
}
protected override void OnPreRender(EventArgs e)
{
String url = GetPreviewURL();
// Register scroll script only for same domains to prevent access denied js errors
registerScrollScript = (StorePreviewScrollPosition && (URLHelper.GetDomain(url) == URLHelper.GetCurrentDomain()));
RegisterHierarchyScripts();
panePreview.Src = url;
base.OnPreRender(e);
}
///
/// Add parameter to content parameter collection
///
/// Content parameter
public void AddContentParameter(UILayoutValue val)
{
paneContent.Values.Add(val);
}
///
/// Register script for window fullscreen in modal dialog
///
private void RegisterFullScreen()
{
if (DialogMode)
{
const string script = @"
$j(document).ready(function() {
if (GetTop)
{
var topFrame = GetTop();
if(topFrame.setToFullScreen)
{
topFrame.setToFullScreen();
$j(window).trigger('resize');
}
else
{
$j(topFrame).load(function(){ topFrame.setToFullScreen(); $j(window).trigger('resize'); });
}
}
})";
ScriptHelper.RegisterStartupScript(Page, typeof(String), "FullScreenScript", ScriptHelper.GetScript(script));
}
}
#endregion
}