Click here to Skip to main content
15,895,786 members
Articles / Web Development / ASP.NET

Using Silverlight in Enterprise: RAD of User Friendly Database Access

Rate me:
Please Sign up or sign in to vote.
4.81/5 (19 votes)
31 Jul 2009CPOL8 min read 58.2K   7K   80  
This article introduces FulcrumWeb RAD Framework - A Silverlight UI Engine to build user friendly database driven applications
/********************************************************************
 *  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();
    }
    //-------------------------------------------------------------------------
  }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Ukraine Ukraine
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions