/*******************************************************************************
* Copyright (c) 2015, 2016 itemis AG 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:
* Alexander Nyßen (itemis AG) - initial API and implementation
*
*******************************************************************************/
package org.eclipse.gef.mvc.examples.logo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.gef.common.adapt.AdapterKey;
import org.eclipse.gef.geometry.planar.AffineTransform;
import org.eclipse.gef.geometry.planar.BezierCurve;
import org.eclipse.gef.geometry.planar.CurvedPolygon;
import org.eclipse.gef.geometry.planar.IGeometry;
import org.eclipse.gef.geometry.planar.IShape;
import org.eclipse.gef.geometry.planar.Line;
import org.eclipse.gef.geometry.planar.Point;
import org.eclipse.gef.geometry.planar.PolyBezier;
import org.eclipse.gef.mvc.examples.AbstractMvcExample;
import org.eclipse.gef.mvc.examples.logo.model.AbstractGeometricElement;
import org.eclipse.gef.mvc.examples.logo.model.GeometricCurve;
import org.eclipse.gef.mvc.examples.logo.model.GeometricShape;
import org.eclipse.gef.mvc.fx.viewer.IViewer;
import com.google.inject.Module;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.Blend;
import javafx.scene.effect.BlendMode;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.Effect;
import javafx.scene.effect.Light.Distant;
import javafx.scene.effect.Lighting;
import javafx.scene.paint.Color;
public class MvcLogoExample extends AbstractMvcExample {
public static final double GEF_STROKE_WIDTH = 3.5;
public static final Color GEF_COLOR_BLUE = Color.rgb(135, 150, 220);
public static final Color GEF_COLOR_GREEN = Color.rgb(99, 123, 71);
public static final Effect GEF_SHADOW_EFFECT = createShadowEffect();
public static final Double[] GEF_DASH_PATTERN = new Double[] { 13d, 8d };
public static List<? extends AbstractGeometricElement<?>> createContentViewerContents() {
// selection handles
GeometricShape topLeftSelectionHandle = new GeometricShape(createHandleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 12, 15), Color.WHITE, GEF_SHADOW_EFFECT);
GeometricShape topRightSelectionHandle = new GeometricShape(createHandleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 243, 15), Color.WHITE, GEF_SHADOW_EFFECT);
GeometricShape bottomLeftSelectionHandle = new GeometricShape(createHandleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 12, 109), Color.WHITE, GEF_SHADOW_EFFECT);
GeometricShape bottomRightSelectionHandle = new GeometricShape(createHandleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 243, 109), Color.WHITE, GEF_SHADOW_EFFECT);
GeometricCurve selectionBoundsTopLine = new GeometricCurve(
new Point[] { new Point(), new Point(140, 24), new Point() }, GEF_COLOR_GREEN, GEF_STROKE_WIDTH,
GEF_DASH_PATTERN, null);
GeometricCurve selectionBoundsLeftLine = new GeometricCurve(
new Point[] { new Point(), new Point(19, 70), new Point() }, GEF_COLOR_GREEN, GEF_STROKE_WIDTH,
GEF_DASH_PATTERN, null);
GeometricCurve selectionBoundsBottomLine = new GeometricCurve(
new Point[] { new Point(), new Point(140, 118), new Point() }, GEF_COLOR_GREEN, GEF_STROKE_WIDTH,
new Double[] { 15d, 10d }, null);
GeometricCurve selectionBoundsRightLine = new GeometricCurve(
new Point[] { new Point(), new Point(250, 70), new Point() }, GEF_COLOR_GREEN, GEF_STROKE_WIDTH,
new Double[] { 15d, 10d }, null);
// g shapes
GeometricShape gBaseShape = new GeometricShape(createGBaseShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 27, 22), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
GeometricShape gTopShape = new GeometricShape(createGTopShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 27, 22), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
GeometricShape gMiddleShape = new GeometricShape(createGMiddleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 27, 22), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// e shape
GeometricShape eShape = new GeometricShape(createEShapeGeometry(), new AffineTransform(1, 0, 0, 1, 100, 22),
GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// f shape
GeometricShape fShape = new GeometricShape(createFShapeGeometry(), new AffineTransform(1, 0, 0, 1, 175, 22),
GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// gDotShape
GeometricShape gDotShape = new GeometricShape(createDotShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 87, 104), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// eDotShape
GeometricShape eDotShape = new GeometricShape(createDotShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 170, 104), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// fDotShape
GeometricShape fDotShape = new GeometricShape(createDotShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 225, 104), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
// fDotShape
GeometricShape cursorShape = new GeometricShape(createCursorShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 227, 45), Color.WHITE, 2, Color.BLACK, GEF_SHADOW_EFFECT);
// anchor curves to shapes
selectionBoundsTopLine.addSourceAnchorage(topLeftSelectionHandle);
selectionBoundsTopLine.addTargetAnchorage(topRightSelectionHandle);
selectionBoundsLeftLine.addSourceAnchorage(topLeftSelectionHandle);
selectionBoundsLeftLine.addTargetAnchorage(bottomLeftSelectionHandle);
selectionBoundsBottomLine.addSourceAnchorage(bottomLeftSelectionHandle);
selectionBoundsBottomLine.addTargetAnchorage(bottomRightSelectionHandle);
selectionBoundsRightLine.addSourceAnchorage(topRightSelectionHandle);
selectionBoundsRightLine.addTargetAnchorage(bottomRightSelectionHandle);
// anchor g-letter shape fragments to its base shape and a point to each
// letter shapes
gDotShape.addAnchorage(gBaseShape);
gMiddleShape.addAnchorage(gBaseShape);
gTopShape.addAnchorage(gBaseShape);
eDotShape.addAnchorage(eShape);
fDotShape.addAnchorage(fShape);
List<AbstractGeometricElement<? extends IGeometry>> visualShapes = new ArrayList<>();
// add all shapes in z-order
visualShapes.add(selectionBoundsTopLine);
visualShapes.add(selectionBoundsLeftLine);
visualShapes.add(selectionBoundsBottomLine);
visualShapes.add(selectionBoundsRightLine);
visualShapes.add(topLeftSelectionHandle);
visualShapes.add(topRightSelectionHandle);
visualShapes.add(bottomLeftSelectionHandle);
visualShapes.add(bottomRightSelectionHandle);
visualShapes.add(gTopShape);
visualShapes.add(gMiddleShape);
visualShapes.add(gBaseShape);
visualShapes.add(eShape);
visualShapes.add(fShape);
visualShapes.add(gDotShape);
visualShapes.add(eDotShape);
visualShapes.add(fDotShape);
visualShapes.add(cursorShape);
return visualShapes;
}
private static IShape createCursorShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(0, 31, 12, 41));
segments.add(new Line(12, 41, 12, 32));
segments.add(new Line(12, 32, 26, 32));
segments.add(new Line(26, 32, 26, 47));
segments.add(new Line(26, 47, 17, 47));
segments.add(new Line(17, 47, 28, 59));
segments.add(new Line(28, 59, 40, 47));
segments.add(new Line(40, 47, 30, 47));
segments.add(new Line(30, 47, 30, 32));
segments.add(new Line(30, 32, 46, 32));
segments.add(new Line(46, 32, 46, 41));
segments.add(new Line(46, 41, 57, 30));
segments.add(new Line(57, 30, 46, 18));
segments.add(new Line(46, 18, 46, 28));
segments.add(new Line(46, 28, 30, 28));
segments.add(new Line(30, 28, 30, 12));
segments.add(new Line(30, 12, 39, 12));
segments.add(new Line(39, 12, 28, 0));
segments.add(new Line(28, 0, 17, 12));
segments.add(new Line(17, 12, 26, 12));
segments.add(new Line(26, 12, 26, 28));
segments.add(new Line(26, 28, 12, 28));
segments.add(new Line(12, 28, 12, 18));
segments.add(new Line(12, 18, 0, 31));
return new CurvedPolygon(segments);
}
private static IShape createDotShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(3, 0, 0, 4));
segments.add(new Line(0, 4, 4, 9));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(4, 9, 8, 5, 3, 0).toBezier()));
return new CurvedPolygon(segments);
}
private static IShape createEShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(1, 10, 6, 10));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(6, 10, 5, 25, 7, 52, 6, 70, 6, 81).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(6, 81, 5, 81, 3, 84).toBezier()));
segments.add(new Line(3, 84, 3, 87));
segments.add(new Line(3, 87, 64, 86));
segments.add(new Line(64, 86, 65, 79));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(65, 79, 59, 81, 51, 82).toBezier()));
segments.add(new Line(51, 82, 12, 82));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(12, 82, 11, 56, 11, 30).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(11, 30, 27, 30, 45, 31).toBezier()));
segments.add(new Line(45, 31, 48, 25));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(48, 25, 35, 27, 19, 27, 10, 26).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(10, 26, 10, 20, 11, 10).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(11, 10, 24, 11, 31, 11, 51, 12).toBezier()));
segments.add(new Line(51, 12, 55, 6));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(55, 6, 45, 7, 33, 8, 15, 7, 7, 6).toBezier()));
segments.add(new Line(7, 6, 1, 10));
return new CurvedPolygon(segments);
}
private static IShape createFShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(3, 13, 3, 23));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(3, 23, 10, 25, 17, 27).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(17, 27, 16, 34, 14, 44, 10, 46).toBezier()));
segments.add(new Line(10, 46, 10, 53));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(10, 53, 8, 70, 7, 83).toBezier()));
segments.add(new Line(7, 83, 13, 89));
segments.add(new Line(13, 89, 17, 85));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(17, 85, 18, 69, 20, 54).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(20, 54, 32, 52, 45, 50).toBezier()));
segments.add(new Line(45, 50, 45, 45));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(45, 45, 33, 46, 22, 46).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(22, 46, 23, 34, 25, 24).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(25, 24, 42, 24, 50, 21, 59, 18, 67, 16).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(67, 16, 67, 12, 64, 10).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(64, 10, 54, 14, 42, 16, 28, 16).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(28, 16, 29, 11, 29, 8, 31, 0).toBezier()));
segments.add(new Line(31, 0, 24, 3));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(24, 3, 24, 8, 23, 12).toBezier()));
segments.add(new Line(23, 12, 20, 11));
segments.add(new Line(20, 11, 20, 15));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(20, 15, 13, 15, 3, 13).toBezier()));
return new CurvedPolygon(segments);
}
private static IShape createGBaseShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(0, 55, 10, 54));
segments.add(new Line(10, 54, 13, 42));
segments.add(new Line(13, 42, 23, 42));
segments.add(new Line(23, 42, 25, 32));
segments.add(new Line(25, 32, 37, 33));
segments.add(new Line(37, 33, 42, 23));
segments.add(new Line(42, 23, 54, 24));
segments.add(new Line(54, 24, 57, 12));
segments.add(new Line(57, 12, 65, 28));
segments.add(new Line(65, 28, 60, 31));
segments.add(new Line(60, 31, 57, 30));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(57, 30, 45, 35, 22, 53, 14, 73, 40, 69).toBezier()));
segments.add(new Line(40, 69, 39, 61));
segments.add(new Line(39, 61, 46, 58));
segments.add(new Line(46, 58, 54, 63));
segments.add(new Line(54, 63, 62, 57));
segments.add(new Line(62, 57, 67, 58));
segments.add(new Line(67, 58, 67, 65));
segments.add(new Line(67, 65, 55, 66));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(55, 66, 53, 77, 51, 86).toBezier()));
segments.add(new Line(51, 86, 47, 86));
segments.add(new Line(47, 86, 46, 71));
segments.add(new Line(46, 71, 25, 84));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(25, 84, 17, 86, 14, 84).toBezier()));
segments.add(new Line(14, 84, 0, 55));
return new CurvedPolygon(segments);
}
private static IShape createGMiddleShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(37, 48, 38, 56));
segments.add(new Line(38, 56, 45, 52));
segments.add(new Line(45, 52, 54, 57));
segments.add(new Line(54, 57, 62, 51));
segments.add(new Line(62, 51, 67, 54));
segments.add(new Line(67, 54, 67, 45));
segments.add(new Line(67, 45, 62, 44));
segments.add(new Line(62, 44, 62, 48));
segments.add(new Line(62, 48, 37, 48));
return new CurvedPolygon(segments);
}
private static IShape createGTopShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.add(new Line(0, 51, 8, 49));
segments.add(new Line(8, 49, 9, 38));
segments.add(new Line(9, 38, 20, 38));
segments.add(new Line(20, 38, 24, 26));
segments.add(new Line(24, 26, 35, 27));
segments.add(new Line(35, 27, 39, 15));
segments.add(new Line(39, 15, 51, 17));
segments.add(new Line(51, 17, 54, 8));
segments.add(new Line(54, 8, 52, 4));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(52, 4, 40, 9, 14, 28, 1, 43, 0, 51).toBezier()));
return new CurvedPolygon(segments);
}
private static IShape createHandleShapeGeometry() {
List<BezierCurve> segments = new ArrayList<>();
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(1, 1, 9, 0, 17, 1).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(17, 1, 16, 8, 17, 16).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(17, 16, 7, 15, 1, 16).toBezier()));
segments.addAll(Arrays.asList(PolyBezier.interpolateCubic(1, 16, 0, 8, 1, 1).toBezier()));
return new CurvedPolygon(segments);
}
public static List<GeometricShape> createPaletteViewerContents() {
final List<GeometricShape> paletteContents = new ArrayList<>();
final GeometricShape handlePrototype = new GeometricShape(createHandleShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 23, 5), Color.WHITE, GEF_SHADOW_EFFECT);
paletteContents.add(handlePrototype);
final GeometricShape cursorPrototype = new GeometricShape(createCursorShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 5, 32), Color.WHITE, 2, Color.BLACK, GEF_SHADOW_EFFECT);
paletteContents.add(cursorPrototype);
final GeometricShape eShapePrototype = new GeometricShape(createEShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 100, 22), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
paletteContents.add(eShapePrototype);
final GeometricShape fShapePrototype = new GeometricShape(createFShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 175, 22), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
paletteContents.add(fShapePrototype);
final GeometricShape dotShapePrototype = new GeometricShape(createDotShapeGeometry(),
new AffineTransform(1, 0, 0, 1, 87, 104), GEF_COLOR_BLUE, GEF_SHADOW_EFFECT);
paletteContents.add(dotShapePrototype);
return paletteContents;
}
private static Effect createShadowEffect() {
DropShadow outerShadow = new DropShadow();
outerShadow.setRadius(3);
outerShadow.setSpread(0.2);
outerShadow.setOffsetX(3);
outerShadow.setOffsetY(3);
outerShadow.setColor(new Color(0.3, 0.3, 0.3, 1));
Distant light = new Distant();
light.setAzimuth(-135.0f);
Lighting l = new Lighting();
l.setLight(light);
l.setSurfaceScale(3.0f);
Blend effects = new Blend(BlendMode.MULTIPLY);
effects.setTopInput(l);
effects.setBottomInput(outerShadow);
return effects;
}
public static void main(String[] args) {
Application.launch(args);
}
public MvcLogoExample() {
super("GEF MVC Logo Example");
}
@Override
protected Module createModule() {
return new MvcLogoExampleModule();
}
protected IViewer getPaletteViewer() {
return getDomain().getAdapter(AdapterKey.get(IViewer.class, MvcLogoExampleModule.PALETTE_VIEWER_ROLE));
}
@Override
protected void hookViewers() {
getPrimaryStage().setScene(
new Scene(new MvcLogoExampleViewersComposite(getContentViewer(), getPaletteViewer()).getComposite()));
}
@Override
protected void populateViewerContents() {
getContentViewer().getContents().setAll(createContentViewerContents());
getPaletteViewer().getContents().setAll(createPaletteViewerContents());
getPrimaryStage().sizeToScene();
}
}