private TreeNode CreateTreeNode(CMS.DocumentEngine.TreeNode Node) { string tooltip = null; string customName = null; if ((!string.IsNullOrWhiteSpace(ToolTipFormat) || !string.IsNullOrWhiteSpace(DisplayNameFormat)) && AllowedPageTypes.ToLower().Split(";,|".ToCharArray()).Contains(Node.NodeClassName.ToLower())) { MacroResolver NodeResolver = GetNodeMacroResolver(Node); if (!string.IsNullOrWhiteSpace(ToolTipFormat)) { tooltip = NodeResolver.ResolveMacros(ToolTipFormat); } if (!string.IsNullOrWhiteSpace(DisplayNameFormat)) { customName = NodeResolver.ResolveMacros(DisplayNameFormat); } } RelatedPage_Tree_CustomTreeNode newNode = new RelatedPage_Tree_CustomTreeNode((!string.IsNullOrWhiteSpace(customName) ? customName : Node.NodeName), Node.NodeID.ToString(), tooltip); if (AlreadySelectedNodes.Contains(Node.NodeID) || (FilterSelectableNodes && !SelectableSelectedNodes.Contains(Node.NodeID))) { newNode.SelectAction = TreeNodeSelectAction.None; newNode.ShowCheckBox = false; newNode.Text = newNode.Text; newNode.CssClass = "AlreadySelected"; newNode.PossiblySelectable = AlreadySelectedNodes.Contains(Node.NodeID); } else { if ((AllowAllTypes || ClassNames.Contains(Node.ClassName))) { newNode.PossiblySelectable = true; newNode.CssClass = "Selectable"; if (SelectionMode == "Checkbox") { newNode.ShowCheckBox = true; newNode.SelectAction = TreeNodeSelectAction.None; } else { newNode.SelectAction = TreeNodeSelectAction.Select; } } else { newNode.SelectAction = TreeNodeSelectAction.None; newNode.CssClass = "NotSelectable"; } } return(newNode); }
private MacroResolver GetNodeMacroResolver(CMS.DocumentEngine.TreeNode Node) { string Culture = URLHelper.GetQueryValue(Request.RawUrl, "culture"); return(CacheHelper.Cache <MacroResolver>(cs => { MacroResolver resolver = MacroResolver.GetInstance(); List <string> Columns = new List <string>(); if (!string.IsNullOrWhiteSpace(ToolTipFormat)) { Columns.AddRange(DataHelper.GetNotEmpty(MacroProcessor.GetMacros(ToolTipFormat, true), "NodeName").Split(';')); } if (!string.IsNullOrWhiteSpace(DisplayNameFormat)) { Columns.AddRange(DataHelper.GetNotEmpty(MacroProcessor.GetMacros(DisplayNameFormat, true), "NodeName").Split(';')); } // Get data for this node and render it out DataSet FullData = new DocumentQuery(Node.ClassName) .WhereEquals("NodeID", Node.NodeID) .Columns(Columns) .Culture(Culture) .CombineWithDefaultCulture(true).Result; foreach (DataColumn item in FullData.Tables[0].Columns) { resolver.SetNamedSourceData(item.ColumnName, FullData.Tables[0].Rows[0][item.ColumnName]); } if (cs.Cached) { cs.CacheDependency = CacheHelper.GetCacheDependency("nodeid|" + Node.NodeID); } return resolver; }, new CacheSettings(CacheHelper.CacheMinutes(SiteContext.CurrentSiteName), "RelationshipTree_GetNodeMacroResolver", Node.NodeID, Culture, ToolTipFormat, DisplayNameFormat))); }
/// <summary> /// Initializes the category provider /// </summary> 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 = ""; } else { categoryProvider.OrderBy = "ObjectType DESC, DisplayName ASC"; } // Do not show AdHoc category if (!ShowAdHocCategory) { categoryProvider.WhereCondition = SqlHelper.AddWhereCondition(categoryProvider.WhereCondition, "CodeName <> 'AdHoc' AND CodeName <> 'AdHocUI'"); } // Do not show empty categories if (!ShowEmptyCategories) { categoryProvider.WhereCondition = SqlHelper.AddWhereCondition(categoryProvider.WhereCondition, "CategoryTemplateChildCount > 0 OR CategoryChildCount > 0"); TreeProvider tp = new TreeProvider(MembershipContext.AuthenticatedUser); CMS.DocumentEngine.TreeNode node = DocumentHelper.GetDocument(DocumentID, tp); string culture = LocalizationContext.PreferredCultureCode; int level = 0; string path = string.Empty; string className = String.Empty; if (node != null) { level = node.NodeLevel; path = node.NodeAliasPath; if (IsNewPage) { level++; path = path + "/%"; } else { culture = node.DocumentCulture; } className = node.NodeClassName; // Check if class id is in query string - then use it's value instead of document class name int classID = QueryHelper.GetInteger("classid", 0); if (classID != 0) { DataClassInfo dci = DataClassInfoProvider.GetDataClassInfo(classID); if (dci != null) { className = dci.ClassName; } } } // 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 = " + SiteContext.CurrentSiteID + ") "; } if (node != null) { categoryProvider.WhereCondition += " AND (" + PageTemplateScopeInfoProvider.GetScopeWhereCondition(path, culture, className, level, SiteContext.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 = " + SiteContext.CurrentSiteID + ") "; } if (node != null) { categoryProvider.Columns += " AND ( " + PageTemplateScopeInfoProvider.GetScopeWhereCondition(path, culture, className, level, SiteContext.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)) { categoryProvider.RootLevelOffset = RootPath.Trim('/').Split('/').Length - 1; categoryProvider.WhereCondition = SqlHelper.AddWhereCondition(categoryProvider.WhereCondition, String.Format("((ObjectPath = '{0}' OR ObjectPath LIKE '{0}/%'))", RootPath.Trim('/'))); } treeElem.ProviderObject = categoryProvider; }
/// <summary> /// Initializes the category provider /// </summary> 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; }
/// <summary> /// Appends given child object to the root node. /// </summary> /// <param name="root">Root node</param> /// <param name="colName">Name of the column</param> /// <param name="childObj">Child object to append</param> /// <param name="enumerate">Indicates if it's enumeration item</param> /// <param name="isPriorityTree">If true, nodes are appended to a priority tree</param> private void AppendChild(TreeNode root, string colName, object childObj, bool enumerate, bool isPriorityTree) { // Convert object property to value if (childObj is ObjectProperty) { object value = ((ObjectProperty)childObj).Value; AppendChild(root, colName, value, enumerate, isPriorityTree); return; } // Prepare the property name string col = colName; string defaultIconUrl = null; if (enumerate) { if (childObj is InfoObjectCollection) { col = ((InfoObjectCollection)childObj).Name; } else if (childObj != null) { col = "[" + col + "]" + (DisplayValues ? " " + HTMLHelper.HTMLEncode(childObj.ToString()) : ""); } } string name = col; if (ContextResolver.Context.DisablePageContextMacros) { if ((name.ToLowerCSafe() == "currentdocument") || (name.ToLowerCSafe() == "currentpageinfo")) { return; } } if (ContextResolver.Context.DisableContextObjectMacros) { if (name.EndsWithCSafe("context", true)) { return; } } // Prepare the icon string iconUrl = GetImagePath("CMSModules/list.png"); if (childObj is SettingsCategoryContainer) { // Get list icon of Settings category iconUrl = GetObjectIconPath(SiteObjectType.SETTINGSCATEGORY, "list.png"); } else if (childObj is CollectionPropertyWrapper) { iconUrl = GetImagePath("Design/Controls/MacroEditor/list.png"); } else if (childObj is InfoObjectCollection) { var colObj = (InfoObjectCollection)childObj; // Collection iconUrl = GetObjectIconPath(colObj.ObjectType, "list.png"); defaultIconUrl = GetDefaultIconUrl(colObj.TypeInfo); } else if (childObj is CMS.DocumentEngine.TreeNode) { // Document CMS.DocumentEngine.TreeNode node = (CMS.DocumentEngine.TreeNode)childObj; iconUrl = GetDocumentTypeIconPath(node.NodeClassName, null, true); string docName = node.GetDocumentName(); if (enumerate) { name = "[" + colName + "] " + HTMLHelper.HTMLEncode(docName); } else { if (DisplayValues) { name += " <span class=\"Info\">(" + HTMLHelper.HTMLEncode(docName) + ")</span>"; ; } } } else if (childObj is BaseInfo) { // Info object BaseInfo infoObj = (BaseInfo)childObj; iconUrl = GetObjectIconPath(infoObj.ObjectType, "list.png"); defaultIconUrl = GetDefaultIconUrl(infoObj.TypeInfo); string objName = infoObj.Generalized.ObjectDisplayName; if (!String.IsNullOrEmpty(objName)) { if (enumerate) { name = "[" + colName + "] " + (DisplayValues ? " " + HTMLHelper.HTMLEncode(objName) : ""); } else { if (DisplayValues) { name += " <span class=\"Info\">(" + HTMLHelper.HTMLEncode(objName) + ")</span>"; } } } } else if (childObj is PageInfo) { // Page info PageInfo pi = (PageInfo)childObj; iconUrl = GetDocumentTypeIconPath(pi.ClassName, "", false); } else if (childObj is IContext) { // Context iconUrl = GetImagePath("Design/Controls/MacroEditor/context.png"); } else if (childObj is Exception) { // Error iconUrl = GetImagePath("Design/Controls/MacroEditor/error.png"); } else { switch (col.ToLowerCSafe()) { case "children": // Children iconUrl = GetImagePath("Design/Controls/MacroEditor/children.png"); break; case "parent": // Parent iconUrl = GetImagePath("Design/Controls/MacroEditor/parent.png"); break; default: if (childObj == null) { // Null iconUrl = GetImagePath("Design/Controls/MacroEditor/null.png"); } else if (!IsSimpleValue(childObj)) { // Complex object iconUrl = GetImagePath("Design/Controls/MacroEditor/repository.png"); } else if (childObj is string) { // Simple value iconUrl = GetImagePath("Design/Controls/MacroEditor/string.png"); } else if ((childObj is int) || (childObj is double) || (childObj is long)) { // Simple value iconUrl = GetImagePath("Design/Controls/MacroEditor/number.png"); } else if (childObj is bool) { if ((bool)childObj) { // True iconUrl = GetImagePath("Design/Controls/MacroEditor/true.png"); } else { // False iconUrl = GetImagePath("Design/Controls/MacroEditor/false.png"); } } else if (childObj is DateTime) { // Simple value iconUrl = GetImagePath("Design/Controls/MacroEditor/datetime.png"); } else { // Simple value iconUrl = GetImagePath("Design/Controls/MacroEditor/value.png"); } break; } } string icon = null; if (!String.IsNullOrEmpty(iconUrl)) { // Check the existence of the file if (!File.Exists(Server.MapPath(iconUrl))) { if (defaultIconUrl == null) { iconUrl = GetImagePath("CMSModules/list.png"); } else { iconUrl = defaultIconUrl; } } icon = "<img src=\"" + UIHelper.ResolveImageUrl(iconUrl) + "\" alt=\"\" style=\"border:0px;vertical-align:middle;\" class=\"Image16\" />"; } bool isSimple = IsSimpleValue(childObj); // Append JS onclick action if defined, pass macro expression to the handler string jsHandler = ""; if (!string.IsNullOrEmpty(OnNodeClickHandler)) { string macroArg = root.ValuePath.Replace('/', '.') + (enumerate ? "[" + colName + "]" : "." + col); macroArg = HttpUtility.UrlDecode(macroArg); macroArg = macroArg.Replace(".[", "[").TrimStart('.'); if (isPriorityTree) { jsHandler = OnNodeClickHandler + "(" + ScriptHelper.GetString(macroArg, true).Replace("\\\"", """) + ");"; } else { jsHandler = OnNodeClickHandler + "(" + ScriptHelper.GetString(macroArg.Substring(MacroExpression.Length + 1), true).Replace("\\\"", """) + ");"; } } // Create the node name = TextHelper.LimitLength(ResHelper.LocalizeString(name), 150, null, true); string text = "<span class=\"ContentTreeItem\" onclick=\"" + jsHandler + "return false;\">" + icon + "<span class=\"Name\">" + name + "</span></span>"; TreeNode child = new TreeNode(text); child.ToolTip = GetValueString(childObj, isSimple); child.Value = HttpUtility.UrlEncode(enumerate ? "[" + colName + "]" : col); child.PopulateOnDemand = !isSimple; child.Expanded = false; root.ChildNodes.Add(child); }