Color Picker Control: Example of Color Picker Built in a Dialog via JavaScript

YAHOO.widget.ColorPickerを、YAHOO.widget.Dialogをコンテナとして入れるExample。
ColorPickerは、先のButtonのところで出てきた(「Button Control: Color Picker Button」を参照)が、ボタンに仕込んだり、今回のようにDialogに仕込んだりするのが普通だろう(CalendarPickerも同様だと思う)。

ボタンに仕込んだ際には、YUI.widget.Buttonが、YUI.widget.Overlay(か、その子孫の)インスタンスをmenu属性として持てることを利用して、コンテナを作り、そこへColorPickerを入れるという戦略だった。

今回のサンプルでは、ColorPickerをインスタンス化する際に、コンテナとしてYUI.widget.Panel(か、その子孫の)インスタンスを指定できることを利用して、DialogをレンダリングするイベントでColorPickerを忍び込ませる、という戦略となっている。

画面は、サンプルでColorPickerを開き、青系の色を選択したときの画面である。

このコントロール画面のうち、以下の4項目は画面の表示項目を変更するボタンで、これはColorPickerの属性値を切り替えることで実現される。

Show/hide HSV fields HSV表現を表示する(初期値は非表示)
Show/hide HEX field 6桁のRGBのHexa表現を表示する(初期値は表示)
Show/hide RGB field RGB表現を表示する。(初期値は表示)
Show/hide HEX summary info RGB表現の右脇にHexa(2桁)を表示する(初期値は非表示)

Dialogボックスであるので、Connection Managerを経由して、サーバーにSubmitをすることが前提となっている(「Container Family: Dialog Quickstart Example」を参照)。

サンプリングでは、この「Container Family: Dialog Quickstart Example」で使ったPHPプログラム(添付のソースで、"ajax_yui_container_dialog_quickstart.php"となっている)をつかった。
上の画面をSubmitしたときの画面が以下。

POSTした属性名と値がリスト化されて戻ってくるようになっている。

また、YUIのExampleでは、Loggerが使われることになっているが、画面中に追記していくこととした。

以下にJavascriptを含むHTMLの全文を示す。
YUIのExampleが(珍しく)モジュール・パターンできれいに書かれているので、コードの変更は(上記の変更を除き)注記の訳と追記をする程度に留めた。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</TITLE>

<style type="text/css">
body {
	margin:0;
	padding:0;
}
</style>

<link rel="stylesheet" type="text/css" href="scripts/yui/slider/assets/skins/sam/slider.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/container/assets/skins/sam/container.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/colorpicker/assets/skins/sam/colorpicker.css" />
<script type="text/javascript" src="scripts/yui/utilities/utilities.js"></script>
<script type="text/javascript" src="scripts/yui/container/container-min.js"></script>
<script type="text/javascript" src="scripts/yui/slider/slider-min.js"></script>
<script type="text/javascript" src="scripts/yui/colorpicker/colorpicker-min.js"></script>

<style type="text/css" id="defaultstyle">
#container {
	margin: 2px;
	padding: 3px;
	width: 400px;
	height: auto;
	border:1px dashed #999999;
}
#resp { 
/*	font-family:courier; */
	margin:10px;
	padding:5px;
	border:1px solid #ccc;
	background:#fff;
}
#yui-picker-panel {
	visibility:hidden;
}
</style>

<script type="text/javascript">
YAHOO.namespace("EGP")
 
