using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.PortalEngine; using CMS.SettingsProvider; using CMS.UIControls; public partial class CMSModules_Widgets_Controls_WidgetTree : CMSAdminControl { #region "Variables" private int mMaxTreeNodes = -1; private bool mUseMaxNodeLimit = true; private bool mSelectWidgets = true; private bool mShowRecentlyUsed = false; private bool mSelectEditorWidgets = false; private bool mSelectUserWidgets = false; private bool mSelectGroupWidgets = false; private bool mSelectInlineWidgets = false; private bool mSelectDashboardWidgets = false; private bool mUseGlobalSettings = false; /// /// 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 widgets are shown in tree or not. /// public bool SelectWidgets { get { return mSelectWidgets; } set { mSelectWidgets = value; } } /// /// Gets or sets whether recently used link is shown or not. /// public bool ShowRecentlyUsed { get { return mShowRecentlyUsed; } set { mShowRecentlyUsed = value; } } /// /// Gets or sets selected item. /// public string SelectedItem { get { return treeElem.SelectedItem; } set { treeElem.SelectedItem = value; } } /// /// Enables or disables use of postback in tree. If disabled JavaScript is used. /// public bool UsePostBack { get { return treeElem.UsePostBack; } set { treeElem.UsePostBack = value; } } /// /// Gets or sets select path. /// public string SelectPath { get { return treeElem.SelectPath; } set { treeElem.SelectPath = value; treeElem.ExpandPath = 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; } } /// /// Determines whether the tree selector will display widgets available for editors. /// public bool SelectEditorWidgets { get { return mSelectEditorWidgets; } set { mSelectEditorWidgets = value; } } /// /// Determines whether the tree selector will only display widgets available for authenticated users. /// public bool SelectUserWidgets { get { return mSelectUserWidgets; } set { mSelectUserWidgets = value; } } /// /// Determines whether the tree selector will only display widgets available for group admin. /// public bool SelectGroupWidgets { get { return mSelectGroupWidgets; } set { mSelectGroupWidgets = value; } } /// /// Determines whether the tree selector will only display widgets available for inline. /// public bool SelectInlineWidgets { get { return mSelectInlineWidgets; } set { mSelectInlineWidgets = value; } } /// /// Determines whether the tree selector will only display widgets available for dashboard. /// public bool SelectDashboardWidgets { get { return mSelectDashboardWidgets; } set { mSelectDashboardWidgets = 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; } // Create and set category provider UniTreeProvider categoryProvider = new UniTreeProvider(); categoryProvider.DisplayNameColumn = "DisplayName"; categoryProvider.IDColumn = "ObjectID"; categoryProvider.LevelColumn = "ObjectLevel"; categoryProvider.OrderColumn = "ObjectType DESC, WidgetCategoryOrder"; categoryProvider.ParentIDColumn = "ParentID"; categoryProvider.PathColumn = "ObjectPath"; categoryProvider.ValueColumn = "ObjectID"; categoryProvider.ChildCountColumn = "CompleteChildCount"; categoryProvider.QueryName = "cms.widgetcategory.selectallview"; categoryProvider.ObjectTypeColumn = "ObjectType"; categoryProvider.ImageColumn = "WidgetCategoryImagePath"; categoryProvider.Columns = "ObjectID, DisplayName, ParentID, WidgetCategoryImagePath, ObjectPath, WidgetCategoryOrder, WidgetCategoryChildCount, ObjectLevel, CompleteChildCount, ObjectType"; // Build where condition CurrentUserInfo currentUser = CMSContext.CurrentUser; string securityWhere = String.Empty; // Security where condition if (!SelectGroupWidgets && !currentUser.IsGlobalAdministrator) { securityWhere = "(WidgetSecurity = 0)"; // Allowed for all if (currentUser.IsAuthenticated()) { securityWhere += " OR (WidgetSecurity = 1)"; // Authenticated if (currentUser.IsGlobalAdministrator) { securityWhere += " OR (WidgetSecurity = 7)"; // Global admin } securityWhere += " OR ((WidgetSecurity = 2) AND (ObjectID IN ( SELECT WidgetID FROM CMS_WidgetRole WHERE RoleID IN (SELECT RoleID FROM View_CMS_UserRole_MembershipRole_ValidOnly_Joined WHERE UserID = " + currentUser.UserID + "))))"; // Authorized roles } } // Categories AND widgets if (SelectWidgets) { categoryProvider.WhereCondition = securityWhere; treeElem.OnGetImage += new CMSAdminControls_UI_Trees_UniTree.GetImageEventHandler(treeElem_OnGetImage); } else // Only Categories { categoryProvider.WhereCondition = "ObjectType = 'widgetcategory'"; categoryProvider.ChildCountColumn = "WidgetCategoryChildCount"; categoryProvider.ObjectTypeColumn = ""; treeElem.DefaultImagePath = GetImageUrl("Objects/CMS_WidgetCategory/list.png"); // Create WHERE condition which filters categories without widgets string where = ""; where = @"0 <>(SELECT TOP 1 ObjectID FROM (SELECT ObjectPath AS WidgetPath, ObjectType, WidgetForUser, WidgetForGroup, WidgetForEditor, WidgetSecurity, ObjectID, WidgetForInline, WidgetForDashboard FROM View_CMS_WidgetCategoryWidget_Joined) AS SUB WHERE SUB.ObjectType = 'widget' AND SUB.WidgetPath LIKE ObjectPath + '%'"; if (SelectEditorWidgets) { where += " AND SUB.WidgetForEditor = 1 "; } else if (SelectUserWidgets) { where += " AND SUB.WidgetForUser = 1 "; } else if (SelectGroupWidgets) { where += " AND SUB.WidgetForGroup = 1"; } else if (SelectInlineWidgets) { where += " AND SUB.WidgetForInline = 1 "; } else if (SelectDashboardWidgets) { where += " AND SUB.WidgetForDashboard = 1 "; } else { where += " AND 1 = 2 "; } if (!string.IsNullOrEmpty(securityWhere)) { where += " AND ( " + securityWhere + ")"; } categoryProvider.WhereCondition = SqlHelperClass.AddWhereCondition(categoryProvider.WhereCondition, where + ")"); } // Set up tree treeElem.ProviderObject = categoryProvider; if (SelectWidgets) { string script = "onclick=\"SelectNode(##NODEID##,'##OBJECTTYPE##', ##PARENTNODEID##);\""; treeElem.NodeTemplate = String.Format("##ICON## ##NODENAME##", script); treeElem.SelectedNodeTemplate = String.Format("##ICON## ##NODENAME##", script); } else { treeElem.NodeTemplate = "##ICON## ##NODENAME##"; treeElem.DefaultItemTemplate = "##ICON####NODENAME##"; treeElem.SelectedDefaultItemTemplate = "##ICON####NODENAME##"; treeElem.SelectedNodeTemplate = "##ICON## ##NODENAME##"; // Register jquery ScriptHelper.RegisterJQuery(Page); string js = "var selectedItem = $j('.ContentTreeSelectedItem');" + "function SelectNode(nodeid, sender){" + "selectedItem.removeClass('ContentTreeSelectedItem'); " + "selectedItem.addClass('ContentTreeItem');" + "selectedItem = $j(sender);" + "selectedItem.removeClass('ContentTreeItem'); " + "selectedItem.addClass('ContentTreeSelectedItem'); " + "document.getElementById('" + treeElem.SelectedItemFieldId + "').value = nodeid;" + treeElem.GetOnSelectedItemBackEventReference() + "}"; ScriptHelper.RegisterStartupScript(Page, typeof(string), "SelectTreeNode", ScriptHelper.GetScript(js)); } // Add last recently used if (ShowRecentlyUsed) { treeElem.AddDefaultItem(GetString("widgets.recentlyused"), "recentlyused", ResolveUrl(GetImageUrl("CMSModules/CMS_Widgets/recentlyused.png"))); } // Setup event handler treeElem.OnItemSelected += new CMSAdminControls_UI_Trees_UniTree.ItemSelectedEventHandler(treeElem_OnItemSelected); treeElem.OnNodeCreated += new CMSAdminControls_UI_Trees_UniTree.NodeCreatedEventHandler(treeElem_OnNodeCreated); } /// /// 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. /// 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() == "widgetcategory") { return defaultNode; } // Increment index count in collapsing indexMaxTreeNodes++; if (indexMaxTreeNodes == MaxTreeNodes) { // Load parentid int parentParentID = 0; WidgetCategoryInfo parentParent = WidgetCategoryInfoProvider.GetWidgetCategoryInfo(parentID); if (parentParent != null) { parentParentID = parentParent.WidgetCategoryParentID; } 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 switch (objectType) { case "widget": return URLHelper.ResolveUrl(GetImageUrl("Objects/CMS_Widget/list.png")); case "widgetcategory": return URLHelper.ResolveUrl(GetImageUrl("Objects/CMS_WidgetCategory/list.png")); } } return String.Empty; } #endregion #region "Methods" /// /// Reloads the tree data. /// public override void ReloadData() { treeElem.ReloadData(); base.ReloadData(); } #endregion }