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
}