// Copyright (C) 1997-2004 Alias Systems Corp.
// 
// The information in this file is provided for the exclusive use of the
// licensees of Alias.  Such users have the right to use, modify,
// and incorporate this code into other products for purposes authorized
// by the Alias license agreement, without fee.
// 
// ALIAS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
// INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
// EVENT SHALL ALIAS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.

//  Procedure Name:
//      referenceEditsWindowPrint
//
//  Description:
//		Print the edit selected in the textScrollList.
//      Called by the textScrollList doubleClickCommand.
//
//  Input Arguments:
//		string $textScrollList: name of the textScrollList to check selection
//
//  Return Value:
//      None.
//


global proc referenceEditsWindowPrint(string $textScrollList){

	string $edit[] = `textScrollList -q -si $textScrollList`;
	print "Reference Edit: ";
	print $edit;

}


//  Procedure Name:
//      referenceEditsWindowRemoveSelectedEdits
//
//  Description:
//      Removes selected edits from the Reference Edits Window.
//
//  Input Arguments:
//		string $referenceFile: reference file
//      string $referenceNode: reference node to remove edits from
//		string $textScrollList: name of the textScrollList to add edits to
//
//  Return Value:
//      None.
//

global proc referenceEditsWindowRemoveSelectedEdits( string $referenceFile,
													string $referenceNode,
													string $textScrollList)
{
	//	get reference state as successful edits can only be removed if
	//	ref is unloaded - leaving out in hopes the referenceEdit command
	//	will handle the error/warning
	//string $referenceFileState = `file -q -dr $referenceFile`;

	string $selectedEdits[] = `textScrollList -q -selectItem $textScrollList`;
	int $refreshWindow = 0;

	for ($edit in $selectedEdits){ 

		string $buffer[];
		int $numTokens = `tokenize $edit " " $buffer`;
		
		//	check for separator info and ignore
		//	i.e. -------- is only 1 token
		if (!`gmatch $buffer[0] "--------"` && 
			!`gmatch $buffer[0] "----------------------------------------"`){ 

			string $cmd = "referenceEdit -failedEdits true ";
			$cmd += "-successfulEdits true -editCommand ";
			$cmd += $buffer[0];
			$cmd += " -removeEdits ";

			switch( $buffer[0] ) {
				case "addAttr":
					$cmd += $buffer[9];
					$cmd += ".";
					$cmd += $buffer[2];
					break;
				case "deleteAttr":
					$cmd += $buffer[1];
					break;
				case "connectAttr":
					$cmd += $buffer[1];
					break;
				case "disconnectAttr":
					$cmd += $buffer[1];
					break;
				case "setAttr":
					$cmd += $buffer[1];
					break;
				case "parent":
					$cmd += $buffer[4];
					break;
			}

			evalEcho($cmd);
			$refreshWindow = 1;
			
		}
	}


	//	refresh window
	//
	if ($refreshWindow)
		referenceEditsWindow $referenceFile;

}



//  Procedure Name:
//      referenceEditsWindowBuildList
//
//  Description:
//      Adds edits to the Reference Edits Window.
//
//  Input Arguments:
//      string $reference: reference node to list edits for
//		string $edit: type of edit to add 
//			setAttr, deleteAttr, addAttr, connectAttr, disconnectAttr, parent
//		string $textScrollList: name of the textScrollList to add edits to
//
//  Return Value:
//      None.
//

