/********************************************************************
* FulcrumWeb RAD Framework - Fulcrum of your business *
* Copyright (c) 2002-2009 FulcrumWeb, ALL RIGHTS RESERVED *
* *
* THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED *
* FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE *
* COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE *
* AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT *
* AND PERMISSION FROM FULCRUMWEB. CONSULT THE END USER LICENSE *
* AGREEMENT FOR INFORMATION ON ADDITIONAL RESTRICTIONS. *
********************************************************************/
using System.Xml;
using Framework.Db;
using Framework.Utils;
namespace Framework.Metadata
{
public class CxFormCustomizer: CxCustomizerBase
{
//-------------------------------------------------------------------------
private CxWinFormMetadata m_Metadata;
private CxTabCustomizerList m_TabCustomizers;
private CxFormCustomizerData m_CurrentData;
private CxFormCustomizerData m_InitialData;
//-------------------------------------------------------------------------
public CxWinFormMetadata Metadata
{
get { return m_Metadata; }
set { m_Metadata = value; }
}
//-------------------------------------------------------------------------
public CxTabCustomizerList TabCustomizers
{
get { return m_TabCustomizers; }
set { m_TabCustomizers = value; }
}
//-------------------------------------------------------------------------
public CxFormCustomizerData CurrentData
{
get { return m_CurrentData; }
set { m_CurrentData = value; }
}
//-------------------------------------------------------------------------
public CxFormCustomizerData InitialData
{
get { return m_InitialData; }
set { m_InitialData = value; }
}
//-------------------------------------------------------------------------
public CxFormCustomizer(
CxCustomizationManager manager,
CxWinFormMetadata metadata)
{
Manager = manager;
Metadata = metadata;
Context = manager.Context;
TabCustomizers = new CxTabCustomizerList();
Initialize();
}
//-------------------------------------------------------------------------
public void Initialize()
{
InitializeTabCustomizers();
// Initializing the Current Data
CurrentData = new CxFormCustomizerData(this);
CurrentData.InitializeFromMetadata();
// Setting the current data as the initial one.
InitialData = CurrentData.Clone();
}
//-------------------------------------------------------------------------
/// <summary>
/// Initializes the tab customizers.
/// </summary>
protected void InitializeTabCustomizers()
{
TabCustomizers.Clear();
if (Metadata != null)
{
foreach (CxWinTabMetadata tab in Metadata.Tabs)
{
CxTabCustomizer tabCustomizer =
new CxTabCustomizer(Manager, this, tab);
tabCustomizer.Initialize();
TabCustomizers.Add(tabCustomizer);
}
}
}
//-------------------------------------------------------------------------
/// <summary>
/// Indicates whether the customizer has been modified somehow.
/// </summary>
/// <returns>true if modified, otherwise false</returns>
public bool GetIsModified()
{
bool result = !CurrentData.Compare(InitialData);
if (!result)
{
foreach (CxTabCustomizer tabCustomizer in TabCustomizers)
{
result |= tabCustomizer.GetIsModified();
if (result) break;
}
}
return result;
}
//-------------------------------------------------------------------------
public override bool ApplyToMetadata()
{
bool isChanged = base.ApplyToMetadata();
if (!CxList.CompareOrdered(
CurrentData.TabOrder.ToStringList(),
Metadata.GetTabOrderManager().Ids))
{
Metadata.GetTabOrderManager().SetCustomOrder(CurrentData.TabOrder.ToStringList());
isChanged |= true;
}
foreach (CxTabCustomizer tabCustomizer in TabCustomizers)
{
isChanged |= tabCustomizer.ApplyToMetadata();
}
return isChanged;
}
//-------------------------------------------------------------------------
/// <summary>
/// Saves customization data to the database.
/// </summary>
/// <param name="connection">database connection</param>
public void Save(CxDbConnection connection)
{
if (GetIsModified())
{
// First we should check if the tab order is different from the initial one.
if (!CxList.CompareOrdered(CurrentData.TabOrder, InitialData.TabOrder))
{
// Win forms management.
CxWinFormMetadata winForm = Metadata;
CxWinTabOrderManager tabManager = winForm.GetTabOrderManager();
bool isWinFormNonCustomState =
CxList.CompareOrdered(CurrentData.TabOrder.ToStringList(), tabManager.NonCustomIds);
if (!isWinFormNonCustomState)
DbInsertOrUpdateWinForm(connection);
}
}
foreach (CxTabCustomizer tabCustomizer in TabCustomizers)
{
tabCustomizer.Save(connection);
}
}
//-------------------------------------------------------------------------
/// <summary>
/// Resets the customizer to the metadata object default values.
/// </summary>
public override void ResetToDefault()
{
base.ResetToDefault();
// Tab Order
CxWinTabOrderManager orderManager = Metadata.GetTabOrderManager();
orderManager.ResetToDefaults();
CurrentData.TabOrder.Clear();
CxList.AddRange(
CurrentData.TabOrder, TabCustomizers.GetSublistBy(orderManager.Ids));
foreach (CxTabCustomizer tabCustomizer in TabCustomizers)
{
tabCustomizer.ResetToDefault();
}
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
#region Database related
//-------------------------------------------------------------------------
/// <summary>
/// Returns value provider for a data operation.
/// </summary>
/// <returns></returns>
protected IxValueProvider GetValueProvider()
{
CxHashtable provider = new CxHashtable();
provider["ApplicationCd"] = Metadata.Holder.ApplicationCode;
provider["MetadataObjectId"] = Metadata.Id;
provider["MetadataObjectTypeCd"] = "form";
CxXmlRenderedObject renderedObject = Metadata.RenderToXml(new XmlDocument(), true, null);
provider["MetadataContent"] = renderedObject.ToString();
return provider;
}
//-------------------------------------------------------------------------
/// <summary>
/// Deletes customization record from the DB table.
/// </summary>
protected void DbDeleteWinForm(CxDbConnection connection)
{
string sql =
@"delete from Framework_WinForms
where WinFormId = :WinFormId
and ApplicationCd = :ApplicationCd";
IxValueProvider provider = GetValueProvider();
connection.ExecuteCommand(sql, provider);
}
//-------------------------------------------------------------------------
/// <summary>
/// Stores the customized data into the database.
/// </summary>
/// <param name="connection">connection to be used</param>
protected void DbInsertOrUpdateWinForm(CxDbConnection connection)
{
string sql =
@"exec [p_Framework_MetadataCustomization_InsertOrUpdate]
@MetadataObjectId = :MetadataObjectId ,
@ApplicationCd = :ApplicationCd ,
@MetadataObjectTypeCd = :MetadataObjectTypeCd ,
@MetadataContent = :MetadataContent ";
IxValueProvider provider = GetValueProvider();
connection.ExecuteCommand(sql, provider);
}
//-------------------------------------------------------------------------
#endregion
//-------------------------------------------------------------------------
/// <summary>
/// Returns a <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
/// </summary>
/// <returns>
/// A <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
/// </returns>
/// <filterpriority>2</filterpriority>
public override string ToString()
{
return Metadata != null ? Metadata.ToString() : base.ToString();
}
//-------------------------------------------------------------------------
}
}