1/******************************************************************************
2	NintendoWare for CTR Maya Plugin
3
4	File:         NW4C_SetAnimRange.mel
5	Description:  set animation range
6	Date:         2010/08/30
7	Author:       Takashi Endo
8
9	Copyright 2010 Nintendo Co., Ltd. All rights reserved.
10*****************************************************************************/
11
12// GetDagList GetAnimRangeList UpdateView SetEditorCurrent
13// CreateAnimRangeNode AddAnimRangeAttr
14// ImportAnimRange ExportAnimRange
15// DropAnimRange
16
17/******************************************************************************
18	confirm dialog check window
19******************************************************************************/
20proc int ConfirmDialogCheckWin(string $parent, string $msg)
21{
22	$msg += "Are you sure ?";
23	string $ret;
24	if (`window -q -ex $parent`)
25	{
26		$ret = `confirmDialog -t "Confirm" -p $parent
27			-m $msg -ma "center"
28			-b "Yes" -b "No" -db "No" -ds "No"`;
29	}
30	else
31	{
32		$ret = `confirmDialog -t "Confirm"
33			-m $msg -ma "center"
34			-b "Yes" -b "No" -db "No" -ds "No"`;
35	}
36	return ($ret == "Yes");
37}
38
39/******************************************************************************
40	get window name string
41******************************************************************************/
42proc string GetWindowNameString()
43{
44	return "nw4cSetAnimRange_Win";
45}
46
47/******************************************************************************
48	do error
49******************************************************************************/
50proc DoError(string $msg)
51{
52	catch(`error $msg`);
53}
54
55/******************************************************************************
56	get number of clip
57******************************************************************************/
58proc int GetNumberOfClip()
59{
60	return 50;
61}
62
63/******************************************************************************
64	string array found
65******************************************************************************/
66proc int IsStringInArray(string $item, string $list[])
67{
68	string $listItem;
69	for ($listItem in $list)
70	{
71		if ($item == $listItem)
72		{
73			return true;
74		}
75	}
76	return false;
77}
78
79/******************************************************************************
80	float to int
81******************************************************************************/
82proc int FloatToInt(float $f)
83{
84	int $n = (int)$f;
85	float $m = $f - $n;
86	if ($m <= -0.5)
87	{
88		$n--;
89	}
90	else if ($m >= 0.5)
91	{
92		$n++;
93	}
94	return $n;
95}
96
97/******************************************************************************
98	get attr title list
99******************************************************************************/
100proc string[] GetAttrTitleList(string $animRange)
101{
102	int $i;
103	int $no = GetNumberOfClip();
104	string $list[];
105	for ($i = 0; $i < $no; ++$i)
106	{
107		$list[$i] = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`;
108	}
109	return $list;
110}
111
112/******************************************************************************
113	get default animation range title
114******************************************************************************/
115proc string GetDefaultAnimRangeTitle(int $i)
116{
117	//return "";
118	string $str = $i;
119	while (size($str) < 2)
120	{
121		$str = "0" + $str;
122	}
123	return ("default" + $str);
124}
125
126/******************************************************************************
127	get unique animation range title
128******************************************************************************/
129proc string GetUniqueAnimRangeTitle(string $animRange, int $i)
130{
131	string $list[] = GetAttrTitleList($animRange);
132	string $str = GetDefaultAnimRangeTitle($i);
133	if ($str == $list[$i])
134	{
135		return $str;
136	}
137	if (!IsStringInArray($str, $list))
138	{
139		return $str;
140	}
141
142	int $idx, $j;
143	int $no = GetNumberOfClip();
144	for ($idx = 0; $idx < $no; ++$idx)
145	{
146		$str = GetDefaultAnimRangeTitle($idx);
147		for ($j = 0; $j < $no; ++$j)
148		{
149			if ($i == $j)
150			{
151				continue;
152			}
153			if ($str == $list[$j])
154			{
155				break;
156			}
157		}
158		if ($j >= $no)
159		{
160			break;
161		}
162	}
163	return $str;
164}
165
166/******************************************************************************
167	add animation range attr
168******************************************************************************/
169global proc nw4cSetAnimRange_AddAnimRangeAttr(string $animRange)
170{
171	int $i;
172	int $no = GetNumberOfClip();
173
174	// merge cmdl
175	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeMergeCmdlFlag"`)
176	{
177		addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeMergeCmdlFlag" -h 1 -dv 0 $animRange;
178	}
179	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeMergeCmdlPath"`)
180	{
181		addAttr -dt "string" -k 0 -ln "nw4c_AnimRangeMergeCmdlPath" -h 1 $animRange;
182	}
183
184	// custom opts
185	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnableCustomOpts"`)
186	{
187		addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeEnableCustomOpts" -h 1 -dv 0 $animRange;
188	}
189	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeCompressNode"`)
190	{
191		addAttr -at "enum" -k 0 -ln "nw4c_AnimRangeCompressNode"
192			-en "None=0:CullUseless=1:CullUninfluential=2:UniteCompressible=3:UniteAll=4:UniteBelow=5" -h 1 -dv 0 $animRange;
193	}
194	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeCompressMaterial"`)
195	{
196		addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeCompressMaterial" -h 1 -dv 0 $animRange;
197	}
198	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeOptimizePrimitive"`)
199	{
200		addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeOptimizePrimitive" -h 1 -dv 0 $animRange;
201	}
202	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeDisableSkeletalModelSimplification"`)
203	{
204		addAttr -at "bool" -k 0 -ln "nw4c_AnimRangeDisableSkeletalModelSimplification" -h 1 -dv 0 $animRange;
205	}
206
207	// animation range
208	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnable"`)
209	{
210		addAttr -at "bool" -k false -ln "nw4c_AnimRangeEnable" -h 1 -dv false -m $animRange;
211		setAttr -s $no ($animRange + "." + "nw4c_AnimRangeEnable");
212		for ($i = 0; $i < $no; ++$i)
213		{
214			setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") false;
215		}
216	}
217	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeLoop"`)
218	{
219		addAttr -at "bool" -k false -ln "nw4c_AnimRangeLoop" -h 1 -dv false -m $animRange;
220		setAttr -s $no ($animRange + "." + "nw4c_AnimRangeLoop");
221		for ($i = 0; $i < $no; ++$i)
222		{
223			setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") false;
224		}
225	}
226	if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeName"`)
227	{
228		addAttr -dt "string" -k false -ln "nw4c_AnimRangeName" -h 1 -m $animRange;
229		setAttr -s $no ($animRange + "." + "nw4c_AnimRangeName");
230		for ($i = 0; $i < $no; ++$i)
231		{
232			setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")
233				`GetDefaultAnimRangeTitle $i`;
234		}
235	}
236	else // for old version
237	{
238		for ($i = 0; $i < $no; ++$i)
239		{
240			if (`getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")` == "")
241			{
242				setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")
243					`GetUniqueAnimRangeTitle $animRange $i`;
244			}
245		}
246	}
247	for ($i = 0; $i < $no; ++$i)
248	{
249		if (!`attributeQuery -n $animRange -ex ("nw4c_AnimRange" + $i)`)
250		{
251			addAttr -at "short" -k true -ln ("nw4c_AnimRange" + $i) -h 1
252				-dv ($i * (-1)) -min ($i * (-1)) -max ($i * (-1)) $animRange;
253		}
254	}
255}
256
257/******************************************************************************
258	parent animation range
259******************************************************************************/
260proc string ParentAnimRange(string $wName, string $animRange, string $dag)
261{
262	string $list[] = `ls $animRange`;
263
264	string $sel[] = `ls -sl`;
265	int $i, $j = -1;
266	for ($i = 0; $i < size($sel); ++$i)
267	{
268		if ($list[0] == $sel[$i])
269		{
270			$j = $i;
271			break;
272		}
273	}
274
275	nameField -e -o $list[0] ($wName + "AnimRangeNameWork");
276	if ($dag != "")
277	{
278		catch(`parent $list[0] $dag`);
279	}
280	else
281	{
282		catch(`parent -w $list[0]`);
283	}
284	$list[0] = `nameField -q -o ($wName + "AnimRangeNameWork")`;
285	$list = `ls $list[0]`;
286
287	if ($j >= 0)
288	{
289		$sel[$j] = $list[0];
290	}
291	if (size($sel))
292	{
293		select -r $sel;
294	}
295	else
296	{
297		select -cl;
298	}
299	return $list[0];
300}
301
302/******************************************************************************
303	create animation range node
304******************************************************************************/
305proc string CreateAnimRangeNode(string $wName, string $dag)
306{
307	string $animRange = "";
308	string $sel[] = `ls -l -sl`;
309	$animRange = `createNode "transform" -n "nw4c_AnimRangeCtrl"`;
310	toggle -te -st true $animRange; // template = true (same as next line ?)
311	setAttr -l true ($animRange + ".template");
312	string $keyAttrList[] = `listAnimatable $animRange`;
313	string $keyAttr;
314	for ($keyAttr in $keyAttrList)
315	{
316		setAttr -k false $keyAttr;
317	}
318	nw4cSetAnimRange_AddAnimRangeAttr($animRange);
319
320	if (size($sel))
321	{
322		select -r $sel;
323	}
324	else
325	{
326		select -cl;
327	}
328
329	if ($dag != "")
330	{
331		if (`objExists $dag`)
332		{
333			$animRange = ParentAnimRange($wName, $animRange, $dag);
334		}
335	}
336	return $animRange;
337}
338
339/******************************************************************************
340	is animation range
341******************************************************************************/
342proc int IsAnimRange(string $animRange)
343{
344	if (`objExists $animRange`)
345	{
346		if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeEnable"`)
347		{
348			return false;
349		}
350//		int $i = 0;
351//		int $no = GetNumberOfClip();
352////		for ($i = 0; $i < $no; ++$i)
353//		for ($i = 0; $i < 1; ++$i)
354//			if (!`attributeQuery -n $animRange -ex ("nw4c_AnimRange" + $i)`)
355//				break;
356////		if ($i < $no)
357//		if ($i < 1)
358//			return false;
359//
360//		if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeLoop"`)
361//			return false;
362//		if (!`attributeQuery -n $animRange -ex "nw4c_AnimRangeName"`)
363//			return false;
364		return true;
365	}
366	return false;
367}
368
369/******************************************************************************
370	delete animation range node
371******************************************************************************/
372proc DeleteAnimRangeNode(string $node)
373{
374	catch(`delete $node`);
375}
376
377/******************************************************************************
378	enable key change script
379******************************************************************************/
380proc EnableKeyChangeScript(string $wName, string $animRange, int $i, int $en)
381{
382	if ($en)
383	{
384		scriptJob -p ($wName + "ClipStart" + $i) -rp
385			-ac ($animRange + "." + "nw4c_AnimRange" + $i)
386			("nw4cSetAnimRange_OnKeyChange " + $wName + " " + $i);
387		scriptJob -p ($wName + "ClipEnable" + $i) -rp
388			-ac ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")
389			("nw4cSetAnimRange_OnEnableChange " + $wName + " " + $i);
390	}
391	else
392	{
393		scriptJob -p ($wName + "ClipStart" + $i) -rp
394			-ac ($animRange + "." + "nw4c_AnimRange" + $i) "";
395		scriptJob -p ($wName + "ClipEnable" + $i) -rp
396			-ac ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") "";
397		scriptJob -p ($wName + "ClipLoop" + $i) -rp
398			-ac ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") ""; // added (2006/04/10)
399	}
400}
401
402/******************************************************************************
403	get time range from key
404******************************************************************************/
405proc float[] GetTimeRangeFromKey(string $animRange, int $i)
406{
407	float $ret[], $f[];
408	int $n = `keyframe -q -kc ($animRange + "." + "nw4c_AnimRange" + $i)`;
409	if ($n)
410	{
411		$ret[0] = `findKeyframe -w "first" ($animRange + "." + "nw4c_AnimRange" + $i)`;
412		$ret[1] = `findKeyframe -w "last" ($animRange + "." + "nw4c_AnimRange" + $i)`;
413	}
414	else
415	{
416		$ret[0] = 0;
417		$ret[1] = 0;
418	}
419	return $ret;
420}
421
422/******************************************************************************
423	set time range to key
424******************************************************************************/
425proc SetTimeRangeToKey(string $wName, string $animRange, int $i, float $s, float $e)
426{
427	EnableKeyChangeScript($wName, $animRange, $i, false);
428	string $attr = "nw4c_AnimRange" + $i;
429	cutKey -cl -at $attr $animRange;
430	if ($s != $e)
431	{
432		setKeyframe -bd false -hi none -cp false -s false -at $attr
433			-t $s -v (-$i) -itt "flat" -ott "step" $animRange; // start
434	}
435		setKeyframe -bd false -hi none -cp false -s false -at $attr
436			-t $e -v (-$i) -itt "flat" -ott "step" $animRange; // end
437	EnableKeyChangeScript($wName, $animRange, $i, true);
438}
439
440/******************************************************************************
441	display time range
442******************************************************************************/
443proc DisplayTimeRange(string $wName, int $i, float $s, float $e)
444{
445	floatField -e -v $s ($wName + "ClipStart" + $i);
446	floatField -e -v $e ($wName + "ClipEnd" + $i);
447	// changed from original (2006/04/10)
448	//text -e -l (`FloatToInt $e` - `FloatToInt $s`) ($wName + "ClipSpan" + $i);
449	int $frameSize = `FloatToInt $e` - `FloatToInt $s`;
450	if (!`checkBox -q -v ($wName + "ClipLoop" + $i)` || $frameSize == 0)
451	{
452		++$frameSize;
453	}
454	text -e -l $frameSize ($wName + "ClipSpan" + $i);
455}
456
457/******************************************************************************
458	connect animation range control
459******************************************************************************/
460proc ConnectAnimRangeControl(string $wName, string $animRange)
461{
462	//trace "connect";
463	connectControl ($wName + "MergeCmdlFlag") ($animRange + "." + "nw4c_AnimRangeMergeCmdlFlag");
464	connectControl ($wName + "MergeCmdlPath") ($animRange + "." + "nw4c_AnimRangeMergeCmdlPath");
465
466	connectControl -in 2 ($wName + "EnableCustomOpts") ($animRange + "." + "nw4c_AnimRangeEnableCustomOpts");
467	connectControl -in 2 ($wName + "CompressNode") ($animRange + "." + "nw4c_AnimRangeCompressNode");
468	connectControl -in 2 ($wName + "CompressMaterial") ($animRange + "." + "nw4c_AnimRangeCompressMaterial");
469	connectControl -in 2 ($wName + "OptimizePrimitive") ($animRange + "." + "nw4c_AnimRangeOptimizePrimitive");
470	connectControl -in 2 ($wName + "DisableSkeletalModelSimplification") ($animRange + "." + "nw4c_AnimRangeDisableSkeletalModelSimplification");
471
472	float $f[];
473	int $no = GetNumberOfClip();
474	int $i;
475	for ($i = 0; $i < $no; ++$i)
476	{
477		connectControl ($wName + "ClipEnable" + $i) ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]");
478		connectControl ($wName + "ClipLoop" + $i) ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]");
479		connectControl ($wName + "ClipName" + $i) ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]");
480
481		// no attr-change-event from anim-editor (Maya bugfix)
482		connectControl ($wName + "ClipAttr" + $i) ($animRange + "." + "nw4c_AnimRange" + $i);
483
484		$f = GetTimeRangeFromKey($animRange, $i);
485		DisplayTimeRange($wName, $i, $f[0], $f[1]);
486		nw4cSetAnimRange_OnEnableChange($wName, $i);
487
488		// link script
489		EnableKeyChangeScript($wName, $animRange, $i, true);
490		floatField -e -cc ("nw4cSetAnimRange_OnKeyChangeUI " + $wName + " " + $i + " s") ($wName + "ClipStart" + $i);
491		floatField -e -cc ("nw4cSetAnimRange_OnKeyChangeUI " + $wName + " " + $i + " e") ($wName + "ClipEnd" + $i);
492	}
493}
494
495/******************************************************************************
496	get current dag
497******************************************************************************/
498proc string GetCurrentDag(string $wName)
499{
500	if (`window -ex $wName`)
501	{
502		if (`nameField -q -en ($wName + "DagName")`)
503		{
504			string $dag = `nameField -q -o ($wName + "DagName")`;
505			if ($dag != "")
506			{
507				if (`objExists $dag`)
508				{
509					return $dag;
510				}
511			}
512		}
513	}
514	return "";
515}
516
517/******************************************************************************
518	get current animation range
519******************************************************************************/
520proc string GetCurrentAnimRange(string $wName)
521{
522	if (`window -ex $wName`)
523	{
524		//if (`nameField -q -en ($wName + "AnimRangeName")`)
525		if (`nameField -q -en ($wName + "AnimRangeNameMaster")`)
526		{
527			string $animRange = `nameField -q -o ($wName + "AnimRangeName")`;
528			if ($animRange != "")
529			{
530				if (`objExists $animRange`)
531				{
532					return $animRange;
533				}
534			}
535		}
536	}
537	return "";
538}
539
540/******************************************************************************
541	save title list
542******************************************************************************/
543proc SaveTitleList(string $wName, string $animRange)
544{
545	int $i;
546	int $no = GetNumberOfClip();
547	string $list[] = GetAttrTitleList($animRange);
548	textScrollList -e -ra ($wName + "_ClipNameList");
549	for ($i = 0; $i < $no; ++$i)
550	{
551		textScrollList -e -a (" " + $list[$i]) ($wName + "_ClipNameList");	// add header space for null string
552	}
553}
554
555/******************************************************************************
556	restore title list
557******************************************************************************/
558proc RestoreTitleList(string $wName, string $animRange, int $i)
559{
560	string $org[] = `textScrollList -q -ai ($wName + "_ClipNameList")`;
561	string $str = "";
562	if (size($org[$i]) > 1)
563	{
564		$str = substring($org[$i], 2, size($org[$i]));						// remove header space for null string
565	}
566	setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $str;
567}
568
569/******************************************************************************
570	merge cmdl flag CB
571******************************************************************************/
572global proc nw4cSetAnimRange_MergeCmdlFlagCB(string $wName)
573{
574	string $flagCtrl = $wName + "MergeCmdlFlag";
575	int $enable = false;
576	if (`control -q -en $flagCtrl`)
577	{
578		$enable = `checkBox -q -v $flagCtrl`;
579	}
580	control -e -en $enable ($wName + "MergeCmdlPath");
581	control -e -en $enable ($wName + "MergeCmdlBrowser");
582}
583
584/******************************************************************************
585	merge cmdl browser CB
586******************************************************************************/
587global proc nw4cSetAnimRange_MergeCmdlBrowserCB(string $wName)
588{
589	string $pathCtrl = $wName + "MergeCmdlPath";
590	string $curPath = `textField -q -tx $pathCtrl`;
591	if (size($curPath) > 0)
592	{
593		$curPath = dirname($curPath);
594		$curPath = (`filetest -d $curPath`) ? ($curPath + "/") : "";
595		//NW4C_SetCurDirFromFile($curPath);
596		//trace ("cur: " + $curPath);
597	}
598	string $newPath = `fileDialog -dm ($curPath + "*.cmdl")`;
599	if (size($newPath) > 0)
600	{
601		textField -e -tx $newPath $pathCtrl;
602		// set attr direct
603		// because connectControl is not effective for change in mel
604		string $animRange = GetCurrentAnimRange($wName);
605		if ($animRange != "")
606		{
607			setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeMergeCmdlPath") $newPath;
608		}
609	}
610}
611
612/******************************************************************************
613	enable custom opts callback
614******************************************************************************/
615global proc nw4cSetAnimRange_EnableCustomOptsCB(string $wName)
616{
617	int $enable = false;
618	if (`control -q -en ($wName + "EnableCustomOpts")`)
619	{
620		$enable = `checkBoxGrp -q -v1 ($wName + "EnableCustomOpts")`;
621	}
622	string $label = "Custom Options";
623	control -e -en $enable ($wName + "CompressNode");
624	control -e -en $enable ($wName + "CompressMaterial");
625	control -e -en $enable ($wName + "OptimizePrimitive");
626	control -e -en $enable ($wName + "DisableSkeletalModelSimplification");
627	frameLayout -e -l $label ($wName + "CustomOptsLayout");
628}
629
630/******************************************************************************
631	set editor current
632******************************************************************************/
633proc SetEditorCurrent(string $wName, string $animRange)
634{
635	int $enable = ($animRange != "");
636
637	if ($enable)
638	{
639		nameField -e -en true -o $animRange ($wName + "AnimRangeNameMaster");
640		nameField -e -en true -o $animRange ($wName + "AnimRangeName");
641		nw4cSetAnimRange_AddAnimRangeAttr($animRange);
642		layout -e -en true ($wName + "Editor");
643		ConnectAnimRangeControl($wName, $animRange);
644		SaveTitleList($wName, $animRange);
645	}
646	else
647	{
648		nameField -e -en false ($wName + "AnimRangeNameMaster");
649		nameField -e -en false ($wName + "AnimRangeName");
650		layout -e -en false ($wName + "Editor");
651	}
652
653	control -e -en $enable ($wName + "MergeCmdlFlag");
654	nw4cSetAnimRange_MergeCmdlFlagCB($wName);
655
656	string $optsLayout = $wName + "CustomOptsLayout";
657	control -e -en $enable ($wName + "EnableCustomOpts");
658	if (!$enable)
659	{
660		//frameLayout -e -cl true $optsLayout;
661	}
662	nw4cSetAnimRange_EnableCustomOptsCB($wName);
663}
664
665/******************************************************************************
666	is special root node
667******************************************************************************/
668proc int IsSpecialRootNode(string $node)
669{
670	string $type = nodeType($node);
671	string $childs[] = `listRelatives -pa -s $node`;
672	if (size(`ls -cameras -lights -typ environmentFog $childs`) > 0 ||
673		$type == "lookAt")
674	{
675		return true;
676	}
677	return false;
678}
679
680/******************************************************************************
681	get dag list
682******************************************************************************/
683proc string[] GetDagList()
684{
685	string $works[] = `ls -as`;
686	string $exlist[] = { "persp", "top", "front", "side" };
687	$works = stringArrayRemove($exlist, $works);
688
689	string $list[];
690	string $item;
691	for ($item in $works)
692	{
693		if (!IsSpecialRootNode($item))
694		{
695			$list[size($list)] = $item;
696		}
697	}
698	if (size($list))
699	{
700		$list = `sort $list`;
701	}
702	return $list;
703}
704
705/******************************************************************************
706	get animation range list
707******************************************************************************/
708proc string[] GetAnimRangeList()
709{
710	string $list[] = `ls -tr -tm`; // transform & templated
711	string $retList[];
712	string $item;
713	for ($item in $list)
714	{
715		if (IsAnimRange($item))
716		{
717			$retList[size($retList)] = $item;
718		}
719	}
720	if (size($retList))
721	{
722		$retList = `sort $retList`;
723	}
724	return $retList;
725}
726
727/******************************************************************************
728	get animation range from dag
729******************************************************************************/
730proc string GetAnimRangeFromDag(string $dag)
731{
732	string $ret = "";
733	if (`objExists $dag`)
734	{
735		string $list[] = `listRelatives -pa -typ "transform" $dag`;
736		string $item;
737		for ($item in $list)
738		{
739			if (IsAnimRange($item))
740			{
741				$ret = $item;
742				break;
743			}
744		}
745	}
746	return $ret;
747}
748
749/******************************************************************************
750	get dag from animation range
751******************************************************************************/
752proc string GetDagFromAnimRange(string $animRange)
753{
754	string $ret = "";
755	if (`objExists $animRange`)
756	{
757		string $list[] = `listRelatives -pa -p -typ "transform" $animRange`;
758		string $item;
759		if ($list[0] != "")
760		{
761			string $dags[] = GetDagList();
762			if (size($dags))
763			{
764				if (IsStringInArray($list[0], $dags))
765				{
766					$ret = $list[0];
767				}
768			}
769		}
770	}
771	return $ret;
772}
773
774/******************************************************************************
775	relation dag to animation range list
776******************************************************************************/
777proc RelationDagToAnimRangeList(string $wName, string $dag)
778{
779	string $animRange = GetAnimRangeFromDag($dag);
780	if ($animRange != "")
781	{
782		SetEditorCurrent($wName, $animRange);
783		nw4cSetAnimRange_UpdateAnimRangeList($wName, 0);
784	}
785	else
786	{
787		SetEditorCurrent($wName, "");
788		textScrollList -e -da ($wName + "AnimRangeList");
789	}
790}
791
792/******************************************************************************
793	relation animation range to dag list
794******************************************************************************/
795proc RelationAnimRangeToDagList(string $wName, string $animRange)
796{
797	string $dag = GetDagFromAnimRange($animRange);
798	if ($dag != "")
799	{
800		nameField -e -en true -o $dag ($wName + "DagName");
801		nw4cSetAnimRange_UpdateDagList($wName);
802	}
803	else
804	{
805		nameField -e -en false ($wName + "DagName");
806		textScrollList -e -da ($wName + "DagList");
807	}
808}
809
810/******************************************************************************
811	quick sort
812******************************************************************************/
813proc QuickSort(string $a[], int $idx[], int $left, int $right, string $compare)
814{
815	int $i, $j, $t;
816	string $s;
817	if ($left < $right)
818	{
819		$s = $a[$idx[($left + $right) / 2]];
820		$i = $left - 1;
821		$j = $right + 1;
822		while (1)
823		{
824			while(eval($compare + " \"" + $a[$idx[++$i]] + "\" \"" + $s + "\"") < 0)
825				;
826			while(eval($compare + " \"" + $a[$idx[--$j]] + "\" \"" + $s + "\"") > 0)
827				;
828			if ($i >= $j)
829			{
830				break;
831			}
832			$t = $idx[$i];
833			$idx[$i] = $idx[$j];
834			$idx[$j] = $t;
835		}
836		QuickSort($a, $idx, $left, ($i - 1), $compare);
837		QuickSort($a, $idx, ($j + 1), $right, $compare);
838	}
839}
840
841/******************************************************************************
842	quick sort string array
843******************************************************************************/
844proc string[] QsortStringArray(string $array[], string $compare)
845{
846	int $sz = size($array);
847	if ($sz <= 1)
848	{
849		return $array;
850	}
851
852	int $i, $idx[];
853	for ($i = ($sz - 1); $i >= 0; --$i)
854	{
855		$idx[$i] = $i;
856	}
857	QuickSort($array, $idx, 0, ($sz - 1), $compare);
858
859	// string list
860	string $retList[];
861	for ($i = ($sz - 1); $i >= 0; --$i)
862	{
863		$retList[$i] = $array[$idx[$i]];
864	}
865	return $retList;
866}
867
868/******************************************************************************
869	merge float range array
870******************************************************************************/
871proc MergeFloatRangeArray(float $s[], float $e[], float $sf[], float $ef[])
872{
873	int $chk;
874	int $i, $j;
875
876	if (!size($s) || !size($e) || (size($s) != size($e)))
877	{
878		return;
879	}
880
881	while(1)
882	{
883		clear($sf);
884		clear($ef);
885		$chk = 0;
886		$sf[0] = $s[0];
887		$ef[0] = $e[0];
888		for ($i = 1; $i < size($s); ++$i)
889		{
890			for ($j = 0; $j < size($sf); ++$j)
891			{
892				if ($sf[$j] <= $s[$i] && $e[$i] <= $ef[$j])
893				{
894					$chk = 1;
895				}
896				else if ($sf[$j] <= $s[$i] && $s[$i] <= ($ef[$j] + 1))
897				{
898					$ef[$j] = $e[$i];
899					$chk = 1;
900				}
901				else if (($sf[$j] - 1) <= $e[$i] && $e[$i] <= $ef[$j])
902				{
903					$sf[$j] = $s[$i];
904					$chk = 1;
905				}
906				else if ($sf[$j] > $s[$i] && $e[$i] > $ef[$j])
907				{
908					$sf[$j] = $s[$i];
909					$ef[$j] = $e[$i];
910					$chk = 1;
911				}
912				else
913				{
914					continue;
915				}
916				break;
917			}
918			if ($j >= size($sf))
919			{
920				$sf[size($sf)] = $s[$i];
921				$ef[size($ef)] = $e[$i];
922			}
923		}
924		if (!$chk)
925		{
926			break;
927		}
928
929		clear($s);
930		clear($e);
931		for ($j = 0; $j < size($sf); ++$j)
932		{
933			$s[$j] = $sf[$j];
934			$e[$j] = $ef[$j];
935		}
936	}
937	string $array[];
938	for ($i = 0; $i < size($sf); ++$i)
939	{
940		$array[$i] = $sf[$i] + "," + $ef[$i];
941	}
942	$array = QsortStringArray($array, "nw4cSetAnimRange_CompareFloatRange");
943	string $tokBuf[];
944	for ($i = 0; $i < size($sf); ++$i)
945	{
946		tokenize $array[$i] "," $tokBuf;
947		$sf[$i] = (float)$tokBuf[0];
948		$ef[$i] = (float)$tokBuf[1];
949	}
950}
951
952/******************************************************************************
953	enable change CB
954******************************************************************************/
955global proc nw4cSetAnimRange_OnEnableChange(string $wName, int $i)
956{
957	string $animRange = GetCurrentAnimRange($wName);
958	if ($animRange == "")
959	{
960		return;
961	}
962	int $en = `getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`;
963	floatField -e -en $en ($wName + "ClipStart" + $i);
964	floatField -e -en $en ($wName + "ClipEnd" + $i);
965	checkBox -e -en $en ($wName + "ClipLoop" + $i);
966	textField -e -en $en ($wName + "ClipName" + $i);
967	button -e -en $en ($wName + "ClipNo" + $i);
968}
969
970/******************************************************************************
971	key change CB
972******************************************************************************/
973global proc nw4cSetAnimRange_OnKeyChange(string $wName, int $i)
974{
975	string $animRange = GetCurrentAnimRange($wName);
976	if ($animRange == "")
977	{
978		return;
979	}
980	float $f[] = GetTimeRangeFromKey($animRange, $i);
981	DisplayTimeRange($wName, $i, $f[0], $f[1]);
982}
983
984/******************************************************************************
985	key change add key CB
986******************************************************************************/
987global proc nw4cSetAnimRange_OnKeyChangeAddKey(string $wName)
988{
989	string $animRange = GetCurrentAnimRange($wName);
990	if ($animRange == "")
991	{
992		return;
993	}
994	string $list[] = `keyframe -q -sl -n $animRange`;
995	if (size($list))
996	{
997		int $i;
998		int $no = GetNumberOfClip();
999		for ($i = 0; $i < $no; ++$i)
1000		{
1001			$list = `keyframe -q -sl -n ($animRange + "." + "nw4c_AnimRange" + $i)`;
1002			if (size($list))
1003			{
1004				nw4cSetAnimRange_OnKeyChange($wName, $i);
1005			}
1006		}
1007	}
1008}
1009
1010/******************************************************************************
1011	key change UI CB
1012******************************************************************************/
1013global proc nw4cSetAnimRange_OnKeyChangeUI(string $wName, int $i, string $which)
1014{
1015	string $animRange = GetCurrentAnimRange($wName);
1016	if ($animRange == "")
1017	{
1018		return;
1019	}
1020	float $s = `floatField -q -v ($wName + "ClipStart" + $i)`;
1021	float $e = `floatField -q -v ($wName + "ClipEnd" + $i)`;
1022	float $f[] = GetTimeRangeFromKey($animRange, $i);
1023
1024	if ($which == "s")
1025	{
1026		if ($f[0] != $s)
1027		{
1028			if ($s >= $e)
1029			{
1030				//$e = $s + 1;
1031				$e = $s; // if allow s = e // changed from original (2006/03/07)
1032			}
1033		}
1034	}
1035	else
1036	{
1037		if ($f[1] != $e)
1038		{
1039			if ($s >= $e)
1040			{
1041				//$s = $e - 1;
1042				$s = $e; // if allow s = e // changed from original (2006/03/07)
1043			}
1044		}
1045	}
1046
1047	DisplayTimeRange($wName, $i, $s, $e);
1048	//if ($f[0] != $s || $f[1] != $e)
1049	if ($f[0] != $s || $f[1] != $e ||
1050		`keyframe -q -kc ($animRange + "." + "nw4c_AnimRange" + $i)` == 0) // changed from original (2006/04/07)
1051	{
1052		SetTimeRangeToKey($wName, $animRange, $i, $s, $e);
1053	}
1054}
1055
1056/******************************************************************************
1057	select dag list CB
1058******************************************************************************/
1059global proc nw4cSetAnimRange_OnSelectDagList(string $wName)
1060{
1061	if (!`window -ex $wName`)
1062	{
1063		return;
1064	}
1065
1066	string $sel[] = `textScrollList -q -si ($wName + "DagList")`;
1067	if (size($sel))
1068	{
1069		nameField -e -en true -o $sel[size($sel) - 1] ($wName + "DagName");
1070		RelationDagToAnimRangeList($wName, $sel[size($sel) - 1]);
1071	}
1072}
1073
1074/******************************************************************************
1075	double click dag list CB
1076******************************************************************************/
1077global proc nw4cSetAnimRange_OnDblClkDagList(string $wName)
1078{
1079	string $dag = GetCurrentDag($wName);
1080	if ($dag != "")
1081	{
1082		select -r $dag;
1083	}
1084}
1085
1086/******************************************************************************
1087	select animation range list CB
1088******************************************************************************/
1089global proc nw4cSetAnimRange_OnSelectAnimRangeList(string $wName)
1090{
1091	if (!`window -ex $wName`)
1092	{
1093		return;
1094	}
1095
1096	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1097	if (size($sel))
1098	{
1099		SetEditorCurrent($wName, $sel[size($sel) - 1]);
1100		RelationAnimRangeToDagList($wName, $sel[size($sel) - 1]);
1101	}
1102}
1103
1104/******************************************************************************
1105	double click animation range list CB
1106******************************************************************************/
1107global proc nw4cSetAnimRange_OnDblClkAnimRangeList(string $wName)
1108{
1109	string $animRange = GetCurrentAnimRange($wName);
1110	if ($animRange != "")
1111	{
1112		select -r $animRange;
1113	}
1114}
1115
1116/******************************************************************************
1117	dag list menu CB
1118******************************************************************************/
1119global proc nw4cSetAnimRange_OnMenuDagList(string $wName)
1120{
1121	if (!`window -ex $wName`)
1122	{
1123		return;
1124	}
1125
1126	string $sel[] = `textScrollList -q -si ($wName + "DagList")`;
1127	int $en = false;
1128	if (size($sel))
1129	{
1130		if (`objExists $sel[size($sel) - 1]`)
1131		{
1132			if (GetAnimRangeFromDag($sel[size($sel) - 1]) == "")
1133			{
1134				$en = true;
1135			}
1136		}
1137	}
1138	menuItem -e -en $en ($wName + "DagListMenuItem1");
1139}
1140
1141/******************************************************************************
1142	animation range list menu CB
1143******************************************************************************/
1144global proc nw4cSetAnimRange_OnMenuAnimRangeList(string $wName)
1145{
1146	if (!`window -ex $wName`)
1147	{
1148		return;
1149	}
1150
1151	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1152	int $en = false;
1153	string $animRange;
1154	if (size($sel))
1155	{
1156		$animRange = $sel[size($sel) - 1];
1157		if (`objExists $animRange`)
1158		{
1159			$en = true;
1160		}
1161	}
1162	menuItem -e -en $en ($wName + "AnimRangeListMenuItem2");
1163	menuItem -e -en $en ($wName + "AnimRangeListMenuItem5");
1164
1165	int $con = $en;
1166	if ($en)
1167	{
1168		if (GetDagFromAnimRange($animRange) != "")
1169		{
1170			$en = false;
1171		}
1172		else
1173		{
1174			$con = false;
1175		}
1176	}
1177	if ($en)
1178	{
1179		$sel = `textScrollList -q -ai ($wName + "DagList")`;
1180		string $list[];
1181		string $dag;
1182		if (size($sel))
1183		{
1184			for ($dag in $sel)
1185			{
1186				if (`objExists $dag`)
1187				{
1188					if (GetAnimRangeFromDag($dag) == "")
1189					{
1190						$list[size($list)] = $dag;
1191					}
1192				}
1193			}
1194		}
1195		if (size($list))
1196		{
1197			popupMenu -e -dai ($wName + "AnimRangeListMenuItem3");
1198			setParent -menu ($wName + "AnimRangeListMenuItem3");
1199			for ($dag in $list)
1200			{
1201				menuItem -l $dag -c ("nw4cSetAnimRange_AttachAnimRange " + $wName + " " + $dag);
1202			}
1203		}
1204		else
1205		{
1206			$en = false;
1207		}
1208	}
1209	menuItem -e -en $en ($wName + "AnimRangeListMenuItem3");
1210	menuItem -e -en $con ($wName + "AnimRangeListMenuItem4");
1211}
1212
1213/******************************************************************************
1214	create animation range
1215******************************************************************************/
1216global proc nw4cSetAnimRange_CreateAnimRange(string $wName, string $mode)
1217{
1218	if (!`window -ex $wName`)
1219	{
1220		return;
1221	}
1222	string $dag;
1223	if ($mode == "a")
1224	{
1225		string $sel[] = `textScrollList -q -si ($wName + "DagList")`;
1226		if (size($sel))
1227		{
1228			$dag = $sel[size($sel) - 1];
1229		}
1230	}
1231	string $animRange = CreateAnimRangeNode($wName, $dag);
1232	SetEditorCurrent($wName, $animRange);
1233}
1234
1235/******************************************************************************
1236	duplicate animation range
1237******************************************************************************/
1238global proc nw4cSetAnimRange_DuplicateAnimRange(string $wName)
1239{
1240	if (!`window -ex $wName`)
1241	{
1242		return;
1243	}
1244
1245	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1246	if (size($sel))
1247	{
1248		if (`objExists $sel[size($sel) - 1]`)
1249		{
1250			string $list[] = `ls -l -sl`;
1251				string $cpy[] = `duplicate $sel[size($sel) - 1]`;;
1252				if (`copyKey $sel[size($sel) - 1]`)
1253				{
1254					pasteKey $cpy[0];
1255				}
1256			if (size($list))
1257			{
1258				select -r $list;
1259			}
1260			else
1261			{
1262				select -cl;
1263			}
1264
1265			$sel = `listRelatives -pa -p $cpy[0]`;
1266			if (size($sel))
1267			{
1268				$cpy[0] = ParentAnimRange($wName, $cpy[0], "");
1269			}
1270
1271			SetEditorCurrent($wName, $cpy[0]);
1272		}
1273	}
1274}
1275
1276/******************************************************************************
1277	delete animation range control
1278******************************************************************************/
1279global proc nw4cSetAnimRange_DeleteAnimRangeCtrl(string $wName)
1280{
1281	if (!`window -ex $wName`)
1282	{
1283		return;
1284	}
1285	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1286	if (size($sel))
1287	{
1288		if (!ConfirmDialogCheckWin($wName, "Delete " + $sel[size($sel) - 1] + ".\n"))
1289		{
1290			return;
1291		}
1292		DeleteAnimRangeNode($sel[size($sel) - 1]);
1293	}
1294}
1295
1296/******************************************************************************
1297	attach animation range
1298******************************************************************************/
1299global proc nw4cSetAnimRange_AttachAnimRange(string $wName, string $dag)
1300{
1301	if (!`window -ex $wName`)
1302	{
1303		return;
1304	}
1305	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1306	if (size($sel))
1307	{
1308		if (`objExists $sel[size($sel) - 1]`)
1309		{
1310			if (`objExists $dag`)
1311			{
1312				$sel[size($sel) - 1] = ParentAnimRange($wName, $sel[size($sel) - 1], $dag);
1313			}
1314		}
1315	}
1316}
1317
1318/******************************************************************************
1319	dettach animation range
1320******************************************************************************/
1321global proc nw4cSetAnimRange_DeattachAnimRange(string $wName)
1322{
1323	if (!`window -ex $wName`)
1324	{
1325		return;
1326	}
1327	string $sel[] = `textScrollList -q -si ($wName + "AnimRangeList")`;
1328	if (size($sel))
1329	{
1330		if (`objExists $sel[size($sel) - 1]`)
1331		{
1332			$sel[size($sel) - 1] = ParentAnimRange($wName, $sel[size($sel) - 1], "");
1333		}
1334	}
1335}
1336
1337/******************************************************************************
1338	file menu CB
1339******************************************************************************/
1340global proc nw4cSetAnimRange_OnMenuFile(string $wName)
1341{
1342	if (!`window -ex $wName`)
1343	{
1344		return;
1345	}
1346	int $en = false;
1347	string $animRange = GetCurrentAnimRange($wName);
1348	if ($animRange != "")
1349	{
1350		$en = true;
1351	}
1352	menuItem -e -en $en ($wName + "FileMenuItem1");
1353	menuItem -e -en $en ($wName + "FileMenuItem2");
1354}
1355
1356/******************************************************************************
1357	get enabled time range array
1358******************************************************************************/
1359proc GetEnabledTimeRangeArray(string $animRange, float $sf[], float $ef[])
1360{
1361	int $i;
1362	float $s[], $e[], $f[];
1363	int $no = GetNumberOfClip();
1364	for ($i = 0; $i < $no; ++$i)
1365	{
1366		if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`)
1367		{
1368			$f = GetTimeRangeFromKey($animRange, $i);
1369			//if ($f[0] < $f[1])
1370			if ($f[0] <= $f[1]) // if allow s = e // changed from original (2006/03/07)
1371			{
1372				$s[size($s)] = $f[0];
1373				$e[size($e)] = $f[1];
1374			}
1375		}
1376	}
1377	clear($sf);
1378	clear($ef);
1379	if (size($s))
1380	{
1381		MergeFloatRangeArray($s, $e, $sf, $ef);
1382	}
1383}
1384
1385/******************************************************************************
1386	make playback info
1387******************************************************************************/
1388proc MakePlaybackInfo(string $wName, string $animRange)
1389{
1390	int $i, $j, $l;
1391	float $f[], $sf[], $ef[];
1392	int $no = GetNumberOfClip();
1393	int $loop = `intField -q -v ($wName + "Loop")`;
1394	if ($loop <= 0)
1395	{
1396		$loop = 1;
1397	}
1398
1399	for ($i = 0; $i < $no; ++$i)
1400	{
1401		if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`)
1402		{
1403			$f = GetTimeRangeFromKey($animRange, $i);
1404			$f[0] = (float)FloatToInt($f[0]);
1405			$f[1] = (float)FloatToInt($f[1]);
1406			if ($f[0] < $f[1])
1407			{
1408				if (`getAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]")`)
1409				{
1410					$l = $loop;
1411				}
1412				else
1413				{
1414					$l = 1;
1415				}
1416				for ($j = 0; $j < $l; ++$j)
1417				{
1418					$sf[size($sf)] = $f[0];
1419					$ef[size($ef)] = $f[1];
1420				}
1421			}
1422		}
1423	}
1424
1425	if (`window -ex ($wName + "AnimRange")`)
1426	{
1427		deleteUI ($wName + "AnimRange");
1428	}
1429	window ($wName + "AnimRange");
1430	formLayout;
1431	textScrollList ($wName + "sList");
1432	textScrollList ($wName + "eList");
1433
1434	for ($i = 0; $i < size($sf); ++$i)
1435	{
1436		textScrollList -e -a ((string)$sf[$i]) ($wName + "sList");
1437		textScrollList -e -a ((string)$ef[$i]) ($wName + "eList");
1438	}
1439	if (size($sf))
1440	{
1441		if (`play -q -f`)
1442		{
1443			$i = 0;
1444		}
1445		else
1446		{
1447			$i = `size($sf)` - 1;
1448		}
1449		intField -v $i ($wName + "Pointer");
1450		floatField -v `playbackOptions -q -min` ($wName + "OrgMin"); // backup
1451		floatField -v `playbackOptions -q -max` ($wName + "OrgMax"); // backup
1452		textField -tx `playbackOptions -q -l` ($wName + "Looping"); // backup
1453		playbackOptions -min $sf[$i] -max $ef[$i] -l "once";
1454		if (`play -q -f`)
1455		{
1456			currentTime $sf[$i];
1457		}
1458		else
1459		{
1460			currentTime $ef[$i];
1461		}
1462	}
1463	else
1464	{
1465		play -st false;
1466	}
1467}
1468
1469/******************************************************************************
1470	update playback button
1471******************************************************************************/
1472proc UpdatePlaybackButton(string $wName)
1473{
1474	if (!`window -ex $wName`)
1475	{
1476		return;
1477	}
1478
1479	int $en0 = true, $en1 = true;
1480	int $cmd0 = 1, $cmd1 = 2;
1481	int $playFlag = `isTrue "playingBack"`;
1482	int $animRangePlayFlag = `window -ex ($wName + "AnimRange")`;
1483
1484	if ($playFlag || $animRangePlayFlag)
1485	{
1486		if (!`checkBox -q -v ($wName + "PlaybackContinuous")`)
1487		{
1488			$en0 = $playFlag;
1489			$en1 = 0;
1490			$cmd0 = 0; // stop
1491		}
1492		else
1493		{
1494			$en0 = 0;
1495			$en1 = $playFlag;
1496			$cmd1 = 0; // stop
1497		}
1498	}
1499
1500	string $img0 = ($cmd0) ?
1501		"nw4cSetAnimRange_Play.bmp" : "nw4cSetAnimRange_Stop.bmp";
1502	string $img1 = ($cmd1) ?
1503		"nw4cSetAnimRange_PlayLoop.bmp" : "nw4cSetAnimRange_Stop.bmp";
1504	string $ann0 = ($cmd0) ? "AnimRange Once" : "Stop";
1505	string $ann1 = ($cmd1) ? "AnimRange Continuous" : "Stop";
1506
1507	symbolButton -e -en $en0 -i $img0 -w 26 -h 26 -ann $ann0
1508		-c ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " " + $cmd0 + ";")
1509		($wName + "PlayBtn0");
1510	symbolButton -e -en $en1 -i $img1 -w 26 -h 26 -ann $ann1
1511		-c ("nw4cSetAnimRange_OnPlaybackButton " + $wName + " " + $cmd1 + ";")
1512		($wName + "PlayBtn1");
1513}
1514
1515/******************************************************************************
1516	playback condition
1517******************************************************************************/
1518global proc int nw4cSetAnimRange_PlaybackCondition(string $wName)
1519{
1520	string $cmd;
1521	string $animRange;
1522	int $ret = false;
1523	int $i, $no;
1524
1525	if (`isTrue "playingBack"`)
1526	{
1527		if (!`window -ex $wName`)
1528		{
1529			return true;
1530		}
1531		if (`checkBox -q -v ($wName + "PlaybackEnable")`)
1532		{
1533			$animRange = GetCurrentAnimRange($wName);
1534			if ($animRange != "")
1535			{
1536				layout -e -en false ($wName + "Pane");
1537				intField -e -en false ($wName + "Loop");
1538				MakePlaybackInfo($wName, $animRange);
1539			}
1540			checkBox -e -v false ($wName + "PlaybackEnable");
1541		}
1542		$ret = true;
1543	}
1544	else
1545	{
1546		if (`window -ex ($wName + "AnimRange")`)
1547		{
1548			if (`floatField -ex ($wName + "OrgMin")`)
1549			{
1550				if (`window -ex $wName`)
1551				{
1552					if (!`checkBox -q -v ($wName + "PlaybackStop")`)
1553					{
1554						int $fwd = `play -q -f`;
1555						string $s[] = `textScrollList -q -ai ($wName + "sList")`;
1556						string $e[] = `textScrollList -q -ai ($wName + "eList")`;
1557						if (size($s))
1558						{
1559							$i = `intField -q -v ($wName + "Pointer")`;
1560							if ($fwd)
1561							{
1562								++$i;
1563								if ($i >= size($s))
1564								{
1565									if (`checkBox -q -v ($wName + "PlaybackContinuous")`)
1566									{
1567										$i = 0;
1568									}
1569								}
1570							}
1571							else
1572							{
1573								$i--;
1574								if ($i < 0)
1575								{
1576									if (`checkBox -q -v ($wName + "PlaybackContinuous")`)
1577									{
1578										$i = size($s) - 1;
1579									}
1580								}
1581							}
1582							if (0 <= $i && $i < size($s))
1583							{
1584								intField -e -v $i ($wName + "Pointer");
1585								playbackOptions -min $s[$i] -max $e[$i];
1586								if ($fwd)
1587								{
1588									currentTime $s[$i];
1589								}
1590								else
1591								{
1592									currentTime $e[$i];
1593								}
1594								play -f $fwd;
1595								return true;
1596							}
1597						}
1598
1599						float $max1;
1600						if ($fwd)
1601						{
1602							$max1 = `playbackOptions -q -max`;
1603						}
1604						else
1605						{
1606							$max1 = `playbackOptions -q -min`;
1607						}
1608						// assistance "move to playback end" (Maya bugfix)
1609						currentTime $max1;
1610					}
1611				}
1612				playbackOptions -min `floatField -q -v ($wName + "OrgMin")` -max `floatField -q -v ($wName + "OrgMax")`;
1613				playbackOptions -l (`textField -q -tx ($wName + "Looping")`);
1614			}
1615			deleteUI ($wName + "AnimRange");
1616		}
1617
1618		if (!`window -ex $wName`)
1619		{
1620			evalDeferred("nw4cSetAnimRange_PlaybackExit " + $wName);
1621		}
1622		else
1623		{
1624			if (!`layout -q -en ($wName + "Pane")`)
1625			{
1626				layout -e -en true ($wName + "Pane");
1627				intField -e -en true ($wName + "Loop");
1628				$animRange = GetCurrentAnimRange($wName);
1629				SetEditorCurrent($wName, $animRange);
1630			}
1631		}
1632	}
1633
1634	UpdatePlaybackButton($wName);
1635
1636	return $ret;
1637}
1638
1639/******************************************************************************
1640	playback exit
1641******************************************************************************/
1642global proc nw4cSetAnimRange_PlaybackExit(string $wName)
1643{
1644	string $cnd[] = `scriptJob -lc`;
1645	if (IsStringInArray(($wName + "PlaybackCondition"), $cnd))
1646	{
1647		condition -del ($wName + "PlaybackCondition");
1648	}
1649}
1650
1651/******************************************************************************
1652	compare float range
1653******************************************************************************/
1654global proc int nw4cSetAnimRange_CompareFloatRange(string $str1, string $str2)
1655{
1656	string $tokBuf1[], $tokBuf2[];
1657	tokenize $str1 "," $tokBuf1;
1658	tokenize $str2 "," $tokBuf2;
1659	float $t1 = (float)$tokBuf1[0];
1660	float $t2 = (float)$tokBuf2[0];
1661	if ($t1 < $t2)
1662	{
1663		return -1;
1664	}
1665	if ($t1 > $t2)
1666	{
1667		return 1;
1668	}
1669	$t1 = (float)$tokBuf1[1];
1670	$t2 = (float)$tokBuf2[1];
1671	if ($t1 < $t2)
1672	{
1673		return -1;
1674	}
1675	if ($t1 > $t2)
1676	{
1677		return 1;
1678	}
1679	return 0;
1680}
1681
1682/******************************************************************************
1683	substring title
1684******************************************************************************/
1685proc string SubstringTitle(string $str)
1686{
1687	string $retStr = "";
1688	int $sz = size($str);
1689	if ($sz >= 10)
1690	{
1691		string $ex = `match "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+," $str`;
1692		int $len = size($ex);
1693		if ($sz > $len)
1694		{
1695			$retStr = substring($str, $len + 1, size($str));
1696		}
1697	}
1698	return $retStr;
1699}
1700
1701/******************************************************************************
1702	compare name
1703******************************************************************************/
1704global proc int nw4cSetAnimRange_CompareName(string $str1, string $str2)
1705{
1706	string $tokBuf1[], $tokBuf2[];
1707	tokenize($str1, ",", $tokBuf1);
1708	$tokBuf1[5] = SubstringTitle($str1);
1709	tokenize($str2, ",", $tokBuf2);
1710	$tokBuf2[5] = SubstringTitle($str2);
1711	float $s1 = (float)$tokBuf1[2];
1712	float $s2 = (float)$tokBuf2[2];
1713	float $e1 = (float)$tokBuf1[3];
1714	float $e2 = (float)$tokBuf2[3];
1715	if ($s1 != $e1 && $s2 == $e2)
1716	{
1717		return -1;
1718	}
1719	if ($s1 == $e1 && $s2 != $e2)
1720	{
1721		return 1;
1722	}
1723	return `strcmp $tokBuf1[5] $tokBuf2[5]`;
1724}
1725
1726/******************************************************************************
1727	compare time range
1728******************************************************************************/
1729global proc int nw4cSetAnimRange_CompareTimeRange(string $str1, string $str2)
1730{
1731	// 0 no
1732	// 1 enable
1733	// 2 start
1734	// 3 end
1735	// 4 loop
1736	// 5 name
1737	string $tokBuf1[], $tokBuf2[];
1738	int $n;
1739	$n = tokenize($str1, ",", $tokBuf1);
1740	if ($n < 4)
1741	{
1742		return 0;
1743	}
1744	$n = tokenize($str2, ",", $tokBuf2);
1745	if ($n < 4)
1746	{
1747		return 0;
1748	}
1749	float $s1 = (float)$tokBuf1[2];
1750	float $s2 = (float)$tokBuf2[2];
1751	float $e1 = (float)$tokBuf1[3];
1752	float $e2 = (float)$tokBuf2[3];
1753	if ($s1 != $e1 && $s2 == $e2)
1754	{
1755		return -1;
1756	}
1757	if ($s1 == $e1 && $s2 != $e2)
1758	{
1759		return 1;
1760	}
1761	if ($s1 < $s2)
1762	{
1763		return -1;
1764	}
1765	if ($s1 > $s2)
1766	{
1767		return 1;
1768	}
1769	if ($e1 < $e2)
1770	{
1771		return -1;
1772	}
1773	if ($e1 > $e2)
1774	{
1775		return 1;
1776	}
1777	return nw4cSetAnimRange_CompareName($str1, $str2);
1778}
1779
1780/******************************************************************************
1781	make animation range data string array
1782******************************************************************************/
1783proc string[] MakeAnimRangeDataStringArray(string $animRange)
1784{
1785	int $i;
1786	int $no = GetNumberOfClip();
1787	float $f[];
1788	string $array[];
1789	for ($i = 0; $i < $no; ++$i)
1790	{
1791		$array[$i] = (string)($i + 1);
1792		$array[$i] = $array[$i] + "," + (string)`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`;
1793		$f = GetTimeRangeFromKey($animRange, $i);
1794		$array[$i] = $array[$i] + "," + ((string)$f[0] + "," + (string)$f[1]);
1795		$array[$i] = $array[$i] + "," + (string)`getAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]")`;
1796		$array[$i] = $array[$i] + "," + `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`;
1797	}
1798	return $array;
1799}
1800
1801/******************************************************************************
1802	set animation range data from string array
1803******************************************************************************/
1804proc SetAnimRangeDataFromStringArray(string $wName, string $animRange, string $array[])
1805{
1806	int $i, $n, $enable;
1807	int $no = GetNumberOfClip();
1808	string $tokBuf[];
1809	float $s, $e;
1810	for ($i = 0; $i < $no; ++$i)
1811	{
1812		EnableKeyChangeScript($wName, $animRange, $i, false);
1813			$n = tokenize($array[$i], ",", $tokBuf);
1814			$enable = (int)$tokBuf[1];
1815			setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") $enable;
1816			cutKey -cl -at ("nw4c_AnimRange" + $i) $animRange;
1817			setAttr -c ($animRange + "." + "nw4c_AnimRange" + $i) 0;
1818			setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") ((int)$tokBuf[4]);
1819
1820			$tokBuf[5] = SubstringTitle($array[$i]);
1821			setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $tokBuf[5];
1822
1823			$s = (float)$tokBuf[2];
1824			$e = (float)$tokBuf[3];
1825			//if ($s != $e)
1826			if ($s != $e || $s != 0 || $enable) // if allow s = e // changed from original (2006/04/07)
1827			{
1828				SetTimeRangeToKey($wName, $animRange, $i, $s, $e);
1829			}
1830		EnableKeyChangeScript($wName, $animRange, $i, true);
1831	}
1832}
1833
1834/******************************************************************************
1835	sort pack
1836******************************************************************************/
1837global proc nw4cSetAnimRange_SortPack(string $wName, string $mode)
1838{
1839	string $animRange = GetCurrentAnimRange($wName);
1840	if ($animRange != "")
1841	{
1842		string $array[] = MakeAnimRangeDataStringArray($animRange);
1843		if ($mode == "t")
1844		{
1845			$array = QsortStringArray($array, "nw4cSetAnimRange_CompareTimeRange");
1846		}
1847		else
1848		{
1849			$array = QsortStringArray($array, "nw4cSetAnimRange_CompareName");
1850		}
1851		SetAnimRangeDataFromStringArray($wName, $animRange, $array);
1852		SetEditorCurrent($wName, $animRange);
1853	}
1854}
1855
1856/******************************************************************************
1857	set unique animation range name
1858******************************************************************************/
1859// added (2006/01/23)
1860proc SetUniqueAnimRangeName(string $animRange, int $idst)
1861{
1862	int $no = GetNumberOfClip();
1863	string $base = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $idst + "]")`;
1864	string $name = $base;
1865	int $id = 1;
1866
1867	while (1)
1868	{
1869		int $found = false;
1870		int $i;
1871		for ($i = 0; $i < $no; ++$i)
1872		{
1873			if ($i != $idst)
1874			{
1875				string $other = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`;
1876				if ($other == $name)
1877				{
1878					$found = true;
1879					break;
1880				}
1881			}
1882		}
1883		if ($found)
1884		{
1885			$name = $base + "_" + $id;
1886			++$id;
1887		}
1888		else
1889		{
1890			break;
1891		}
1892	}
1893
1894	if ($id > 1)
1895	{
1896		setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $idst + "]")
1897			$name;
1898		//trace ("unique: " + $base + " -> " + $name);
1899	}
1900}
1901
1902/******************************************************************************
1903	drag animation range
1904******************************************************************************/
1905global proc string[] nw4cSetAnimRange_DragAnimRange(string $wName,
1906	string $dragControl, int $x, int $y, int $mods)
1907{
1908	string $msgs[];
1909	if (!`window -ex $wName`)
1910	{
1911		return $msgs;
1912	}
1913	if ($mods != 0 && $mods != 2)
1914	{
1915		return $msgs;
1916	}
1917	string $i = match("[0-9]+$", $dragControl);
1918	if ($i != "")
1919	{
1920		$msgs[0] = $wName + "Clip";
1921		if ($mods == 0)
1922		{
1923			$msgs[1] = "Move";
1924		}
1925		else if ($mods == 2)		// ctrl
1926		{
1927			$msgs[1] = "Copy";
1928		}
1929		$msgs[2] = $i;
1930	}
1931	return $msgs;
1932}
1933
1934/******************************************************************************
1935	drop animation range
1936
1937		$msgs[0]	$wName + "Clip"
1938		$msgs[1]	"Move" or "Copy"
1939		$msgs[2]	clip index of drag item (source)
1940******************************************************************************/
1941global proc nw4cSetAnimRange_DropAnimRange(string $wName,
1942	string $dragControl, string $dropControl, string $msgs[],
1943	int $x, int $y, int $type)
1944{
1945	if (!`window -ex $wName`)
1946	{
1947		return;
1948	}
1949
1950	//if ($type != 2)
1951	//	return;
1952
1953	if ($msgs[0] == $wName + "Clip")
1954	{
1955		string $i = match("[0-9]+$", $dropControl);
1956		if ($i != "" && $msgs[2] != "" && $i != $msgs[2])
1957		{
1958			int $s = (int)$msgs[2];
1959			int $d = (int)$i;
1960			string $animRange = GetCurrentAnimRange($wName);
1961			if ($animRange != "")
1962			{
1963				string $array[] = MakeAnimRangeDataStringArray($animRange);
1964				string $result[];
1965				int $j, $k = 0;
1966				int $no = GetNumberOfClip();
1967				if ($msgs[1] == "Move")
1968				{
1969					for ($j = 0; $j < $no; ++$j)
1970					{
1971						if ($j == $s)
1972						{
1973							continue;
1974						}
1975						if ($s < $d)
1976						{
1977							$result[$k++] = $array[$j];
1978						}
1979						if ($j == $d)
1980						{
1981							$result[$k++] = $array[$s];
1982						}
1983						if ($s > $d)
1984						{
1985							$result[$k++] = $array[$j];
1986						}
1987					}
1988				}
1989				else if ($msgs[1] == "Copy")
1990				{
1991					for ($j = 0; $j < $no; ++$j)
1992					{
1993						if ($j == $d)
1994						{
1995							$result[$k++] = $array[$s];
1996						}
1997						else
1998						{
1999							$result[$k++] = $array[$j];
2000						}
2001					}
2002				}
2003				SetAnimRangeDataFromStringArray($wName, $animRange, $result);
2004				// changed from original (2006/01/23)
2005				if ($msgs[1] == "Copy")
2006				{
2007					SetUniqueAnimRangeName($animRange, $d);
2008				}
2009				SetEditorCurrent($wName, $animRange);
2010			}
2011		}
2012	}
2013}
2014
2015/******************************************************************************
2016	import animation range proc (called from animation range file)
2017
2018		$orgAnimRange is not used
2019******************************************************************************/
2020global proc nw4cSetAnimRange_ImportAnimRangeProc(string $wName,
2021	string $exprotVer, string $orgAnimRange, string $list[])
2022{
2023	string $animRange = GetCurrentAnimRange($wName);
2024	if ($animRange == "")
2025	{
2026		return;
2027	}
2028	if ($exprotVer != "1.00")								// check version
2029	{
2030		return;
2031	}
2032	string $array[], $titles[], $tokBuf[];
2033	string $str;
2034	float $s, $e;
2035	int $no = GetNumberOfClip();
2036	int $i;
2037	for ($str in $list)
2038	{
2039		clear($tokBuf);
2040		if (tokenize($str, ", \r\n\t", $tokBuf) < 6)
2041		{
2042			continue;
2043		}
2044		$i = $tokBuf[0];
2045		if ($i <= 0 || $i > $no)
2046		{
2047			continue;
2048		}
2049		$i--;
2050
2051		$s = (float)$tokBuf[2];
2052		$e = (float)$tokBuf[3];
2053		if ($s > $e)									// check range
2054		{
2055			continue;
2056		}
2057		if (match("[^0-9a-zA-Z_]", $tokBuf[5]) != "")	// check title
2058		{
2059			continue;
2060		}
2061		$array[$i] = $tokBuf[0] + "," + $tokBuf[1] + "," + $tokBuf[2] + "," + $tokBuf[3] + "," + $tokBuf[4] + "," + $tokBuf[5];
2062		$titles[$i] = $tokBuf[5];
2063	}
2064
2065	int $ret = false;
2066	if (size($array) == $no)		// check number of channels
2067	{
2068		for ($i = 0; $i < $no; ++$i)
2069		{
2070			if ($array[$i] == "")	// check title
2071			{
2072				break;
2073			}
2074		}
2075		if ($i == $no)				// check number of channels
2076		{
2077// enabled import animation range channel -> disabled current animation range channel
2078//			string $currentArray[] = MakeAnimRangeDataStringArray($animRange);
2079//			string $currentTitles[];
2080//			int $j = 0;
2081//			for ($i = 0; $i < $no; ++$i)
2082//			{
2083//				clear $tokBuf;
2084//				tokenize $currentArray[$i] ", \r\n\t" $tokBuf;
2085//				$currentTitles[$i] = $tokBuf[5];
2086//				if ($tokBuf[1] == "1")	// enable
2087//					continue;
2088//
2089//				clear $tokBuf;
2090//				tokenize $array[$j] ", \r\n\t" $tokBuf;
2091//				if ($tokBuf[1] == "1")	// enable
2092//				{
2093//					$currentArray[$i] = $array[$j];
2094//					$currentTitles[$i] = $tokBuf[5];
2095//					$j++;
2096//				}
2097//			}
2098//			$currentTitles = stringArrayRemoveDuplicates($currentTitles);	// check title
2099//			if (size($currentTitles) == $no)
2100//			{
2101//				SetAnimRangeDataFromStringArray($wName, $animRange, $currentArray);
2102//				SetEditorCurrent($wName, $animRange);
2103//
2104//				for (; $j<$no; $j++)
2105//				{
2106//					clear $tokBuf;
2107//					tokenize $array[$j] ", \r\n\t" $tokBuf;
2108//					if ($tokBuf[1] == "1")	// enable
2109//					{
2110//						warning ("Remain channels in import file. <" + $wName + ">");
2111//						break;
2112//					}
2113//				}
2114//
2115//				$ret = true;
2116//			}
2117//			else
2118//				DoError ("Found same title as current nw4c_AnimRangeCtrl in import file. <" + $wName + ">");
2119// overwrite all
2120//			$titles = stringArrayRemoveDuplicates($titles);	// check title
2121//			if (size($titles) == $no)
2122//			{
2123//				SetAnimRangeDataFromStringArray($wName, $animRange, $array);
2124//				SetEditorCurrent($wName, $animRange);
2125//				$ret = true;
2126//			}
2127// overwrite title or title and range
2128			$titles = stringArrayRemoveDuplicates($titles);	// check title
2129			if (size($titles) == $no)
2130			{
2131				string $opt = `confirmDialog -t "Import Option"
2132					-m "Select Import Type." -p $wName
2133					-b "All" -b "Title and Range" -b "Only Title" -b "Cancel"
2134					-db "All" -cb "Cancel" -ds "Cancel"`;
2135				if ($opt != "Cancel")
2136				{
2137					string $currentArray[] = MakeAnimRangeDataStringArray($animRange);
2138					string $tokBufTemp[];
2139					for ($i = 0; $i < $no; ++$i)
2140					{
2141						clear($tokBuf);
2142						tokenize($currentArray[$i], ", \r\n\t", $tokBuf);
2143
2144						clear($tokBufTemp);
2145						tokenize($array[$i], ", \r\n\t", $tokBufTemp);
2146
2147						$tokBuf[5] = $tokBufTemp[5]; // title
2148						if ($opt != "Only Title")
2149						{
2150							$tokBuf[2] = $tokBufTemp[2]; // start
2151							$tokBuf[3] = $tokBufTemp[3]; // end
2152						}
2153						if ($opt == "All")
2154						{
2155							$tokBuf[1] = $tokBufTemp[1]; // enable
2156							$tokBuf[4] = $tokBufTemp[4]; // loop
2157						}
2158						$currentArray[$i] = $tokBuf[0] + "," + $tokBuf[1] + "," + $tokBuf[2] + "," + $tokBuf[3] + "," + $tokBuf[4] + "," + $tokBuf[5];
2159					}
2160					SetAnimRangeDataFromStringArray($wName, $animRange, $currentArray);
2161					SetEditorCurrent($wName, $animRange);
2162				}
2163				$ret = true;
2164			}
2165		}
2166	}
2167	if (!$ret)
2168	{
2169		DoError("Invalid import file. <" + $wName + ">");
2170	}
2171}
2172
2173/******************************************************************************
2174	import animation range CB
2175******************************************************************************/
2176global proc int nw4cSetAnimRange_ImportAnimRangeCB(string $wName,
2177	string $fileName, string $fileType)
2178{
2179	//string $abRet[];
2180	//catch($abRet = nw4c_ABGetLatest("", { $fileName }));
2181
2182	int $fh = fopen($fileName, "r");
2183	if ($fh == 0)
2184	{
2185		return false;
2186	}
2187	string $str = fgetline($fh);
2188	$str = match("^nw4cSetAnimRange_ImportAnimRangeProc", $str);
2189	fclose($fh);
2190
2191	if ($str == "")
2192	{
2193		DoError("Not exported file. <" + $wName + ">");
2194		return false;
2195	}
2196
2197	eval("source \"" + $fileName + "\"");
2198
2199	// save last accessed folder
2200	optionVar -sv nw4cSetAnimRange_AnimRangeFileFolder `dirname $fileName`;
2201
2202	return true;
2203}
2204
2205/******************************************************************************
2206	write file export animation range
2207******************************************************************************/
2208proc int WriteFileExportAnimRange(string $wName, string $animRange, string $fileName)
2209{
2210	int $fh = fopen($fileName, "w");
2211	if ($fh == 0)
2212	{
2213		return false;
2214	}
2215	string $str = "nw4cSetAnimRange_ImportAnimRangeProc(\r\n\t\"" + $wName +
2216		"\",\r\n\t\"1.00\",\r\n\t\"" + $animRange + "\",\r\n";
2217	fprint($fh, $str);
2218	string $list[] = MakeAnimRangeDataStringArray($animRange);
2219	$str = "\t{\r\n";
2220	int $i;
2221	for ($i = 0; $i < size($list); ++$i)
2222	{
2223		$str += ("\t\t\"" + $list[$i] + "\"");
2224		if ($i < (size($list) - 1))
2225		{
2226			$str += ",";
2227		}
2228		$str += "\r\n";
2229	}
2230	$str += "\t}\r\n";
2231	$str += ");\r\n";
2232	fprint($fh, $str);
2233	fclose($fh);
2234	return true;
2235}
2236
2237/******************************************************************************
2238	export animation range CB
2239******************************************************************************/
2240global proc int nw4cSetAnimRange_ExportAnimRangeCB(string $wName,
2241	string $fileName, string $fileType)
2242{
2243	string $animRange = GetCurrentAnimRange($wName);
2244	if ($animRange == "")
2245	{
2246		return false;
2247	}
2248
2249	//string $abRet[];
2250	//int $abCheckout = false;
2251	//if (!catch($abRet = nw4c_ABCheckOut("", { $fileName })))
2252	//	$abCheckout = $abRet[0];
2253
2254	int $ret = WriteFileExportAnimRange($wName, $animRange, $fileName);
2255
2256	//if ($abCheckout)
2257	//	catch($abRet = nw4c_ABCheckIn("", { $fileName }));
2258
2259	// save last accessed folder
2260	optionVar -sv nw4cSetAnimRange_AnimRangeFileFolder `dirname $fileName`;
2261
2262	return $ret;
2263}
2264
2265/******************************************************************************
2266	get animation range win dir
2267******************************************************************************/
2268proc string GetAnimRangeFileFolder(string $wName, int $md)
2269{
2270	string $path;
2271	if (`optionVar -ex nw4cSetAnimRange_AnimRangeFileFolder`)
2272	{
2273		$path = `optionVar -q nw4cSetAnimRange_AnimRangeFileFolder`;
2274		if (`filetest -d $path`)
2275		{
2276			return $path;
2277		}
2278	}
2279	$path = `workspace -q -rd`;
2280	if (`filetest -d $path`)
2281	{
2282		return $path;
2283	}
2284	return "";
2285}
2286
2287/******************************************************************************
2288	import animation range
2289******************************************************************************/
2290global proc nw4cSetAnimRange_ImportAnimRange(string $wName)
2291{
2292	string $animRange = GetCurrentAnimRange($wName);
2293	if ($animRange == "")
2294	{
2295		return;
2296	}
2297	string $path = GetAnimRangeFileFolder($wName, true);
2298	if ($path == "")
2299	{
2300		return;
2301	}
2302	string $old = `workspace -q -dir`;
2303	workspace -dir $path;
2304	fileBrowserDialog -m 0 -fc ("nw4cSetAnimRange_ImportAnimRangeCB " + $wName)
2305		-an "Import" -ft "mel";
2306	workspace -dir $old;
2307
2308	// title bar doesn't become active (Maya bugfix)
2309	catch(setFocus(`getPanel -wf`));
2310	showWindow $wName;
2311}
2312
2313/******************************************************************************
2314	export animation range
2315******************************************************************************/
2316global proc nw4cSetAnimRange_ExportAnimRange(string $wName)
2317{
2318	string $animRange = GetCurrentAnimRange($wName);
2319	if ($animRange == "")
2320	{
2321		return;
2322	}
2323	string $path = GetAnimRangeFileFolder($wName, true);
2324	if ($path == "")
2325	{
2326		return;
2327	}
2328	string $old = `workspace -q -dir`;
2329	workspace -dir $path;
2330	fileBrowserDialog -m 1 -fc ("nw4cSetAnimRange_ExportAnimRangeCB " + $wName)
2331		-an "Export" -ft "mel";
2332	workspace -dir $old;
2333
2334	// title bar doesn't become active (Maya bugfix)
2335	catch(setFocus(`getPanel -wf`));
2336	showWindow $wName;
2337}
2338
2339/******************************************************************************
2340	call editor (Graph Editor / Dope Sheet)
2341******************************************************************************/
2342global proc nw4cSetAnimRange_CallEditor(string $wName, string $cmd)
2343{
2344	string $node;
2345	$node = GetCurrentDag($wName);
2346	if ($node == "")
2347	{
2348		$node = GetCurrentAnimRange($wName);
2349	}
2350	if ($node != "")
2351	{
2352		select -r $node;
2353	}
2354	eval($cmd);
2355}
2356
2357/******************************************************************************
2358	editor menu CB
2359******************************************************************************/
2360global proc nw4cSetAnimRange_OnMenuEditor(string $wName, int $i)
2361{
2362	if (!`window -ex $wName`)
2363	{
2364		return;
2365	}
2366
2367	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item1"); // animation range from selected range
2368	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item2"); // animation range from playback range
2369	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item3"); // animation range from scene range
2370	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item4"); // playback from selected animation range
2371	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item5"); // select animation range anim curve
2372	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item6"); // select animation range hierarchy anim curve
2373	menuItem -e -en `checkBox -q -v ($wName + "ClipEnable" + $i)` ($wName + "EditorMenu" + $i + "Item9"); // delete selected animation range
2374
2375	int $en;
2376	if ($i)
2377	{
2378		$en = true;
2379	}
2380	else
2381	{
2382		$en = false;
2383	}
2384	menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item7"); // move up
2385
2386	if ($i < (GetNumberOfClip() - 1))
2387	{
2388		$en = true;
2389	}
2390	else
2391	{
2392		$en = false;
2393	}
2394	menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item8"); // move down
2395
2396	$en = false;
2397	if (`checkBox -q -v ($wName + "ClipEnable" + $i)`)
2398	{
2399		if (GetCurrentDag($wName) != "")
2400		{
2401			$en = true;
2402		}
2403	}
2404	menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item10"); // add key to hierarchy from selected animation range
2405
2406	$en = false;
2407	if (GetCurrentDag($wName) != "")
2408	{
2409		$en = true;
2410	}
2411	menuItem -e -en $en ($wName + "EditorMenu" + $i + "Item11"); // add key to hierarchy from enable animation range
2412}
2413
2414/******************************************************************************
2415	get time range
2416******************************************************************************/
2417global proc nw4cSetAnimRange_GetTimeRange(string $wName, int $i, string $mode)
2418{
2419	if (!`window -ex $wName`)
2420	{
2421		return;
2422	}
2423
2424	float $s, $e;
2425	if ($mode == "s")			// playback from selected animation range
2426	{
2427		nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s");
2428		$s = `floatField -q -v ($wName + "ClipStart" + $i)`;
2429		$e = `floatField -q -v ($wName + "ClipEnd" + $i)`;
2430		// changed from original (2006/03/07)
2431		// set start frame later to avoid adjusting start frame when (s = e)
2432		playbackOptions -max `FloatToInt $e`;
2433		playbackOptions -min `FloatToInt $s`;
2434	}
2435	else if ($mode == "m")		// playback from enable animation range
2436	{
2437		string $animRange = GetCurrentAnimRange($wName);
2438		if ($animRange != "")
2439		{
2440			float $sf[], $ef[];
2441			GetEnabledTimeRangeArray($animRange, $sf, $ef);
2442			if (size($sf))
2443			{
2444				// changed from original (2006/03/07)
2445				// set start frame later to avoid adjusting start frame when (s = e)
2446				playbackOptions -max `FloatToInt ($ef[size($ef) - 1])`;
2447				playbackOptions -min `FloatToInt $sf[0]`;
2448			}
2449		}
2450	}
2451	else
2452	{
2453		if ($mode == "t")		// animation range from selected range
2454		{
2455			string $list[] = `lsUI -ctl`;
2456			string $item;
2457			for ($item in $list)
2458			{
2459				if (`objectType $item` == "timeControl")
2460				{
2461					string $rng = `timeControl -q -rng $item`;
2462					string $tokBuf[];
2463					tokenize($rng, "\"", $tokBuf);
2464					tokenize($tokBuf[0], ":", $tokBuf);
2465					$s = (float)$tokBuf[0];
2466					$e = (float)$tokBuf[1];
2467					break;
2468				}
2469			}
2470		}
2471		else if ($mode == "p")	// animation range from playback range
2472		{
2473			$s = `playbackOptions -q -min`;
2474			$e = `playbackOptions -q -max`;
2475		}
2476		else if ($mode == "a")	// animation range from scene range
2477		{
2478			$s = `playbackOptions -q -ast`;
2479			$e = `playbackOptions -q -aet`;
2480		}
2481		DisplayTimeRange($wName, $i, $s, $e);
2482		nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s");
2483	}
2484}
2485
2486/******************************************************************************
2487	select time range key
2488******************************************************************************/
2489global proc nw4cSetAnimRange_SelectTimeRangeKey(string $wName, int $i)
2490{
2491	string $node;
2492	$node = GetCurrentDag($wName);
2493	if ($node == "")
2494	{
2495		$node = GetCurrentAnimRange($wName);
2496	}
2497	if ($node != "")
2498	{
2499		select -r $node;
2500	}
2501
2502	$node = GetCurrentAnimRange($wName);
2503	if ($node != "")
2504	{
2505		selectKey -add -k ($node + "." + "nw4c_AnimRange" + $i);
2506	}
2507}
2508
2509/******************************************************************************
2510	AE expand names
2511******************************************************************************/
2512// in others/showEditor.mel
2513proc string[] AEexpandNames(string $array[])
2514{
2515	string	$retval[];
2516	string	$buffer[];
2517	for ($i = 0; $i < size($array); ++$i)
2518	{
2519		$buffer = `ls -l $array[$i]`;
2520		for ($j = 0; $j < size($buffer); ++$j)
2521		{
2522			$retval[size($retval)] = $buffer[$j];
2523		}
2524		clear($buffer);
2525	}
2526	return $retval;
2527}
2528
2529/******************************************************************************
2530	AE filter unwanted nodes
2531******************************************************************************/
2532// in others/showEditor.mel
2533proc string[] AEfilterUnwantedNodes(string $array[])
2534{
2535	string  $retVal[];
2536	string  $nodeType;
2537	int $count, $i, $j = 0;
2538
2539	$count = size($array);
2540	for ($i = 0; $i < $count; ++$i)
2541	{
2542		$nodeType = `nodeType $array[$i]`;
2543		// Remove Referenced Fur Globals from a list
2544		int $refFurGlobal = `reference -q -inr $array[$i]`;
2545		if (!($nodeType == "renderGlobals" ||
2546			  ($nodeType == "FurGlobals" && $refFurGlobal)))
2547		{
2548			$retVal[$j] = $array[$i];
2549			++$j;
2550		}
2551	}
2552
2553	return $retVal;
2554}
2555
2556/******************************************************************************
2557	AE get related nodes
2558******************************************************************************/
2559// in others/showEditor.mel
2560proc string[] AEgetRelatedNodes(string $node)
2561{
2562	string	$rNodes[], $retval[], $tmpNodes[];
2563	string	$nodeNameType = `nodeType $node`;
2564	string	$relatedScript = ("AE"+$nodeNameType+"Related");
2565
2566	if (`exists $relatedScript`)
2567	{
2568		$tmpNodes = `eval($relatedScript + " \"" + $node + "\"")`;
2569		$rNodes = AEexpandNames($tmpNodes);
2570	}
2571	else
2572	{
2573		string $focusNode[];
2574		$tmpNodes = `defaultNavigation -ren -d $node`;
2575		$tmpNodes = AEfilterUnwantedNodes($tmpNodes);
2576		$rNodes = AEexpandNames($tmpNodes);
2577		$focusNode[0] = `defaultNavigation -dwn -d $node`;
2578		clear($tmpNodes);
2579		$tmpNodes = AEexpandNames($focusNode);
2580		$rNodes[size($rNodes)] = $tmpNodes[0];
2581	}
2582	// the first item in the return string array is the node itself
2583	//
2584	clear($tmpNodes);
2585	$tmpNodes[0] = $node;
2586	$retval = AEexpandNames($tmpNodes);
2587
2588	// need to go through the string array and remove unwanted
2589	// duplicates
2590	//
2591	for ($i = 0; $i < size($rNodes)-1; ++$i)
2592	{
2593		$duplicated = false;
2594		for ($j = 0; $j < size($retval); ++$j)
2595		{
2596			if ($rNodes[$i] == $retval[$j])
2597			{
2598				$duplicated = true;
2599				break;
2600			}
2601		}
2602		if (!$duplicated)
2603		{
2604			$retval[size($retval)] = $rNodes[$i];
2605		}
2606	}
2607
2608	// now search for the last item in the $retval for a duplicate
2609	//
2610	string $lastNode = $rNodes[size($rNodes)-1];
2611	$duplicated = false;
2612	for ($i = 0; $i < size($retval); ++$i)
2613	{
2614		if ($lastNode == $retval[$i])
2615		{
2616			$duplicated = true;
2617			break;
2618		}
2619	}
2620
2621	if (!$duplicated)
2622	{
2623		$retval[size($retval)] = $node;
2624	}
2625	else
2626	{
2627		$retval[size($retval)] = $lastNode;
2628	}
2629
2630	return $retval;
2631}
2632
2633/******************************************************************************
2634	fix AE get related nodes
2635******************************************************************************/
2636proc string[] FixAEgetRelatedNodes(string $node)
2637{
2638	string $list[] = AEgetRelatedNodes($node);
2639
2640	// shader search (Maya bugfix)
2641	string $shape[] = `ls -s $list`;
2642	string $workList[], $tmp[];
2643	string $work, $item;
2644	for ($work in $shape)
2645	{
2646		$workList = `listConnections -t "shadingEngine" $work`;
2647		$workList = stringArrayRemoveDuplicates($workList);
2648		for ($item in $workList)
2649		{
2650			$tmp = `listConnections ($item + ".surfaceShader")`;
2651			if (size($tmp))
2652			{
2653				if (!IsStringInArray($tmp[0], $list))
2654				{
2655					$list[size($list)] = $tmp[0];
2656				}
2657			}
2658		}
2659	}
2660	return $list;
2661}
2662
2663/******************************************************************************
2664	ls material
2665******************************************************************************/
2666proc string[] LsMaterial(string $list[])
2667{
2668	string $tmpList[];
2669	if (size($list))
2670	{
2671		$tmpList = `ls -mat $list`;
2672	}
2673	string $workList[], $retList[];
2674	string $temp, $work;
2675	for ($temp in $tmpList)
2676	{
2677		$work = `nodeType $temp`;
2678		$workList = `getClassification $work`;
2679		if (match("^shader/surface", $workList[0]) != "")
2680		{
2681			$retList[size($retList)] = $temp;
2682		}
2683	}
2684	return $retList;
2685}
2686
2687/******************************************************************************
2688	get selected key time list
2689******************************************************************************/
2690proc string[] GetSelectedKeyTimeList()
2691{
2692	string $sel[] = `keyframe -q -sl -n`;
2693	string $org[];
2694	float $key[];
2695	int $i, $j;
2696	// make list (attr_name, time[0], time[1], time[2], ...)
2697	for ($i = 0; $i < size($sel); ++$i)
2698	{
2699		$org[$i] = $sel[$i];
2700		$key = `keyframe -q -sl $org[$i]`;
2701		for ($j = 0; $j < size($key); ++$j)
2702		{
2703			$org[$i] = $org[$i] + "," + $key[$j];
2704		}
2705	}
2706	return $org;
2707}
2708
2709/******************************************************************************
2710	select key time list
2711******************************************************************************/
2712proc SelectKeyTimeList(string $list[])
2713{
2714	int $i, $j;
2715	string $tokBuf[];
2716	if (`keyframe -q -kc`)
2717	{
2718		selectKey -cl;
2719	}
2720	string $arg;
2721	for ($i = 0; $i < size($list); ++$i)
2722	{
2723		clear($tokBuf);
2724		tokenize($list[$i], ",", $tokBuf);
2725		$arg = "";
2726		for ($j = 1; $j < size($tokBuf); ++$j)
2727		{
2728			$arg += (" -t " + ((float)$tokBuf[$j]));
2729		}
2730		if ($arg != "")
2731		{
2732			eval("selectKey -add -k" + $arg + " " + $tokBuf[0]);
2733		}
2734	}
2735}
2736
2737/******************************************************************************
2738	search connect key attr
2739******************************************************************************/
2740proc string SearchConnectKeyAttr(string $src)
2741{
2742	string $node[] = `listConnections -p false ($src + ".output")`;
2743	if (!size($node))
2744	{
2745		return "";
2746	}
2747	string $plug[] = `listConnections -p true ($src + ".output")`;
2748
2749	if (`nodeType $node[0]` == "mute" && ($node[0] + ".input") == $plug[0])
2750	{
2751		return SearchConnectKeyAttr($node[0]);
2752	}
2753	else
2754	{
2755		return $plug[0];
2756	}
2757}
2758
2759/******************************************************************************
2760	is driven anim
2761******************************************************************************/
2762proc int IsDrivenAnim(string $anim)
2763{
2764	string $plug = SearchConnectKeyAttr($anim);
2765	if ($plug != "")
2766	{
2767		string $drv[] = `setDrivenKeyframe -q -dr $plug`;
2768		if (size($drv))
2769		{
2770			if ($drv[0] != "No drivers.")
2771			{
2772				return true;
2773			}
2774		}
2775	}
2776	return false;
2777}
2778
2779/******************************************************************************
2780	select hierarchy time range
2781******************************************************************************/
2782global proc nw4cSetAnimRange_SelectHierarchyTimeRange(string $wName, int $i)
2783{
2784	if ((`getModifiers` % 2) != 1)	// != shift
2785	{
2786		if (`keyframe -q -kc`)
2787		{
2788			selectKey -cl;
2789		}
2790	}
2791
2792	string $node = GetCurrentDag($wName);						// top dag
2793	if ($node == "")
2794	{
2795		return;
2796	}
2797	string $animRange = GetCurrentAnimRange($wName);
2798	if ($animRange == "")
2799	{
2800		return;
2801	}
2802	nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s");
2803	float $s = `floatField -q -v ($wName + "ClipStart" + $i)`;
2804	float $e = `floatField -q -v ($wName + "ClipEnd"   + $i)`;
2805	if ($s >= $e)
2806	{
2807		return;
2808	}
2809
2810	// if loop, select key at (endFrame + 1)
2811	// changed from original (2006/01/23)
2812	//if (`checkBox -q -v ($wName + "ClipLoop" + $i)`)
2813	//{
2814	//	++$e;
2815	//}
2816
2817	waitCursor -state on;
2818	string $selKey[] = GetSelectedKeyTimeList();
2819	string $sel[] = `ls -sl`;
2820
2821	select -r $node;
2822	select -hi;
2823	string $list[] = `ls -sl`;
2824	string $item;
2825	string $tree[];												// related node list
2826	string $workList[];
2827	for ($item in $list)
2828	{
2829		$workList = FixAEgetRelatedNodes($item);
2830		if (size($workList))
2831		{
2832			$tree = stringArrayCatenate($tree, $workList);
2833		}
2834	}
2835	$tree = stringArrayRemoveDuplicates($tree);
2836	$tree = `ls $tree`;											// full path -> fine path
2837	$workList = GetAnimRangeList();
2838	$tree = stringArrayRemove($workList, $tree);				// exclude animation range node
2839	$tree[size($tree)] = $animRange + ".nw4c_AnimRange" + $i;				// add specified animation range
2840
2841	// for custom effect of material
2842	$workList = LsMaterial($tree);
2843	if (size($workList))
2844	{
2845		$workList = `listHistory $workList`;
2846		if (size($workList))
2847		{
2848			$workList = stringArrayRemoveDuplicates($workList);
2849			$tree = stringArrayCatenate($tree, $workList);
2850			$tree = stringArrayRemoveDuplicates($tree);
2851		}
2852	}
2853
2854	// add select
2855	select -r $sel;
2856	SelectKeyTimeList($selKey);
2857	for ($item in $tree)
2858	{
2859		$workList = `keyframe -q -n $item`;
2860		for ($item in $workList)									// anim curve node list
2861		{
2862			if (!IsDrivenAnim($item))
2863			{
2864				selectKey -add -k -t ($s + ":" + $e) $item;
2865			}
2866		}
2867	}
2868
2869	// for dope sheet
2870	setToolTo scaleSuperContext;
2871	waitCursor -state off;
2872}
2873
2874/******************************************************************************
2875	delete time range
2876******************************************************************************/
2877global proc nw4cSetAnimRange_DeleteTimeRange(string $wName, int $i, string $mode)
2878{
2879	string $animRange = GetCurrentAnimRange($wName);
2880	if ($animRange != "")
2881	{
2882		int $s, $e;
2883		if ($mode == "s")	// selected animation range
2884		{
2885			if (!ConfirmDialogCheckWin($wName, "Delete nw4c_AnimRange" + $i + ".\n"))
2886			{
2887				return;
2888			}
2889			$s = $i;
2890			$e = $s + 1;
2891		}
2892		else				// disabled animation range
2893		{
2894			if (!ConfirmDialogCheckWin($wName, "Delete Disabled AnimRanges.\n"))
2895			{
2896				return;
2897			}
2898			$s = 0;
2899			$e = GetNumberOfClip();
2900		}
2901
2902		for ($i = $s; $i < $e; ++$i)
2903		{
2904			if ($mode == "m")
2905			{
2906				if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`)
2907				{
2908					continue;
2909				}
2910			}
2911			EnableKeyChangeScript($wName, $animRange, $i, false);
2912				cutKey -cl -at ("nw4c_AnimRange" + $i) $animRange;
2913				setAttr -c ($animRange + "." + "nw4c_AnimRange" + $i) 0;
2914
2915				$f = GetTimeRangeFromKey($animRange, $i);
2916				DisplayTimeRange($wName, $i, $f[0], $f[1]);
2917
2918				setAttr ($animRange + "." + "nw4c_AnimRangeLoop" + "[" + $i + "]") false;
2919				setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")
2920					`GetUniqueAnimRangeTitle $animRange $i`;
2921			EnableKeyChangeScript($wName, $animRange, $i, true);
2922
2923			setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") false;
2924		}
2925	}
2926}
2927
2928/******************************************************************************
2929	move time range (up / down) (using drag & drop proc)
2930******************************************************************************/
2931global proc nw4cSetAnimRange_MoveTimeRange(string $wName, int $i, string $mode)
2932{
2933	string $animRange = GetCurrentAnimRange($wName);
2934	if ($animRange != "")
2935	{
2936		int $s = $i;
2937		int $d = $i;
2938		if ($mode == "u")
2939		{
2940			if ($i)
2941			{
2942				$d--;
2943			}
2944		}
2945		else
2946		{
2947			if ($i < (GetNumberOfClip() - 1))
2948			{
2949				$s++;
2950			}
2951		}
2952		if ($s != $d)
2953		{
2954			string $dragControl = ($wName + "ClipNo" + $s);
2955			string $dropControl = ($wName + "ClipNo" + $d);
2956			string $msgs[] = nw4cSetAnimRange_DragAnimRange($wName, $dragControl, 0, 0, 0);
2957			nw4cSetAnimRange_DropAnimRange($wName, $dragControl, $dropControl, $msgs, 0, 0, 2);
2958		}
2959	}
2960}
2961
2962/******************************************************************************
2963	enable all
2964******************************************************************************/
2965global proc nw4cSetAnimRange_EnableAll(string $wName, string $mode)
2966{
2967	string $animRange = GetCurrentAnimRange($wName);
2968	if ($animRange != "")
2969	{
2970		int $i;
2971		int $no = GetNumberOfClip();
2972		int $en = false;
2973		if ($mode == "e")
2974		{
2975			$en = true;
2976		}
2977		for ($i = 0; $i < $no; ++$i)
2978		{
2979			setAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]") $en;
2980		}
2981	}
2982}
2983
2984/******************************************************************************
2985	check animation range title (if empty or same as other, restore)
2986******************************************************************************/
2987global proc nw4cSetAnimRange_CheckAnimRangeTitle(string $wName, int $i)
2988{
2989	string $animRange = GetCurrentAnimRange($wName);
2990	if ($animRange != "")
2991	{
2992		string $item = `getAttr ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]")`;
2993		//$item = `strip $item`;
2994		//setAttr -typ "string" ($animRange + "." + "nw4c_AnimRangeName" + "[" + $i + "]") $item;
2995		if ($item == ""
2996			|| match("[^0-9a-zA-Z_]", $item) != "")
2997		{
2998			RestoreTitleList($wName, $animRange, $i);
2999			warning (("nw4c_AnimRange" + $i) + ":Invalid name was specified. <" + $wName + ">.");
3000			return;
3001		}
3002
3003		int $idx;
3004		int $no = GetNumberOfClip();
3005		string $list[] = GetAttrTitleList($animRange);
3006		for ($idx = 0; $idx < $no; ++$idx)
3007		{
3008			if ($idx == $i)
3009			{
3010				continue;
3011			}
3012			if ($item == $list[$idx])
3013			{
3014				break;
3015			}
3016		}
3017		if ($idx < $no)		// same name
3018		{
3019			RestoreTitleList($wName, $animRange, $i);
3020			warning (("nw4c_AnimRange" + $i) + ":Duplicate name was specified. <" + $wName + ">.");
3021			return;
3022		}
3023
3024		SaveTitleList($wName, $animRange);
3025	}
3026}
3027
3028/******************************************************************************
3029	set animation range range key
3030******************************************************************************/
3031global proc nw4cSetAnimRange_SetAnimRangeRangeKey(string $wName, int $i)
3032{
3033	string $node = GetCurrentDag($wName);						// top dag
3034	if ($node == "")
3035	{
3036		return;
3037	}
3038	string $animRange = GetCurrentAnimRange($wName);
3039	if ($animRange == "")
3040	{
3041		return;
3042	}
3043	nw4cSetAnimRange_OnKeyChangeUI($wName, $i, "s");
3044	float $s = `floatField -q -v ($wName + "ClipStart" + $i)`;
3045	float $e = `floatField -q -v ($wName + "ClipEnd"   + $i)`;
3046	if ($s >= $e)
3047	{
3048		return;
3049	}
3050
3051	// if loop, set key at (endFrame + 1)
3052	// changed from original (2006/01/23)
3053	//if (`checkBox -q -v ($wName + "ClipLoop" + $i)`)
3054	//{
3055	//	++$e;
3056	//}
3057
3058	waitCursor -state on;
3059
3060	string $sel[] = `ls -sl`;
3061
3062	select -r $node;
3063	select -hi;
3064	string $list[] = `ls -sl`;
3065	string $item;
3066	string $tree[];												// related node list
3067	string $workList[];
3068	for ($item in $list)
3069	{
3070		$workList = FixAEgetRelatedNodes($item);
3071		if (size($workList))
3072		{
3073			$tree = stringArrayCatenate($tree, $workList);
3074		}
3075	}
3076	$tree = stringArrayRemoveDuplicates($tree);
3077	$tree = `ls $tree`;											// full path -> fine path
3078	$workList = GetAnimRangeList();
3079	$tree = stringArrayRemove($workList, $tree);				// exclude animation range node
3080
3081	// for custom effect of material
3082	$workList = LsMaterial($tree);
3083	if (size($workList))
3084	{
3085		$workList = `listHistory $workList`;
3086		if (size($workList))
3087		{
3088			$workList = stringArrayRemoveDuplicates($workList);
3089			$tree = stringArrayCatenate($tree, $workList);
3090			$tree = stringArrayRemoveDuplicates($tree);
3091		}
3092	}
3093
3094	// add key
3095	float $anchor[] = { $s, $e };
3096	float $times[], $vals[];
3097	string $itt[], $ott[];
3098	int $i;
3099	for ($item in $tree)
3100	{
3101		$workList = `keyframe -q -n $item`;
3102		for ($item in $workList)									// anim curve node list
3103		{
3104			if (IsDrivenAnim($item))
3105			{
3106				continue;
3107			}
3108			for ($i = 0; $i < size($anchor); ++$i)
3109			{
3110				$times = `keyframe -q $item`;
3111				if ($times[0] <= $anchor[$i] && $anchor[$i] <= $times[size($times) - 1])
3112				{
3113					catchQuiet(`setKeyframe -i -hi none -t $anchor[$i] $item`);
3114				}
3115				else	// out of time-range
3116				{
3117					if (`getAttr ($item + ".preInfinity")` || `getAttr ($item + ".postInfinity")`)
3118					{
3119						continue;		// != constant
3120					}
3121
3122					if ($times[0] > $anchor[$i])
3123					{
3124						$itt = `keyTangent -in 0 -q -itt $item`;
3125						if ($itt[0] == "spline" || $itt[0] == "fixed")
3126						{
3127							catchQuiet(`keyTangent -in 0 -e -l false -itt "clamped" $item`);
3128						}
3129
3130						$ott = `keyTangent -in 0 -q -ott $item`;
3131						if ($ott[0] == "step")
3132						{
3133							$vals = `keyframe -t $times[0] -q -vc $item`;
3134							catchQuiet(`setKeyframe -hi none -t $anchor[$i] -v $vals[0] $item`);
3135							continue;
3136						}
3137					}
3138					else
3139					{
3140						$ott = `keyTangent -in (size($times) - 1) -q -ott $item`;
3141						if ($ott[0] == "spline" || $ott[0] == "fixed")
3142						{
3143							catchQuiet(`keyTangent -in (size($times) - 1) -e -l false -ott "clamped" $item`);
3144						}
3145					}
3146					catchQuiet(`setKeyframe -i -hi none -t $anchor[$i] $item`);
3147				}
3148			}
3149		}
3150	}
3151
3152	if (size($sel))
3153	{
3154		select -r $sel;
3155	}
3156	else
3157	{
3158		select -cl;
3159	}
3160
3161	waitCursor -state off;
3162}
3163
3164/******************************************************************************
3165	set enabled animation range range key
3166******************************************************************************/
3167global proc nw4cSetAnimRange_SetEnabledAnimRangeRangeKey(string $wName, int $i)
3168{
3169	string $node = GetCurrentDag($wName);						// top dag
3170	if ($node == "")
3171	{
3172		return;
3173	}
3174	string $animRange = GetCurrentAnimRange($wName);
3175	if ($animRange == "")
3176	{
3177		return;
3178	}
3179
3180	int $no = GetNumberOfClip();
3181	for ($i = 0; $i < $no; ++$i)
3182	{
3183		if (`getAttr ($animRange + "." + "nw4c_AnimRangeEnable" + "[" + $i + "]")`)
3184		{
3185			nw4cSetAnimRange_SetAnimRangeRangeKey($wName, $i);
3186		}
3187	}
3188}
3189
3190/******************************************************************************
3191	update dag list
3192******************************************************************************/
3193global proc nw4cSetAnimRange_UpdateDagList(string $wName)
3194{
3195	if (!`window -ex $wName`)
3196	{
3197		return;
3198	}
3199
3200	string $exlist[] = GetDagList();
3201	string $list[];
3202	string $work;
3203	for ($work in $exlist)
3204	{
3205		if (!IsAnimRange($work))
3206		{
3207			$list[size($list)] = $work;
3208		}
3209	}
3210	string $sel[] = `textScrollList -q -ai ($wName + "DagList")`;
3211	string $name;
3212	int $i = 0;
3213
3214	// same list
3215	if (size($sel) == size($list) && size($list))
3216	{
3217		// speed up
3218		//$sel = stringArrayRemove($list, $sel);
3219		//if (!size($sel))
3220		string $intsct = `stringArrayIntersector -i $list`;
3221		stringArrayIntersector -e -i $sel $intsct;
3222		$sel = `stringArrayIntersector -q $intsct`;
3223		deleteUI $intsct;
3224		if (size($sel) == size($list))
3225		{
3226			$i = 1;
3227		}
3228	}
3229	// change list
3230	if (!$i)
3231	{
3232		// speed up
3233		textScrollList -e -vis false -m false ($wName + "DagList");
3234		textScrollList -e -ra ($wName + "DagList");
3235
3236		if (size($list))
3237		{
3238			$name = "";
3239			for ($work in $list)
3240			{
3241				$name += (" -a \"" + $work + "\"");
3242			}
3243			if (size($name))
3244			{
3245				eval("textScrollList -e " + $name + " " + ($wName + "DagList"));
3246			}
3247		}
3248		// speed up
3249		textScrollList -e -vis true -m true ($wName + "DagList");
3250	}
3251
3252	// select
3253	$work = GetCurrentDag($wName);
3254	if ($work != "")
3255	{
3256		$sel = `ls $work`;
3257		$work = $sel[0];
3258		if (IsStringInArray($work, $list))
3259		{
3260			textScrollList -e -si $work ($wName + "DagList");
3261		}
3262	}
3263}
3264
3265/******************************************************************************
3266	update animation range list
3267******************************************************************************/
3268global proc nw4cSetAnimRange_UpdateAnimRangeList(string $wName, int $updateEditor)
3269{
3270	if (!`window -ex $wName`)
3271	{
3272		return;
3273	}
3274
3275	string $list[] = GetAnimRangeList();
3276	string $sel[] = `textScrollList -q -ai ($wName + "AnimRangeList")`;
3277	string $work;
3278	string $name;
3279	int $i = 0;
3280
3281	// same list
3282	if (size($sel) == size($list) && size($list))
3283	{
3284		$sel = stringArrayRemove($list, $sel);
3285		if (!size($sel))
3286		{
3287			$i = 1;
3288		}
3289	}
3290	// change list
3291	if (!$i)
3292	{
3293		textScrollList -e -ra ($wName + "AnimRangeList");
3294
3295		if (size($list))
3296		{
3297			$name = "";
3298			for ($work in $list)
3299			{
3300				$name += (" -a \"" + $work + "\"");
3301			}
3302			if (size($name))
3303			{
3304				eval("textScrollList -e" + $name + " " + ($wName + "AnimRangeList"));
3305			}
3306		}
3307	}
3308
3309	// select
3310	$work = GetCurrentAnimRange($wName);
3311	if ($work != "")
3312	{
3313		$sel = `ls $work`;
3314		$work = $sel[0];
3315		if (IsStringInArray($work, $list))
3316		{
3317			textScrollList -e -si $work ($wName + "AnimRangeList");
3318			RelationAnimRangeToDagList($wName, $work);
3319			// changed from original (2006/01/23)
3320			if ($updateEditor)
3321			{
3322				SetEditorCurrent($wName, $work);
3323			}
3324		}
3325	}
3326	else
3327	{
3328		SetEditorCurrent($wName, "");
3329	}
3330}
3331
3332/******************************************************************************
3333	update view
3334******************************************************************************/
3335global proc nw4cSetAnimRange_UpdateView(string $wName, int $updateEditor)
3336{
3337	if (!`window -ex $wName`)
3338	{
3339		return;
3340	}
3341	checkBox -e -v false ($wName + "UpdateQueued");
3342	nw4cSetAnimRange_UpdateDagList($wName);
3343	nw4cSetAnimRange_UpdateAnimRangeList($wName, $updateEditor);
3344}
3345
3346/******************************************************************************
3347	update view queue
3348******************************************************************************/
3349global proc nw4cSetAnimRange_UpdateViewQueue(string $wName, int $updateEditor)
3350{
3351	if (!`window -ex $wName`)
3352	{
3353		return;
3354	}
3355
3356	if (!`checkBox -q -v ($wName + "UpdateQueued")`)
3357	{
3358		checkBox -e -v true ($wName + "UpdateQueued");
3359		evalDeferred -lp ("nw4cSetAnimRange_UpdateView " + $wName + " " + $updateEditor);
3360	}
3361}
3362
3363/******************************************************************************
3364	draw editor label (by frameLayout)
3365******************************************************************************/
3366proc DrawEditorLabel(string $label)
3367{
3368	frameLayout -lv false -cll false -bs "etchedOut";
3369		columnLayout -adj true -cat "both" 0;
3370			text -l $label;
3371		setParent ..;
3372	setParent ..;
3373}
3374
3375/******************************************************************************
3376	playback button CB
3377******************************************************************************/
3378global proc nw4cSetAnimRange_OnPlaybackButton(string $wName, int $cmd)
3379{
3380	if (!`window -ex $wName`)
3381	{
3382		return;
3383	}
3384	if (GetCurrentAnimRange($wName) != "")
3385	{
3386		int $cmdTable[];
3387		if ($cmd == 0)		// stop
3388		{
3389			$cmdTable = { false, false, true };
3390		}
3391		else if ($cmd == 1)	// once
3392		{
3393			$cmdTable = { true, false, false };
3394		}
3395		else				// continuous
3396		{
3397			$cmdTable = { true, true, false };
3398		}
3399		checkBox -e -v $cmdTable[0] ($wName + "PlaybackEnable");
3400		checkBox -e -v $cmdTable[1] ($wName + "PlaybackContinuous");
3401		checkBox -e -v $cmdTable[2] ($wName + "PlaybackStop");
3402		if ($cmd)
3403		{
3404			playButtonForward(); // others/timeSlider.mel
3405		}
3406	}
3407	if ($cmd == 0)		// stop
3408	{
3409		play -st false;
3410	}
3411}
3412
3413/******************************************************************************
3414	create playback control
3415******************************************************************************/
3416proc string CreatePlaybackControl(string $wName)
3417{
3418	string $lay = `formLayout`;
3419		string $btn0 = `symbolButton -w 26 -h 26 ($wName + "PlayBtn0")`;
3420		string $btn1 = `symbolButton -w 26 -h 26 ($wName + "PlayBtn1")`;
3421	setParent ..; // formLayout
3422	formLayout -e
3423		-af $btn0 "left" 24
3424		-af $btn0 "top" 0
3425		-af $btn0 "bottom" 0
3426		-ac $btn1 "left" 20 $btn0
3427		-af $btn1 "top" 0
3428		-af $btn1 "bottom" 0
3429		$lay;
3430	UpdatePlaybackButton($wName);
3431	return $lay;
3432/*
3433	string $addAnn = "AnimRange ";
3434	string $icon[] = // iconFile, annotation, command, dimWhenPlay, space
3435	{
3436		"nw4cSetAnimRange_Play.bmp"    , ($addAnn + "Once"),
3437		("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 1;"), "t", "0" ,
3438		"nw4cSetAnimRange_PlayLoop.bmp", ($addAnn + "Continuous"),
3439		("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 2;"), "t", "20",
3440		"nw4cSetAnimRange_Stop.bmp"    , ("Stop"),
3441		("nw4cSetAnimRange_OnPlaybackButton " + $wName + " 0;"), "f", "20"
3442	};
3443	int $i, $j = 0, $w, $h;
3444	string $lay;
3445	string $btn[];
3446	$lay = `formLayout`;
3447	for ($i = 0; $i < size($icon); $i += 5)
3448	{
3449		// get size
3450		$btn[$j] = `picture -i $icon[$i]`;
3451		$w = `picture -q -w $btn[$j]`;
3452		$h = `picture -q -h $btn[$j]`;
3453		deleteUI $btn[$j];
3454		// create
3455		$btn[$j] = `symbolButton -w ($w + 2) -h ($h + 2)
3456			-i $icon[$i] -ann $icon[$i + 1] -c $icon[$i + 2]
3457			($wName + "PlayBtn" + $j)`;
3458		eval("dimWhen -" + $icon[$i + 3] + " playingBack " + $btn[$j]);
3459		if (!$i)
3460		{
3461			formLayout -e
3462				-af $btn[$j] "top" 0
3463				-af $btn[$j] "left" 0
3464				-af $btn[$j] "bottom" 0 $lay;
3465		}
3466		else
3467		{
3468			formLayout -e
3469				-af $btn[$j] "top" 0
3470				-ac $btn[$j] "left" ((int)$icon[$i + 4]) $btn[$j - 1]
3471				-af $btn[$j] "bottom" 0 $lay;
3472		}
3473		++$j;
3474	}
3475	setParent ..; // formLayout
3476	return $lay;
3477*/
3478}
3479
3480/******************************************************************************
3481	create animation range edit control
3482******************************************************************************/
3483proc CreateAnimRangeEditControl(string $wName)
3484{
3485	int $afterMaya2011Adjust = 0;
3486	if (getApplicationVersionAsFloat() >= 2011)
3487		$afterMaya2011Adjust = 1;
3488
3489	int $no = GetNumberOfClip();
3490	for ($i = 0; $i < $no; ++$i)
3491	{
3492		rowLayout -nc 7 -cw 1 (110 + $afterMaya2011Adjust * 10) -cw 2 (40 + $afterMaya2011Adjust * 9)
3493					-cw 3 200 -cw 4 45 -cw 5 45 -cw 6 50 -cw 7 40
3494					-cat 1 "both" 0 -cat 2 "both" 12 -cat 3 "both" 0 -cat 4 "both" 0 -cat 5 "both" 1 -cat 6 "both" 3 -cat 7 "both" 12
3495					-cal 1 "center" -cal 2 "center" -cal 3 "center" -cal 4 "center" -cal 5 "center" -cal 6 "center" -cal 7 "center"
3496					-rat 6 "bottom" 1;
3497			popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuEditor " + $wName + " " + $i);
3498				menuItem -l ("Set Anim Range from \"Selected Range\"")
3499					-c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " t")
3500					($wName + "EditorMenu" + $i + "Item1");
3501				menuItem -l ("Set Anim Range from \"Playback Range\"")
3502					-c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " p")
3503					($wName + "EditorMenu" + $i + "Item2");
3504				menuItem -l ("Set Anim Range from \"Scene Range\"")
3505					-c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " a")
3506					($wName + "EditorMenu" + $i + "Item3");
3507				menuItem -d true;
3508				menuItem -l ("Set Playback Range from \"nw4c_AnimRange" + $i + "\"")
3509					-c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " s")
3510					($wName + "EditorMenu" + $i + "Item4");
3511				menuItem -l ("Set Playback Range from \"Enabled Anim Ranges\"")
3512					-c ("nw4cSetAnimRange_GetTimeRange " + $wName + " " + $i + " m");
3513				menuItem -d true;
3514				menuItem -l ("Select \"nw4c_AnimRange" + $i + "\" Anim Curve")
3515					-c ("nw4cSetAnimRange_SelectTimeRangeKey " + $wName + " " + $i)
3516					($wName + "EditorMenu" + $i + "Item5");
3517				menuItem -l ("Select \"nw4c_AnimRange" + $i + "\" Hierarchy Anim Curve")
3518					-c ("nw4cSetAnimRange_SelectHierarchyTimeRange " + $wName + " " + $i)
3519					($wName + "EditorMenu" + $i + "Item6");
3520				menuItem -d true;
3521				menuItem -l ("Move Up \"nw4c_AnimRange" + $i + "\"")
3522					-c ("nw4cSetAnimRange_MoveTimeRange " + $wName + " " + $i + " u")
3523					($wName + "EditorMenu" + $i + "Item7");
3524				menuItem -l ("Move Down \"nw4c_AnimRange" + $i + "\"")
3525					-c ("nw4cSetAnimRange_MoveTimeRange " + $wName + " " + $i + " d")
3526					($wName + "EditorMenu" + $i + "Item8");
3527				menuItem -d true;
3528				menuItem -l ("Sort Order by Anim Range")
3529					-c ("nw4cSetAnimRange_SortPack " + $wName + " t");
3530				menuItem -l ("Sort Order by Title")
3531					-c ("nw4cSetAnimRange_SortPack " + $wName + " n");
3532				menuItem -d true;
3533				menuItem -l ("Delete \"nw4c_AnimRange" + $i + "\"")
3534					-c ("nw4cSetAnimRange_DeleteTimeRange " + $wName + " " + $i + " s")
3535					($wName + "EditorMenu" + $i + "Item9");
3536				menuItem -l ("Delete \"Disabled Anim Ranges\"")
3537					-c ("nw4cSetAnimRange_DeleteTimeRange " + $wName + " " + $i + " m");
3538				menuItem -d true;
3539				menuItem -l ("Add Key to Hierarchy from \"nw4c_AnimRange" + $i + "\"")
3540					-c ("nw4cSetAnimRange_SetAnimRangeRangeKey " + $wName + " " + $i)
3541					($wName + "EditorMenu" + $i + "Item10");
3542				menuItem -l ("Add Key to Hierarchy from Enabled Anim Ranges")
3543					-c ("nw4cSetAnimRange_SetEnabledAnimRangeRangeKey " + $wName + " " + $i)
3544					($wName + "EditorMenu" + $i + "Item11");
3545
3546			button -l ("nw4c_AnimRange" + $i)
3547				-dgc ("nw4cSetAnimRange_DragAnimRange " + $wName)
3548				-dpc ("nw4cSetAnimRange_DropAnimRange " + $wName)
3549				-ann ("Select \"nw4c_AnimRange" + $i + "\" Hierarchy Anim Curve")
3550				-c ("nw4cSetAnimRange_SelectHierarchyTimeRange " + $wName + " " + $i)
3551				($wName + "ClipNo" + $i);
3552
3553			checkBox -l "" ($wName + "ClipEnable" + $i);
3554
3555			textField -cc ("nw4cSetAnimRange_CheckAnimRangeTitle " + $wName + " " + $i)
3556				($wName + "ClipName" + $i);
3557
3558			floatField -pre 0 ($wName + "ClipStart" + $i);
3559			floatField -pre 0 ($wName + "ClipEnd" + $i);
3560
3561			frameLayout -lv false -cll false -bs "in" -mw 1;
3562				text -l "" ($wName + "ClipSpan" + $i);
3563			setParent ..; // frameLayout
3564
3565			checkBox -l "" ($wName + "ClipLoop" + $i);
3566		setParent ..; // rowLayout
3567
3568		// no attr-change-event from anim-editor (Maya bugfix)
3569		floatField -m false ($wName + "ClipAttr" + $i);
3570	}
3571}
3572
3573/******************************************************************************
3574	load plugin
3575******************************************************************************/
3576proc LoadPlugin()
3577{
3578	if (!`pluginInfo -q -l "NW4C_CallbackJob.mll"`)
3579	{
3580		loadPlugin("NW4C_CallbackJob.mll");
3581	}
3582}
3583
3584/******************************************************************************
3585	main
3586******************************************************************************/
3587global proc NW4C_SetAnimRange()
3588{
3589	int $afterMaya2011Adjust = 0;
3590	if (getApplicationVersionAsFloat() >= 2011)
3591		$afterMaya2011Adjust = 1;
3592
3593    // minimum window size
3594	int $winW = 580 + $afterMaya2011Adjust * 50;
3595	int $winH = 441;
3596
3597	//-----------------------------------------------------------------------------
3598	// load plugin
3599	LoadPlugin();
3600
3601	//-----------------------------------------------------------------------------
3602	// check window exists
3603	string $wName = GetWindowNameString();
3604	if (`window -ex $wName`)
3605	{
3606		showWindow $wName;
3607		return;
3608	}
3609
3610	//-----------------------------------------------------------------------------
3611	// check playing back
3612	if (`isTrue "playingBack"`)
3613	{
3614		play -st false;
3615		warning ("PlayBack was stopped. Please restart \"NW4C Set Anim Range\".");
3616		return;
3617	}
3618	nw4cSetAnimRange_PlaybackExit($wName);
3619
3620	//-----------------------------------------------------------------------------
3621	// begin create window
3622	waitCursor -st 1;
3623	window -t "NW4C Set Animation Range" -wh $winW $winH -mb 1 $wName;
3624	window -e -in `window -q -t $wName` $wName;		// (Maya bugfix)
3625
3626	//-----------------------------------------------------------------------------
3627	// main menu
3628	//menuBarLayout;
3629	menu -l "File" -pmc ("nw4cSetAnimRange_OnMenuFile " + $wName);
3630		menuItem -l "Import Animation Range Channels..."
3631			-c ("nw4cSetAnimRange_ImportAnimRange " + $wName)
3632			($wName + "FileMenuItem1");
3633		menuItem -l "Export Animation Range Channels..."
3634			-c ("nw4cSetAnimRange_ExportAnimRange " + $wName)
3635			($wName + "FileMenuItem2");
3636	menu -l "Window";
3637		//if (!`exists nw4c_AnimEditUtility`)
3638		if (1)
3639		{
3640			menuItem -l "Graph Editor..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " GraphEditor");
3641			menuItem -l "Dope Sheet..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " DopeSheetEditor");
3642		}
3643		//else
3644		//{
3645		//	menuItem -l "NW4C AnimEdit Utility..." -c ("nw4cSetAnimRange_CallEditor " + $wName + " nw4c_AnimEditUtility");
3646		//}
3647	menu -l "Help";
3648		menuItem -l ("Help on " + `window -q -t $wName` + "...")
3649			-c "NW4C_ShowHelp \"html/NW4C_SetAnimRange.html\" \"\"";
3650	//setParent ..; // menuBarLayout
3651
3652	//-----------------------------------------------------------------------------
3653	// top layout
3654	string $frm, $ctl;
3655	formLayout ($wName + "TopLayout");
3656		nameField -en false -vis false ($wName + "DagName");
3657		nameField -en false -vis false ($wName + "AnimRangeNameMaster");
3658		paneLayout -cn "top3" -ps 1 50 30 -ps 2 50 30 -ps 3 100 70
3659			-h 270 -w 530 ($wName + "Pane");
3660			//-----------------------------------------------------------------------------
3661			// dag list
3662			$frm = `formLayout`;
3663				$ctl = `text -l "Root List"`;
3664				textScrollList -ams false -fn "plainLabelFont"
3665					-sc ("nw4cSetAnimRange_OnSelectDagList " + $wName)
3666					-dcc ("nw4cSetAnimRange_OnDblClkDagList " + $wName)
3667					($wName + "DagList");
3668					popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuDagList " + $wName);
3669						menuItem -l "Create and Attach nw4c_AnimRangeCtrl"
3670							-c ("nw4cSetAnimRange_CreateAnimRange " + $wName + " a")
3671							($wName + "DagListMenuItem1");
3672				formLayout -e
3673						-af $ctl "top"		0
3674						-af $ctl "left"		5
3675						-an $ctl "bottom"
3676						-af $ctl "right"	0
3677						-ac ($wName + "DagList") "top"		0	$ctl
3678						-af ($wName + "DagList") "left"		0
3679						-af ($wName + "DagList") "bottom"	0
3680						-af ($wName + "DagList") "right"	0
3681						$frm;
3682			setParent ..; // formLayout
3683
3684			//-----------------------------------------------------------------------------
3685			// animation range list
3686			$frm = `formLayout`;
3687				$ctl = `text -l "nw4c_AnimRangeCtrl List"`;
3688				nameField -vis false ($wName + "AnimRangeNameWork");
3689				textScrollList -ams false -fn "plainLabelFont"
3690					-sc ("nw4cSetAnimRange_OnSelectAnimRangeList " + $wName)
3691					-dcc ("nw4cSetAnimRange_OnDblClkAnimRangeList " + $wName)
3692					($wName + "AnimRangeList");
3693					popupMenu -b 3 -pmc ("nw4cSetAnimRange_OnMenuAnimRangeList " + $wName);
3694						menuItem -l "Create nw4c_AnimRangeCtrl"
3695							-c ("nw4cSetAnimRange_CreateAnimRange " + $wName + " c")
3696							($wName + "AnimRangeListMenuItem1");
3697						menuItem -l "Duplicate Highlighted"
3698							-c ("nw4cSetAnimRange_DuplicateAnimRange " + $wName)
3699							($wName + "AnimRangeListMenuItem2");
3700						menuItem -d true;
3701						menuItem -l "Attach Highlighted to" -sm true
3702							($wName + "AnimRangeListMenuItem3");
3703						setParent -menu ..;
3704						menuItem -l "Detach Highlighted"
3705							-c ("nw4cSetAnimRange_DeattachAnimRange " + $wName)
3706							($wName + "AnimRangeListMenuItem4");
3707						menuItem -d true;
3708						menuItem -l "Delete Highlighted"
3709							-c ("nw4cSetAnimRange_DeleteAnimRangeCtrl " + $wName)
3710							($wName + "AnimRangeListMenuItem5");
3711				formLayout -e
3712						-af $ctl "top"		0
3713						-af $ctl "left"		5
3714						-an $ctl "bottom"
3715						-af $ctl "right"	0
3716						-ac ($wName + "AnimRangeList") "top"		0	$ctl
3717						-af ($wName + "AnimRangeList") "left"		0
3718						-af ($wName + "AnimRangeList") "bottom"	0
3719						-af ($wName + "AnimRangeList") "right"	0
3720						$frm;
3721			setParent ..; // formLayout
3722
3723			//-----------------------------------------------------------------------------
3724			// edit area
3725			$frm = `formLayout`;
3726				$ctl = `scrollLayout -hst 0`;
3727				formLayout -e
3728						-af $ctl "top"		0
3729						-af $ctl "left"		0
3730						-af $ctl "bottom"	0
3731						-af $ctl "right"	0
3732						$frm;
3733					columnLayout -adj true -cat "both" 0;
3734						text -l " Edit" -fn "boldLabelFont" -al "left";
3735						rowLayout -nc 2 -cw 1 (170 + $afterMaya2011Adjust * 20) -cw 2 220
3736							-ct2 "both" "both" -cl2 "right" "center";
3737							text -l "Current nw4c_AnimRangeCtrl  :  ";
3738							nameField -en false ($wName + "AnimRangeName");
3739						setParent ..; // rowLayout
3740						separator -st "none" -h 5;
3741
3742						rowColumnLayout -nc 5
3743							-cw 1 (1 + $afterMaya2011Adjust * 75) -cw 2 (169 - $afterMaya2011Adjust * 53) -cw 3 300 -cw 4 5 -cw 5 25
3744							-cat 2 "right" 0;
3745							text -l ""; // dummy
3746							checkBox -l "Merge cmdl File" -v 0
3747								-cc ("nw4cSetAnimRange_MergeCmdlFlagCB " + $wName)
3748								($wName + "MergeCmdlFlag");
3749							textField
3750								($wName + "MergeCmdlPath");
3751							text -l ""; // dummy
3752							symbolButton -i "navButtonBrowse.xpm"
3753								-c ("nw4cSetAnimRange_MergeCmdlBrowserCB " + $wName)
3754								($wName + "MergeCmdlBrowser");
3755						setParent ..; // rowColumnLayout
3756						separator -st "none" -h 5;
3757
3758						frameLayout -l "" -cll 1 -cl 1 -bv 1 -bs "etchedIn"
3759								($wName + "CustomOptsLayout");
3760							columnLayout -adj 1 -rs 4;
3761								checkBoxGrp -l "" -ncb 1 -cw2 18 200
3762									-l1 "Enable Custom Options"
3763									-cc ("nw4cSetAnimRange_EnableCustomOptsCB " + $wName)
3764									($wName + "EnableCustomOpts");
3765								frameLayout -l "Optimization Options" -cll 0 -cl 0 -bv 1 -bs "etchedIn";
3766									columnLayout -adj 1 -rs 4;
3767									optionMenuGrp -l "Compress Node" -cw 1 100
3768										-rat 1 "both" 4 -cat 1 "right" 4
3769										($wName + "CompressNode");
3770										menuItem -da 0 -l "None";
3771										menuItem -da 1 -l "Cull Useless Node";
3772										menuItem -da 2 -l "Cull Uninfluential Node";
3773										menuItem -da 3 -l "Unite Compressible Node";
3774										menuItem -da 4 -l "Unite All Node";
3775										menuItem -da 5 -l "Unite Below Node";
3776									optionMenuGrp -l "Compress Material" -cw 1 100
3777										-rat 1 "both" 4 -cat 1 "right" 4
3778										($wName + "CompressMaterial");
3779										menuItem -da 0 -l "None";
3780										menuItem -da 1 -l "Compress Same Material";
3781									checkBoxGrp -l "" -ncb 1 -cw 1 100 -cw 2 120
3782										-l1 "Optimize Primitive" -v1 0
3783										($wName + "OptimizePrimitive");
3784									checkBoxGrp -l "" -ncb 1 -cw 1 100 -cw 2 190
3785										-l1 "Disable SkeletalModel-Simplification" -v1 0
3786										($wName + "DisableSkeletalModelSimplification");
3787									setParent ..; // columnLayout
3788								setParent ..; // frameLayout
3789							setParent ..; // columnLayout
3790						setParent ..; // frameLayout
3791						separator -st "none" -h 5;
3792
3793						columnLayout -adj true -cat "both" 0 ($wName + "Editor");
3794							textScrollList -vis 0 ($wName + "_ClipNameList"); // to restore name (never displayed)
3795							rowLayout -nc 6
3796								-cw 1 (110 + $afterMaya2011Adjust * 10) -cw 2 (40 + $afterMaya2011Adjust * 10)
3797								-cw 3 200 -cw 4 (90 + $afterMaya2011Adjust * 33) -cw 5 50 -cw 6 40
3798								-ct6 "both" "both" "both" "both" "both" "both"
3799								-cl6 "center" "center" "center" "center" "center" "center";
3800								DrawEditorLabel("Channel");
3801								DrawEditorLabel("Enable");
3802									popupMenu -b 3;
3803										menuItem -l "Enable All"
3804											-c ("nw4cSetAnimRange_EnableAll " + $wName + " e");
3805										menuItem -l "Disable All"
3806											-c ("nw4cSetAnimRange_EnableAll " + $wName + " d");
3807								DrawEditorLabel("Title");
3808								DrawEditorLabel("Animation Range");
3809								DrawEditorLabel("Size");
3810								DrawEditorLabel("Loop");
3811							setParent ..; // rowLayout
3812							columnLayout -adj true -cat "both" 0;
3813								CreateAnimRangeEditControl($wName);
3814							setParent ..; // columnLayout
3815						setParent ..; // columnLayout
3816					setParent ..; // columnLayout
3817				setParent ..; // scrollLayout
3818			setParent ..; // formLayout
3819		setParent ..; // paneLayout
3820
3821		//-----------------------------------------------------------------------------
3822		$ctl = `columnLayout -adj true -cat "both" 0`;
3823			//-----------------------------------------------------------------------------
3824			// playback
3825			frameLayout -lv false -cll false -bs "in";
3826				columnLayout -adj true -cat "both" 0;
3827					rowLayout -nc 3 -cw 1 220 -cw 2 180 -adj 3
3828						-ct3 "both" "both" "both"
3829						-cl3 "left" "center" "center";
3830						columnLayout -adj true -cat "both" 0 -cal "left";
3831							text -l " Current Animation Range Playback" -fn "boldLabelFont";
3832						setParent ..; // columnLayout
3833						columnLayout -adj true -cat "both" 0;
3834							separator -st "none" -h 5;
3835							CreatePlaybackControl($wName);
3836						setParent ..; // columnLayout
3837						columnLayout -adj true -cat "both" 0;
3838							separator -st "none" -h 8;
3839							rowLayout -nc 2 -cw 1 70 -cw 2 40
3840								-ct2 "both" "both" -cl2 "right" "center";
3841								text -l "Loop Count ";
3842								intField -v 3 -min 1 ($wName + "Loop");
3843							setParent ..; // rowLayout
3844						setParent ..; // columnLayout
3845					setParent ..; // rowLayout
3846					columnLayout -vis false -adj true -cat "both" 10 -cal "left";
3847						checkBox -l "" ($wName + "PlaybackEnable");
3848						checkBox -l "" ($wName + "PlaybackContinuous");
3849						checkBox -l "" ($wName + "PlaybackStop");
3850						separator -st "none" -h 3;
3851					setParent ..; // columnLayout
3852					separator -st "none" -h 3;
3853				setParent ..; // columnLayout
3854			setParent ..; // frameLayout
3855			separator -st "none" -h 5;
3856
3857			//-----------------------------------------------------------------------------
3858			// close button
3859			columnLayout -adj true -cat "both" 10;
3860				button -l "Close" -c ("deleteUI " + $wName);
3861			setParent ..; // columnLayout
3862
3863			formLayout -e
3864				-af ($wName + "Pane") "top"		0
3865				-af ($wName + "Pane") "left"	0
3866				-ac ($wName + "Pane") "bottom"	0	$ctl
3867				-af ($wName + "Pane") "right"	0
3868				-an $ctl "top"
3869				-af $ctl "left"		0
3870				-af $ctl "bottom"	3
3871				-af $ctl "right"	0
3872				($wName + "TopLayout");
3873
3874			// speed up
3875			//nw4cSetAnimRange_NodeUpdateCtrl($wName, $wName + "TopLayout", "nw4cSetAnimRange_UpdateView " + $wName);
3876				// ^ commented out in original
3877			checkBox -m false -v false ($wName + "UpdateQueued");
3878
3879			//-----------------------------------------------------------------------------
3880			// set script job
3881			scriptJob -p $wName -e deleteAll ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0");
3882			scriptJob -p $wName -e NameChanged ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 1");
3883			scriptJob -p $wName -cf readingFile ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0");
3884			scriptJob -p $wName -ct "delete" ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0");
3885			scriptJob -p $wName -e DagObjectCreated ("nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0");
3886			eval("NW4C_CallbackJob -p " + $wName
3887				+ " -e kAfterRemoveReference \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\"");
3888			if (`getApplicationVersionAsFloat` >= 6.5) // in startup/getApplicationVersionAsFloat.mel
3889			{
3890				eval("NW4C_CallbackJob -p " + $wName
3891					+ " -e kAfterUnloadReference \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\"");
3892			}
3893			eval("NW4C_CallbackJob -p " + $wName
3894				+ " -e kParentAdded \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\"");
3895			eval("NW4C_CallbackJob -p " + $wName
3896				+ " -e kParentRemoved \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\"");
3897			eval("NW4C_CallbackJob -p " + $wName
3898				+ " -e kChildReordered \"nw4cSetAnimRange_UpdateViewQueue " + $wName + " 0\"");
3899
3900			button -m false ($wName + "DefFocus");
3901			setFocus ($wName + "DefFocus");
3902
3903		setParent ..; // columnLayout (playback & close)
3904	setParent ..; // formLayout (Top)
3905
3906	if (`window -q -w $wName` < $winW)
3907	{
3908		window -e -w $winW $wName;
3909	}
3910	if (`window -q -h $wName` < $winH)
3911	{
3912		window -e -h $winH $wName;
3913	}
3914
3915	showWindow;
3916
3917	//-----------------------------------------------------------------------------
3918	// update window
3919	nw4cSetAnimRange_UpdateView($wName, 0);
3920	SetEditorCurrent($wName, "");
3921	waitCursor -st 0;
3922
3923	//-----------------------------------------------------------------------------
3924	// create playing back condition
3925	condition -i -d "playingBack"
3926		-s ("nw4cSetAnimRange_PlaybackCondition " + $wName)
3927		($wName + "PlaybackCondition");
3928	scriptJob -uid $wName ("nw4cSetAnimRange_PlaybackCondition " + $wName);
3929	scriptJob -p $wName -e SelectionChanged
3930		("nw4cSetAnimRange_OnKeyChangeAddKey " + $wName);
3931}
3932
3933