/*
* 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.interfaces.shape;
import java.util.Arrays;
import net.sf.latexdraw.view.pst.PSTricksConstants;
import org.eclipse.jdt.annotation.NonNull;
/**
* The arrow styles.
* @author Arnaud Blouin
*/
public enum ArrowStyle {
NONE {
@Override
public String getPSTToken() {
return ""; //$NON-NLS-1$
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return NONE;
}
}, LEFT_ARROW {
@Override
public String getPSTToken() {
return PSTricksConstants.LARROW_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return RIGHT_ARROW;
}
@Override
public boolean needsLineReduction() {
return true;
}
}, RIGHT_ARROW {
@Override
public String getPSTToken() {
return PSTricksConstants.RARROW_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return LEFT_ARROW;
}
@Override
public boolean needsLineReduction() {
return true;
}
}, RIGHT_DBLE_ARROW {
@Override
public String getPSTToken() {
return PSTricksConstants.DRARROW_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return LEFT_DBLE_ARROW;
}
@Override
public boolean needsLineReduction() {
return true;
}
}, LEFT_DBLE_ARROW {
@Override
public String getPSTToken() {
return PSTricksConstants.DLARROW_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return RIGHT_DBLE_ARROW;
}
@Override
public boolean needsLineReduction() {
return true;
}
}, BAR_END {
@Override
public String getPSTToken() {
return PSTricksConstants.BAREND_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return BAR_END;
}
}, BAR_IN {
@Override
public String getPSTToken() {
return PSTricksConstants.BARIN_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return BAR_IN;
}
}, LEFT_SQUARE_BRACKET {
@Override
public String getPSTToken() {
return PSTricksConstants.LSBRACKET_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return RIGHT_SQUARE_BRACKET;
}
}, RIGHT_SQUARE_BRACKET {
@Override
public String getPSTToken() {
return PSTricksConstants.RSBRACKET_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return LEFT_SQUARE_BRACKET;
}
}, LEFT_ROUND_BRACKET {
@Override
public String getPSTToken() {
return PSTricksConstants.LRBRACKET_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return RIGHT_ROUND_BRACKET;
}
}, RIGHT_ROUND_BRACKET {
@Override
public String getPSTToken() {
return PSTricksConstants.RRBRACKET_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return LEFT_ROUND_BRACKET;
}
}, CIRCLE_END {
@Override
public String getPSTToken() {
return PSTricksConstants.CIRCLEEND_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return CIRCLE_END;
}
}, CIRCLE_IN {
@Override
public String getPSTToken() {
return PSTricksConstants.CIRCLEIN_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return CIRCLE_IN;
}
}, DISK_END {
@Override
public String getPSTToken() {
return PSTricksConstants.DISKEND_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return DISK_END;
}
}, DISK_IN {
@Override
public String getPSTToken() {
return PSTricksConstants.DISKIN_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return DISK_IN;
}
}, ROUND_END {
@Override
public String getPSTToken() { return PSTricksConstants.ROUNDEND_STYLE; }
@Override
public ArrowStyle getOppositeArrowStyle() { return ROUND_END; }
}, ROUND_IN {
@Override
public String getPSTToken() {
return PSTricksConstants.ROUNDIN_STYLE;
}
@Override
public ArrowStyle getOppositeArrowStyle() {
return ROUND_IN;
}
@Override
public boolean needsLineReduction() {
return true;
}
}, SQUARE_END {
@Override
public String getPSTToken() { return PSTricksConstants.SQUAREEND_STYLE; }
@Override
public ArrowStyle getOppositeArrowStyle() { return SQUARE_END; }
};
/**
* @return The opposite arrow of the current one.
* @since 3.0
*/
public abstract ArrowStyle getOppositeArrowStyle();
/**
* @return The PSTricks token of the arrow style.
* @since 3.0
*/
public abstract String getPSTToken();
/**
* @return True if the style is a bar.
* @since 3.0
*/
public boolean isBar() {
return this == BAR_END || this == BAR_IN;
}
public boolean isReducingShape() {
return this == LEFT_ARROW || this == RIGHT_ARROW || this == LEFT_DBLE_ARROW || this == RIGHT_DBLE_ARROW || this == ROUND_IN || this == CIRCLE_IN || this == DISK_IN;
}
/**
* @return True if the style is an arrow.
* @since 3.0
*/
public boolean isArrow() {
return this == LEFT_ARROW || this == RIGHT_ARROW || this == RIGHT_DBLE_ARROW || this == LEFT_DBLE_ARROW;
}
/**
* @return True if the style is a round bracket.
* @since 3.0
*/
public boolean isRoundBracket() {
return this == LEFT_ROUND_BRACKET || this == RIGHT_ROUND_BRACKET;
}
/**
* @return True if the style is a square bracket.
* @since 3.0
*/
public boolean isSquareBracket() {
return this == LEFT_SQUARE_BRACKET || this == RIGHT_SQUARE_BRACKET;
}
/**
* @return True if the style is a circle or a disk.
* @since 3.0
*/
public boolean isCircleDisk() {
return this == CIRCLE_END || this == CIRCLE_IN || this == DISK_END || this == DISK_IN;
}
/**
* @return True if the style is a style for right arrows.
* @since 3.0
*/
public boolean isRightStyle() {
return this == RIGHT_ARROW || this == RIGHT_DBLE_ARROW || this == RIGHT_ROUND_BRACKET || this == RIGHT_SQUARE_BRACKET;
}
/**
* @param style The style to test.
* @return True if the given style and the calling style are of the same kind (e.g. both are
* circles or disks).
* @since 3.0
*/
public boolean isSameKind(final ArrowStyle style) {
return style != null && (isArrow() && style.isArrow() || isBar() && style.isBar() || isCircleDisk() && style.isCircleDisk() || isRoundBracket() && style.isRoundBracket() || isSquareBracket() && style.isSquareBracket());
}
/**
* @return True if the current arrow style need its line to be reduced. For instance the arrow
* style requires its line to be smaller. The width of the arrow can be used in
* complement to reduce the line.
* @since 3.0
*/
public boolean needsLineReduction() {
return false;
}
/**
* @param token The PST token or the name of the style to get (e.g. NONE.toString()).
* @return The arrow style corresponding to the given PST token or the style name (or null).
* @since 3.0
*/
public static @NonNull ArrowStyle getArrowStyle(final String token) {
return Arrays.stream(values()).filter(it -> it.getPSTToken().equals(token) || it.toString().equals(token)).findAny().orElse(ArrowStyle.NONE);
}
}