/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: DefaultTopologyDrawer.java,v 1.3 2005/03/18 13:55:26 rampil Exp $
 */
package org.logical_paradox.testsite.oln.view;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Iterator;

import org.logical_paradox.testsite.oln.OverlayNetworkConstant;
import org.logical_paradox.testsite.oln.object.Node;
import org.logical_paradox.testsite.oln.object.Topology;

/**
 * デフォルトのトポロジー描画ロジック
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class DefaultTopologyDrawer implements TopologyDrawer {
	/**
	 * トポロジーを描画する
	 * @param g 描画対象リージョン
	 * @param topo 描画するトポロジー
	 */
	public void paint(Graphics g, Topology topo) {
		// ブラシの設定
		Color prevColor = g.getColor();

		for(Iterator it = topo.iteratorNodes(); it.hasNext();) {
			Node node = (Node)it.next();
			Rectangle rect = node.getRectangle();

			// ノードの描画対象領域を一度背景色で塗りつぶす
			g.setColor(OverlayNetworkConstant.DEFAULT_BG_COLOR);
			g.fillRect((int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight());

			if(node.isSelected()) {
				g.setColor(Color.BLUE);
			} else {
				g.setColor(Color.GREEN);
			}

			if(node.isMarked() == false) {
				// マークされていないノードの場合(マウスが上にない場合)
				g.drawRect((int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight());
			} else {
				// マーク済みノードの場合(マウスが上にある場合)
				Rectangle selectableRect = node.getSelectableRectangle();
				g.drawRect((int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight());
				g.setColor(Color.RED);
				g.drawRect((int)selectableRect.getX(), (int)selectableRect.getY(), (int)selectableRect.getWidth(), (int)selectableRect.getHeight());
			}

			// 関連するノードに対して、リンクをはる
			if(topo.isCompleteConnectivity()) {
				g.setColor(Color.CYAN);
			} else {
				g.setColor(Color.YELLOW);
			}
			for(Iterator it2 = node.iteratorRelativeNodes(); it2.hasNext();) {
				Node pair = (Node)it2.next();
				g.drawLine((int)node.getX(), (int)node.getY(), (int)pair.getX(), (int)pair.getY());
			}

			node.unmark();
		}
		// ブラシを元に戻す
		g.setColor(prevColor);
	}
}
