/*
* 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.stream.Collectors;
import net.sf.latexdraw.models.ShapeFactory;
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.IShape;
/**
* Implementation of IArrowableShape.
* @author Arnaud Blouin
*/
interface LArrowableShape extends IArrowableShape {
@Override
default void copy(final IShape sh) {
if(getClass().isInstance(sh)) {
final IArrowableShape arr = (IArrowableShape) sh;
final List<IArrow> arrows = getArrows();
arrows.clear();
arrows.addAll(arr.getArrows().stream().map(arrow -> ShapeFactory.INST.createArrow(arrow, this)).collect(Collectors.toList()));
}else {
if(sh instanceof IArrowableShape) {
final IArrowableShape arr = (IArrowableShape) sh;
setArrowStyle(arr.getArrowStyle(0), 0);
setArrowStyle(arr.getArrowStyle(-1), -1);
setArrowInset(arr.getArrowInset());
setArrowLength(arr.getArrowLength());
setArrowSizeDim(arr.getArrowSizeDim());
setArrowSizeNum(arr.getArrowSizeNum());
setDotSizeDim(arr.getDotSizeDim());
setDotSizeNum(arr.getDotSizeNum());
setBracketNum(arr.getBracketNum());
setRBracketNum(arr.getRBracketNum());
setTBarSizeDim(arr.getTBarSizeDim());
setTBarSizeNum(arr.getTBarSizeNum());
}
}
}
@Override
default IArrow getArrowAt(final int position) {
final List<IArrow> arrows = getArrows();
if(arrows.isEmpty() || position >= arrows.size() || position < -1) {
return null;
}
if(position == -1) {
return arrows.get(arrows.size() - 1);
}
return arrows.get(position);
}
@Override
default int getArrowIndex(final IArrow arrow) {
return getArrows().indexOf(arrow);
}
@Override
default int getNbArrows() {
return getArrows().size();
}
@Override
default void setDotSizeDim(final double dotSizeDim) {
getArrows().forEach(arr -> arr.setDotSizeDim(dotSizeDim));
}
@Override
default void setDotSizeNum(final double dotSizeNum) {
getArrows().forEach(arr -> arr.setDotSizeNum(dotSizeNum));
}
@Override
default void setTBarSizeNum(final double tbarSizeNum) {
getArrows().forEach(arr -> arr.setTBarSizeNum(tbarSizeNum));
}
@Override
default void setTBarSizeDim(final double tbarSizeDim) {
getArrows().forEach(arr -> arr.setTBarSizeDim(tbarSizeDim));
}
@Override
default double getTBarSizeDim() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getTBarSizeDim();
}
@Override
default double getTBarSizeNum() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getTBarSizeNum();
}
@Override
default void setRBracketNum(final double rBracketNum) {
getArrows().forEach(arr -> arr.setRBracketNum(rBracketNum));
}
@Override
default void setBracketNum(final double bracketNum) {
getArrows().forEach(arr -> arr.setBracketNum(bracketNum));
}
@Override
default void setArrowLength(final double lgth) {
getArrows().forEach(arr -> arr.setArrowLength(lgth));
}
@Override
default void setArrowSizeDim(final double arrowSizeDim) {
getArrows().forEach(arr -> arr.setArrowSizeDim(arrowSizeDim));
}
@Override
default void setArrowSizeNum(final double arrowSizeNum) {
getArrows().forEach(arr -> arr.setArrowSizeNum(arrowSizeNum));
}
@Override
default void setArrowInset(final double inset) {
getArrows().forEach(arr -> arr.setArrowInset(inset));
}
@Override
default double getDotSizeDim() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getDotSizeDim();
}
@Override
default double getDotSizeNum() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getDotSizeNum();
}
@Override
default double getBracketNum() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getBracketNum();
}
@Override
default double getArrowSizeNum() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getArrowSizeNum();
}
@Override
default double getArrowSizeDim() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getArrowSizeDim();
}
@Override
default double getArrowInset() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getArrowInset();
}
@Override
default double getArrowLength() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getArrowLength();
}
@Override
default double getRBracketNum() {
return getArrows().isEmpty() ? Double.NaN : getArrows().get(0).getRBracketNum();
}
@Override
default void setArrowStyle(final ArrowStyle style, final int position) {
if(style != null) {
final IArrow arr = getArrowAt(position);
if(arr != null) {
arr.setArrowStyle(style);
}
}
}
@Override
default ArrowStyle getArrowStyle(final int position) {
final IArrow arr = getArrowAt(position);
return arr == null ? null : arr.getArrowStyle();
}
@Override
default void setOnArrowChanged(final Runnable run) {
//TODO
}
}