blob: 46821945ccd7833c26f1eb6b5f0f02aaef22a316 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}