001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.conflict.pair;
003    import static org.openstreetmap.josm.gui.conflict.pair.ListRole.MERGED_ENTRIES;
004    import static org.openstreetmap.josm.gui.conflict.pair.ListRole.MY_ENTRIES;
005    import static org.openstreetmap.josm.gui.conflict.pair.ListRole.THEIR_ENTRIES;
006    import static org.openstreetmap.josm.tools.I18n.tr;
007    
008    /**
009     * Enumeration of the possible comparison pairs
010     *
011     */
012    public enum ComparePairType {
013    
014        /**
015         * compare my version of an {@link OsmPrimitive} with their version
016         */
017        MY_WITH_THEIR (tr("My with Their"), new ListRole[] {MY_ENTRIES, THEIR_ENTRIES}),
018    
019        /**
020         * compare my version of an {@link OsmPrimitive} with the merged version
021         */
022        MY_WITH_MERGED (tr("My with Merged"),  new ListRole[] {MY_ENTRIES, MERGED_ENTRIES}),
023    
024        /**
025         * compare their version of an {@link OsmPrimitive} with the merged veresion
026         */
027        THEIR_WITH_MERGED(tr("Their with Merged"),  new ListRole[] {THEIR_ENTRIES, MERGED_ENTRIES});
028    
029        /** the localized display name */
030        private final String displayName;
031        private ListRole[] participatingRoles;
032    
033        ComparePairType(String displayName, ListRole[] participatingRoles) {
034            this.displayName = displayName;
035            this.participatingRoles = participatingRoles;
036        }
037    
038        /**
039         * replies the display name
040         *
041         * @return the display name
042         */
043        public String getDisplayName() {
044            return displayName;
045        }
046    
047        /**
048         * replies true, if <code>role</code> is participating in this comparison
049         * pair
050         *
051         * @param role  the list role
052         * @return true, if <code>role</code> is participating in this comparison
053         * pair; false, otherwise
054         */
055        public boolean isParticipatingIn(ListRole role) {
056            for (ListRole r: participatingRoles) {
057                if (r.equals(role)) return true;
058            }
059            return false;
060        }
061    
062        /**
063         * replies the pair of {@link ListRole}s participating in this comparison
064         * pair
065         *
066         * @return  the pair of list roles
067         */
068        public ListRole[] getParticipatingRoles() {
069            return participatingRoles;
070        }
071    
072        /**
073         * replies the opposite role of <code>role</code> participating in this comparison
074         * pair
075         *
076         * @param role one of the two roles in this pair
077         * @return the opposite role
078         * @exception IllegalStateException  if role is not participating in this pair
079         */
080        public ListRole getOppositeRole(ListRole role) {
081            if (!isParticipatingIn(role))
082                throw new IllegalStateException(tr("Role {0} is not participating in compare pair {1}.", role.toString(), this.toString()));
083            if (participatingRoles[0].equals(role))
084                return participatingRoles[1];
085            else
086                return participatingRoles[0];
087        }
088    }