/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.gef.examples.logicdesigner.figures;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.IScrollableFigure;
import org.eclipse.draw2d.PuristicScrollPane;
import org.eclipse.draw2d.ScrollPane;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;

import org.eclipse.gef.handles.HandleBounds;

import org.eclipse.gef.examples.logicdesigner.model.Circuit;

public class CircuitFigure extends NodeFigure implements HandleBounds,
		IScrollableFigure {

	private ScrollPane scrollpane;

	public CircuitFigure() {
		setBorder(new CircuitBorder());
		scrollpane = new PuristicScrollPane();
		IFigure pane = new FreeformLayer();
		pane.setLayoutManager(new FreeformLayout());
		setLayoutManager(new StackLayout());
		add(scrollpane);
		scrollpane.setViewport(new FreeformViewport());
		scrollpane.setContents(pane);

		createConnectionAnchors();
		setBackgroundColor(ColorConstants.listBackground());
		setOpaque(true);
	}

	protected void createConnectionAnchors() {
		FixedConnectionAnchor in, out;
		for (int i = 0; i < 8; i++) {
			in = new FixedConnectionAnchor(this);
			out = new FixedConnectionAnchor(this);
			if (i > 3) {
				in.topDown = false;
				in.offsetV = 5;
				out.topDown = false;
			} else {
				out.offsetV = 5;
			}
			setOutputConnectionAnchor(i, out);
			setInputConnectionAnchor(i, in);
			outputConnectionAnchors.addElement(out);
			inputConnectionAnchors.addElement(in);
		}
	}

	public IFigure getContentsPane() {
		return scrollpane.getContents();
	}

	protected FixedConnectionAnchor getInputConnectionAnchor(int i) {
		return (FixedConnectionAnchor) connectionAnchors
				.get(Circuit.TERMINALS_IN[i]);
	}

	/**
	 * @see org.eclipse.gef.handles.HandleBounds#getHandleBounds()
	 */
	public Rectangle getHandleBounds() {
		return getBounds().getCropped(new Insets(2, 0, 2, 0));
	}

	protected FixedConnectionAnchor getOutputConnectionAnchor(int i) {
		return (FixedConnectionAnchor) connectionAnchors
				.get(Circuit.TERMINALS_OUT[i]);
	}

	public Dimension getPreferredSize(int w, int h) {
		Dimension prefSize = super.getPreferredSize(w, h);
		Dimension defaultSize = new Dimension(100, 100);
		prefSize.union(defaultSize);
		return prefSize;
	}

	protected void layoutConnectionAnchors() {
		int x;
		for (int i = 0; i < 4; i++) {
			x = (2 * i + 1) * getSize().width / 8;
			getOutputConnectionAnchor(i + 4).setOffsetH(x - 1);
			getInputConnectionAnchor(i).setOffsetH(x - 1);
			getInputConnectionAnchor(i + 4).setOffsetH(x);
			getOutputConnectionAnchor(i).setOffsetH(x);
		}
	}

	/**
	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
	 */
	protected void paintFigure(Graphics graphics) {
		Rectangle rect = getBounds().getCopy();
		rect.crop(new Insets(2, 0, 2, 0));
		graphics.fillRectangle(rect);
	}

	public void setInputConnectionAnchor(int i, ConnectionAnchor c) {
		connectionAnchors.put(Circuit.TERMINALS_IN[i], c);
	}

	public void setOutputConnectionAnchor(int i, ConnectionAnchor c) {
		connectionAnchors.put(Circuit.TERMINALS_OUT[i], c);
	}

	public String toString() {
		return "CircuitBoardFigure"; //$NON-NLS-1$
	}

	public void validate() {
		if (isValid())
			return;
		layoutConnectionAnchors();
		super.validate();
	}

	protected boolean useLocalCoordinates() {
		return true;
	}

	public ScrollPane getScrollPane() {
		return scrollpane;
	}

}
