blob: 2bee428894e9238021334061c8791213fd6305b0 [file] [log] [blame]
/*******************************************************************************
* <copyright>
*
* Copyright (c) 2005, 2012 SAP AG.
* 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:
* SAP AG - initial API, implementation and documentation
* mwenz - Bug 342869 - Image doesn't scale the contained SWT Image on resize
*
* </copyright>
*
*******************************************************************************/
package org.eclipse.graphiti.testtool.sketch.features.create;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.impl.AbstractCreateFeature;
import org.eclipse.graphiti.mm.GraphicsAlgorithmContainer;
import org.eclipse.graphiti.mm.algorithms.AbstractText;
import org.eclipse.graphiti.mm.algorithms.Ellipse;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.algorithms.Image;
import org.eclipse.graphiti.mm.algorithms.Polygon;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.algorithms.Rectangle;
import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
import org.eclipse.graphiti.mm.algorithms.styles.Font;
import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
import org.eclipse.graphiti.mm.pictograms.BoxRelativeAnchor;
import org.eclipse.graphiti.mm.pictograms.ChopboxAnchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.FixPointAnchor;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeCreateService;
import org.eclipse.graphiti.testtool.sketch.SketchFeatureProvider;
import org.eclipse.graphiti.testtool.sketch.SketchImageProvider;
import org.eclipse.graphiti.util.IColorConstant;
/**
* The Class SketchCreateGaFeature.
*/
public abstract class SketchCreateGaFeature extends AbstractCreateFeature {
private static final String NEW_ELEMENT = "new element";
private Class<? extends GraphicsAlgorithm> gaType;
private static int MIN_SIZE = 51;
/**
* Instantiates a new sketch create ga feature.
*
* @param fp
* the fp
* @param name
* the name
* @param description
* the description
* @param gaType
* the ga type
*/
public SketchCreateGaFeature(IFeatureProvider fp, String name, String description,
Class<? extends GraphicsAlgorithm> gaType) {
super(fp, name, description);
setGaType(gaType);
}
public boolean canCreate(ICreateContext context) {
boolean ret = false;
ContainerShape targetContainer = context.getTargetContainer();
if (targetContainer != null) {
ret = true;
}
return ret;
}
public Object[] create(ICreateContext context) {
ContainerShape targetContainer = context.getTargetContainer();
AnchorContainer newAc = createAnchorContainer(targetContainer);
IPeCreateService pecService = Graphiti.getPeCreateService();
IGaService gaService = Graphiti.getGaService();
final ChopboxAnchor newAnchor = pecService.createChopboxAnchor(newAc);
int width = context.getWidth() < MIN_SIZE ? MIN_SIZE : context.getWidth();
int height = context.getHeight() < MIN_SIZE ? MIN_SIZE : context.getHeight();
GraphicsAlgorithm newGa = createGa(newAc, width, height);
gaService.setLocationAndSize(newGa, context.getX(), context.getY(), width, height);
if (!Image.class.equals(gaType)) {
AbstractText label;
if (isMultiLineText()) {
label = gaService.createDefaultMultiText(getDiagram(), newGa, NEW_ELEMENT);
} else {
label = gaService.createText(newGa, NEW_ELEMENT);
}
Font font = gaService.manageFont(getDiagram(), "Comic Sans MS", 14);
label.setFont(font);
label.setForeground(manageColor(IColorConstant.BLUE));
label.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);
label.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
gaService.setLocationAndSize(label, 0, 0, width, height);
}
layoutPictogramElement(newAc);
final Connection targetConnection = context.getTargetConnection();
if (targetConnection != null) {
gaService.setLocation(newGa, context.getX() - (width / 2), context.getY() - (height / 2));
Anchor oldEndAnchor = targetConnection.getEnd();
targetConnection.setEnd(newAnchor);
Connection connection = pecService.createFreeFormConnection(getDiagram());
Polyline p = gaService.createPolyline(connection);
GraphicsAlgorithm targetConnectionGraphicsAlgorithm = targetConnection.getGraphicsAlgorithm();
p.setLineWidth(targetConnectionGraphicsAlgorithm.getLineWidth());
p.setForeground(targetConnectionGraphicsAlgorithm.getForeground());
p.setLineStyle(targetConnectionGraphicsAlgorithm.getLineStyle());
connection.setStart(newAnchor);
connection.setEnd(oldEndAnchor);
}
SketchFeatureProvider fp = (SketchFeatureProvider) getFeatureProvider();
if (fp.isTestMode() && (newGa instanceof Rectangle)) {
BoxRelativeAnchor bra = pecService.createBoxRelativeAnchor(newAc);
Rectangle r = gaService.createRectangle(bra);
gaService.setLocationAndSize(r, -5, 0, 10, 10);
r.setTransparency(1.0);
bra.setRelativeWidth(0.5);
FixPointAnchor fpa = pecService.createFixPointAnchor(newAc);
r = gaService.createRectangle(fpa);
gaService.setLocationAndSize(r, 0, 0, 10, 10);
r.setTransparency(1.0);
fpa.setLocation(gaService.createPoint(10, 10));
}
// Create an italic font to use it later in the rich tooltip
gaService.manageFont(getDiagram(), IGaService.DEFAULT_FONT, IGaService.DEFAULT_FONT_SIZE, true, false);
return new Object[] { newAc };
}
/**
* Creates the anchor container.
*
* @param targetContainer
* the target container
*
* @return the anchor container
*/
abstract protected AnchorContainer createAnchorContainer(ContainerShape targetContainer);
/**
* Creates the ga.
*
* @param gac
* the gac
* @param width
* the width
* @param height
* the height
*
* @return the graphics algorithm
*/
protected GraphicsAlgorithm createGa(GraphicsAlgorithmContainer gac, int width, int height) {
GraphicsAlgorithm ret = null;
IGaService gaService = Graphiti.getGaService();
if (RoundedRectangle.class.equals(gaType)) {
ret = gaService.createRoundedRectangle(gac, 10, 10);
} else if (Rectangle.class.equals(gaType)) {
ret = gaService.createRectangle(gac);
} else if (Ellipse.class.equals(gaType)) {
ret = gaService.createEllipse(gac);
} else if (Polyline.class.equals(gaType)) {
// top-left, top-right, bottom-right, bottom-left
int[] xy = new int[] { 0, 0, width, 0, width, height, 0, height };
int[] ba = new int[] { 0, 0, 20, 40, 40, 20, 0, 0 };
Polyline p = gaService.createPolyline(gac, xy, ba);
ret = p;
} else if (Polygon.class.equals(gaType)) {
if (getCreateName().startsWith("Tria")) { // triangle
// top-middle, bottom-right, bottom-left
int xy[] = new int[] { width / 2, 0, width, height, 0, height };
int ba[] = new int[] { 0, 0, 40, 40, 40, 40 };
Polygon p = gaService.createPolygon(gac, xy, ba);
ret = p;
} else { // arrow
// top-left, top-middle, middle-right, bottom-middle,
// bottom-right
int xy[] = new int[] { 0, 0, (2 * width / 3), 0, width, height / 2, (2 * width / 3), height, 0, height };
int ba[] = new int[] { 0, 0, 30, 15, 0, 0, 15, 30, 60, 60 };
Polygon p = gaService.createPolygon(gac, xy, ba);
ret = p;
}
} else if (Image.class.equals(gaType)) {
Image image = gaService.createImage(gac, SketchImageProvider.IMG_GRAPHITI);
image.setStretchH(true);
image.setStretchV(true);
image.setProportional(true);
ret = image;
}
if (ret != null) {
Diagram diagram = getDiagram();
ret.setForeground(gaService.manageColor(diagram, IColorConstant.BLACK));
ret.setBackground(gaService.manageColor(diagram, IColorConstant.WHITE));
ret.setTransparency(0.3);
ret.setLineWidth(2);
}
return ret;
}
private void setGaType(Class<? extends GraphicsAlgorithm> gaType) {
this.gaType = gaType;
}
protected Class<?> getGaType() {
return gaType;
}
protected boolean isMultiLineText() {
return true;
}
}