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_PortalEngine_Controls_WebParts_WebPartTree : CMSAdminControl { #region "Variables" private int mMaxTreeNodes = -1; private bool mUseMaxNodeLimit = true; private bool mSelectWebParts = false; private bool mShowRecentlyUsed = false; private bool mShowWidgetOnlyWebparts = false; private bool mUseGlobalSettings = false; /// /// Index used for item count under one node. /// private int indexMaxTreeNodes = -1; #endregion #region "Public properties" /// /// Indicates if all nodes should be expanded. /// public bool ExpandAll { get { return treeElem.ExpandAll; } set { treeElem.ExpandAll = value; } } /// /// Indicates number of expanded levels. /// public int ExpandLevel { get { return treeElem.ExpandLevel; } set { treeElem.ExpandLevel = value; } } /// /// Gets or sets expand path. /// public string ExpandPath { get { return treeElem.ExpandPath; } set { treeElem.ExpandPath = value; } } /// /// Indicates whether webpart of type "Widget only" will be displayed in selector. /// public bool ShowWidgetOnlyWebparts { get { return mShowWidgetOnlyWebparts; } set { mShowWidgetOnlyWebparts = value; } } /// /// Indicates whether use max node limit stored in settings. /// public bool UseMaxNodeLimit { get { return mUseMaxNodeLimit; } set { mUseMaxNodeLimit = value; } } /// /// If true, only 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 webparts are shown in tree or not. /// public bool SelectWebParts { get { return mSelectWebParts; } set { mSelectWebParts = 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; } } /// /// Gets or sets if use postback. /// 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; } } /// /// Root path for the items in the tree. /// public virtual string RootPath { get; set; } #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 = "CategoryOrder"; categoryProvider.ParentIDColumn = "ParentID"; categoryProvider.PathColumn = "ObjectPath"; categoryProvider.ValueColumn = "ObjectID"; categoryProvider.ChildCountColumn = "CompleteChildCount"; categoryProvider.QueryName = "cms.webpartcategory.selectallview"; categoryProvider.ObjectTypeColumn = "ObjectType"; categoryProvider.Columns = "DisplayName, ObjectID, ObjectLevel,CategoryOrder,ParentID, ObjectPath, CompleteChildCount,ObjectType,CategoryChildCount, CategoryImagePath"; categoryProvider.ImageColumn = "CategoryImagePath"; string where = null; if (!SelectWebParts) { // Select only categories where = "ObjectType = N'webpartcategory'"; categoryProvider.ChildCountColumn = "CategoryChildCount"; categoryProvider.ObjectTypeColumn = ""; treeElem.DefaultImagePath = GetImageUrl("Objects/CMS_WebPartCategory/list.png"); } else { categoryProvider.OrderBy = "ObjectType DESC, DisplayName ASC"; treeElem.OnGetImage += new CMSAdminControls_UI_Trees_UniTree.GetImageEventHandler(treeElem_OnGetImage); } // Prepare root path string rootPath = "/"; if (!string.IsNullOrEmpty(RootPath)) { rootPath = RootPath + "/"; } if (!ShowWidgetOnlyWebparts) { // Hide categories with "widget only" web parts where = SqlHelperClass.AddWhereCondition(where, "ObjectPath = '" + SqlHelperClass.GetSafeQueryString(rootPath, false) + "' OR (SELECT Count(*) FROM View_CMS_WebPartCategoryWebpart_Joined AS X WHERE X.ObjectType = N'webpart' AND (X.WebPartType IS NULL OR X.WebPartType != " + Convert.ToInt32(WebPartTypeEnum.WidgetOnly) + ") AND X.ObjectPath LIKE View_CMS_WebPartCategoryWebpart_Joined.ObjectPath + '/%') > 0"); } // Add custom where condition if (!string.IsNullOrEmpty(RootPath)) { where = SqlHelperClass.AddWhereCondition(where, "ObjectPath = '" + SqlHelperClass.GetSafeQueryString(RootPath, false) + "' OR ObjectPath LIKE '" + SqlHelperClass.GetSafeQueryString(RootPath, false) + "/%'"); categoryProvider.RootLevelOffset = RootPath.Split('/').Length - 1; treeElem.ExpandPath = RootPath.TrimEnd() + "/"; } categoryProvider.WhereCondition = where; // Set up tree treeElem.ProviderObject = categoryProvider; if (SelectWebParts) { 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 = "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("webparts.recentlyused"), "recentlyused", ResolveUrl(GetImageUrl("Objects/CMS_WebPartCategory/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. /// /// The data row to check /// The defaul 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() == "webpartcategory") { return defaultNode; } // Increment index count in collapsing indexMaxTreeNodes++; if (indexMaxTreeNodes == MaxTreeNodes) { // Load parentid int parentParentID = 0; WebPartCategoryInfo category = WebPartCategoryInfoProvider.GetWebPartCategoryInfoById(parentID); if (category != null) { parentParentID = category.CategoryParentID; } 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 private 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 == "webpart") { return GetImageUrl("Objects/CMS_WebPart/tree.png"); } else if (objectType == "webpartcategory") { return GetImageUrl("Objects/CMS_WebPartCategory/list.png"); } } return String.Empty; } #endregion #region "Methods" /// /// Reloads the tree data. /// public override void ReloadData() { treeElem.ReloadData(); base.ReloadData(); } #endregion }