blob: e953e153904f194f6d7a7afc38c4a659ab0241b5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 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.wst.wsdl.ui.internal.asd.design.figures;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.swt.graphics.Color;
public class BaseLinkIconFigure extends Figure {
public static int VALID_SCHEMA_LINK_STYLE = 1;
public static int INVALID_SCHEMA_LINK_STYLE = 2;
private int linkIconStyle = VALID_SCHEMA_LINK_STYLE;
private AbstractGraphicalEditPart editPart;
private List childFigures = new ArrayList();
public int figureSpacing = 7;
public BaseLinkIconFigure(AbstractGraphicalEditPart ep) {
editPart = ep;
ToolbarLayout layout = new ToolbarLayout(true) {
public void layout(IFigure parent) {
super.layout(parent);
AbstractGraphicalEditPart ep = getAssociatedEditPart();
IFigure associatedFigure = ep.getFigure();
if (associatedFigure != null) {
// Update the bounds
Rectangle associatedBounds = associatedFigure.getBounds();
int x = associatedBounds.x + associatedBounds.width;
int y = associatedBounds.y;
int width = getSize().width;
int height = associatedBounds.height;
Rectangle newFigBounds = new Rectangle(x, y, width, height);
// Set my bounds based on my associated editpart
setBounds(newFigBounds);
// Layout the children
Iterator it = parent.getChildren().iterator();
while (it.hasNext()) {
IFigure fig = (IFigure) it.next();
Point newPoint = new Point(x, y);
// Indent the figure to the right to show the "broken" schema link figure
if (fig instanceof RightInvalidIconFigure) {
newPoint.x = newPoint.x + figureSpacing;
}
fig.setLocation(newPoint);
}
}
}
};
setLayoutManager(layout);
// Default to a ValidLinkIconFigure
linkIconStyle = VALID_SCHEMA_LINK_STYLE;
addChildFigure(new ValidLinkIconFigure());
}
private void removeChildFigures() {
Iterator it = childFigures.iterator();
while (it.hasNext()) {
remove((IFigure) it.next());
}
childFigures.clear();
}
private void addChildFigure(IFigure fig) {
childFigures.add(fig);
add(fig);
}
public void setLinkIconStyle(int style) {
if (style == VALID_SCHEMA_LINK_STYLE && linkIconStyle != VALID_SCHEMA_LINK_STYLE) {
removeChildFigures();
addChildFigure(new ValidLinkIconFigure());
}
else if (style == INVALID_SCHEMA_LINK_STYLE && linkIconStyle != INVALID_SCHEMA_LINK_STYLE) {
removeChildFigures();
addChildFigure(new LeftInvalidIconFigure());
addChildFigure(new RightInvalidIconFigure());
}
linkIconStyle = style;
}
public int getLinkIconStyle() {
return linkIconStyle;
}
public void setColor(Color color) {
Iterator it = childFigures.iterator();
while (it.hasNext()) {
IFigure fig = (IFigure) it.next();
fig.setBackgroundColor(color);
fig.setForegroundColor(color);
}
}
public AbstractGraphicalEditPart getAssociatedEditPart() {
return editPart;
}
private class LeftInvalidIconFigure extends LinkIconFigure {
public LeftInvalidIconFigure() {
super(null);
PointList points = new PointList();
// Draw the arrow
points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 5, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 7, 0 + verticalBuffer)); // top slash
points.addPoint(new Point(horizontalBuffer + 5, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 2, 10 + verticalBuffer)); // bottom slash
points.addPoint(new Point(horizontalBuffer + 4, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 0, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer));
setForegroundColor(ColorConstants.lightGray);
setBackgroundColor(ColorConstants.lightGray);
setFill(true);
setPoints(points);
}
// We increase the size of the width because we indent the figure towards the right.
// So we indent by that same amount stored in horizontalBuffer
public Dimension getPreferredSize(int wHint, int hHint) {
Dimension dimension = super.getPreferredSize(wHint, hHint);
dimension.width = dimension.width + horizontalBuffer;
return dimension;
}
public void setLocation(Point point) {
super.setLocation(point);
// Update the points with the following method call
setFigureLocation(point);
}
}
private class RightInvalidIconFigure extends LinkIconFigure {
public RightInvalidIconFigure() {
super(null);
PointList points = new PointList();
points.addPoint(new Point(horizontalBuffer + 5, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 7, 0 + verticalBuffer)); // top slash
points.addPoint(new Point(horizontalBuffer + 5, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 10, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 10, 0 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 15, 5 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 10, 10 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 10, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 4, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 2, 10 + verticalBuffer)); // bottom slash
points.addPoint(new Point(horizontalBuffer + 5, 4 + verticalBuffer));
setForegroundColor(ColorConstants.lightGray);
setBackgroundColor(ColorConstants.lightGray);
setFill(true);
setPoints(points);
}
public void setLocation(Point point) {
super.setLocation(point);
setFigureLocation(point);
}
}
private class ValidLinkIconFigure extends LeftInvalidIconFigure {
public ValidLinkIconFigure() {
PointList points = new PointList();
// Draw the arrow
points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 15, 4 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 15, 0 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 20, 5 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 15, 10 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 15, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 0, 6 + verticalBuffer));
points.addPoint(new Point(horizontalBuffer + 0, 4 + verticalBuffer));
setForegroundColor(ColorConstants.lightGray);
setBackgroundColor(ColorConstants.lightGray);
setFill(true);
setPoints(points);
}
}
}