package ash.reverse.uml;
import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import javax.swing.JLabel;
import java.awt.Font;
import java.awt.FontMetrics;
import ash.reverse.struct.FileRecord;

/**
 * UMLダイアグラムを生成するためのベースクラス。
 */
class UMLDiagram implements UMLConst {
	static final int MARGIN = 24;
	static final int MAX_HEIGHT = 800;

	/** レイアウト計算で使用するフォントメトリックス */
	protected FontMetrics fm;

	/** グラフのノード情報を保持するリスト */
	protected List<ClassNode> nodeList = new ArrayList<ClassNode>();

	/** グラフのアークの情報を保持するリスト */
	protected List<Relationship> relList = new ArrayList<Relationship>();

	/**
	 * レイアウト計算で使用するフォントを設定する。
	 * @param font レイアウト計算で使用するフォント
	 */
	void setFont(Font font) {
		if(font != null) {
			fm = new JLabel().getFontMetrics(font);
			assert trace("height=" + fm.getHeight() +
						 ", width=" + fm.stringWidth("Hello"));
		}
	}

	/**
	 * UMLダイアグラムを生成する。
	 * @param out UMLダイアグラムの出力先
	 */
	public void generateDiagram(PrintStream out) {
		int xpos = MARGIN;
		int ypos = MARGIN;
		int seq = 0;
		int maxWidth = 0;

		// ノードをレイアウトして、ダイアグラム情報を出力する。
		for(ClassNode cn : nodeList) {
			int width = cn.width();
			int height = cn.height();
			int y = ypos + MARGIN + height;
		
			if(seq > 0 && y > MAX_HEIGHT) {
				xpos += MARGIN + maxWidth;
				ypos = MARGIN;
				seq = 0;
				maxWidth = 0;
			}
			if(width > maxWidth) maxWidth = width;
			seq++;
			cn.setLocation(xpos, ypos);
			ypos += height + MARGIN;
			cn.print(out);
		}

		out.println();

		// 関係情報を出力する。
		for(Relationship rel : relList) out.println(rel.umlFormat());
	}

	boolean trace(Object msg) {
		System.err.println(msg);
		return true;
	}
}
