Click here to Skip to main content
15,895,142 members
Articles / Web Development / HTML

Build a Google IG like AJAX Start Page in 7 days using ASP.NET AJAX and .NET 3.0

Rate me:
Please Sign up or sign in to vote.
4.80/5 (325 votes)
10 Mar 2010CPOL38 min read 1.8M   7.8K   1.1K  
Build a Start Page similar to Google IG in 7 nights using ASP.NET AJAX, .NET 3.0, LINQ, DLinq, and XLinq.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;

using DashboardDataAccess;

public partial class WidgetContainer : System.Web.UI.UserControl, IWidgetHost
{
    public event Action<WidgetInstance> Deleted;

    public bool SettingsOpen
    {
        get 
        { 
            object val = ViewState[this.ClientID + "_SettingsOpen"];
            if( null == val ) return false;
            else return (bool)val;
        }
        set { ViewState[this.ClientID + "_SettingsOpen"] = value; }
    }

    private WidgetInstance _WidgetInstance;

    public WidgetInstance WidgetInstance
    {
        get { return _WidgetInstance; }
        set { _WidgetInstance = value; }
    }
	
    private IWidget _WidgetRef;

    private bool _IsFirstLoad;

    public bool IsFirstLoad
    {
        get { return _IsFirstLoad; }
        set { _IsFirstLoad = value; }
    }
	

    protected void Page_Load(object sender, EventArgs e)
    {
        WidgetTitle.Text = this.WidgetInstance.Title;
        this.SetExpandCollapseButtons();        
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        var widget = LoadControl(this.WidgetInstance.Widget.Url);
        
        widget.ID = "Widget" + this.WidgetInstance.Id.ToString();
        
        //WidgetBodyUpdatePanel.ContentTemplateContainer.Controls.Add(widget);
        WidgetBodyPanel.Controls.Add(widget);
        this._WidgetRef = widget as IWidget;
        this._WidgetRef.Init(this);
    }

    private void SetExpandCollapseButtons()
    {
        if (!this.WidgetInstance.Expanded)
        {
            ExpandWidget.Visible = true;
            CollapseWidget.Visible = false;
            WidgetBodyPanel.Visible = false;            
        }
        else
        {
            ExpandWidget.Visible = false;
            CollapseWidget.Visible = true;
            WidgetBodyPanel.Visible = true;
        }
    }

    protected void EditWidget_Click(object sender, EventArgs e)
    {
        if( this.SettingsOpen )
        {
            this.SettingsOpen = false;
            this._WidgetRef.HideSettings();
            EditWidget.Visible = true;
            CancelEditWidget.Visible = false;
        }
        else
        {
            this.SettingsOpen = true;
            this._WidgetRef.ShowSettings();
            (this as IWidgetHost).Maximize();
            EditWidget.Visible = false;
            CancelEditWidget.Visible = true;
        }

        WidgetBodyUpdatePanel.Update();
    }

    protected void CollapseWidget_Click(object sender, EventArgs e)
    {
        (this as IWidgetHost).Minimize();
    }

    protected void ExpandWidget_Click(object sender, EventArgs e)
    {
        (this as IWidgetHost).Maximize();
    }

    protected void CloseWidget_Click(object sender, EventArgs e)
    {
        // Inject script which removes the controls and behaviors from the client side for this widget
        this._WidgetRef.Closed();
        (this as IWidgetHost).Close();        
    }

    protected void SaveWidgetTitle_Click(object sender, EventArgs e)
    {
        WidgetTitleTextBox.Visible = SaveWidgetTitle.Visible = false;
        WidgetTitle.Visible = true;
        WidgetTitle.Text = WidgetTitleTextBox.Text;

        DatabaseHelper.Update<WidgetInstance>(this.WidgetInstance, delegate(WidgetInstance wi)
        {
            wi.Title = WidgetTitleTextBox.Text;
        });
    }

    protected void WidgetTitle_Click(object sender, EventArgs e)
    {
        WidgetTitleTextBox.Text = this.WidgetInstance.Title;
        WidgetTitleTextBox.Visible = true;
        SaveWidgetTitle.Visible = true;
        WidgetTitle.Visible = false;
    }

    protected void CancelEditWidget_Click(object sender, EventArgs e)
    {

    }


    void IWidgetHost.Maximize()
    {
        DatabaseHelper.Update<WidgetInstance>(this.WidgetInstance, delegate(WidgetInstance i)
        {
            i.Expanded = true;
        });

        this.SetExpandCollapseButtons();
        this._WidgetRef.Maximized();

        WidgetBodyUpdatePanel.Update();
        WidgetHeaderUpdatePanel.Update();
    }

    void IWidgetHost.Minimize()
    {
        DatabaseHelper.Update<WidgetInstance>(this.WidgetInstance, delegate(WidgetInstance i)
        {
            i.Expanded = false;
        });
        
        this.SetExpandCollapseButtons();
        this._WidgetRef.Minimized();

        WidgetBodyUpdatePanel.Update();        
        WidgetHeaderUpdatePanel.Update();
    }

    void IWidgetHost.Close()
    {
        Deleted(this.WidgetInstance);        
    }

    public override void RenderControl(HtmlTextWriter writer)
    {
        writer.AddAttribute("InstanceId", this.WidgetInstance.Id.ToString());
        base.RenderControl(writer);
    }

    void IWidgetHost.SaveState(string state)
    {
        DatabaseHelper.Update<WidgetInstance>(this.WidgetInstance, delegate(WidgetInstance i)
        {
            i.State = state;
        });
    }

    string IWidgetHost.GetState()
    {
        return this.WidgetInstance.State;
    }

    bool IWidgetHost.IsFirstLoad
    {
        get
        {
            return this.IsFirstLoad;
        }
    }
}

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
Architect BT, UK (ex British Telecom)
United Kingdom United Kingdom

Comments and Discussions