package org.eclipse.stem.ui.grapheditor;

import java.util.List;

import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphConnection;
import org.eclipse.zest.core.widgets.GraphItem;
import org.eclipse.zest.core.widgets.GraphNode;

public class TextModifyListener implements ModifyListener
{ 
	final static int 	NODE_TITLE=GraphDefs.NODE_TITLE, 
						NODE_URI=GraphDefs.NODE_URI, 
						NODE_LABEL=GraphDefs.NODE_LABEL, 
						EDGE_TITLE=GraphDefs.EDGE_TITLE, 
						EDGE_AURI=GraphDefs.EDGE_AURI, 
						EDGE_BURI=GraphDefs.EDGE_BURI, 
						EDGE_LABEL_VALUE=GraphDefs.EDGE_LABEL_VALUE,
						EDGE_POPULATION=GraphDefs.EDGE_POPULATION;
	NodeData nodeData;
	ConnectionData connectionData;
	int attribute;
	Graph zestGraph;
	
	TextModifyListener(Graph zestGraph, int attribute)
	{
		this.attribute = attribute;
		this.zestGraph = zestGraph;
		
	}
	
	public void modifyText(final ModifyEvent e) {
		Text text = (Text) e.widget;
		if (!text.isFocusControl())
		      return;
		
		List<GraphItem> selectedItems = zestGraph.getSelection();
		if (selectedItems.size() == 1)
		{
			if (selectedItems.get(0) instanceof GraphNode)
			{
				GraphNode selectedNode = (GraphNode) selectedItems.get(0);
				NodeData nodeData = (NodeData) selectedNode.getData();
				this.nodeData = nodeData;
				
			}
			if (selectedItems.get(0) instanceof GraphConnection)
			{
				GraphConnection selectedConnection = (GraphConnection) selectedItems.get(0);
				ConnectionData connectionData = (ConnectionData) selectedConnection.getData();
				this.connectionData = connectionData;
				
			}
		}
		
		if ( (this.nodeData == null) && (this.connectionData == null))
			return;
		
		switch(attribute)
		{
		case NODE_TITLE: nodeData.setNodeTitle(text.getText()); break;
		case NODE_URI: nodeData.setNodeURI(text.getText()); break;
		case NODE_LABEL: break;
		case EDGE_TITLE: connectionData.setEdgeTitle(text.getText()); break;
		case EDGE_AURI: connectionData.setNodeAURI(text.getText()); break;
		case EDGE_BURI: connectionData.setNodeBURI(text.getText()); break;
		case EDGE_LABEL_VALUE: connectionData.setEdgeLabelValue(text.getText()); break;
		case EDGE_POPULATION: connectionData.setEdgePopulation(text.getText()); break;
		
		}
			
	}
}
