/******************************************************************************* * 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; } }