/*
カラーオーダーボックス
色指定用の枠を作るUIつきスクリプト
テキストで名前と入れると前景色でカラーチップを描いて上下にダミーチップをつける。
スーパー暫定版	2008/02/03

*/
	var exFlag=true;
//そもそもドキュメントがなければ終了
	if(app.documents.length==0){
		exFlag=false;
	}
if(exFlag){
	var nas = new Object();
		nas.Version=new Object();

//@include "%NAS%/config.lib"
//@include "%NAS%/nas_common.lib"
//@include "%NAS%/fakeAE.lib"
//@include "%NAS%/nas_GUIlib.lib"



//仮値なのですべてポイント指定
/*
	selection.select()はpoint指定のみなのでその前で換算が必要
	デフォルトを埋め込んで、UIでサイズのみ変更が吉
	2 x 1.5 cm(w/h) 位か?
	Document.selection.select()メソッドはマニュアルにポイント指定だと書いてあるけど、
	実際はpxなので注意(CS2)
*/
var targetLayer	=(app.activeDocument.activeLayer)?app.activeDocument.activeLayer:app.activeDocument.layers[0];
var myDPC	=app.activeDocument.resolution/2.54;
var boxNum	=3;//ボックス数は 3(Hi/ノーマル/1号)
var boxWidth	=2;//サイズは、とりあえず[cm]
var boxHeight	=1.5;
var colorReverse =true;//仮色の反転フラグ(RGB反転なので明暗も反転)
//初期位置はセレクションがあればその左上、無い場合は、アクティブドキュメントの中央
var myPoint=div([app.activeDocument.width.as("px"),app.activeDocument.height.as("px")],2);//画面中央

/*	とりあえずパス今のところ出現位置は中央固定
まず、選択範囲の有る無しは、このルーチンで取得できないケースが多い(例の仕様変更の余波っぽいがウラワザなので無理は禁物)
 function checkSelection(){var flag = true;try {activeDocument.selection.translateBoundary(0,0);}catch(e){flag = false;}return flag;}

if (checkSelection())
{
	alert(app.activeDocument.selection.bounds.toString());//取得できないケースが多すぎ。ぎゃー
//ぎゃーもなにも全然取得できない?なんだこれは?
}
 */

if(app.activeDocument.selection)
var centerColor=new Array();
centerColor[0]=app.foregroundColor.rgb.red;
centerColor[1]=app.foregroundColor.rgb.green;
centerColor[2]=app.foregroundColor.rgb.blue;


function drawColorBox(boxName,myPoint,boxWidth,boxHeight,boxNum){

/*
	ドキュメントのバウンディングボックスを超えると数値の反転が発生しているっぽい
	UI操作ではおきないタイプの操作ではかなり信頼度(対応)が甘いカンジ
実操作の前に概略計算をおこなう
指定位置は描画範囲の中心にする
はみ出しにより安全な対応にする為には、別ドキュメントで書いてペーストした方が良さそう
2008/02/03
*/
var fontSize=boxHeight*(0.6);
var myMargin=6;
var myWidth	=boxWidth;
var myHeight	=(boxHeight*boxNum)+fontSize+myMargin;
var myLineColor=new SolidColor();
	myLineColor.rgb.red	=0;
	myLineColor.rgb.green	=0;
	myLineColor.rgb.blue	=0;

//	文字を記入(テキストレイヤが良い・フォントは現在のフォントサイズのみ調整)
//	チップレイヤとリンクさせる事
	var myTextLayer=app.activeDocument.artLayers.add();
		myTextLayer.kind=LayerKind.TEXT;
		myTextLayer.textItem.contents=boxName;//テキスト挿入
		myTextLayer.textItem.font="Heisei Kaku Gothic Std W5";//フォント設定
		myTextLayer.textItem.size=Math.floor(72*(boxHeight/2)/app.activeDocument.resolution);//フォントサイズ設定ポイント
		myTextLayer.textItem.justification=Justification.CENTER;//フォント配置設定
		myTextLayer.textItem.color=myLineColor;//フォントカラー設定
		myTextLayer.textItem.position=[new UnitValue(myPoint[0],"px"),new UnitValue(myPoint[1]+myHeight/2,"px")];//フォント位置設定

//	カラーチップ作成
//	新しいレイヤを空で作成して、名前を割りつける

	var newColorChips=app.activeDocument.artLayers.add();
		newColorChips.name=boxName;

	for (var boxCount=0;boxCount<boxNum;boxCount++){

		var myPosition=sub(add(myPoint,[0,boxHeight*boxCount]),[myWidth/2,myHeight/2]);
		var myRegion=[
			myPosition,
			add(myPosition,[boxWidth,0]),
			add(myPosition,[boxWidth,boxHeight]),
			add(myPosition,[0,boxHeight])
		];


//			セレクトを作成
		app.activeDocument.selection.select(
			myRegion,
			SelectionType.REPLACE,
			0.0,
			false
		);
//塗色は、描画色から計算した仮色で作る。あとで置き替えが必要
		var centerNo	=Math.ceil(boxNum/2)-1;
		var colorParam	=Math.abs(centerNo-boxCount);
		if(boxCount==centerNo){
			myColor=centerColor;

		}else{
			if(boxCount<centerNo){
				myColor=add(centerColor,mul(sub([255,255,255],centerColor),colorParam/(centerNo+1)));
			}else{
				myColor=div(centerColor,Math.pow(1.2,colorParam));
			}
		};
//			fill
		var fillColor=new SolidColor();
//alert(myColor.toString());
//仮色なのでこれ以上はやらない。もしあるとしたらグレー化

if((boxCount!=centerNo)&&(colorReverse)){
			fillColor.rgb.red	=255-myColor[0];
			fillColor.rgb.green	=255-myColor[1];
			fillColor.rgb.blue	=255-myColor[2];
}else{

			fillColor.rgb.red	=myColor[0];
			fillColor.rgb.green	=myColor[1];
			fillColor.rgb.blue	=myColor[2];
}
		app.activeDocument.selection.fill(
			fillColor,
			ColorBlendMode.NORMAL,
			100,
			false
		);
//ノーマルマークをつける(仮でストロークしておく)
		if(boxCount==centerNo){
			var backupColor=app.foregroundColor;
		app.activeDocument.selection.stroke(
			myLineColor,
			0.03*myDPC,
			StrokeLocation.INSIDE,
			ColorBlendMode.NORMAL,
			100,
			false
		);
			app.foregroundColor=backupColor;//ストロークは前景色を書き換える
		}
	}
//	カラーチップとラベルをリンク
		myTextLayer.link(newColorChips);//リンク作成
		;//
//	selection解除
	app.activeDocument.selection.deselect();
//	できたレイヤは選択されていたレイヤの上に移動
		myTextLayer.move(targetLayer,ElementPlacement.PLACEBEFORE);
		newColorChips.move(myTextLayer,ElementPlacement.PLACEBEFORE);

};//


//drawColorBox("お試し",myPoint,boxWidth*myDPC,boxHeight*myDPC,boxNum);
/*
	GUI初期化
ボタン/2ヶ
テキスト/4ヶ

*/
//入力を数値に限定
clipNum=function(){
	if(isNaN(this.text)){this.text=this.baseValue.toString()}else{
		this.text=(this.text*1).toString();
	}
};
//入力を整数に限定
clipInt=function(){
	if(isNaN(this.text)){this.text=this.baseValue.toString()}else{
		this.text=Math.floor(this.text*1).toString();
	}
};
//	Window
var w=nas.GUI.newWindow("dialog","色指定チップを作る",3,6);
//	TEXT
 w.tx1	=nas.GUI.addEditText(w,"(名称未定)",0,0,3,1);

 w.lb1	=nas.GUI.addStaticText  (w ,"BOX" ,0 ,1 ,1.5 ,1).justify="right";
	w.tx2	=nas.GUI.addEditText(w,boxNum,1.5,1,1,1);
	w.lb1u	=nas.GUI.addStaticText  (w ,"個" ,2.5 ,1 ,0.5 ,1);
	w.tx2.baseValue=boxNum;w.tx2.onChange=clipInt;

 w.lb2	=nas.GUI.addStaticText  (w ,"width" ,0 ,2 ,1.5 ,1).justify="right";
	w.tx3	=nas.GUI.addEditText(w,boxWidth,1.5,2,1,1);
	w.lb2u	=nas.GUI.addStaticText  (w ,"cm" ,2.5 ,2 ,0.5 ,1);
	w.tx3.baseValue=boxWidth;w.tx3.onChange=clipNum;

 w.lb3	=nas.GUI.addStaticText  (w ,"height" ,0 ,3 ,1.5 ,1).justify="right";
	w.tx4	=nas.GUI.addEditText(w,boxHeight,1.5,3,1,1);
	w.lb3u	=nas.GUI.addStaticText  (w ,"cm" ,2.5 ,3 ,0.5 ,1);
	w.tx4.baseValue=boxHeight;w.tx4.onChange=clipNum;

 w.cb1 =nas.GUI.addCheckBox (w,"仮色反転",1,4,2,1);
	w.cb1.value=colorReverse;
	w.cb1.onClick=function(){
		colorReverse=this.value;
	}
 w.bt1	=nas.GUI.addButton(w,"OK",0,5,3,1);

w.bt1.onClick=function(){
//どうも実行前に数値の検証が必要

	drawColorBox(
		this.parent.tx1.text,
		myPoint,
		this.parent.tx3.text*myDPC,
		this.parent.tx4.text*myDPC,
		this.parent.tx2.text*1
	);
this.parent.close();
}
w.tx1.active=true;
w.show();
}