//YAHOO.example.colorpickerモジュールにオブジェクトを追加する。
YAHOO.EGP.inDialog = function() {
 
	//Aliasの定義
	var Event=YAHOO.util.Event,
		Dom=YAHOO.util.Dom,
		lang=YAHOO.lang;
 
	return {
	
        init: function() {
 
            // Dialogをインスタンス化する。
            this.dialog = new YAHOO.widget.Dialog("yui-picker-panel", { 
				width : "500px",
				close: true,
				fixedcenter : true,
				visible : false, 
				constraintoviewport : true,
				buttons : [ { text:"Submit", handler:this.handleSubmit, isDefault:true },
					{ text:"Cancel", handler:this.handleCancel } ]
             });
 
			// Dialogがレンダリングされるタイミングで、ColorPickerのインスタンスを作成してDialogのボディーにいれる。
            this.dialog.renderEvent.subscribe(function() {
                // ColorPickerが作られてなければ、dialogをコンテナにして作成する。
				if (!this.picker) {
					 Dom.get('log').innerHTML+='<hr/>ColorPickerのインスタンス化が終了しました。<br/>';
					this.picker = new YAHOO.widget.ColorPicker("yui-picker", {
						// containerはPanelとその子孫を指定できる(APIドキュメント)
						container: this.dialog,
						images: {
							PICKER_THUMB: "scripts/yui/colorpicker/assets/picker_thumb.png",
							HUE_THUMB: "scripts/yui/colorpicker/assets/hue_thumb.png"
						}
						//Here are some other configurations we could use for our Picker:
						//showcontrols: false,  // default is true, false hides the entire set of controls
						//showhexcontrols: true, // default is false
						//showhsvcontrols: true  // default is false
					});
 
					//listen to rgbChange to be notified about new values
					this.picker.on("rgbChange", function(o) {
         				 Dom.get('log').innerHTML+='<hr/>RBGが変更されました。<br/>次はオブジェクトダンプ'+
						 					lang.dump(o)+'<br/>';
					});
				}
			});	
			
			// DialogにValidationを持たせたければ書く。
            this.dialog.validate = function() {
				return true;
            };
 
            // Connection Managerのハンドラ
            this.dialog.callback = { 
                    success: this.handleSuccess, 
                    failure: this.handleFailure 
            };
            
            // 全てセットアップが終わったので、Dialogをレンダリングする。
            this.dialog.render();
			
			// We can wrap up initialization by wiring all of the buttons in our
			// button dashboard to selectively show and hide parts of the
			// Color Picker interface.  Remember that "Event" here is an
			// alias for YAHOO.util.Event and "Event.on" is therfor a shortcut
			// for YAHOO.util.Event.onAvailable -- the standard Dom event attachment
			// method:
	    
            // おのおののボタンにclickイベントのハンドラを仕込む。
            Event.on("show", "click", this.dialog.show, this.dialog, true);
            Event.on("hide", "click", this.dialog.hide, this.dialog, true);
            Event.on("btnhsv", "click", function(e) {
                        var p = this.picker;
                        // set(a,b)はa属性をbにするという意味。YAHOO.util.AttributeProviderに由来。
                        // 下の書き方でtoggleボタンとなっている。
                        p.set(p.OPT.SHOW_HSV_CONTROLS, !p.get(p.OPT.SHOW_HSV_CONTROLS));
                    }, this.dialog, true);
            Event.on("btnhex", "click", function(e) {
                        var p = this.picker;
                        p.set(p.OPT.SHOW_HEX_CONTROLS, !p.get(p.OPT.SHOW_HEX_CONTROLS));
                    }, this.dialog, true);
            Event.on("btnrgb", "click", function(e) {
                        var p = this.picker;
                        p.set(p.OPT.SHOW_RGB_CONTROLS, !p.get(p.OPT.SHOW_RGB_CONTROLS));
                    }, this.dialog, true);
            Event.on("btnhexsummary", "click", function(e) {
                        var p = this.picker;
                        p.set(p.OPT.SHOW_HEX_SUMMARY, !p.get(p.OPT.SHOW_HEX_SUMMARY));
                    }, this.dialog, true);
			
			//initialization complete:
		 	Dom.get('log').innerHTML+='<hr/>初期処理が終了しました。<br/>';
 
		},
		
		//ダイアログでsubmitボタンが押されたときのハンドラ
		handleSubmit: function() {
			//ダイアログをsubmitする(POSTメソッドになる)。thisはDialogインスタンス。
			this.submit();
		 	Dom.get('log').innerHTML+='<hr/>Dialogがsubmitされました。<br/>';
		},
 
		//ダイアログでcancelボタンが押されたときのハンドラ
		handleCancel: function() {
			//thisはDialogインスタンス。Cancelメソッドが呼ばれるとDialogは自動的に消える。
			this.cancel();
		 	Dom.get('log').innerHTML+='<hr/>Dialogがcancelされました。<br/>';
		},
		
		//ダイアログをConnection Manager経由で、submitしたときのsuccessのハンドラ。
		handleSuccess: function(o) {
		 	Dom.get('log').innerHTML+='<hr/>Connection Managerの処理が正常に終了しました。<br/>';
			var response = o.responseText;
			//On Yahoo servers, we may get some page stamping;
			//we can trim off the trailing comment:
			response = response.split("<!")[0]; 
			response = "<strong>サーバーからのレスポンスは次の通りです:</strong> " + response;
			document.getElementById("resp").innerHTML = response;
		},

		//ダイアログをConnection Manager経由で、submitしたときのsuccessのハンドラ。
		handleFailure: function(o) { 
		 	Dom.get('log').innerHTML+='<hr/>Connection Managerの処理が失敗しました。<br/>';
		}
	}; 
}(); 
	
YAHOO.util.Event.onDOMReady(
		YAHOO.EGP.inDialog.init, 
		YAHOO.EGP.inDialog, 
		true
);

</script>
</HEAD>

<BODY class="yui-skin-sam">
<div id="container">
<p>
ColorPickerをDialogに埋め込むサンプルです。
</p>
<div> 
  <button id="show">Show Color Picker</button> 
  <button id="hide">Hide Color Picker</button> 
  <button id="btnhsv">Show/hide HSV fields</button> 
  <button id="btnhex">Show/hide HEX field</button> 
  <button id="btnrgb">Show/hide RGB field</button> 
  <button id="btnhexsummary">Show/hide HEX summary info</button> 
</div> 
 
<!--begin Dialog markup in standard module format--> 
<div id="yui-picker-panel" class="yui-picker-panel"> 
	<div class="hd">色を選んでください。:</div> 
	<div class="bd"> 
		<form name="yui-picker-form" id="yui-picker-form" method="post" action="ajax_yui_container_dialog_quickstart.php"> 
		<div class="yui-picker" id="yui-picker"></div> 
		</form> 
	</div> 
	<div class="ft"></div> 
</div> 
 
<!--サーバーレスポンスの表示領域--> 
<div id="resp">サーバーからのレスポンスがここに表示されます。</div>
<div id='log'></div>
</div>
</BODY>
</HTML>