1/******************************************************************************
2	NintendoWare for CTR Maya Plugin
3
4	File:         NW4C_SetUserData.mel
5	Description:  set user data
6	Date:         2010/10/14
7	Author:       Takashi Endo
8
9	Copyright 2010 Nintendo Co., Ltd. All rights reserved.
10******************************************************************************/
11
12// UpdateWindowT OpenInputWindow
13// InputApplyCB DeleteBtnCB MoveUpBtnCB
14
15/******************************************************************************
16	user data size
17******************************************************************************/
18global proc int nw4cSetUserData_Get_UserDataSize(string $node)
19{
20	return (`attributeQuery -n $node -ex "nw4cUserDataSize"`) ?
21		`getAttr ($node + ".nw4cUserDataSize")` : 0;
22}
23
24global proc nw4cSetUserData_Add_UserDataSize(string $node)
25{
26	if (!`attributeQuery -n $node -ex "nw4cUserDataSize"`)
27	{
28		addAttr -ln "nw4cUserDataSize" -at "short" -dv 0 -h 1 $node;
29	}
30}
31
32global proc nw4cSetUserData_Set_UserDataSize(string $node, int $val)
33{
34	nw4cSetUserData_Add_UserDataSize($node);
35	setAttr ($node + ".nw4cUserDataSize") $val;
36}
37
38/******************************************************************************
39	user data value
40******************************************************************************/
41global proc string nw4cSetUserData_Get_UserDataValue(string $node, int $index)
42{
43	if (!`attributeQuery -n $node -ex "nw4cUserData"` ||
44		$index >= nw4cSetUserData_Get_UserDataSize($node))
45	{
46		return "";
47	}
48	string $val = `getAttr ($node + ".nw4cUserData[" + $index + "]")`;
49	return $val;
50}
51
52global proc nw4cSetUserData_Add_UserDataValue(string $node)
53{
54	if (!`attributeQuery -n $node -ex "nw4cUserData"`)
55	{
56		addAttr -m -ln "nw4cUserData" -dt "string" -h 1 $node;
57	}
58}
59
60global proc nw4cSetUserData_Set_UserDataValue(string $node, int $index, string $val)
61{
62	nw4cSetUserData_Add_UserDataValue($node);
63	setAttr -typ "string" ($node + ".nw4cUserData[" + $index + "]") $val;
64	//trace ("set: " + $node + ".data[" + $index + "] = " + $val);
65}
66
67global proc int nw4cSetUserData_Get_AllUserDataValue(string $values[], string $node)
68{
69	clear($values);
70	int $size = nw4cSetUserData_Get_UserDataSize($node);
71	for ($index = 0; $index < $size; ++$index)
72	{
73		$values[$index] = nw4cSetUserData_Get_UserDataValue($node, $index);
74	}
75	return $size; // return user data size
76}
77
78/******************************************************************************
79	is user data name is unique
80******************************************************************************/
81proc int IsUserDataNameIsUnique(string $dataValues[], string $checkName,
82	int $editIndex)
83{
84	int $dataSize = size($dataValues);
85	int $index;
86	for ($index = 0; $index < $dataSize; ++$index)
87	{
88		if ($index == $editIndex)
89		{
90			continue;
91		}
92		string $name = match("[^\"]*\"", $dataValues[$index]);
93		if (size($name) >= 2)
94		{
95			if (substring($name, 1, size($name) - 1) == $checkName)
96			{
97				return false;
98			}
99		}
100	}
101	return true;
102}
103
104/******************************************************************************
105	decode user data value
106
107		$words[0]: name
108		$words[1]: type (0, 1, 2)
109		$words[2]: size
110		$words[3]: value
111******************************************************************************/
112proc DecodeUserDataValue(string $words[], string $userData)
113{
114	string $name = match("[^\"]*\"", $userData);
115	string $typeStr = "0";
116	string $sizeStr = "0";
117	string $valStr = "";
118
119	int $nameSize = size($name);
120	if ($nameSize <= 1)
121	{
122		$name = "error";
123	}
124	else
125	{
126		$name = substring($name, 1, $nameSize - 1);
127		$userData = substring($userData, $nameSize + 1, size($userData));
128		if (size(match("^i", $userData)) > 0)
129		{
130			$typeStr = "1";
131		}
132		else if (size(match("^f", $userData)) > 0)
133		{
134			$typeStr = "2";
135		}
136		$userData = substring($userData, 3, size($userData));
137		$sizeStr = match("[0-9]+", $userData);
138		$valStr = substring($userData, size($sizeStr) + 2, size($userData));
139	}
140
141	$words[0] = $name;
142	$words[1] = $typeStr;
143	$words[2] = $sizeStr;
144	$words[3] = $valStr;
145}
146
147/******************************************************************************
148	get list string from user data value
149******************************************************************************/
150proc string GetListStringFromUserDataValue(string $userData)
151{
152	//-----------------------------------------------------------------------------
153	// decode
154	string $words[4];
155	DecodeUserDataValue($words, $userData);
156	string $name    = $words[0];
157	int $type       = (int)$words[1];
158	string $sizeStr = $words[2];
159	string $valStr  = $words[3];
160
161	//-----------------------------------------------------------------------------
162	// format
163	int $nameSize = size($name);
164	if ($nameSize < 16)
165	{
166		$name += substring("                ", 1, 16 - $nameSize);
167	}
168	else if ($nameSize > 16)
169	{
170		$name = substring($name, 1, 16 - 3) + "...";
171	}
172
173	if ($type == 0)
174	{
175		string $strs[];
176		tokenize($valStr, "&", $strs);
177		$valStr = "";
178		for ($str in $strs)
179		{
180			$str = strip($str);
181			//print ("[" + $str + "]\n");
182			if (size($str) == 0)
183			{
184				continue;
185			}
186
187			if (size($valStr) != 0) $valStr += " ";
188			$valStr += $str;
189		}
190	}
191
192	if (size($sizeStr) < 4)
193	{
194		$sizeStr = substring("    ", 1, 4 - size($sizeStr)) + $sizeStr;
195	}
196
197	if (size($valStr) > 24)
198	{
199		$valStr = substring($valStr, 1, 24 - 3) + "...";
200	}
201
202	string $typeNames[3] = { "(String) ", "(Integer)", "(Float)  " };
203	return ($name + "  " + $typeNames[$type] + "  [" + $sizeStr + "]  \"" + $valStr + "\"");
204}
205
206/******************************************************************************
207	get selected SG
208
209		return SG size
210******************************************************************************/
211proc int GetSelectedSG(string $sgs[])
212{
213	$sgs = `ls -sl -typ shadingEngine`;
214	if (size($sgs) == 0)
215	{
216		// get SG from selected material
217		string $mats[] = `ls -sl -mat`;
218		for ($mat in $mats)
219		{
220			if (!`attributeQuery -n $mat -ex "oc"`)
221			{
222				continue;
223			}
224			string $connectedSgs[] =
225				`listConnections -s 0 -d 1 -type shadingEngine ($mat + ".oc")`;
226			for ($sg in $connectedSgs)
227			{
228				if ($sg != "initialParticleSE" &&
229					$sg != "swatchShadingGroup")
230				{
231					$sgs[size($sgs)] = $sg;
232				}
233			}
234		}
235	}
236	return size($sgs);
237}
238
239/******************************************************************************
240	is valid transform
241******************************************************************************/
242proc int IsValidTransform(string $node)
243{
244	string $childs[] = `listRelatives -pa -s $node`;
245	if (size(`ls
246		-typ ambientLight
247		-typ areaLight
248		-typ volumeLight
249		-typ environmentFog
250		$childs`) > 0)
251	{
252		return false;
253	}
254	else
255	{
256		return true;
257	}
258}
259
260/******************************************************************************
261	get selected transform & SG
262
263		return node size
264******************************************************************************/
265proc int GetSelectedXformAndSG(string $nodes[])
266{
267	clear($nodes);
268
269	//-----------------------------------------------------------------------------
270	// transform
271	string $xforms[] = `ls -sl -typ transform`;
272	for ($node in $xforms)
273	{
274		if (IsValidTransform($node))
275		{
276			$nodes[size($nodes)] =$node;
277		}
278	}
279
280	//-----------------------------------------------------------------------------
281	// SG
282	string $sgs[];
283	if (GetSelectedSG($sgs) > 0)
284	{
285		for ($node in $sgs)
286		{
287			$nodes[size($nodes)] =$node;
288		}
289	}
290
291	return size($nodes);
292}
293
294/******************************************************************************
295	enable main window
296******************************************************************************/
297global proc nw4cSetUserData_EnableMainWindow(int $enableFlag)
298{
299	if (`window -ex nw4cSetUserData_Win`)
300	{
301		control -e -en $enableFlag nw4cSetUserData_MoveUpBtn;
302		control -e -en $enableFlag nw4cSetUserData_MoveDownBtn;
303		control -e -en $enableFlag nw4cSetUserData_AddBtn;
304		control -e -en $enableFlag nw4cSetUserData_DeleteBtn;
305		control -e -en $enableFlag nw4cSetUserData_EditBtn;
306		control -e -en $enableFlag nw4cSetUserData_List;
307		control -e -en $enableFlag nw4cSetUserData_CloseBtn;
308	}
309}
310
311/******************************************************************************
312	input apply callback
313******************************************************************************/
314global proc nw4cSetUserData_InputApplyCB(string $node,
315	int $curIndex, int $addFlag)
316{
317	//-----------------------------------------------------------------------------
318	// check node exist
319	if (!`objExists $node`)
320	{
321		warning ("Node does not exist: " + $node);
322		return;
323	}
324
325	//-----------------------------------------------------------------------------
326	// get all data
327	string $dataValues[];
328	int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
329
330	//-----------------------------------------------------------------------------
331	// get control value
332	string $name = `textField -q -tx nw4cSetUserData_DataName`;
333	$name = strip($name);
334	int $type = `radioButtonGrp -q -sl nw4cSetUserData_DataType` - 1;
335	string $value = `scrollField -q -tx nw4cSetUserData_Value`;
336
337	//-----------------------------------------------------------------------------
338	// check name
339	string $strVals[];
340	int $intNums[];
341	float $floatNums[];
342	if (size($name) == 0)
343	{
344		error "Name is empty";
345	}
346	if (size(match("[^-_.0-9A-Za-z]", $name)) > 0)
347	{
348		error "Name is wrong (please use only [alphabetic/numeric character] [-] [_] [.])";
349	}
350	int $editIndex = ($addFlag) ? -1 : $curIndex;
351	if (!IsUserDataNameIsUnique($dataValues, $name, $editIndex))
352	{
353		error "Name is already used";
354	}
355
356	//-----------------------------------------------------------------------------
357	// check value
358	if ($type == 0)	// string
359	{
360		if (size($value) == 0)
361		{
362			error "String is empty";
363		}
364		string $lines[];
365		tokenize($value, "\n", $lines);
366		for ($line in $lines)
367		{
368			$line = strip($line);
369			//print ("[" + $line + "]\n");
370			if (size($line) == 0)
371			{
372				continue;
373			}
374
375			if (size(match("[<>&'\"]", $line)) > 0)
376			{
377				error "String is wrong (please don't use [<] [>] [&] ['] [double quote])";
378			}
379
380			$strVals[size($strVals)] = $line;
381		}
382
383		if (size($strVals) == 0)
384		{
385			error "Please input strings";
386		}
387	}
388	else			// int / float
389	{
390		if (size($value) == 0)
391		{
392			error "Number is empty";
393		}
394		int $validFlag = 1;
395		string $lines[];
396		tokenize($value, "\n", $lines);
397		for ($line in $lines)
398		{
399			$line = strip($line);
400			//print ("[" + $line + "]\n");
401			if (size($line) == 0)
402			{
403				continue;
404			}
405
406			string $words[];
407			if (tokenize($line, " ", $words) != 1 || // multi value per line
408				size(match("[^eE][+-]", $line)) > 0) // +/- is not at top or after E
409			{
410				$validFlag = 0;
411				break;
412			}
413
414			if ($type == 1)	// int
415			{
416				if (size(match("[^+-0123456789]", $line)) > 0)
417				{
418					$validFlag = 0;
419					break;
420				}
421				$intNums[size($intNums)] = (int)$line;
422			}
423			else			// float
424			{
425				if (size(match("[^+-0123456789eE.]", $line)) > 0)
426				{
427					$validFlag = 0;
428					break;
429				}
430				$floatNums[size($floatNums)] = (float)$line;
431			}
432		}
433
434		if ($type == 1)
435		{
436			if (!$validFlag || size($intNums) == 0)
437			{
438				error "Please input integer number";
439			}
440		}
441		else
442		{
443			if (!$validFlag || size($floatNums) == 0)
444			{
445				error "Please input float number";
446			}
447		}
448	}
449
450	//-----------------------------------------------------------------------------
451	// create data string
452	string $dataStr = $name + "\"";
453	if ($type == 0)
454	{
455		int $strLen = 0;
456		string $strData = "";
457		string $strVal;
458		for ($strVal in $strVals)
459		{
460			if (size($strData) > 0)
461			{
462				$strData += "&";
463			}
464			$strData += $strVal;
465			$strLen += size($strVal);
466		}
467
468		$dataStr += "s " + $strLen + " " + $strData;
469	}
470	else if ($type == 1)
471	{
472		$dataStr += "i " + size($intNums);
473		int $intVal;
474		for ($intVal in $intNums)
475		{
476			$dataStr += " " + $intVal;
477		}
478	}
479	else
480	{
481		$dataStr += "f " + size($floatNums);
482		float $floatVal;
483		for ($floatVal in $floatNums)
484		{
485			$dataStr += " " + $floatVal;
486		}
487	}
488
489	//-----------------------------------------------------------------------------
490	// add or edit
491	if ($addFlag)
492	{
493		//-----------------------------------------------------------------------------
494		// add
495		if ($curIndex > $dataSize)
496		{
497			$curIndex = $dataSize;
498		}
499		if ($dataSize > 0)
500		{
501			// shift
502			for ($idx = $dataSize; $idx > $curIndex; --$idx)
503			{
504				nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx - 1]);
505			}
506		}
507		nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr);
508		nw4cSetUserData_Set_UserDataSize($node, $dataSize + 1);
509	}
510	else
511	{
512		//-----------------------------------------------------------------------------
513		// edit
514		if ($dataSize == 0)
515		{
516			$curIndex = 0;
517			nw4cSetUserData_Set_UserDataSize($node, 1);
518		}
519		else if ($curIndex >= $dataSize)
520		{
521			$curIndex = $dataSize - 1;
522		}
523		nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr);
524	}
525}
526
527/******************************************************************************
528	open input window
529******************************************************************************/
530proc OpenInputWindow(string $node, int $curIndex, int $addFlag)
531{
532	//-----------------------------------------------------------------------------
533	// get current value
534	string $name = "";
535	int $type = 0;
536	string $values = "";
537	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
538	if (!$addFlag)
539	{
540		string $userData = nw4cSetUserData_Get_UserDataValue($node, $curIndex);
541		string $words[4];
542		DecodeUserDataValue($words, $userData);
543		$name = $words[0];
544		$type = (int)$words[1];
545		string $valStr = $words[3];
546		if ($type == 0)
547		{
548			string $strs[];
549			tokenize($valStr, "&", $strs);
550			for ($str in $strs)
551			{
552				$values += ("" + $str + "\r\n");
553			}
554		}
555		else
556		{
557			string $nums[];
558			tokenize($valStr, " ", $nums);
559			for ($num in $nums)
560			{
561				$values += ("" + $num + "\r\n");
562			}
563		}
564	}
565
566	//-----------------------------------------------------------------------------
567	// set command
568	string $applyCmd = ("nw4cSetUserData_InputApplyCB "
569		+ $node + " " + $curIndex + " " + $addFlag + ";");
570	int $closeSelIndex = ($addFlag && $curIndex >= $dataSize) ? -1 : $curIndex;
571	int $closeShowIndex = ($addFlag && $curIndex >= $dataSize) ? $curIndex : -1;
572	string $closeCmd = "deleteUI nw4cSetUserData_InputWin; "
573		+ "nw4cSetUserData_UpdateWindow " + $closeSelIndex + " " + $closeShowIndex + "; ";
574
575	//-----------------------------------------------------------------------------
576	// create window
577	int $wd = 320;
578	int $ht = 370;
579	if (`window -ex nw4cSetUserData_InputWin`)
580	{
581		deleteUI nw4cSetUserData_InputWin;
582	}
583	window -t ("Input User Data   ---   " + $node) -wh $wd $ht -mxb 0 -tbm 0
584		nw4cSetUserData_InputWin;
585	//columnLayout -adj 1 -cat "both" 8 -cal "center" -rs 8;
586	string $form = `formLayout -nd 100`;
587
588	//-----------------------------------------------------------------------------
589	// attr
590	string $nameLabel = `text -l "Name" -al "right"`;
591	textField -tx $name
592		-ec ($applyCmd + $closeCmd)
593		nw4cSetUserData_DataName;
594
595	radioButtonGrp -l "Type" -nrb 3 -cw4 60 70 70 70
596		-la3 "String" "Integer" "Float"
597		-sl ($type + 1)
598		nw4cSetUserData_DataType;
599
600	text -l "String or Number : (One value per line)" -al "left" -fn "boldLabelFont"
601		nw4cSetUserData_NumberLabel;
602	scrollField -ww 0 -tx $values
603		-ec "scrollField -e -it \"\\r\\n\" nw4cSetUserData_Value"
604		nw4cSetUserData_Value;
605
606	//-----------------------------------------------------------------------------
607	// OK & Cancel button
608	string $okBtn     = `button -w 100 -h 26 -l "OK"
609		-c ($applyCmd + $closeCmd)`;
610	string $cancelBtn = `button -w 100 -h 26 -l "Cancel"
611		-c ($closeCmd)`;
612
613	formLayout -e
614		-af $nameLabel "top" 8
615		-an $nameLabel "left"
616		-an $nameLabel "bottom"
617		-ac $nameLabel "right" 10 nw4cSetUserData_DataName
618
619		-af nw4cSetUserData_DataName "top" 8
620		-af nw4cSetUserData_DataName "left" 68
621		-an nw4cSetUserData_DataName "bottom"
622		-af nw4cSetUserData_DataName "right" 8
623
624		-ac nw4cSetUserData_DataType "top" 16 $nameLabel
625		-af nw4cSetUserData_DataType "left" 8
626		-an nw4cSetUserData_DataType "bottom"
627		-an nw4cSetUserData_DataType "right"
628
629		-ac nw4cSetUserData_NumberLabel "top" 12 nw4cSetUserData_DataType
630		-af nw4cSetUserData_NumberLabel "left" 8
631		-an nw4cSetUserData_NumberLabel "bottom"
632		-af nw4cSetUserData_NumberLabel "right" 8
633
634		-ac nw4cSetUserData_Value "top" 0 nw4cSetUserData_NumberLabel
635		-af nw4cSetUserData_Value "left" 8
636		-af nw4cSetUserData_Value "bottom" 48
637		-af nw4cSetUserData_Value "right" 8
638
639		-an $okBtn "top"
640		-an $okBtn "left"
641		-af $okBtn "bottom" 8
642		-ac $okBtn "right" 8 $cancelBtn
643
644		-an $cancelBtn "top"
645		-an $cancelBtn "left"
646		-af $cancelBtn "bottom" 8
647		-af $cancelBtn "right" 16
648		$form;
649
650	setParent ..; // formLayout
651
652	//setParent ..; // columnLayout
653
654	if ($addFlag)
655	{
656		setFocus nw4cSetUserData_DataName;
657	}
658	else
659	{
660		setFocus nw4cSetUserData_Value;
661	}
662
663	if (`window -q -w nw4cSetUserData_InputWin` < $wd)
664	{
665		window -e -w $wd nw4cSetUserData_InputWin;
666	}
667	if (`window -q -h nw4cSetUserData_InputWin` < $ht)
668	{
669		window -e -h $ht nw4cSetUserData_InputWin;
670	}
671	//window -e -wh $wd $ht nw4cSetUserData_InputWin;
672
673	//-----------------------------------------------------------------------------
674	// show window
675	showWindow nw4cSetUserData_InputWin;
676
677	//-----------------------------------------------------------------------------
678	// disable main window
679	nw4cSetUserData_EnableMainWindow(0);
680}
681
682/******************************************************************************
683	get selected item index
684
685		return -1 if not selected
686******************************************************************************/
687proc int GetSelectedItemIndex()
688{
689	int $selIndexes[] = `textScrollList -q -sii nw4cSetUserData_List`;
690	if (size($selIndexes) == 0)
691	{
692		return -1;
693	}
694	else
695	{
696		return ($selIndexes[0] - 1);
697	}
698}
699
700/******************************************************************************
701	select list callback
702******************************************************************************/
703global proc nw4cSetUserData_SelectListCB(string $node)
704{
705	int $index = GetSelectedItemIndex();
706	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
707
708	int $selOK = ($index >= 0 && $index < $dataSize);
709
710	if ($index >= $dataSize)
711	{
712		textScrollList -e -da nw4cSetUserData_List;
713	}
714
715	control -e -en ($selOK && $index > 0)
716		nw4cSetUserData_MoveUpBtn;
717	control -e -en ($selOK && $index < $dataSize - 1)
718		nw4cSetUserData_MoveDownBtn;
719	control -e -en 1 nw4cSetUserData_AddBtn; // always enable
720	control -e -en $selOK nw4cSetUserData_DeleteBtn;
721	control -e -en $selOK nw4cSetUserData_EditBtn;
722}
723
724/******************************************************************************
725	move up button callback
726******************************************************************************/
727global proc nw4cSetUserData_MoveUpBtnCB(string $node)
728{
729	int $index = GetSelectedItemIndex();
730	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
731	if ($index > 0 && $index < $dataSize)
732	{
733		string $selVal = nw4cSetUserData_Get_UserDataValue($node, $index);
734		string $upVal  = nw4cSetUserData_Get_UserDataValue($node, $index - 1);
735		nw4cSetUserData_Set_UserDataValue($node, $index, $upVal);
736		nw4cSetUserData_Set_UserDataValue($node, $index - 1, $selVal);
737		nw4cSetUserData_UpdateWindow($index - 1, -1);
738	}
739}
740
741/******************************************************************************
742	move down button callback
743******************************************************************************/
744global proc nw4cSetUserData_MoveDownBtnCB(string $node)
745{
746	int $index = GetSelectedItemIndex();
747	int $dataSize = nw4cSetUserData_Get_UserDataSize($node);
748	if ($index >= 0 && $index < $dataSize - 1)
749	{
750		string $selVal  = nw4cSetUserData_Get_UserDataValue($node, $index);
751		string $downVal = nw4cSetUserData_Get_UserDataValue($node, $index + 1);
752		nw4cSetUserData_Set_UserDataValue($node, $index, $downVal);
753		nw4cSetUserData_Set_UserDataValue($node, $index + 1, $selVal);
754		nw4cSetUserData_UpdateWindow($index + 1, -1);
755	}
756}
757
758/******************************************************************************
759	add button callback
760******************************************************************************/
761global proc nw4cSetUserData_AddBtnCB(string $node)
762{
763	int $index = GetSelectedItemIndex();
764	if ($index == -1)
765	{
766		$index = nw4cSetUserData_Get_UserDataSize($node);
767	}
768	OpenInputWindow($node, $index, 1);
769}
770
771/******************************************************************************
772	edit button callback
773******************************************************************************/
774global proc nw4cSetUserData_EditBtnCB(string $node)
775{
776	int $index = GetSelectedItemIndex();
777	if ($index == -1 || $index >= nw4cSetUserData_Get_UserDataSize($node))
778	{
779		return;
780	}
781	OpenInputWindow($node, $index, 0);
782}
783
784/******************************************************************************
785	delete button callback
786******************************************************************************/
787global proc nw4cSetUserData_DeleteBtnCB(string $node)
788{
789	//-----------------------------------------------------------------------------
790	// check node exist
791	if (!`objExists $node`)
792	{
793		warning ("Node does not exist: " + $node);
794		return;
795	}
796
797	//-----------------------------------------------------------------------------
798	// get all item
799	string $dataValues[];
800	int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
801
802	//-----------------------------------------------------------------------------
803	// check selected item
804	int $delIndex = GetSelectedItemIndex();
805	if ($delIndex == -1 || $delIndex >= $dataSize)
806	{
807		return;
808	}
809
810	//-----------------------------------------------------------------------------
811	// delete
812	int $idx;
813	for ($idx = $delIndex; $idx < $dataSize - 1; ++$idx)
814	{
815		nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx + 1]); // shift
816	}
817	nw4cSetUserData_Set_UserDataValue($node, $dataSize - 1, ""); // set empty to deleted item
818	--$dataSize;
819	nw4cSetUserData_Set_UserDataSize($node, $dataSize); // decrement size
820
821	//-----------------------------------------------------------------------------
822	// update window
823	int $selIndex = -1;
824	if ($delIndex < $dataSize)
825	{
826		$selIndex = $delIndex;
827	}
828	else if ($dataSize > 0)
829	{
830		$selIndex = $dataSize - 1;
831	}
832	nw4cSetUserData_UpdateWindow($selIndex, -1);
833}
834
835/******************************************************************************
836	get SG name with material
837******************************************************************************/
838proc string GetSGNameWithMat(string $sg)
839{
840	string $ins[] = `listConnections -s 1 -d 0 ($sg + ".ss")`;
841	if (size($ins))
842	{
843		$sg += " ( " + $ins[0] + " )";
844	}
845	return $sg;
846}
847
848/******************************************************************************
849	update window (UpdateWindowT)
850******************************************************************************/
851global proc nw4cSetUserData_UpdateWindow(int $selIndex, int $showIndex)
852{
853	//-----------------------------------------------------------------------------
854	// get selection
855	string $nodes[];
856	GetSelectedXformAndSG($nodes);
857	int $enableFlag = (size($nodes) == 1);
858
859	//-----------------------------------------------------------------------------
860	// set node name
861	string $nodeName;
862	if ($enableFlag)
863	{
864		if (nodeType($nodes[0]) == "shadingEngine")
865		{
866			$nodeName = GetSGNameWithMat($nodes[0]);
867		}
868		else
869		{
870			$nodeName = $nodes[0];
871		}
872	}
873	else if (size($nodes) > 1)
874	{
875		$nodeName = "(Multi node is selected)";
876	}
877	else
878	{
879		$nodeName = "(None)";
880	}
881	text -e -l $nodeName nw4cSetUserData_NodeName;
882
883	//-----------------------------------------------------------------------------
884	// set current attr & change command
885	textScrollList -e -ra nw4cSetUserData_List;
886	if ($enableFlag)
887	{
888		string $node = $nodes[0];
889		button -e -c ("nw4cSetUserData_MoveUpBtnCB " + $node)
890			nw4cSetUserData_MoveUpBtn;
891		button -e -c ("nw4cSetUserData_MoveDownBtnCB " + $node)
892			nw4cSetUserData_MoveDownBtn;
893		button -e -c ("nw4cSetUserData_AddBtnCB " + $node)
894			nw4cSetUserData_AddBtn;
895		button -e -c ("nw4cSetUserData_DeleteBtnCB " + $node)
896			nw4cSetUserData_DeleteBtn;
897		button -e -c ("nw4cSetUserData_EditBtnCB " + $node)
898			nw4cSetUserData_EditBtn;
899
900		string $dataValues[];
901		int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node);
902		for ($index = 0; $index < $dataSize; ++$index)
903		{
904			string $listStr = GetListStringFromUserDataValue($dataValues[$index]);
905			textScrollList -e -a $listStr nw4cSetUserData_List;
906		}
907		if ($selIndex != -1 && $selIndex < $dataSize)
908		{
909			textScrollList -e -sii ($selIndex + 1) nw4cSetUserData_List;
910		}
911		if ($showIndex != -1 && $showIndex < $dataSize)
912		{
913			textScrollList -e -shi ($showIndex + 1) nw4cSetUserData_List;
914		}
915
916		textScrollList -e
917			-sc ("nw4cSetUserData_SelectListCB " + $node)
918			-dcc ("nw4cSetUserData_EditBtnCB " + $node)
919			nw4cSetUserData_List;
920
921		nw4cSetUserData_SelectListCB($nodes[0]);
922	}
923	textScrollList -e -a "-----" nw4cSetUserData_List; // for add last
924
925	//-----------------------------------------------------------------------------
926	// set enable state
927	if (`window -ex nw4cSetUserData_InputWin`)
928	{
929		nw4cSetUserData_EnableMainWindow(0);
930	}
931	else
932	{
933		if (!$enableFlag)
934		{
935			control -e -en $enableFlag nw4cSetUserData_MoveUpBtn;
936			control -e -en $enableFlag nw4cSetUserData_MoveDownBtn;
937			control -e -en $enableFlag nw4cSetUserData_AddBtn;
938			control -e -en $enableFlag nw4cSetUserData_DeleteBtn;
939			control -e -en $enableFlag nw4cSetUserData_EditBtn;
940		}
941		control -e -en $enableFlag nw4cSetUserData_List;
942		control -e -en 1 nw4cSetUserData_CloseBtn;
943	}
944}
945
946/******************************************************************************
947	main
948******************************************************************************/
949global proc NW4C_SetUserData()
950{
951	//-----------------------------------------------------------------------------
952	// create window
953	int $wd = 505;
954	int $ht = 420;
955	if (!`window -ex nw4cSetUserData_Win`)
956	{
957		window -t "NW4C Set User Data" -wh $wd $ht -mxb 0 -mb 1
958			nw4cSetUserData_Win;
959		menu -l "Help";
960		menuItem -l ("Help on " + `window -q -t nw4cSetUserData_Win` + "...")
961			-c "NW4C_ShowHelp \"html/data_plugins.html\" \"user_data\"";
962
963		string $form1 = `formLayout -nd 100`;
964
965		//-----------------------------------------------------------------------------
966		// node name
967		string $nameFrame = `frameLayout -l "Selected Transform Node or Shading Group" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`;
968			columnLayout -adj 1 -cal "center" -rs 8;
969
970			text -l "" nw4cSetUserData_NodeName;
971
972			setParent ..; // columnLayout
973		setParent ..; // formLayout
974
975		//-----------------------------------------------------------------------------
976		// list
977		string $listFrame = `frameLayout -l "" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`;
978			string $form2 = `formLayout -nd 100`;
979
980			// buttons
981			string $listBtnRow = `rowColumnLayout -nc 5
982				-cw 1 80 -cw 2 80 -cw 3 80 -cw 4 80 -cw 5 80
983				-cs 1  1 -cs 2  8 -cs 3 22 -cs 4  8 -cs 5 22`;
984				button -l "Move Up" -h 24
985					nw4cSetUserData_MoveUpBtn;
986				button -l "Move Down" -h 24
987					nw4cSetUserData_MoveDownBtn;
988				button -l "Add..." -h 24
989					nw4cSetUserData_AddBtn;
990				button -l "Delete" -h 24
991					nw4cSetUserData_DeleteBtn;
992				button -l "Edit..." -h 24
993					nw4cSetUserData_EditBtn;
994			setParent ..; // rowColumnLayout
995
996			// list
997			string $listText = `text -l "Name               Type       Size    Value"
998				-al "left" -fn "smallFixedWidthFont"`;
999			textScrollList -nr 15 -ams 0 -fn "smallFixedWidthFont"
1000				nw4cSetUserData_List;
1001
1002			setParent ..; // formLayout
1003
1004			formLayout -e
1005				-af $listBtnRow "top" 8
1006				-af $listBtnRow "left" 8
1007				-an $listBtnRow "bottom"
1008				-af $listBtnRow "right" 8
1009
1010				-ac $listText "top" 8 $listBtnRow
1011				-af $listText "left" 8
1012				-an $listText "bottom"
1013				-af $listText "right" 8
1014
1015				-ac nw4cSetUserData_List "top" 0 $listText
1016				-af nw4cSetUserData_List "left" 8
1017				-af nw4cSetUserData_List "bottom" 8
1018				-af nw4cSetUserData_List "right" 8
1019				$form2;
1020
1021		setParent ..; // frameLayout
1022
1023		//-----------------------------------------------------------------------------
1024		// close button
1025		string $closeCmd = "deleteUI nw4cSetUserData_Win; ";
1026
1027		button -h 26 -l "Close" -c $closeCmd
1028			nw4cSetUserData_CloseBtn;
1029
1030		formLayout -e
1031			-af $nameFrame "top" 4
1032			-af $nameFrame "left" 4
1033			-an $nameFrame "bottom"
1034			-af $nameFrame "right" 4
1035
1036			-ac $listFrame "top" 4 $nameFrame
1037			-af $listFrame "left" 4
1038			-ac $listFrame "bottom" 4 nw4cSetUserData_CloseBtn
1039			-af $listFrame "right" 4
1040
1041			-an nw4cSetUserData_CloseBtn "top"
1042			-af nw4cSetUserData_CloseBtn "left" 4
1043			-af nw4cSetUserData_CloseBtn "bottom" 8
1044			-af nw4cSetUserData_CloseBtn "right" 4
1045			$form1;
1046
1047		setParent ..; // formLayout
1048
1049		setFocus nw4cSetUserData_CloseBtn;
1050
1051		//-----------------------------------------------------------------------------
1052		// set selection change job
1053		scriptJob -p nw4cSetUserData_Win
1054			-e "SelectionChanged" "nw4cSetUserData_UpdateWindow -1 -1";
1055
1056		//-----------------------------------------------------------------------------
1057		// set undo / redo job
1058		scriptJob -p nw4cSetUserData_Win
1059			-e "Undo" "nw4cSetUserData_UpdateWindow -1 -1";
1060		scriptJob -p nw4cSetUserData_Win
1061			-e "Redo" "nw4cSetUserData_UpdateWindow -1 -1";
1062	}
1063	if (`window -q -w nw4cSetUserData_Win` < $wd)
1064	{
1065		window -e -w $wd nw4cSetUserData_Win;
1066	}
1067	if (`window -q -h nw4cSetUserData_Win` < $ht)
1068	{
1069		window -e -h $ht nw4cSetUserData_Win;
1070	}
1071	//window -e -wh $wd $ht nw4cSetUserData_Win;
1072
1073	//-----------------------------------------------------------------------------
1074	// update window
1075	nw4cSetUserData_UpdateWindow(-1, -1);
1076
1077	//-----------------------------------------------------------------------------
1078	// show window
1079	showWindow nw4cSetUserData_Win;
1080	if (`window -ex nw4cSetUserData_InputWin`)
1081	{
1082		showWindow nw4cSetUserData_InputWin;
1083	}
1084}
1085