global proc referenceEditsWindowBuildList(string $reference, 
										  string $edit,
										  string $textScrollList)
{
	//	query successful and failed edits separately. Failed edits can always
	//	be removed, successful edits can only be removed when the ref is unloaded
	string $refEditsSuccessful[] = `referenceQuery -fld 0 -scs 1 -ec $edit -es $reference`;
	string $refEditsFailed[] = `referenceQuery -fld 1 -scs 0 -ec $edit -es $reference`;

	if (`size ($refEditsSuccessful)`){

		//	add separator and title
		textScrollList -edit
			-append "----------------------------------------"
			$textScrollList;

		textScrollList -edit
			-append ("-------- " + $edit + " --------")
			$textScrollList;

		textScrollList -edit
			-append "----------------------------------------"
			$textScrollList;

		//	add edits
		for ($refEdit in $refEditsSuccessful){

			textScrollList -edit
				-append $refEdit
				$textScrollList;

		}
	}

	if (`size ($refEditsFailed)`){

		//	add separator and title
		textScrollList -edit
			-append "----------------------------------------"
			$textScrollList;

		textScrollList -edit
			-append ("-------- failed_" + $edit + " --------")
			$textScrollList;

		textScrollList -edit
			-append "----------------------------------------"
			$textScrollList;

		//	add edits
		for ($refEdit in $refEditsFailed){

			textScrollList -edit
				-append $refEdit
				$textScrollList;

		}
	}

}

//  Procedure Name:
//      referenceEditsWindow
//
//  Description:
//      Creates a window that lists edits for a specified reference file.
//
//  Input Arguments:
//      string $referenceFile: reference file to list edits for
//
//  Return Value:
//      None.
//
global proc referenceEditsWindow(string $referenceFile){

	string $referenceNode = `referenceQuery -referenceNode $referenceFile`;
	string $window = ("refEditsWin_" + $referenceNode);

	if (`window -exists $window`) {
		deleteUI -window $window;
	}

	window -title ("Reference Edits: " + $referenceNode) $window;
	
	//paneLayout -configuration "single";
	string $mainForm = `formLayout -numberOfDivisions 100 ($window + "_formLayout")`;
	
	string $textScrollList = `textScrollList ($window + "_textScrollList")`;
    textScrollList -edit
		-font "boldLabelFont"
		-height 500
		-width 250
		-allowMultiSelection true
		-doubleClickCommand ("referenceEditsWindowPrint " + $textScrollList)
		//-deleteKeyCommand "webBrowserDeleteBookmark"
		$textScrollList;
	
	
	//	populate scroll list with edits
	//
	referenceEditsWindowBuildList( $referenceNode, "setAttr", $textScrollList);
	referenceEditsWindowBuildList( $referenceNode, "connectAttr", $textScrollList);
	referenceEditsWindowBuildList( $referenceNode, "disconnectAttr", $textScrollList);
	referenceEditsWindowBuildList( $referenceNode, "addAttr", $textScrollList);
	referenceEditsWindowBuildList( $referenceNode, "deleteAttr", $textScrollList);
	referenceEditsWindowBuildList( $referenceNode, "parent", $textScrollList);


	string $buttonForm = `formLayout -numberOfDivisions 100`;

		string $refreshButton = `button -label "Refresh Edits List" ($window + "_refreshButton")`;

		string $removeButton = `button -label "Remove Selected Edits" ($window + "_removeButton")`;

		button -edit
			-command ("referenceEditsWindow \"" + ($referenceFile) + "\"")
			$refreshButton;

		button -edit
			-command ("referenceEditsWindowRemoveSelectedEdits \"" +
				($referenceFile) + "\" " + ($referenceNode) + " " + ($textScrollList))
			$removeButton;

		formLayout -edit
			-attachForm		$refreshButton     "top"		0
			-attachForm		$refreshButton     "left"		0
			-attachForm		$refreshButton     "bottom"		0
			-attachPosition $refreshButton     "right"		0 50

			-attachForm		$removeButton		"top"		0
			-attachPosition $removeButton		"left"		0 50
			-attachForm     $removeButton		"bottom"	0
			-attachForm     $removeButton		"right"		0

			$buttonForm;

		setParent $mainForm;

	formLayout -edit
		-attachForm     $textScrollList     "top"		5
		-attachForm     $textScrollList     "left"		5
		-attachForm		$textScrollList     "bottom"	35
		-attachForm		$textScrollList     "right"		5 

		-attachControl	$buttonForm		    "top"		5	$textScrollList
		-attachForm     $buttonForm			"left"		5
		-attachForm     $buttonForm			"bottom"	5
		-attachForm     $buttonForm			"right"		5

		$mainForm;

	showWindow $window;

}