File: D:/HostingSpaces/RMourik/bassol.nl/wwwroot/CMSModules/Widgets/Controls/WidgetTree.ascx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using CMS.Helpers;
using CMS.PortalEngine;
using CMS.Base;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.DataEngine;
using CMS.Membership;
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;
/// <summary>
/// Index used for item count under one node.
/// </summary>
private int indexMaxTreeNodes = -1;
#endregion
#region "Public properties"
/// <summary>
/// Indicates whether use max node limit stored in settings.
/// </summary>
public bool UseMaxNodeLimit
{
get
{
return mUseMaxNodeLimit;
}
set
{
mUseMaxNodeLimit = value;
}
}
/// <summary>
/// If true, only global settings are used.
/// </summary>
public bool UseGlobalSettings
{
get
{
return mUseGlobalSettings;
}
set
{
mUseGlobalSettings = value;
}
}
/// <summary>
/// Maximum tree nodes shown under parent node - this value can be ignored if UseMaxNodeLimit set to false.
/// </summary>
public int MaxTreeNodes
{
get
{
if (mMaxTreeNodes < 0)
{
mMaxTreeNodes = SettingsKeyInfoProvider.GetIntValue((UseGlobalSettings ? "" : SiteContext.CurrentSiteName + ".") + "CMSMaxUITreeNodes");
}
return mMaxTreeNodes;
}
set
{
mMaxTreeNodes = value;
}
}
/// <summary>
/// Gets or sets whether widgets are shown in tree or not.
/// </summary>
public bool SelectWidgets
{
get
{
return mSelectWidgets;
}
set
{
mSelectWidgets = value;
}
}
/// <summary>
/// Gets or sets whether recently used link is shown or not.
/// </summary>
public bool ShowRecentlyUsed
{
get
{
return mShowRecentlyUsed;
}
set
{
mShowRecentlyUsed = value;
}
}
/// <summary>
/// Gets or sets selected item.
/// </summary>
public string SelectedItem
{
get
{
return treeElem.SelectedItem;
}
set
{
treeElem.SelectedItem = value;
}
}
/// <summary>
/// Enables or disables use of postback in tree. If disabled JavaScript is used.
/// </summary>
public bool UsePostBack
{
get
{
return treeElem.UsePostBack;
}
set
{
treeElem.UsePostBack = value;
}
}
/// <summary>
/// Gets or sets select path.
/// </summary>
public string SelectPath
{
get
{
return treeElem.SelectPath;
}
set
{
treeElem.SelectPath = value;
treeElem.ExpandPath = value;
}
}
/// <summary>
/// Indicates if the control should perform the operations.
/// </summary>
public override bool StopProcessing
{
get
{
return base.StopProcessing;
}
set
{
base.StopProcessing = value;
treeElem.StopProcessing = value;
}
}
/// <summary>
/// Indicates if control is used on live site.
/// </summary>
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
treeElem.IsLiveSite = value;
}
}
/// <summary>
/// Determines whether the tree selector will display widgets available for editors.
/// </summary>
public bool SelectEditorWidgets
{
get
{
return mSelectEditorWidgets;
}
set
{
mSelectEditorWidgets = value;
}
}
/// <summary>
/// Determines whether the tree selector will only display widgets available for authenticated users.
/// </summary>
public bool SelectUserWidgets
{
get
{
return mSelectUserWidgets;
}
set
{
mSelectUserWidgets = value;
}
}
/// <summary>
/// Determines whether the tree selector will only display widgets available for group admin.
/// </summary>
public bool SelectGroupWidgets
{
get
{
return mSelectGroupWidgets;
}
set
{
mSelectGroupWidgets = value;
}
}
/// <summary>
/// Determines whether the tree selector will only display widgets available for inline.
/// </summary>
public bool SelectInlineWidgets
{
get
{
return mSelectInlineWidgets;
}
set
{
mSelectInlineWidgets = value;
}
}
/// <summary>
/// Determines whether the tree selector will only display widgets available for dashboard.
/// </summary>
public bool SelectDashboardWidgets
{
get
{
return mSelectDashboardWidgets;
}
set
{
mSelectDashboardWidgets = value;
}
}
#endregion
#region "Custom events"
/// <summary>
/// On selected item event handler.
/// </summary>
public delegate void ItemSelectedEventHandler(string selectedValue);
/// <summary>
/// On selected item event handler.
/// </summary>
public event ItemSelectedEventHandler OnItemSelected;
#endregion
#region "Page and other events"
/// <summary>
/// Page_Load event.
/// </summary>
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";
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, WidgetCategoryChildCount, ObjectLevel, CompleteChildCount, ObjectType";
// Build where condition
var currentUser = MembershipContext.AuthenticatedUser;
string securityWhere = String.Empty;
// Security where condition
if (!SelectGroupWidgets && !currentUser.IsGlobalAdministrator)
{
securityWhere = "(WidgetSecurity = 0)"; // Allowed for all
if (AuthenticationHelper.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;
}
else // Only Categories
{
categoryProvider.WhereCondition = "ObjectType = 'widgetcategory'";
categoryProvider.ChildCountColumn = "WidgetCategoryChildCount";
categoryProvider.ObjectTypeColumn = "";
// 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 = SqlHelper.AddWhereCondition(categoryProvider.WhereCondition, where + ")");
}
// Set up tree
treeElem.ProviderObject = categoryProvider;
if (SelectWidgets)
{
string script = "onclick=\"SelectNode(##NODEID##,'##OBJECTTYPE##', ##PARENTNODEID##);return false;\"";
treeElem.NodeTemplate = String.Format("<span id=\"##OBJECTTYPE##_##NODEID##\" {0} name=\"treeNode\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>", script);
treeElem.SelectedNodeTemplate = String.Format("<span id=\"##OBJECTTYPE##_##NODEID##\" {0} name=\"treeNode\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>", script);
}
else
{
treeElem.NodeTemplate = "<span onclick=\"SelectNode(##NODEID##, this);return false;\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
treeElem.DefaultItemTemplate = "<span onclick=\"SelectNode('recentlyused', this);return false;\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
treeElem.SelectedDefaultItemTemplate = "<span onclick=\"SelectNode('recentlyused', this);return false;\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
treeElem.SelectedNodeTemplate = "<span onclick=\"SelectNode(##NODEID##, this);return false;\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
ScriptHelper.RegisterJQuery(Page);
string js = "var selectedItem = $cmsj('.ContentTreeSelectedItem');" +
"function SelectNode(nodeid, sender){" +
"selectedItem.removeClass('ContentTreeSelectedItem'); " +
"selectedItem.addClass('ContentTreeItem');" +
"selectedItem = $cmsj(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", null);
}
// Setup event handler
treeElem.OnItemSelected += treeElem_OnItemSelected;
treeElem.OnNodeCreated += treeElem_OnNodeCreated;
}
/// <summary>
/// Page PreRender.
/// </summary>
protected void Page_PreRender(object sender, EventArgs e)
{
if (StopProcessing)
{
return;
}
// Load data
if (!RequestHelper.IsPostBack())
{
treeElem.ReloadData();
}
}
/// <summary>
/// Used for maxnodes in collapsed node.
/// </summary>
protected TreeNode treeElem_OnNodeCreated(DataRow itemData, TreeNode defaultNode)
{
if (UseMaxNodeLimit && (MaxTreeNodes > 0))
{
// 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 = "<span class=\"ContentTreeItem\" onclick=\"SelectNode(" + parentID + " ,'widgetcategory'," + parentParentID + ",true ); return false;\"><span class=\"Name\">" + GetString("general.seelisting") + "</span></span>";
return node;
}
if (indexMaxTreeNodes > MaxTreeNodes)
{
return null;
}
}
return defaultNode;
}
/// <summary>
/// On selected item event.
/// </summary>
/// <param name="selectedValue">Selected value</param>
protected void treeElem_OnItemSelected(string selectedValue)
{
if (OnItemSelected != null)
{
OnItemSelected(selectedValue);
}
}
#endregion
#region "Methods"
/// <summary>
/// Reloads the tree data.
/// </summary>
public override void ReloadData()
{
treeElem.ReloadData();
base.ReloadData();
}
#endregion
}