using System;
using System.Web;
using System.Web.UI;
using System.Data;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.PortalEngine;
using CMS.SettingsProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
using CMS.WorkflowEngine;
using TreeNode = System.Web.UI.WebControls.TreeNode;
public partial class CMSModules_PortalEngine_Controls_Layout_PageTemplateTree : CMSAdminControl
{
#region "Variables"
private int mMaxTreeNodes = -1;
private bool mUseMaxNodeLimit = true;
private bool mSelectPageTemplates = false;
private bool mShowAdHocCategory = true;
private bool mShowEmptyCategories = true;
private int mDocumentID = 0;
private bool mIsNewPage = false;
private bool mShowOnlySiteTemplates = true;
private bool mUseGlobalSettings = false;
private string mSelectFunctionName = "SelectNode";
///
/// Index used for item count under one node.
///
private int indexMaxTreeNodes = -1;
#endregion
#region "Public properties"
///
/// Indicates whether use max node limit stored in settings.
///
public bool UseMaxNodeLimit
{
get
{
return mUseMaxNodeLimit;
}
set
{
mUseMaxNodeLimit = value;
}
}
///
/// If true, only global settings are used.
///
public bool UseGlobalSettings
{
get
{
return mUseGlobalSettings;
}
set
{
mUseGlobalSettings = value;
}
}
///
/// Maximum tree nodes shown under parent node - this value can be ignored if UseMaxNodeLimit set to false.
///
public int MaxTreeNodes
{
get
{
if (mMaxTreeNodes < 0)
{
mMaxTreeNodes = SettingsKeyProvider.GetIntValue((UseGlobalSettings ? "" : CMSContext.CurrentSiteName + ".") + "CMSMaxUITreeNodes");
}
return mMaxTreeNodes;
}
set
{
mMaxTreeNodes = value;
}
}
///
/// Gets or sets whether page templates are shown in tree or not.
///
public bool SelectPageTemplates
{
get
{
return mSelectPageTemplates;
}
set
{
mSelectPageTemplates = value;
}
}
///
/// Gets or sets selected item.
///
public string SelectedItem
{
get
{
return treeElem.SelectedItem;
}
set
{
treeElem.SelectedItem = value;
}
}
///
/// Gets or sets if use postback.
///
public bool UsePostBack
{
get
{
return treeElem.UsePostBack;
}
set
{
treeElem.UsePostBack = value;
}
}
///
/// Root path
///
public string RootPath
{
get;
set;
}
///
/// Gets or sets select path.
///
public string SelectPath
{
get
{
return treeElem.SelectPath;
}
set
{
treeElem.SelectPath = value;
treeElem.ExpandPath = value;
}
}
///
/// Shows or hides AdHoc category in tree.
///
public bool ShowAdHocCategory
{
get
{
return mShowAdHocCategory;
}
set
{
mShowAdHocCategory = value;
}
}
///
/// Shows or hides empty categories in tree.
///
public bool ShowEmptyCategories
{
get
{
return mShowEmptyCategories;
}
set
{
mShowEmptyCategories = value;
}
}
///
/// Gets or sets a value indicating whether to show site page templates only.
///
public bool ShowOnlySiteTemplates
{
get
{
return mShowOnlySiteTemplates;
}
set
{
mShowOnlySiteTemplates = value;
}
}
///
/// Indicates if the control should perform the operations.
///
public override bool StopProcessing
{
get
{
return base.StopProcessing;
}
set
{
base.StopProcessing = value;
treeElem.StopProcessing = value;
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
treeElem.IsLiveSite = value;
}
}
///
/// Gets or sets document id.
///
public int DocumentID
{
get
{
return mDocumentID;
}
set
{
mDocumentID = value;
}
}
///
/// Whether selecting new page.
///
public bool IsNewPage
{
get
{
return mIsNewPage;
}
set
{
mIsNewPage = value;
}
}
///
/// Name of the JS function for the selection
///
public string SelectFunctionName
{
get
{
return mSelectFunctionName;
}
set
{
mSelectFunctionName = value;
}
}
#endregion
#region "Custom events"
///
/// On selected item event handler.
///
public delegate void ItemSelectedEventHandler(string selectedValue);
///
/// On selected item event handler.
///
public event ItemSelectedEventHandler OnItemSelected;
#endregion
#region "Page and other events"
///
/// Page_Load event.
///
protected void Page_Load(object sender, EventArgs e)
{
if (StopProcessing)
{
return;
}
InitCategoryProvider();
if (SelectPageTemplates)
{
treeElem.NodeTemplate = "##ICON## ##NODENAME##";
treeElem.SelectedNodeTemplate = "##ICON## ##NODENAME##";
}
else
{
treeElem.NodeTemplate = "##ICON## ##NODENAME##";
treeElem.DefaultItemTemplate = "##ICON####NODENAME##
";
treeElem.SelectedDefaultItemTemplate = "##ICON####NODENAME##";
treeElem.SelectedNodeTemplate = "##ICON## ##NODENAME##";
// Register jquery
ScriptHelper.RegisterJQuery(Page);
string js =
@"
function " + SelectFunctionName + @"(nodeid, sender) {
var si = $j('.ContentTreeSelectedItem');
si.removeClass('ContentTreeSelectedItem');
si.addClass('ContentTreeItem');
si = $j(sender);
si.removeClass('ContentTreeItem');
si.addClass('ContentTreeSelectedItem');
document.getElementById('" + treeElem.SelectedItemFieldId + "').value = nodeid;" +
treeElem.GetOnSelectedItemBackEventReference() +
"}";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "SelectTreeNode", ScriptHelper.GetScript(js));
}
// Setup event handler
treeElem.OnItemSelected += new CMSAdminControls_UI_Trees_UniTree.ItemSelectedEventHandler(treeElem_OnItemSelected);
treeElem.OnNodeCreated += new CMSAdminControls_UI_Trees_UniTree.NodeCreatedEventHandler(treeElem_OnNodeCreated);
}
///
/// Initializes the category provider
///
private void InitCategoryProvider()
{
// Create and set category provider
UniTreeProvider categoryProvider = new UniTreeProvider();
categoryProvider.DisplayNameColumn = "DisplayName";
categoryProvider.IDColumn = "ObjectID";
categoryProvider.LevelColumn = "ObjectLevel";
categoryProvider.OrderColumn = "CategoryOrder";
categoryProvider.ParentIDColumn = "ParentID";
categoryProvider.PathColumn = "ObjectPath";
categoryProvider.ValueColumn = "ObjectID";
categoryProvider.ChildCountColumn = "CompleteChildCount";
categoryProvider.QueryName = "cms.pagetemplatecategory.selectallview";
categoryProvider.ObjectTypeColumn = "ObjectType";
categoryProvider.Columns = "DisplayName, CodeName, ObjectID, ObjectLevel, CategoryOrder, ParentID, ObjectPath, CompleteChildCount, ObjectType, CategoryChildCount, CategoryImagePath, Parameter";
categoryProvider.ImageColumn = "CategoryImagePath";
categoryProvider.ParameterColumn = "Parameter";
if (!SelectPageTemplates)
{
categoryProvider.WhereCondition = "ObjectType = 'pagetemplatecategory'";
categoryProvider.ChildCountColumn = "CategoryChildCount";
categoryProvider.ObjectTypeColumn = "";
treeElem.DefaultImagePath = GetImageUrl("Objects/CMS_PageTemplateCategory/list.png");
}
else
{
categoryProvider.OrderBy = "ObjectType DESC, DisplayName ASC";
treeElem.OnGetImage += new CMSAdminControls_UI_Trees_UniTree.GetImageEventHandler(treeElem_OnGetImage);
}
// Do not show AdHoc category
if (!ShowAdHocCategory)
{
categoryProvider.WhereCondition = SqlHelperClass.AddWhereCondition(categoryProvider.WhereCondition, "CodeName <> 'AdHoc'");
}
// Do not show empty categories
if (!ShowEmptyCategories)
{
categoryProvider.WhereCondition = SqlHelperClass.AddWhereCondition(categoryProvider.WhereCondition, "CategoryTemplateChildCount > 0 OR CategoryChildCount > 0");
TreeProvider tp = new TreeProvider(CMSContext.CurrentUser);
CMS.DocumentEngine.TreeNode node = DocumentHelper.GetDocument(DocumentID, tp);
string culture = CMSContext.PreferredCultureCode;
int level = 0;
string path = string.Empty;
if (node != null)
{
level = node.NodeLevel;
path = node.NodeAliasPath;
if (IsNewPage)
{
level++;
path = path + "/%";
}
else
{
culture = node.DocumentCulture;
}
}
// Add where condition for scopes
categoryProvider.WhereCondition += " AND (ObjectLevel = 0 OR (SELECT TOP 1 ObjectID FROM View_CMS_PageTemplateCategoryPageTemplate_Joined AS X WHERE X.ObjectType = 'pagetemplate' ";
categoryProvider.WhereCondition += " AND (X.PageTemplateType IS NULL OR X.PageTemplateType <> N'" + PageTemplateInfoProvider.GetPageTemplateTypeCode(PageTemplateTypeEnum.Dashboard) + "')";
if (ShowOnlySiteTemplates)
{
categoryProvider.WhereCondition += " AND X.ObjectID IN (SELECT PageTemplateID FROM CMS_PageTemplateSite WHERE SiteID = " + CMSContext.CurrentSiteID + ") ";
}
if (node != null)
{
categoryProvider.WhereCondition += " AND (" + PageTemplateScopeInfoProvider.GetScopeWhereCondition(path, culture, node.NodeClassName, level, CMSContext.CurrentSiteName, "X", "ObjectID") + ") ";
}
categoryProvider.WhereCondition += " AND (X.ObjectPath LIKE View_CMS_PageTemplateCategoryPageTemplate_Joined.ObjectPath + '/%')) IS NOT NULL)";
// Add column count column - minimal number of children
categoryProvider.Columns += @", (SELECT TOP 1 Count(*) FROM View_CMS_PageTemplateCategoryPageTemplate_Joined AS Y WHERE
(Y.ObjectID = View_CMS_PageTemplateCategoryPageTemplate_Joined.ObjectID AND Y.ObjectLevel = 0)
OR ( View_CMS_PageTemplateCategoryPageTemplate_Joined.ObjectType = 'PageTemplateCategory'
AND View_CMS_PageTemplateCategoryPageTemplate_Joined.CategoryChildCount > 0
AND Y.ObjectType = 'PageTemplate' AND Y.ObjectLevel > View_CMS_PageTemplateCategoryPageTemplate_Joined.ObjectLevel + 1 ";
if (ShowOnlySiteTemplates)
{
categoryProvider.Columns += "AND Y.ObjectID IN (SELECT PageTemplateID FROM CMS_PageTemplateSite WHERE SiteID = " + CMSContext.CurrentSiteID + ") ";
}
if (node != null)
{
categoryProvider.Columns += " AND ( " + PageTemplateScopeInfoProvider.GetScopeWhereCondition(path, culture, node.NodeClassName, level, CMSContext.CurrentSiteName, "Y", "ObjectID") + " ) ";
}
categoryProvider.Columns += " AND Y.ObjectPath LIKE View_CMS_PageTemplateCategoryPageTemplate_Joined.ObjectPath + '/%')) AS MinNumberOfChilds";
categoryProvider.ChildCountColumn = "MinNumberOfChilds";
}
// Handle the root path
if (!String.IsNullOrEmpty(RootPath) && (RootPath != "/"))
{
categoryProvider.RootLevelOffset = RootPath.Split('/').Length - 1;
categoryProvider.WhereCondition = SqlHelperClass.AddWhereCondition(categoryProvider.WhereCondition, String.Format("((ObjectPath = '{0}' OR ObjectPath LIKE '{0}/%'))", RootPath));
}
treeElem.ProviderObject = categoryProvider;
}
///
/// Page PreRender.
///
protected void Page_PreRender(object sender, EventArgs e)
{
if (StopProcessing)
{
return;
}
// Load data
if (!RequestHelper.IsPostBack())
{
treeElem.ReloadData();
}
}
///
/// Used for maxnodes in collapsed node.
///
/// The item data
/// The default node
protected TreeNode treeElem_OnNodeCreated(DataRow itemData, TreeNode defaultNode)
{
if (UseMaxNodeLimit)
{
// Get parentID from data row
int parentID = ValidationHelper.GetInteger(itemData["ParentID"], 0);
string objectType = ValidationHelper.GetString(itemData["ObjectType"], String.Empty);
// Don't use maxnodes limitation for categories
if (objectType.ToLowerCSafe() == "pagetemplatecategory")
{
return defaultNode;
}
// Increment index count in collapsing
indexMaxTreeNodes++;
if (indexMaxTreeNodes == MaxTreeNodes)
{
// Load parentid
int parentParentID = 0;
PageTemplateCategoryInfo parentParent = PageTemplateCategoryInfoProvider.GetPageTemplateCategoryInfo(parentID);
if (parentParent != null)
{
parentParentID = parentParent.ParentId;
}
TreeNode node = new TreeNode();
node.Text = "" + GetString("general.seelisting") + "";
return node;
}
if (indexMaxTreeNodes > MaxTreeNodes)
{
return null;
}
}
return defaultNode;
}
///
/// On selected item event.
///
/// Selected value
protected void treeElem_OnItemSelected(string selectedValue)
{
if (OnItemSelected != null)
{
OnItemSelected(selectedValue);
}
}
///
/// On get image event.
///
/// Current node
protected string treeElem_OnGetImage(UniTreeNode node)
{
if ((node != null) && (node.ItemData != null))
{
string objectType = string.Empty;
DataRow dr = (DataRow)node.ItemData;
if (dr != null)
{
objectType = ValidationHelper.GetString(dr["ObjectType"], "").ToLowerCSafe();
}
// Return image path
if (objectType == "pagetemplate")
{
// Set special icon for ad-hoc page template
if (!ValidationHelper.GetBoolean(dr["Parameter"], true))
{
return GetImageUrl("Objects/CMS_PageTemplate/adhoc.png");
}
return GetImageUrl("Objects/CMS_PageTemplate/tree.png");
}
else if (objectType == "pagetemplatecategory")
{
return GetImageUrl("Objects/CMS_PageTemplateCategory/list.png");
}
}
return String.Empty;
}
#endregion
#region "Methods"
///
/// Reloads the tree data.
///
public override void ReloadData()
{
InitCategoryProvider();
treeElem.ReloadData();
base.ReloadData();
}
#endregion
}