001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.sort;
003
004import static org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction.NONE;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007public class WayConnectionType {
008
009    /** True, if the corresponding primitive is not a way or the way is incomplete */
010    private final boolean invalid;
011
012    /** True, if linked to the previous / next member.  */
013    public boolean linkPrev;
014    public boolean linkNext;
015
016    /**
017     * direction is FORWARD if the first node of this way is connected to the previous way
018     * and / or the last node of this way is connected to the next way.
019     * direction is BACKWARD if it is the other way around.
020     * direction has a ROUNDABOUT value, if it is tagged as such and it is somehow
021     * connected to the previous / next member.
022     * If there is no connection to the previous or next member, then
023     * direction has the value NONE.
024     */
025    public Direction direction;
026
027    public enum Direction {
028        FORWARD, BACKWARD, ROUNDABOUT_LEFT, ROUNDABOUT_RIGHT, NONE;
029
030        public boolean isRoundabout() {
031            return this == ROUNDABOUT_RIGHT || this == ROUNDABOUT_LEFT;
032        }
033    }
034
035    /** True, if the element is part of a closed loop of ways. */
036    public boolean isLoop;
037
038    public boolean isOnewayLoopForwardPart;
039    public boolean isOnewayLoopBackwardPart;
040    public boolean isOnewayHead;
041    public boolean isOnewayTail;
042
043    public WayConnectionType(boolean linkPrev, boolean linkNext, Direction direction) {
044        this.linkPrev = linkPrev;
045        this.linkNext = linkNext;
046        this.isLoop = false;
047        this.direction = direction;
048        invalid = false;
049    }
050
051    public WayConnectionType(boolean invalid) {
052        this.invalid = invalid;
053    }
054
055    /** construct invalid instance */
056    public WayConnectionType() {
057        this.linkPrev = false;
058        this.linkNext = false;
059        this.isLoop = false;
060        this.direction = NONE;
061        invalid = true;
062    }
063
064    public boolean isValid() {
065        return !invalid;
066    }
067
068    @Override
069    public String toString() {
070        return "[P "+linkPrev+" ;N "+linkNext+" ;D "+direction+" ;L "+isLoop+
071                " ;FP " + isOnewayLoopForwardPart+";BP " + isOnewayLoopBackwardPart+
072                ";OH " + isOnewayHead+";OT " + isOnewayTail+']';
073    }
074
075    public String getToolTip() {
076        if (!isValid())
077            return "";
078        else if (linkPrev && linkNext)
079            return tr("way is connected");
080        else if (linkPrev)
081            return tr("way is connected to previous relation member");
082        else if (linkNext)
083            return tr("way is connected to next relation member");
084        else
085            return tr("way is not connected to previous or next relation member");
086    }
087}