/* * This file is part of LaTeXDraw. * Copyright (c) 2005-2017 Arnaud BLOUIN * LaTeXDraw is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later version. * LaTeXDraw is distributed without any warranty; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ package net.sf.latexdraw.models.impl; import java.awt.geom.Point2D; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; import javafx.geometry.Point3D; import net.sf.latexdraw.badaboom.BadaboomCollector; import net.sf.latexdraw.models.ShapeFactory; import net.sf.latexdraw.models.interfaces.shape.Color; import net.sf.latexdraw.models.interfaces.shape.IArrow; import net.sf.latexdraw.models.interfaces.shape.IArrowableShape; import net.sf.latexdraw.models.interfaces.shape.IAxes; import net.sf.latexdraw.models.interfaces.shape.IBezierCurve; import net.sf.latexdraw.models.interfaces.shape.ICircle; import net.sf.latexdraw.models.interfaces.shape.ICircleArc; import net.sf.latexdraw.models.interfaces.shape.IDot; import net.sf.latexdraw.models.interfaces.shape.IDrawing; import net.sf.latexdraw.models.interfaces.shape.IEllipse; import net.sf.latexdraw.models.interfaces.shape.IFreehand; import net.sf.latexdraw.models.interfaces.shape.IGrid; import net.sf.latexdraw.models.interfaces.shape.IGroup; import net.sf.latexdraw.models.interfaces.shape.ILine; import net.sf.latexdraw.models.interfaces.shape.IPicture; import net.sf.latexdraw.models.interfaces.shape.IPlot; import net.sf.latexdraw.models.interfaces.shape.IPoint; import net.sf.latexdraw.models.interfaces.shape.IPolygon; import net.sf.latexdraw.models.interfaces.shape.IPolyline; import net.sf.latexdraw.models.interfaces.shape.IRectangle; import net.sf.latexdraw.models.interfaces.shape.IRhombus; import net.sf.latexdraw.models.interfaces.shape.IShape; import net.sf.latexdraw.models.interfaces.shape.IShapeFactory; import net.sf.latexdraw.models.interfaces.shape.ISquare; import net.sf.latexdraw.models.interfaces.shape.IText; import net.sf.latexdraw.models.interfaces.shape.ITriangle; import org.eclipse.jdt.annotation.NonNullByDefault; /** * An implementation of the abstract factory. * @author Arnaud Blouin */ @NonNullByDefault public class LShapeFactory implements IShapeFactory { /** The map that maps types to creation operations. */ final Map<Class<?>, Supplier<IShape>> factoryMap; public LShapeFactory() { super(); factoryMap = new HashMap<>(); factoryMap.put(IPlot.class, () -> createPlot(createPoint(), 1.0, 10.0, "x", false)); factoryMap.put(ICircleArc.class, () -> createCircleArc()); factoryMap.put(LCircleArc.class, () -> createCircleArc()); factoryMap.put(ICircle.class, () -> createCircle()); factoryMap.put(LCircle.class, () -> createCircle()); factoryMap.put(IEllipse.class, () -> createEllipse()); factoryMap.put(LEllipse.class, () -> createEllipse()); factoryMap.put(ISquare.class, () -> createSquare()); factoryMap.put(LSquare.class, () -> createSquare()); factoryMap.put(IRectangle.class, () -> createRectangle()); factoryMap.put(LRectangle.class, () -> createRectangle()); factoryMap.put(ITriangle.class, () -> createTriangle()); factoryMap.put(LTriangle.class, () -> createTriangle()); factoryMap.put(IRhombus.class, () -> createRhombus()); factoryMap.put(LRhombus.class, () -> createRhombus()); factoryMap.put(IPolyline.class, () -> createPolyline()); factoryMap.put(LPolyline.class, () -> createPolyline()); factoryMap.put(IPolygon.class, () -> createPolygon()); factoryMap.put(LPolygon.class, () -> createPolygon()); factoryMap.put(IAxes.class, () -> createAxes(createPoint())); factoryMap.put(LAxes.class, () -> createAxes(createPoint())); factoryMap.put(IGrid.class, () -> createGrid(createPoint())); factoryMap.put(LGrid.class, () -> createGrid(createPoint())); factoryMap.put(IBezierCurve.class, () -> createBezierCurve()); factoryMap.put(LBezierCurve.class, () -> createBezierCurve()); factoryMap.put(IDot.class, () -> createDot(createPoint())); factoryMap.put(LDot.class, () -> createDot(createPoint())); factoryMap.put(IFreehand.class, () -> createFreeHand()); factoryMap.put(LFreehand.class, () -> createFreeHand()); factoryMap.put(IGroup.class, () -> createGroup()); factoryMap.put(LGroup.class, () -> createGroup()); factoryMap.put(IPicture.class, () -> createPicture(createPoint())); factoryMap.put(LPicture.class, () -> createPicture(createPoint())); factoryMap.put(IText.class, () -> createText()); factoryMap.put(LText.class, () -> createText()); factoryMap.put(IPlot.class, () -> createPlot(createPoint(), 1d, 10d, "x", false)); factoryMap.put(LPlot.class, () -> createPlot(createPoint(), 1d, 10d, "x", false)); } @Override public <T extends IShape> Optional<T> newShape(final Class<T> shapeClass) { if(shapeClass == null) return Optional.empty(); try { return Optional.of(shapeClass.cast(factoryMap.get(shapeClass).get())); }catch(final Throwable ex) { BadaboomCollector.INSTANCE.add(ex); return Optional.empty(); } } @Override public IGroup createGroup(final IShape sh) { final IGroup gp = createGroup(); if(sh != null) { gp.addShape(sh); } return gp; } @Override public Color createColorFX(final javafx.scene.paint.Color col) { if(col == null) throw new IllegalArgumentException(); return createColor(col.getRed(), col.getGreen(), col.getBlue(), col.getOpacity()); } @Override public Color createColorAWT(java.awt.Color col) { if(col == null) throw new IllegalArgumentException(); return createColorInt(col.getRed(), col.getGreen(), col.getBlue(), col.getAlpha()); } @Override public Color createColorInt(final int r, final int g, final int b, final int a) { return createColor(r / 255.0, g / 255.0, b / 255.0, a / 255.0); } @Override public Color createColorInt(final int r, final int g, final int b) { return createColorInt(r, g, b, 255); } @Override public Color createColorHSB(final double h, final double s, final double b) { final javafx.scene.paint.Color col = javafx.scene.paint.Color.hsb(h, s, b); return createColor(col.getRed(), col.getGreen(), col.getBlue(), col.getOpacity()); } @Override public Color createColor(final double r, final double g, final double b, final double o) { return new ColorImpl(r, g, b, o); } @Override public Color createColor(final double r, final double g, final double b) { return createColor(r, g, b, 1.0); } @Override public Color createColor() { return createColor(1.0, 1.0, 1.0, 1.0); } @Override public IPlot createPlot(final IPoint pos, final double minX, final double maxX, final String eq, final boolean polar) { return new LPlot(pos, minX, maxX, eq, polar); } @Override public IPoint createPoint(final Point2D pt) { return pt == null ? createPoint() : createPoint(pt.getX(), pt.getY()); } @Override public IPoint createPoint(final Point3D pt) { return pt == null ? createPoint() : createPoint(pt.getX(), pt.getY()); } @Override public IDrawing createDrawing() { return new LDrawing(); } @Override public IArrow createArrow(final IArrow arrow, final IArrowableShape owner) { return new LArrow(arrow, owner); } @Override public IArrow createArrow(final IArrowableShape owner) { return new LArrow(owner); } @Override public IAxes createAxes(final IPoint pt) { return new LAxes(pt); } @Override public IDot createDot(final IPoint pt) { return new LDot(pt); } @Override public IBezierCurve createBezierCurve() { return new LBezierCurve(true); } @Override public IBezierCurve createBezierCurve(final IPoint point, final IPoint point2) { return new LBezierCurve(point, point2, true); } @Override public IEllipse createEllipse(final IPoint tl, final IPoint br) { return new LEllipse(tl, br); } @Override public IEllipse createEllipse() { return new LEllipse(); } @Override public ITriangle createTriangle(final IPoint pos, final double width, final double height) { return new LTriangle(pos, width, height); } @Override public ITriangle createTriangle() { return new LTriangle(); } @Override public IRhombus createRhombus(final IPoint centre, final double width, final double height) { return new LRhombus(centre, width, height); } @Override public IRhombus createRhombus() { return new LRhombus(); } @Override public IPicture createPicture(final IPoint pt) { return new LPicture(pt); } @Override public IGrid createGrid(final IPoint pt) { return new LGrid(pt); } @Override public IFreehand createFreeHand() { return new LFreehand(); } @Override public ICircle createCircle(final IPoint pt, final double radius) { return new LCircle(pt, radius); } @Override public ICircle createCircle() { return createCircle(ShapeFactory.INST.createPoint(), 10); } @Override public IGroup createGroup() { return new LGroup(); } @Override public ILine createLine(final double x1, final double y1, final double x2, final double y2) { return new LLine(x1, y1, x2, y2); } @Override public ILine createLine(final double b, final IPoint p1) { return new LLine(b, p1); } @Override public ILine createLine(final IPoint p1, final IPoint p2) { return new LLine(p1, p2); } @Override public IPoint createPoint() { return new LPoint();} @Override public IPoint createPoint(final double x, final double y) { return new LPoint(x, y); } @Override public IPoint createPoint(final IPoint pt) { return new LPoint(pt); } @Override public IPolyline createPolyline() { return new LPolyline(); } @Override public IPolyline createPolyline(final IPoint point, final IPoint point2) { return new LPolyline(point, point2); } @Override public IPolygon createPolygon() { return new LPolygon(); } @Override public IPolygon createPolygon(final IPoint point, final IPoint point2) { return new LPolygon(point, point2); } @Override public IRectangle createRectangle() { return createRectangle(ShapeFactory.INST.createPoint(), ShapeFactory.INST.createPoint(1, 1)); } @Override public IRectangle createRectangle(final IPoint pos, final double width, final double height) { return createRectangle(pos, ShapeFactory.INST.createPoint(pos.getX() + width, pos.getY() + height)); } @Override public IRectangle createRectangle(final IPoint tl, final IPoint br) { return new LRectangle(tl, br); } @Override public IText createText() { return new LText(); } @Override public IText createText(final IPoint pt, final String text) { return new LText(pt, text); } @Override public ISquare createSquare() { return createSquare(ShapeFactory.INST.createPoint(), 1); } @Override public ISquare createSquare(final IPoint pos, final double width) { return new LSquare(pos, width); } @Override public ICircleArc createCircleArc(final IPoint pos, final double width) { return new LCircleArc(pos, width); } @Override public ICircleArc createCircleArc() { return createCircleArc(ShapeFactory.INST.createPoint(), 1); } @Override public <T extends IShape> T duplicate(final T shape) { return shape == null ? null : shape.duplicate(); } }