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