package kt.layer;

import java.awt.*;
import javax.swing.*;
import java.util.*;

import ilog.cpl.graphic.views.IlpShelfItemPosition;
import ilog.cpl.graphic.IlpRelativePoint;
import ilog.cpl.graphic.IlpGraphicViewStyleManager;
import ilog.tgo.datasource.IltDefaultDataSource;
import ilog.tgo.model.*;
import ilog.cpl.graphic.IlpPoint;
import ilog.cpl.service.IlpContext;
import ilog.cpl.style.IlpStyleManager;
import ilog.cpl.style.key.IlpFloatKey;
import ilog.cpl.style.IlpStyle;
import ilog.cpl.model.IlpObject;
import ilog.cpl.model.IlpClass;
import ilog.cpl.IlpNetwork;
import ilog.cpl.style.key.IlpBooleanKey;
import ilog.cpl.IlpSystem;
import ilog.cpl.model.IlpClassManager;
import ilog.cpl.style.key.IlpColorKey;
import ilog.views.interactor.IlvUnZoomViewInteractor;
import ilog.cpl.equipment.IlpEquipmentController;
import ilog.cpl.network.action.toolbar.*;
import ilog.cpl.IlpEquipment;
import ilog.cpl.equipment.IlpEquipmentView;
import ilog.cpl.network.IlpNetworkView;
import ilog.views.graphlayout.circular.IlvClusterNumber;
import ilog.views.graphlayout.circular.IlvCircularLayout;
import ilog.views.graphlayout.IlvGraphLayoutException;
import ilog.views.graphlayout.IlvGraphLayout;
import ilog.tgo.graphic.IltCompositeGrapher;
import ilog.views.graphlayout.circular.IlvClusterId;
import ilog.tgo.model.attribute.IltAttribute;
import ilog.views.IlvGraphic;

class Demo extends JPanel
{
	private Vector vLinkModel;

	IltDefaultDataSource dataSource;
	IlpNetwork networkComponent;
	IlvCircularLayout nodeLayout = new IlvCircularLayout();
	IlpNetworkView view = null;
	IltCompositeGrapher grapher = null;

	IltNetworkElement iltNeSystem[] = new IltNetworkElement[4];

	public Demo()
	{
		createNetworkComponent();
		makeDataSource();
		makeLink();

		///¡Ú¡Ú¡Ú///
		view = getNetwork().getView();
		grapher = view.getCompositeGrapher();

		//////
		setNodeLayout(true);
	}

	void createNetworkComponent()
	{
		dataSource = new IltDefaultDataSource();
		networkComponent = new IlpNetwork( );

		networkComponent.setDataSource( dataSource );
		setLayout( new BorderLayout() );
		add( networkComponent, BorderLayout.CENTER );
	}

	void makeDataSource()
	{
		vLinkModel = new Vector();

		// ÇÏ³ª
		iltNeSystem[0] = new IltNetworkElement( "code001" );
		iltNeSystem[0].setName( "´ëÀü" + "_" + "Àåºñ1" );
		iltNeSystem[0].setType( IltNetworkElement.Type.IP_Router2 );
		vLinkModel.add(iltNeSystem[0]);

		// µÎ¿ï
		iltNeSystem[1] = new IltNetworkElement( "code002" );
		iltNeSystem[1].setName( "ÀüÁÖ" + "_" + "Àåºñ1" );
		iltNeSystem[1].setType( IltNetworkElement.Type.SAN_FiberChannelSwitch );
		vLinkModel.add(iltNeSystem[1]);

		// ¼Â
		iltNeSystem[2] = new IltNetworkElement( "code003" );
		iltNeSystem[2].setName( "ÀüÁÖ" + "_" + "Àåºñ3" );
		iltNeSystem[2].setType( IltNetworkElement.Type.SAN_FiberChannelSwitch );
		vLinkModel.add(iltNeSystem[2]);

		// ³Ý
		iltNeSystem[3] = new IltNetworkElement( "code004" );
		iltNeSystem[3].setName( "ÀüÁÖ" + "_" + "Àåºñ4" );
		iltNeSystem[3].setType( IltNetworkElement.Type.SAN_FiberChannelSwitch );
		vLinkModel.add(iltNeSystem[3]);

		dataSource.addObjects( vLinkModel );
	}

