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