/* * 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.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.IntStream; import net.sf.latexdraw.models.interfaces.shape.ArrowStyle; import net.sf.latexdraw.models.interfaces.shape.IArrow; import net.sf.latexdraw.models.interfaces.shape.IArrowableShape; import net.sf.latexdraw.models.interfaces.shape.IGroup; import net.sf.latexdraw.models.interfaces.shape.ILine; import net.sf.latexdraw.models.interfaces.shape.IShape; /** * This trait encapsulates the code of the group related to the support of arrowable shapes. * @author Arnaud Blouin */ interface LGroupArrowable extends IGroup { /** May return the first grid of the group. */ default Optional<IArrowableShape> firstIArrowable() { return arrowShapes().stream().filter(sh -> sh.isTypeOf(IArrowableShape.class)).findFirst(); } default List<IArrowableShape> arrowShapes() { return getShapes().stream().filter(sh -> sh instanceof IArrowableShape).map(sh -> (IArrowableShape) sh).collect(Collectors.toList()); } @Override default int getArrowIndex(final IArrow arrow) { return firstIArrowable().map(sh -> sh.getArrowIndex(arrow)).orElse(-1); } @Override default int getNbArrows() { return firstIArrowable().map(arc -> arc.getNbArrows()).orElse(0); } @Override default void setTBarSizeDimList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setTBarSizeDim(values.get(i)); } }); } } @Override default List<Double> getTBarSizeDimList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getTBarSizeDim() : Double.NaN).collect(Collectors.toList()); } @Override default void setTBarSizeNumList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setTBarSizeNum(values.get(i)); } }); } } @Override default List<Double> getTBarSizeNumList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getTBarSizeNum() : Double.NaN).collect(Collectors.toList()); } @Override default void setDotSizeNumList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setDotSizeNum(values.get(i)); } }); } } @Override default List<Double> getDotSizeNumList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getDotSizeNum() : Double.NaN).collect(Collectors.toList()); } @Override default void setDotSizeDimList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setDotSizeDim(values.get(i)); } }); } } @Override default List<Double> getDotSizeDimList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getDotSizeDim() : Double.NaN).collect(Collectors.toList()); } @Override default void setBracketNumList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setBracketNum(values.get(i)); } }); } } @Override default List<Double> getBracketNumList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getBracketNum() : Double.NaN).collect(Collectors.toList()); } @Override default void setRBracketNumList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setRBracketNum(values.get(i)); } }); } } @Override default List<Double> getRBracketNumList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getRBracketNum() : Double.NaN).collect(Collectors.toList()); } @Override default void setArrowSizeNumList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setArrowSizeNum(values.get(i)); } }); } } @Override default List<Double> getArrowSizeNumList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getArrowSizeNum() : Double.NaN).collect(Collectors.toList()); } @Override default void setArrowSizeDimList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setArrowSizeDim(values.get(i)); } }); } } @Override default List<Double> getArrowSizeDimList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getArrowSizeDim() : Double.NaN).collect(Collectors.toList()); } @Override default void setArrowLengthList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setArrowLength(values.get(i)); } }); } } @Override default List<Double> getArrowLengthList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getArrowLength() : Double.NaN).collect(Collectors.toList()); } @Override default void setArrowInsetList(final List<Double> values) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setArrowInset(values.get(i)); } }); } } @Override default List<Double> getArrowInsetList() { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getArrowInset() : Double.NaN).collect(Collectors.toList()); } @Override default List<ArrowStyle> getArrowStyleList(final int i) { return getShapes().stream().map(sh -> sh instanceof IArrowableShape ? ((IArrowableShape) sh).getArrowStyle(i) : ArrowStyle.NONE).collect(Collectors.toList()); } @Override default void setArrowStyleList(final List<ArrowStyle> values, final int index) { final List<IShape> shapes = getShapes(); if(values != null && values.size() == shapes.size()) { IntStream.range(0, values.size()).forEach(i -> { final IShape sh = shapes.get(i); if(sh instanceof IArrowableShape) { ((IArrowableShape) sh).setArrowStyle(values.get(i), index); } }); } } @Override default void setArrowStyle(final ArrowStyle style, final int position) { arrowShapes().forEach(sh -> sh.setArrowStyle(style, position)); } @Override default ArrowStyle getArrowStyle(final int position) { return firstIArrowable().map(sh -> sh.getArrowStyle(position)).orElse(ArrowStyle.NONE); } @Override default IArrow getArrowAt(final int position) { return firstIArrowable().map(sh -> sh.getArrowAt(position)).orElse(null); } @Override default ILine getArrowLine(final IArrow arrow) { return firstIArrowable().map(arc -> arc.getArrowLine(arrow)).orElse(null); } @Override default void setDotSizeDim(final double dotSizeDim) { arrowShapes().forEach(sh -> sh.setDotSizeDim(dotSizeDim)); } @Override default void setDotSizeNum(final double dotSizeNum) { arrowShapes().forEach(sh -> sh.setDotSizeNum(dotSizeNum)); } @Override default void setTBarSizeNum(final double tbarSizeNum) { arrowShapes().forEach(sh -> sh.setTBarSizeNum(tbarSizeNum)); } @Override default void setTBarSizeDim(final double tbarSizeDim) { arrowShapes().forEach(sh -> sh.setTBarSizeDim(tbarSizeDim)); } @Override default double getTBarSizeDim() { return firstIArrowable().map(sh -> sh.getTBarSizeDim()).orElse(Double.NaN); } @Override default double getTBarSizeNum() { return firstIArrowable().map(sh -> sh.getTBarSizeNum()).orElse(Double.NaN); } @Override default void setRBracketNum(final double rBracketNum) { arrowShapes().forEach(sh -> sh.setRBracketNum(rBracketNum)); } @Override default void setBracketNum(final double bracketNum) { arrowShapes().forEach(sh -> sh.setBracketNum(bracketNum)); } @Override default void setArrowLength(final double lgth) { arrowShapes().forEach(sh -> sh.setArrowLength(lgth)); } @Override default void setArrowSizeDim(final double arrowSizeDim) { arrowShapes().forEach(sh -> sh.setArrowSizeDim(arrowSizeDim)); } @Override default void setArrowSizeNum(final double arrowSizeNum) { arrowShapes().forEach(sh -> sh.setArrowSizeNum(arrowSizeNum)); } @Override default void setArrowInset(final double inset) { arrowShapes().forEach(sh -> sh.setArrowInset(inset)); } @Override default double getDotSizeDim() { return firstIArrowable().map(sh -> sh.getDotSizeDim()).orElse(Double.NaN); } @Override default double getDotSizeNum() { return firstIArrowable().map(sh -> sh.getDotSizeNum()).orElse(Double.NaN); } @Override default double getBracketNum() { return firstIArrowable().map(sh -> sh.getBracketNum()).orElse(Double.NaN); } @Override default double getArrowSizeNum() { return firstIArrowable().map(sh -> sh.getArrowSizeNum()).orElse(Double.NaN); } @Override default double getArrowSizeDim() { return firstIArrowable().map(sh -> sh.getArrowSizeDim()).orElse(Double.NaN); } @Override default double getArrowInset() { return firstIArrowable().map(sh -> sh.getArrowInset()).orElse(Double.NaN); } @Override default double getArrowLength() { return firstIArrowable().map(sh -> sh.getArrowLength()).orElse(Double.NaN); } @Override default double getRBracketNum() { return firstIArrowable().map(sh -> sh.getRBracketNum()).orElse(Double.NaN); } @Override default void setOnArrowChanged(Runnable run) { //TODO } }