Ignore:
Timestamp:
2012-09-11T09:55:54+02:00 (12 years ago)
Author:
larry0ua
Message:

'RelToolbox: added warning messages to the warning icon hint'

Location:
applications/editors/josm/plugins/reltoolbox/src/relcontext
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/SortAndFixAction.java

    r28693 r28703  
    3737        rel.addChosenRelationListener(this);
    3838        setEnabled(false);
    39        
     39
    4040        // construct all available fixers
    4141        fixers = new ArrayList<RelationFixer>();
    42         fixers.add(new BoundaryFixer()); // should be before multipolygon as takes special case of multipolygon relation - boundary
    43         fixers.add(new MultipolygonFixer());
    44         fixers.add(new AssociatedStreetFixer());
    45        
     42        //should be before multipolygon as takes special case of multipolygon relation - boundary
     43        fixers.add(new BoundaryFixer()); // boundary, multipolygon, boundary=administrative
     44        fixers.add(new MultipolygonFixer()); // multipolygon
     45        fixers.add(new AssociatedStreetFixer()); //associatedStreet
     46
     47        for(RelationFixer fix : fixers) {
     48            fix.setFixAction(this);
     49        }
    4650    }
    4751
     52    @Override
    4853    public void actionPerformed( ActionEvent e ) {
    4954        Command c = fixRelation(rel.get());
     
    5257    }
    5358
     59    @Override
    5460    public void chosenRelationChanged( Relation oldRelation, Relation newRelation ) {
    5561        setEnabled(newRelation != null && needsFixing( newRelation));
     
    5965        return !isIncomplete(rel) && !getFixer(rel).isRelationGood(rel);
    6066    }
    61    
     67
    6268    private RelationFixer getFixer( Relation rel ) {
    6369        for(RelationFixer fixer : fixers)
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/AssociatedStreetFixer.java

    r28693 r28703  
    11package relcontext.relationfix;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import java.util.ArrayList;
     
    1517import org.openstreetmap.josm.data.osm.Way;
    1618
    17 import static org.openstreetmap.josm.tools.I18n.tr;
    18 
    1919public class AssociatedStreetFixer extends RelationFixer {
    2020
     
    2626        public boolean isRelationGood(Relation rel) {
    2727                for (RelationMember m : rel.getMembers()) {
    28                 if (m.getType().equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole()))
     28                if (m.getType().equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole())) {
     29                    setWarningMessage(tr("Node without 'house' role found"));
    2930                        return false;
    30                 if (m.getType().equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) || "street".equals(m.getRole())))
     31                }
     32                if (m.getType().equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) || "street".equals(m.getRole()))) {
     33                    setWarningMessage(tr("Way without 'house' or 'street' role found"));
     34                    return false;
     35                }
     36                if (m.getType().equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole())) {
     37                    setWarningMessage(tr("Relation without 'house' role found"));
    3138                        return false;
    32                 if (m.getType().equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole()))
    33                         return false;
     39                }
    3440        }
    3541                // relation should have name
    3642                if (!rel.hasKey("name")) {
     43                    setWarningMessage(tr("Relation does not have name"));
    3744                        return false;
    3845                }
     
    4047                String streetName = rel.get("name");
    4148                for (RelationMember m : rel.getMembers()) {
    42                         if (m.getRole().equals("street") && !m.getWay().get("name").equals(streetName))
    43                                 return false;
     49                        if (m.getRole().equals("street") && !m.getWay().get("name").equals(streetName)) {
     50                            setWarningMessage(tr("Relation has streets with different names"));
     51                            return false;
     52                        }
    4453                }
     54                clearWarningMessage();
    4555                return true;
    4656        }
    4757
    48         @Override
     58    @Override
    4959        public Command fixRelation(Relation source) {
    5060                // any way with highway tag -> street
     
    5464                Relation rel = new Relation(source);
    5565                boolean fixed = false;
    56                
     66
    5767                for (int i = 0; i < rel.getMembersCount(); i++) {
    5868                        RelationMember m = rel.getMember(i);
    59                        
     69
    6070                        if (m.isNode()) {
    6171                                Node node = m.getNode();
    62                                 if (!"house".equals(m.getRole()) && 
     72                                if (!"house".equals(m.getRole()) &&
    6373                                                (node.hasKey("building") || node.hasKey("addr:housenumber"))) {
    6474                                        fixed = true;
     
    7080                                        fixed = true;
    7181                                        rel.setMember(i, new RelationMember("street", way));
    72                                 } else if (!"house".equals(m.getRole()) && 
     82                                } else if (!"house".equals(m.getRole()) &&
    7383                                                (way.hasKey("building") || way.hasKey("addr:housenumber"))) {
    7484                                        fixed = true;
     
    7787                        } else if (m.isRelation()) {
    7888                                Relation relation = m.getRelation();
    79                                 if (!"house".equals(m.getRole()) && 
     89                                if (!"house".equals(m.getRole()) &&
    8090                                                (relation.hasKey("building") || relation.hasKey("addr:housenumber") || "multipolygon".equals(relation.get("type")))) {
    8191                                        fixed = true;
     
    8494                        }
    8595                }
    86                
     96
    8797                // fill relation name
    8898                Map<String, Integer> streetNames = new HashMap<String, Integer>();
    89                 for (RelationMember m : rel.getMembers()) 
     99                for (RelationMember m : rel.getMembers())
    90100                        if ("street".equals(m.getRole()) && m.isWay()) {
    91101                                String name = m.getWay().get("name");
    92102                                if (name == null || name.isEmpty()) continue;
    93                                
     103
    94104                                Integer count = streetNames.get(name);
    95                                
     105
    96106                                streetNames.put(name, count != null? count + 1 : 1);
    97107                        }
     
    104114                        }
    105115                }
    106                
    107                 if (!rel.hasKey("name")) {
     116
     117                if (!rel.hasKey("name") && !commonName.isEmpty()) {
    108118                        fixed = true;
    109119                        rel.put("name", commonName);
     
    111121                        commonName = ""; // set empty common name - if we already have name on relation, do not overwrite it
    112122                }
    113                
     123
    114124                List<Command> commandList = new ArrayList<Command>();
    115125                if (fixed) {
    116126                        commandList.add(new ChangeCommand(source, rel));
    117127                }
    118                
     128
    119129                /*if (!commonName.isEmpty())
    120130                // fill common name to streets
    121                 for (RelationMember m : rel.getMembers()) 
     131                for (RelationMember m : rel.getMembers())
    122132                        if ("street".equals(m.getRole()) && m.isWay()) {
    123133                                String name = m.getWay().get("name");
    124134                                if (commonName.equals(name)) continue;
    125                                
     135
    126136                                // TODO: ask user if he really wants to overwrite street name??
    127                                
     137
    128138                                Way oldWay = m.getWay();
    129139                                Way newWay = new Way(oldWay);
    130140                                newWay.put("name", commonName);
    131                                
     141
    132142                                commandList.add(new ChangeCommand(oldWay, newWay));
    133143                        }
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/BoundaryFixer.java

    r28693 r28703  
    11package relcontext.relationfix;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import org.openstreetmap.josm.command.ChangeCommand;
     
    1517
    1618        public BoundaryFixer() {
    17                 super(new String[]{"boundary", "multipolygon"});
     19                super("boundary", "multipolygon");
    1820        }
    19        
     21
    2022        /**
    21          * For boundary relations both "boundary" and "multipolygon" types are applicable, but 
     23         * For boundary relations both "boundary" and "multipolygon" types are applicable, but
    2224         * it should also have key boundary=administrative to be fully boundary.
    2325         * @see http://wiki.openstreetmap.org/wiki/Relation:boundary
     
    2729                return super.isFixerApplicable(rel) && "administrative".equals(rel.get("boundary"));
    2830        }
    29        
     31
    3032        @Override
    3133        public boolean isRelationGood(Relation rel) {
    3234                for( RelationMember m : rel.getMembers() ) {
    33             if (m.getType().equals(OsmPrimitiveType.RELATION) && !"subarea".equals(m.getRole()))
     35            if (m.getType().equals(OsmPrimitiveType.RELATION) && !"subarea".equals(m.getRole())) {
     36                setWarningMessage(tr("Relation without 'subarea' role found"));
    3437                return false;
    35             if (m.getType().equals(OsmPrimitiveType.NODE) && !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole())))
     38            }
     39            if (m.getType().equals(OsmPrimitiveType.NODE) && !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole()))) {
     40                setWarningMessage(tr("Node without 'label' or 'admin_centre' role found"));
    3641                return false;
    37             if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole())))
     42            }
     43            if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {
     44                setWarningMessage(tr("Way without 'inner' or 'outer' role found"));
    3845                                return false;
     46            }
    3947        }
     48                clearWarningMessage();
    4049                return true;
    4150        }
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/MultipolygonFixer.java

    r28693 r28703  
    11package relcontext.relationfix;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import java.util.ArrayList;
     
    2325                super("multipolygon");
    2426        }
    25        
    26         protected MultipolygonFixer(String[] types) {
     27
     28        protected MultipolygonFixer(String...types) {
    2729                super(types);
    2830        }
     
    3234        public boolean isRelationGood(Relation rel) {
    3335                for (RelationMember m : rel.getMembers())
    34                         if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole())))
    35                                 return false;
     36                        if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {
     37                            setWarningMessage(tr("Way without 'inner' or 'outer' role found"));
     38                            return false;
     39                        }
     40                clearWarningMessage();
    3641                return true;
    3742        }
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/RelationFixer.java

    r28693 r28703  
    11package relcontext.relationfix;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import java.util.ArrayList;
    46import java.util.List;
    57
     8import javax.swing.Action;
     9
    610import org.openstreetmap.josm.command.Command;
    711import org.openstreetmap.josm.data.osm.Relation;
    812
     13import relcontext.actions.SortAndFixAction;
     14
    915public abstract class RelationFixer {
    10        
     16
    1117        private List<String> applicableTypes;
    12        
    13         {
    14                 applicableTypes = new ArrayList<String>();
    15         }
     18        private SortAndFixAction sortAndFixAction;
     19
    1620        /**
    17          * Construct new RelationFixer by only one applicable relation type
    18          * @param type
    19          */
    20         public RelationFixer(String type) {
    21                 applicableTypes.add(type);
    22         }
    23        
    24         /**
    25          * Construct new RelationFixer by an array of applicable types
     21         * Construct new RelationFixer by a list of applicable types
    2622         * @param types
    2723         */
    28         public RelationFixer(String[] types) {
     24        public RelationFixer(String... types) {
     25            applicableTypes = new ArrayList<String>();
    2926                for(String type: types) {
    3027                        applicableTypes.add(type);
    3128                }
    3229        }
    33        
     30
    3431        /**
    3532         * Check if given relation is of needed type. You may override this method to check first type
    3633         * and then check desired relation properties.
    3734         * Note that this only verifies if current RelationFixer can be used to check and fix given relation
    38          * Deeper relation checking is at {@link isRelationGood} 
    39          * 
     35         * Deeper relation checking is at {@link isRelationGood}
     36         *
    4037         * @param rel Relation to check
    4138         * @return true if relation can be verified by current RelationFixer
     
    4643                if (!rel.hasKey("type"))
    4744                        return false;
    48                
     45
    4946                String type = rel.get("type");
    5047                for(String oktype: applicableTypes)
    51                         if (oktype.equals(type)) 
     48                        if (oktype.equals(type))
    5249                                return true;
    53                
     50
    5451                return false;
    5552        }
    56        
     53
    5754        /**
    5855         * Check if given relation is OK. That means if all roles are given properly, all tags exist as expected etc.
    5956         * Should be written in children classes.
    60          * 
     57         *
    6158         * @param rel Relation to verify
    6259         * @return true if given relation is OK
    6360         */
    6461        public abstract boolean isRelationGood(Relation rel);
    65        
     62
    6663        /**
    6764         * Fix relation and return new relation with fixed tags, roles etc.
    6865         * Note that is not obligatory to return true for isRelationGood for new relation
    69          * 
     66         *
    7067         * @param rel Relation to fix
    7168         * @return command that fixes the relation {@code null} if it cannot be fixed or is already OK
    7269         */
    7370        public abstract Command fixRelation(Relation rel);
     71
     72    public void setFixAction(SortAndFixAction sortAndFixAction) {
     73        this.sortAndFixAction = sortAndFixAction;
     74    }
     75    protected void setWarningMessage(String text) {
     76        if (text == null) {
     77            clearWarningMessage();
     78        } else {
     79            sortAndFixAction.putValue(Action.SHORT_DESCRIPTION, text);
     80        }
     81    }
     82    protected void clearWarningMessage() {
     83        sortAndFixAction.putValue(Action.SHORT_DESCRIPTION, tr("Fix roles of the chosen relation members"));
     84    }
     85
    7486}
Note: See TracChangeset for help on using the changeset viewer.