/* * 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 net.sf.latexdraw.models.interfaces.prop.IAxesProp; import net.sf.latexdraw.models.interfaces.shape.AxesStyle; import net.sf.latexdraw.models.interfaces.shape.IGroup; import net.sf.latexdraw.models.interfaces.shape.IPoint; import net.sf.latexdraw.models.interfaces.shape.IShape; import net.sf.latexdraw.models.interfaces.shape.PlottingStyle; import net.sf.latexdraw.models.interfaces.shape.TicksStyle; /** * This trait encapsulates the code of the group related to the support of axes. * @author Arnaud Blouin */ interface LGroupAxes extends IGroup { /** May return the first axes shape of the group. */ default <T extends IShape & IAxesProp> Optional<T> firstIAxes() { return (Optional<T>) axesShapes().stream().filter(sh -> sh.isTypeOf(IAxesProp.class)).findFirst(); } default <T extends IShape & IAxesProp> List<T> axesShapes() { return getShapes().stream().filter(sh -> sh instanceof IAxesProp).map(sh -> (T) sh).collect(Collectors.toList()); } @Override default double getIncrementX() { return firstIAxes().map(sh -> sh.getIncrementX()).orElse(Double.NaN); } @Override default double getIncrementY() { return firstIAxes().map(sh -> sh.getIncrementY()).orElse(Double.NaN); } @Override default void setIncrementX(final double increment) { axesShapes().forEach(sh -> sh.setIncrementX(increment)); } @Override default void setIncrementY(final double increment) { axesShapes().forEach(sh -> sh.setIncrementY(increment)); } @Override default double getDistLabelsX() { return firstIAxes().map(sh -> sh.getDistLabelsX()).orElse(Double.NaN); } @Override default double getDistLabelsY() { return firstIAxes().map(sh -> sh.getDistLabelsY()).orElse(Double.NaN); } @Override default void setDistLabelsX(final double distLabelsX) { axesShapes().forEach(sh -> sh.setDistLabelsX(distLabelsX)); } @Override default void setDistLabelsY(final double distLabelsY) { axesShapes().forEach(sh -> sh.setDistLabelsY(distLabelsY)); } @Override default PlottingStyle getLabelsDisplayed() { return firstIAxes().map(sh -> sh.getLabelsDisplayed()).orElse(PlottingStyle.ALL); } @Override default void setLabelsDisplayed(final PlottingStyle labelsDisplayed) { axesShapes().forEach(sh -> sh.setLabelsDisplayed(labelsDisplayed)); } @Override default boolean isShowOrigin() { return firstIAxes().map(sh -> sh.isShowOrigin()).orElse(false); } @Override default void setShowOrigin(final boolean showOrigin) { axesShapes().forEach(sh -> sh.setShowOrigin(showOrigin)); } @Override default PlottingStyle getTicksDisplayed() { return firstIAxes().map(sh -> sh.getTicksDisplayed()).orElse(PlottingStyle.ALL); } @Override default void setTicksDisplayed(final PlottingStyle ticksDisplayed) { axesShapes().forEach(sh -> sh.setTicksDisplayed(ticksDisplayed)); } @Override default TicksStyle getTicksStyle() { return firstIAxes().map(sh -> sh.getTicksStyle()).orElse(TicksStyle.FULL); } @Override default void setTicksStyle(final TicksStyle ticksStyle) { axesShapes().forEach(sh -> sh.setTicksStyle(ticksStyle)); } @Override default double getTicksSize() { return firstIAxes().map(sh -> sh.getTicksSize()).orElse(Double.NaN); } @Override default void setTicksSize(final double ticksSize) { axesShapes().forEach(sh -> sh.setTicksSize(ticksSize)); } @Override default AxesStyle getAxesStyle() { return firstIAxes().map(sh -> sh.getAxesStyle()).orElse(AxesStyle.AXES); } @Override default void setAxesStyle(final AxesStyle axesStyle) { axesShapes().forEach(sh -> sh.setAxesStyle(axesStyle)); } @Override default IPoint getIncrement() { return firstIAxes().map(sh -> sh.getIncrement()).orElse(null); } @Override default void setIncrement(final IPoint increment) { axesShapes().forEach(sh -> sh.setIncrement(increment)); } @Override default IPoint getDistLabels() { return firstIAxes().map(sh -> sh.getDistLabels()).orElse(null); } @Override default void setDistLabels(final IPoint distLabels) { axesShapes().forEach(sh -> sh.setDistLabels(distLabels)); } }