using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI.WebControls;
using System.Collections;
using CMS.CMSHelper;
using CMS.EmailEngine;
using CMS.ExtendedControls;
using CMS.FormEngine;
using CMS.GlobalHelper;
using CMS.LicenseProvider;
using CMS.PortalEngine;
using CMS.Scheduler;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.WebFarmSync;
using CMS.WorkflowEngine;
public partial class CMSModules_AdminControls_Controls_ObjectRelationships_ObjectRelationships : CMSUserControl
{
#region "Private fields"
///
/// Table of the registered object types [objectType -> true]
///
private Hashtable registeredObjects = new Hashtable();
private TranslationHelper th = null;
private bool loaded = false;
private GeneralizedInfo mObject = null;
private GeneralizedInfo mRelatedObject = null;
private string mObjectType = null;
private int mObjectID = -1;
private string[] mObjectTypes = null;
#endregion
#region "Private properties"
///
/// Returns true if the left side is active.
///
private bool ActiveLeft
{
get
{
return ValidationHelper.GetBoolean(ViewState["ActiveLeft"], false);
}
set
{
ViewState["ActiveLeft"] = value;
}
}
///
/// Collection of available object types.
///
private string[] ObjectTypes
{
get
{
if (mObjectTypes == null)
{
return mObjectTypes =
new string[]
{
FormObjectType.BIZFORM,
PredefinedObjectType.NEWSLETTER,
PredefinedObjectType.NEWSLETTERISSUE,
PredefinedObjectType.NEWSLETTERSUBSCRIBER,
PredefinedObjectType.NEWSLETTERTEMPLATE,
PredefinedObjectType.FORUMGROUP,
PredefinedObjectType.FORUM,
SiteObjectType.ROLE,
SchedulerObjectType.SCHEDULEDTASK,
EmailObjectType.EMAILTEMPLATE,
WorkflowObjectType.WORKFLOWSCOPE,
PredefinedObjectType.ORDER,
PredefinedObjectType.SHIPPINGOPTION,
PredefinedObjectType.PAYMENTOPTION,
PredefinedObjectType.POLL,
PredefinedObjectType.REPORTCATEGORY,
PredefinedObjectType.REPORT,
SiteObjectType.USER,
SiteObjectType.SITE,
WebFarmObjectType.WEBFARMSERVER,
SiteObjectType.CSSSTYLESHEET,
SiteObjectType.COUNTRY,
SiteObjectType.CULTURE,
SiteObjectType.DOCUMENTTYPE,
EmailObjectType.EMAILTEMPLATE,
SiteObjectType.FORMUSERCONTROL,
SiteObjectType.INLINECONTROL,
SiteObjectType.RESOURCE,
PortalObjectType.PAGELAYOUT,
PortalObjectType.PAGETEMPLATE,
SiteObjectType.RELATIONSHIPNAME,
SiteObjectType.UICULTURE,
PortalObjectType.WEBPARTCONTAINER,
PortalObjectType.WEBPART,
LicenseObjectType.LICENSEKEY,
PredefinedObjectType.CUSTOMER,
PredefinedObjectType.SKU,
PredefinedObjectType.OPTIONCATEGORY,
PredefinedObjectType.MANUFACTURER,
PredefinedObjectType.SUPPLIER,
PredefinedObjectType.DISCOUNTCOUPON,
PredefinedObjectType.DISCOUNTLEVEL,
PredefinedObjectType.DEPARTMENT,
PredefinedObjectType.TAXCLASS,
PredefinedObjectType.CURRENCY,
PredefinedObjectType.EXCHANGETABLE,
PredefinedObjectType.ORDERSTATUS,
PredefinedObjectType.PUBLICSTATUS,
PredefinedObjectType.INTERNALSTATUS
};
}
return mObjectTypes;
}
}
#endregion
#region "Public properties"
///
/// Current object.
///
public GeneralizedInfo Object
{
get
{
if (mObject == null)
{
mObject = CMSObjectHelper.GetObjectById(ObjectType, ObjectID);
}
return mObject;
}
}
///
/// Related object type.
///
public GeneralizedInfo RelatedObject
{
get
{
if (mRelatedObject == null)
{
string selected = drpRelatedObjType.SelectedValue;
if (!String.IsNullOrEmpty(selected))
{
mRelatedObject = CMSObjectHelper.GetReadOnlyObject(selected);
}
}
return mRelatedObject;
}
}
///
/// Type of the current object.
///
public string ObjectType
{
get
{
return mObjectType;
}
set
{
mObjectType = value;
}
}
///
/// ID of the current object.
///
public int ObjectID
{
get
{
return mObjectID;
}
set
{
mObjectID = value;
}
}
#endregion
#region "Page events"
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
LoadData();
}
protected override void OnPreRender(EventArgs e)
{
int selectedSiteId = ValidationHelper.GetInteger(siteSelector.Value, 0);
pnlNew.Visible = (!pnlSite.Visible || (selectedSiteId >= 0)) && (RelatedObject != null);
string safeObjectType = null;
string activeType = null;
string currentType = null;
// Initialize form labels
if (Object != null)
{
safeObjectType = Object.ObjectType.Replace(".", "_");
currentType = " (" + GetString("ObjectType." + safeObjectType) + ")";
}
if (RelatedObject != null)
{
safeObjectType = RelatedObject.ObjectType.Replace(".", "_");
activeType = " (" + GetString("ObjectType." + safeObjectType) + ")";
}
// Setup link texts
imgNewRelationship.ImageUrl = GetImageUrl("CMSModules/CMS_Content/Properties/addrelationship.png");
lnkNewRelationship.Text = GetString("ObjRelationship.New");
if (pnlAddNew.Visible)
{
btnSwitchSides.Text = GetString("Relationship.SwitchSides");
btnOk.Text = GetString("General.Save");
btnAnother.Text = GetString("General.SaveAndAnother");
btnCancel.Text = GetString("General.Cancel");
leftCell.Text = GetString("ObjRelationship.LeftSide");
rightCell.Text = GetString("ObjRelationship.RightSide");
middleCell.Text = GetString("Relationship.RelationshipName");
// Handle the active items
if (ActiveLeft)
{
leftCell.Text += activeType;
rightCell.Text += currentType;
selLeftObj.Visible = true;
lblLeftObj.Visible = false;
selRightObj.Visible = false;
lblRightObj.Visible = true;
}
else
{
leftCell.Text += currentType;
rightCell.Text += activeType;
selLeftObj.Visible = false;
lblLeftObj.Visible = true;
selRightObj.Visible = true;
lblRightObj.Visible = false;
}
}
else
{
if (!loaded)
{
gridItems.ReloadData();
}
}
base.OnPreRender(e);
}
public void LoadData()
{
if (!RequestHelper.IsPostBack())
{
// Initialize controls
SetupControl();
}
// Init events
gridItems.OnAction += gridItems_OnAction;
gridItems.OnBeforeDataReload += gridItems_OnBeforeDataReload;
gridItems.WhereCondition = GetWhereCondition(drpRelatedObjType.SelectedItem != null ? drpRelatedObjType.SelectedItem.Value : null);
// Init site selector
siteSelector.OnSelectionChanged += siteSelector_OnSelectionChanged;
siteSelector.DropDownSingleSelect.AutoPostBack = true;
siteSelector.SpecialFields = new string[,]
{
{ GetString("general.selectall"), "-1" },
{ GetString("general.globalobjects"), "0" }
};
// Display items that are available
if (pnlAddNew.Visible)
{
DisplayAvailableItems();
}
ControlsHelper.RegisterPostbackControl(btnOk);
ControlsHelper.RegisterPostbackControl(btnCancel);
}
#endregion
#region "Grid view handling"
protected void gridItems_OnAction(string actionName, object actionArgument)
{
switch (actionName.ToLowerCSafe())
{
case "delete":
// Look for info on relationship being removed
int leftObjId = ValidationHelper.GetInteger(Request.Params["leftObjId"], -1);
string leftObjType = ValidationHelper.GetString(Request.Params["leftObjType"], "");
int relationshipId = ValidationHelper.GetInteger(Request.Params["relationshipId"], -1);
int rightObjId = ValidationHelper.GetInteger(Request.Params["rightObjId"], -1);
string rightObjType = ValidationHelper.GetString(Request.Params["rightObjType"], "");
// Remove the relationship if all the necessary information available
if ((leftObjId > -1) && (leftObjType.Trim() != "") && (relationshipId > -1) && (rightObjId > -1) && (rightObjType.Trim() != ""))
{
ObjectRelationshipInfoProvider.RemoveRelationship(leftObjId, leftObjType, rightObjId, rightObjType, relationshipId);
}
// Reload the data
gridItems.ReloadData();
break;
}
}
#endregion
#region "Event handlers"
///
/// Refreshes the selection of site.
///
protected void RefreshNewSiteSelection()
{
if (RelatedObject != null)
{
if ((RelatedObject.SiteIDColumn != TypeInfo.COLUMN_NAME_UNKNOWN) && (CMSObjectHelper.GetSiteBindingObject(RelatedObject) == null))
{
pnlSite.Visible = true;
siteSelector_OnSelectionChanged(null, null);
}
else
{
pnlSite.Visible = false;
}
}
}
protected void lnkNewRelationship_Click(object sender, EventArgs e)
{
// Hide and disable unused controls
pnlEditList.Visible = false;
pnlAddNew.Visible = true;
RefreshNewSiteSelection();
// Initialize drop-down list with available relationship types
DisplayAvailableRelationships();
// Initialize drop=down list with available relationship items
DisplayAvailableItems();
// Supply the current object name
lblLeftObj.Text = Object.ObjectDisplayName;
lblRightObj.Text = Object.ObjectDisplayName;
}
protected void btnSwitchSides_Click(object sender, EventArgs e)
{
bool newActiveLeft = !ActiveLeft;
if (newActiveLeft)
{
selLeftObj.Value = selRightObj.Value;
}
else
{
selRightObj.Value = selLeftObj.Value;
}
ActiveLeft = newActiveLeft;
// Display the items that are available
DisplayAvailableItems();
}
protected void drpRelatedObjType_SelectedIndexChanged(object sender, EventArgs e)
{
RefreshNewSiteSelection();
}
protected void btnAnother_Click(object sender, EventArgs e)
{
// Add the relationship between objects
if (AddRelationship())
{
string safeObjectType = RelatedObject.ObjectType.Replace(".", "_");
string activeType = GetString("ObjectType." + safeObjectType);
string name = ActiveLeft ? selLeftObj.DropDownSingleSelect.SelectedItem.Text : selRightObj.DropDownSingleSelect.SelectedItem.Text;
lblInfo.Text = String.Format(ResHelper.GetString("Relationship.Saved"), activeType, name);
lblInfo.Visible = true;
}
}
protected void btnOk_Click(object sender, EventArgs e)
{
// Add the relationship between objects
if (AddRelationship())
{
// Load the list dialog
pnlEditList.Visible = true;
pnlAddNew.Visible = false;
drpRelatedObjType.Enabled = true;
// Reload the data
gridItems.ReloadData();
}
}
protected void btnCancel_Click(object sender, EventArgs e)
{
// Load the list dialog
pnlEditList.Visible = true;
pnlAddNew.Visible = false;
drpRelatedObjType.Enabled = true;
// Reload the data
gridItems.ReloadData();
}
///
/// Handles site selection change event.
///
protected void siteSelector_OnSelectionChanged(object sender, EventArgs e)
{
// If the new relationship is being added
if (pnlAddNew.Visible)
{
DisplayAvailableItems();
}
else
{
// Reload the data
gridItems.ReloadData();
}
}
#endregion
#region "Private methods"
///
/// Reloads the data for the UniGrid control displaying the objects related to the current object.
///
private void gridItems_OnBeforeDataReload()
{
loaded = true;
registeredObjects.Clear();
// Prepare the translations table
th = new TranslationHelper();
th.UseDisplayNameAsCodeName = true;
}
///
/// Inserts the new relationship according the selected values.
///
private bool AddRelationship()
{
if (ObjectID > 0)
{
if (drpRelationship.SelectedItem == null)
{
lblError.Text = GetString("ObjRelationship.MustSelect");
lblError.Visible = true;
return false;
}
// Get information on type of the selected relationship
int selectedRelationshipId = ValidationHelper.GetInteger(drpRelationship.SelectedItem.Value, -1);
string selectedObjType = null;
// If the main objectis on the left side selected object is taken from rifht drop-down list
bool currentOnLeft = !ActiveLeft;
int selectedObjId = currentOnLeft ? ValidationHelper.GetInteger(selRightObj.Value, -1) : ValidationHelper.GetInteger(selLeftObj.Value, -1);
// Get information on type of the selected object
selectedObjType = drpRelatedObjType.SelectedItem.Value;
// If all the necessary information are present
if ((selectedObjId <= 0) || (selectedRelationshipId <= 0) || (selectedObjType == null))
{
lblError.Text = GetString("ObjRelationship.MustSelect");
lblError.Visible = true;
return false;
}
if (currentOnLeft)
{
ObjectRelationshipInfoProvider.AddRelationship(ObjectID, ObjectType, selectedObjId, selectedObjType, selectedRelationshipId);
return true;
}
else
{
ObjectRelationshipInfoProvider.AddRelationship(selectedObjId, selectedObjType, ObjectID, ObjectType, selectedRelationshipId);
return true;
}
}
return false;
}
///
/// Initializes the control properties.
///
private void SetupControl()
{
// Information on current object supplied
if ((ObjectID != 0) && (ObjectType != null))
{
// Fill in the available objects into the filter
DisplayAvailableObjects();
}
else
{
lblError.Visible = true;
lblError.Text = "[ObjectRelationships.ascx] SetupControl()- ObjectID or ObjectType wasn't initialized.";
}
}
///
/// Gets the where condition for the selected object type.
///
/// Selected object type
public string GetWhereCondition(string selectedObjectType)
{
if (Object != null)
{
string where = null;
if (RelatedObject != null)
{
// Get the site name
if ((RelatedObject.SiteIDColumn != TypeInfo.COLUMN_NAME_UNKNOWN) && (CMSObjectHelper.GetSiteBindingObject(RelatedObject) == null))
{
if (siteSelector.DropDownSingleSelect.Items.Count == 0)
{
siteSelector.Value = CMSContext.CurrentSiteID;
}
if (siteSelector.HasData)
{
// Set the site name for registration
int selectedSiteId = ValidationHelper.GetInteger(siteSelector.Value, 0);
if (selectedSiteId >= 0)
{
string siteWhere = QueryProvider.GetQuery(RelatedObject.ObjectType + ".selectall", RelatedObject.IDColumn, SqlHelperClass.GetSiteIDWhereCondition(RelatedObject.SiteIDColumn, selectedSiteId), null, 0);
// Where condition for the left object
string rightWhere = ObjectRelationshipInfoProvider.GetWhereCondition(ObjectID, ObjectType, 0, false, true, selectedObjectType);
rightWhere += " AND RelationshipLeftObjectID IN (" + siteWhere + ")";
// Where condition for the left object
string leftWhere = ObjectRelationshipInfoProvider.GetWhereCondition(ObjectID, ObjectType, 0, true, false, selectedObjectType);
leftWhere += " AND RelationshipRightObjectID IN (" + siteWhere + ")";
// --- Add site conditions here
where = SqlHelperClass.AddWhereCondition(leftWhere, rightWhere, "OR");
}
}
}
}
if (String.IsNullOrEmpty(where))
{
// Get using regular where
where = ObjectRelationshipInfoProvider.GetWhereCondition(ObjectID, ObjectType, 0, true, true, selectedObjectType);
}
return where;
}
return null;
}
///
/// Fills the given drop-down list with the available relationship types.
///
private void DisplayAvailableRelationships()
{
if (drpRelationship.Items.Count == 0)
{
// Get the relationships from DB
DataSet ds = RelationshipNameInfoProvider.GetAllRelationshipNames(CMSContext.CurrentSite.SiteID, "RelationshipAllowedObjects LIKE '%;##OBJECTS##;%'");
if (!DataHelper.DataSourceIsEmpty(ds))
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
drpRelationship.Items.Add(new ListItem(dr["RelationshipDisplayName"].ToString(), dr["RelationshipNameID"].ToString()));
}
drpRelationship.Enabled = true;
}
else
{
drpRelationship.Items.Add(new ListItem(GetString("General.NoneAvailable"), ""));
drpRelationship.Enabled = false;
}
}
}
///
/// Fills given drop-down list with the items of particular type.
///
private void DisplayAvailableItems()
{
if (RelatedObject != null)
{
// Prepare the site where
string where = null;
if (RelatedObject.SiteIDColumn != TypeInfo.COLUMN_NAME_UNKNOWN)
{
int selectedSiteId = -1;
// Add where
if (CMSObjectHelper.GetSiteBindingObject(RelatedObject) == null)
{
selectedSiteId = ValidationHelper.GetInteger(siteSelector.Value, -1);
}
if (selectedSiteId == 0)
{
where = RelatedObject.SiteIDColumn + " IS NULL";
}
else
{
where = RelatedObject.SiteIDColumn + " = " + selectedSiteId;
}
}
// Load the object selectors
if (ActiveLeft)
{
// Active left selector
selLeftObj.Enabled = true;
selLeftObj.ObjectType = RelatedObject.ObjectType;
selLeftObj.WhereCondition = where;
selLeftObj.Reload(true);
if (!selLeftObj.HasData)
{
selLeftObj.DropDownSingleSelect.Items.Add(new ListItem(GetString("General.NoneAvailable"), ""));
selLeftObj.Enabled = false;
}
}
else
{
// Active right selector
selRightObj.Enabled = true;
selRightObj.ObjectType = RelatedObject.ObjectType;
selRightObj.WhereCondition = where;
selRightObj.Reload(true);
if (!selRightObj.HasData)
{
selRightObj.DropDownSingleSelect.Items.Add(new ListItem(GetString("General.NoneAvailable"), ""));
selRightObj.Enabled = false;
}
}
}
}
///
/// Fills given drop-down list with the available object types.
///
private void DisplayAvailableObjects()
{
// For each type of available objects create a new item and insert it to the list
if (ObjectTypes != null)
{
// All selection
ListItem li = new ListItem(ResHelper.GetString("General.SelectAnything"), "");
drpRelatedObjType.Items.Add(li);
SortedDictionary types = new SortedDictionary();
// Prepare the list of items
foreach (string objType in ObjectTypes)
{
types[GetString("ObjectTasks." + objType.Replace(".", "_").Replace("#", "_"))] = objType;
}
// Fill in the list
foreach (KeyValuePair item in types)
{
string objType = item.Value;
li = new ListItem(item.Key, objType);
drpRelatedObjType.Items.Add(li);
// Preselect the same object type as the main object if available
if (!RequestHelper.IsPostBack() && objType.EqualsCSafe(ObjectType, true))
{
li.Selected = true;
}
}
drpRelatedObjType.DataBind();
}
}
#endregion
}