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 }