//PickColor Control 2004 Source Code....
using System;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;
namespace WMB.WebControls
{
[ToolboxBitmap(typeof(DropDownList)),
DefaultProperty("Text"),
ToolboxData("<{0}:ColorPick runat='server' />")]
public class ColorPick : Control, INamingContainer
{
// we need a textbox, a span and a table of which we can set or get properties
TextBox _TextBox = new TextBox();
Label _Label = new Label();
Table MainTable = new Table();
[Category("Data"),
Description("Set to true if you want to create the colortables serverside and send them to the browser."),
DefaultValue(false)]
public bool ShowColors
{
get
{
if (ViewState["ShowColors"] == null)
{
return false;//default value
}
else
{
return (bool)ViewState["ShowColors"];
}
}
set
{
if (value)
{
_Label.Style["visibility"] = "visible";
}
else
{
_Label.Style["visibility"] = "hidden";
}
MainTable.Visible = value;
ViewState["ShowColors"] = value;
}
}
[Category("Data"),
Description("Textbox text."),
DefaultValue("")]
public string Text
{
get
{
return _TextBox.Text;
}
set
{
Color c;
if (value.Trim() != "")
{
c = Color.FromName(value);
if (!c.IsKnownColor)
{
string hexvalue = Regex.Replace(value, "[^0-9a-fA-F]", "");
if (hexvalue.Length == 6)
{
c = ColorTranslator.FromHtml("#" + hexvalue);
value = ColorTranslator.ToHtml(c);
}
else
{
c = Color.White;
value = "#Error";
}
}
else
{
value = ColorTranslator.ToHtml(c);
}
}
else
{
c = Color.White;
}
if (c.GetBrightness() < 0.5)
{
_TextBox.Style["color"] = "white";
}
else
{
_TextBox.Style["color"] = "black";
}
_TextBox.Text = value;
_TextBox.Style["background-color"] = ColorTranslator.ToHtml(c);
}
}
protected override void OnInit(EventArgs e)
{
// set default visibility of the color tables
ShowColors = ShowColors;
//the textbox is added here in order to maintain viewstate
_TextBox.TextChanged += new EventHandler(TextBox_TextChanged);
_TextBox.AutoPostBack = true;
_TextBox.ID = "ColorField";
Controls.Add(_TextBox);
base.OnInit(e);
}
protected override void CreateChildControls()
{
//First we edit the main span
_Label.Style["position"] = "absolute";
_Label.ID = "ColorSpan";
//We need a table for layout and header
MainTable.Attributes.Add("style", "color:captiontext;background-color:threedface;border:2px threedhighlight outset;font-weight:bold;border-collapse:collapse;");
//this is our header row
TableRow MainTr = new TableRow();
MainTr.Style["background-color"] = "activecaption";
// this is the tablecell with the header text
TableCell MainTd = new TableCell();
MainTd.Style["padding-left"] = "5px";
MainTd.ColumnSpan = 2;
MainTd.HorizontalAlign = HorizontalAlign.Left;
MainTd.Text = "Colorpick 2004";
MainTr.Controls.Add(MainTd);
// this is tablecell with the closebutton
MainTd = new TableCell();
MainTd.HorizontalAlign = HorizontalAlign.Right;
// this is our closebutton
Button CloseButton = new Button();
CloseButton.Text = "x";
CloseButton.Attributes.Add("style", "font-weight:bold;width:20px;");
CloseButton.CausesValidation = false;
CloseButton.ToolTip = "Close";
CloseButton.Click += new EventHandler(ShowButton_Click);
// all add it to our layout table
MainTd.Controls.Add(CloseButton);
MainTr.Controls.Add(MainTd);
MainTable.Controls.Add(MainTr);
MainTr = new TableRow();
// lets create our colortables and add them to our maintable
Table ColorTable;
TableRow ColorTr = new TableRow();
TableCell ColorTd = new TableCell();
for (int i1 = 0; i1 <= 255; i1 += 51)
{
MainTd = new TableCell();
ColorTable = new Table();
for (int i2 = 0; i2 <= 255; i2 += 51)
{
ColorTr = new TableRow();
for (int i3 = 0; i3 <= 255; i3 += 51)
{
ColorTd = new TableCell();
Button ColorButton = new Button();
ColorButton.CssClass = "colorbutton";
Color c = Color.FromArgb(i1, i2, i3);
ColorButton.Style["background-color"] = ColorTranslator.ToHtml(c);
ColorButton.ToolTip = ColorButton.Style["background-color"];
ColorButton.CausesValidation = false;
ColorButton.Click += new EventHandler(ColorButton_Click);
ColorTd.Controls.Add(ColorButton);
ColorTr.Controls.Add(ColorTd);
}
ColorTable.Controls.Add(ColorTr);
}
MainTd.Controls.Add(ColorTable);
MainTr.Controls.Add(MainTd);
if (i1 == 102 || i1 == 255)
{
MainTable.Controls.Add(MainTr);
MainTr = new TableRow();
}
}
// add the table to _Label and _Label to control
_Label.Controls.Add(MainTable);
Controls.Add(_Label);
//let us create and add a button to show the colortables
Button ShowButton = new Button();
ShowButton.ID = "ShowButton";
ShowButton.Text = "...";
ShowButton.Style["width"] = "20px";
ShowButton.ToolTip = "Show colortables";
ShowButton.CausesValidation = false;
ShowButton.Click += new EventHandler(ShowButton_Click);
Controls.Add(ShowButton);
}
//here's three functions for the controls
private void ShowButton_Click(object sender, EventArgs e)
{
ShowColors = !ShowColors;
}
private void ColorButton_Click(object sender, EventArgs e)
{
this.Text = ((Button)sender).Style["background-color"];
ShowColors = false;
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
this.Text = _TextBox.Text;
}
//we need lots of javascript which we create on prerender
protected override void OnPreRender(EventArgs e)
{
//if we don't have the javascript in our page yet we'll get it out of cache... and if it's not there... we'll create it
if (!Page.IsClientScriptBlockRegistered("WMBColorPick"))
{
string ClientScript = (string)HttpContext.Current.Cache.Get("WMBColorPick");
if (ClientScript == null)
{
StringBuilder sb = new StringBuilder();
sb.Append("<style type=\"text/css\" media=\"screen\">\n");
sb.Append("\tinput.colorbutton {border-style:None;height:10px;width:10px;cursor:pointer;}\n<");
sb.Append("/style>\n");
sb.Append("\n");
sb.Append("<script language=\"JavaScript\" type=\"text/javascript\">\n");
sb.Append("\n");
sb.Append("function showbutton_click(elmnt){\n");
sb.Append("\telmnt=document.getElementById(elmnt);\n");
sb.Append("\tif(elmnt.style.visibility=='hidden'){\n");
sb.Append("\t\telmnt.style.visibility='visible';\n");
sb.Append("\t\t}\n");
sb.Append("\telse {\n");
sb.Append("\t\telmnt.style.visibility='hidden';\n");
sb.Append("\t}\n");
sb.Append("}\n");
sb.Append("\n");
sb.Append("function colorbutton_click(colorbutton, elmnt){\n");
sb.Append("\telmnt=document.getElementById(elmnt);\n");
sb.Append("\telmnt.style.backgroundColor=colorbutton.style.backgroundColor;\n");
sb.Append("\telmnt.value=colorbutton.title;\n");
sb.Append("\tvar bright = (parseInt(colorbutton.title.substr(1,2),16)+parseInt(colorbutton.title.substr(3,2),16)+parseInt(colorbutton.title.substr(5,2),16))/3;\n");
sb.Append("\tif(bright<=127){\n");
sb.Append("\t\telmnt.style.color = 'white';\n");
sb.Append("\t\t}\n");
sb.Append("\telse {\n");
sb.Append("\t\telmnt.style.color = 'black';\n");
sb.Append("\t}\n");
sb.Append("}\n");
sb.Append("\n");
sb.Append("function createcolortable(id){\n");
sb.Append("var spanid = id + '_ColorSpan';\n");
sb.Append("var textboxid = id + '_ColorField';\n");
sb.Append("var buttonid = id + '_ShowButton';\n");
sb.Append("\n");
sb.Append("mytable = document.createElement('TABLE');\n");
sb.Append("mytable.style.color='captiontext';\n");
sb.Append("mytable.style.backgroundColor='threedface';\n");
sb.Append("mytable.style.border='2px threedhighlight outset';\n");
sb.Append("mytable.style.fontWeight='bold';\n");
sb.Append("mytable.style.borderCollapse='collapse';\n");
sb.Append("\n");
sb.Append("mytablebody = document.createElement('TBODY');\n");
sb.Append("\n");
sb.Append("myrow=document.createElement('TR');\n");
sb.Append("myrow.style.backgroundColor='activecaption';\n");
sb.Append("\n");
sb.Append("mycell=document.createElement('TD');\n");
sb.Append("\n");
sb.Append("mycell.colSpan = '2';\n");
sb.Append("mycell.setAttribute('align','left');\n");
sb.Append("mycell.style.paddingLeft='5px';\n");
sb.Append("\n");
sb.Append("celltext=document.createTextNode('ColorPick 2004');\n");
sb.Append("mycell.appendChild(celltext);\n");
sb.Append("\n");
sb.Append("myrow.appendChild(mycell);\n");
sb.Append("\n");
sb.Append("mycell=document.createElement('TD');\n");
sb.Append("mycell.setAttribute('align','right');\n");
sb.Append("\n");
sb.Append("closebutton=document.createElement('INPUT');\n");
sb.Append("closebutton.type='submit';\n");
sb.Append("closebutton.value='x';\n");
sb.Append("closebutton.style.fontWeight='bold';\n");
sb.Append("closebutton.style.width='20px';\n");
sb.Append("closebutton['onclick']=new Function('showbutton_click(\"'+ spanid + '\"); return false');\n");
sb.Append("\n");
sb.Append("closebutton.setAttribute('title', 'Close');\n");
sb.Append("\n");
sb.Append("\n");
sb.Append("mycell.appendChild(closebutton);\n");
sb.Append("\n");
sb.Append("myrow.appendChild(mycell);\n");
sb.Append("\n");
sb.Append("mytablebody.appendChild(myrow);\n");
sb.Append("\n");
sb.Append("myrow=document.createElement('TR');\n");
sb.Append("\n");
sb.Append("for(i1=0;i1<6;i1++) {\n");
sb.Append("\tmycell=document.createElement('TD');\n");
sb.Append("\tmycolortable=document.createElement('TABLE');\n");
sb.Append("\tmycolortablebody=document.createElement('TBODY');\n");
sb.Append("\t\t\tfor (i2=0; i2<6; i2++ ){\n");
sb.Append("\t\t\t\tmycolorrow=document.createElement('TR');\n");
sb.Append("\t\t\t\t\tfor (i3=0; i3<6; i3++ ){\n");
sb.Append("\t\t\t\t\t\tmycolorcell=document.createElement('TD');\n");
sb.Append("\t\t\t\t\t\tcolorbutton=document.createElement('INPUT');\n");
sb.Append("\t\t\t\t\t\tcolorbutton.type='submit';\n");
sb.Append("\t\t\t\t\t\tcolorbutton.value='';\n");
sb.Append("\t\t\t\t\t\tcolorbutton.className = 'colorbutton' ;\n");
sb.Append("\t\t\t\t\t\tvar hexcolor = '#' + toHex(i1) + toHex(i2) + toHex(i3);\n");
sb.Append("\t\t\t\t\t\tcolorbutton.style.backgroundColor = hexcolor;\n");
sb.Append("\t\t\t\t\t\tcolorbutton.setAttribute('title', hexcolor);\n");
sb.Append("\t\t\t\t\t\tcolorbutton['onclick']=new Function('colorbutton_click(this,\"' + textboxid + '\"); return false');\n");
sb.Append("\t\t\t\t\t\tmycolorcell.appendChild(colorbutton);\n");
sb.Append("\t\t\t\t\t\tmycolorrow.appendChild(mycolorcell);\n");
sb.Append("\t\t\t\t\t}\n");
sb.Append("\t\t\t\tmycolortablebody.appendChild(mycolorrow);\n");
sb.Append("\t\t\t}\n");
sb.Append("\t\tmycolortable.appendChild(mycolortablebody);\n");
sb.Append("\t\tmycell.appendChild(mycolortable);\n");
sb.Append("\t\tmyrow.appendChild(mycell); \n");
sb.Append("\t\n");
sb.Append("\t\tif ( i1 == 2 || i1 == 5 )\n");
sb.Append("\t\t{\n");
sb.Append("\t\tmytablebody.appendChild(myrow);\n");
sb.Append("\t\tmyrow=document.createElement('TR');\n");
sb.Append("\t\t}\n");
sb.Append("}\n");
sb.Append("mytable.appendChild(mytablebody);\n");
sb.Append("var myspan = document.getElementById(spanid);\n");
sb.Append("myspan.appendChild(mytable);\n");
sb.Append("var showbutton = document.getElementById(buttonid);\n");
sb.Append("showbutton['onclick']=new Function('showbutton_click(\"'+ spanid + '\"); return false');\n");
sb.Append("}\n");
sb.Append("\n");
sb.Append("function toHex(i){\n");
sb.Append("\tswitch(i){\n");
sb.Append("\tcase 0: {return '00';}\n");
sb.Append("\tcase 1: {return '33';}\n");
sb.Append("\tcase 2: {return '66';}\n");
sb.Append("\tcase 3: {return '99';}\n");
sb.Append("\tcase 4: {return 'CC';}\n");
sb.Append("\tcase 5: {return 'FF';}\n");
sb.Append("\t}\n");
sb.Append("\treturn '00';\n");
sb.Append("}\n<");
sb.Append("/script>");
ClientScript = sb.ToString();
HttpContext.Current.Cache.Insert("WMBColorPick", ClientScript);
}
Page.RegisterClientScriptBlock("WMBColorPick", ClientScript);
}
//create the colortables on pageload if we don't create them serverside
if (!ShowColors)
{
StringBuilder sb2 = new StringBuilder();
sb2.Append("<script language=\"JavaScript\" type=\"text/javascript\">");
sb2.Append("createcolortable('" + this.ID + "')<");
sb2.Append("/script>");
Page.RegisterStartupScript(this.ID, sb2.ToString());
}
base.OnPreRender(e);
}
}
}