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
}