	void makeLink()
	{
		String sLinkKey = "code001" + "-" + "code002";

		IltNetworkElement iltNeFrom = (IltNetworkElement)dataSource.getObject( "code001" );
		IltNetworkElement iltNeTo   = (IltNetworkElement)dataSource.getObject( "code002" );

		if ( iltNeFrom == null || iltNeTo == null ) return;

		IltLink link = new IltLink( sLinkKey );

		link.setFrom(iltNeFrom);
		link.setTo(iltNeTo);
		
		vLinkModel.add(link);
		dataSource.addObjects( vLinkModel );
	}

	private IlpNetwork getNetwork()
	{
		return networkComponent;
	}

	///¡Ú¡Ú¡Ú///
	void setCluster()
	{
		int[] cluster = new int[] { 0, 1, 2};

		int count = 0;
		// ACE °è¿­
		IlvClusterId clusterId0 = new IlvClusterNumber(cluster[0]);
		// CANS, AC120
		IlvClusterId clusterId1 = new IlvClusterNumber(cluster[1]);
		// MSS °è¿­
		IlvClusterId clusterId2 = new IlvClusterNumber(cluster[2]);
		
		String nodeType = "";

		IltAttribute nodeTypeAttr = IltNetworkElement.TypeAttribute;

		Enumeration enum = grapher.getNodes();

		while (enum.hasMoreElements())
		{
			
			IltObject object = (IltObject)enum.nextElement();

			if (object.getName() == null)
				continue;

			if (object.hasAttributeValue(nodeTypeAttr))
			{

				if (object.getAttributeValue(nodeTypeAttr) != ilog.cpl.model.IlpAttributeValueHolder.VALUE_NOT_SET)
				{
					nodeType = object.getAttributeValue(nodeTypeAttr).toString();
				}
			}


			IlvGraphic g = object.getLayoutProxy(grapher);
			if (g != null)
			{
				if (nodeType.length() > 0 && nodeType.substring(0,3).equals("ACE"))
				{
					if (count == 0)
						nodeLayout.setRootClusterId(clusterId0);
					nodeLayout.setClusterId(g, clusterId0, count);
				}
				else if (nodeType.length() > 0 && nodeType.substring(0,3).equals("MSS"))
				{
					if (count == 0)
						nodeLayout.setRootClusterId(clusterId2);
					nodeLayout.setClusterId(g, clusterId2, count);
				}
				else
				{ // CANS, AC120, etc
					if (count == 0)
						nodeLayout.setRootClusterId(clusterId2);
					nodeLayout.setClusterId(g, clusterId1, count);
				}
				count++;
			}
		}
	}

	public void setNodeLayout(boolean flag)
	{
		//final IlpNetworkView view = getNetwork().getView();
		//final IltCompositeGrapher grapher = view.getCompositeGrapher();

		if(view != null) // no use layout
			return;

		System.out.println("Circular Layout starting .......");
		if (nodeLayout == null)
			nodeLayout = new IlvCircularLayout();
		nodeLayout.setLinkStyle(IlvCircularLayout.NO_RESHAPE_STYLE);
		//nodeLayout.setLinkStyle(IlvCircularLayout.STRAIGHT_LINE_STYLE);
		nodeLayout.setLevelOffset(50);
		if (flag)
			nodeLayout.setOffset(30);
		else
			nodeLayout.setOffset(50);

		///////////////¡Ú¡Ú¡Ú///
		setCluster();

		nodeLayout.attach(grapher.getGraphModel());
		nodeLayout.setCoordinatesMode(IlvGraphLayout.VIEW_COORDINATES);
		nodeLayout.setLayoutRegion(new ilog.views.IlvRect(80, 80, 500, 500));

		try
		{
			nodeLayout.performLayout(true, false, true);
		}
		catch (IlvGraphLayoutException e)
		{
			e.printStackTrace();
		}
	}
	

	public static void main( String args[] )
	{
		JFrame f = new JFrame();
		f.getContentPane().add( "Center", new Demo() );
		f.setSize(400,400);
		f.setVisible(true);
	}
}