Ignore:
Timestamp:
2014-05-20T21:48:59+02:00 (10 years ago)
Author:
simon04
Message:

Search preset: also show adequate relations to be created (according to the defined role member match expressions)

Location:
trunk/src/org/openstreetmap/josm/gui/tagging
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java

    r7100 r7153  
    384384        originalSelectionEmpty = participants.isEmpty();
    385385        Collection<OsmPrimitive> sel = new LinkedList<>();
    386         for (OsmPrimitive osm : participants)
    387         {
    388             if (types != null)
    389             {
    390                 if(osm instanceof Relation)
    391                 {
    392                     if(!types.contains(TaggingPresetType.RELATION) &&
    393                             !(types.contains(TaggingPresetType.CLOSEDWAY) && ((Relation)osm).isMultipolygon())) {
    394                         continue;
    395                     }
    396                 }
    397                 else if(osm instanceof Node)
    398                 {
    399                     if(!types.contains(TaggingPresetType.NODE)) {
    400                         continue;
    401                     }
    402                 }
    403                 else if(osm instanceof Way)
    404                 {
    405                     if(!types.contains(TaggingPresetType.WAY) &&
    406                             !(types.contains(TaggingPresetType.CLOSEDWAY) && ((Way)osm).isClosed())) {
    407                         continue;
    408                     }
    409                 }
    410             }
    411             sel.add(osm);
     386        for (OsmPrimitive osm : participants) {
     387            if (typeMatches(EnumSet.of(TaggingPresetType.forPrimitive(osm)))) {
     388                sel.add(osm);
     389            }
    412390        }
    413391        return sel;
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java

    r7100 r7153  
    5353import org.openstreetmap.josm.gui.widgets.JosmTextField;
    5454import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
     55import org.openstreetmap.josm.tools.Predicate;
     56import org.openstreetmap.josm.tools.Utils;
    5557
    5658/**
     
    334336        boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
    335337
    336         List<PresetClassification> result = new ArrayList<>();
    337         PRESET_LOOP:
    338             for (PresetClassification presetClasification: classifications) {
    339                 TaggingPreset preset = presetClasification.preset;
    340                 presetClasification.classification = 0;
    341 
    342                 if (onlyApplicable && preset.types != null) {
    343                     boolean found = false;
    344                     for (TaggingPresetType type: preset.types) {
    345                         if (getTypesInSelection().contains(type)) {
    346                             found = true;
    347                             break;
    348                         }
    349                     }
    350                     if (!found) {
    351                         continue;
    352                     }
    353                 }
    354 
    355                 if (groupWords != null && presetClasification.isMatchingGroup(groupWords) == 0) {
    356                     continue PRESET_LOOP;
    357                 }
    358 
    359                 int matchName = presetClasification.isMatchingName(nameWords);
    360 
    361                 if (matchName == 0) {
    362                     if (groupWords == null) {
    363                         int groupMatch = presetClasification.isMatchingGroup(nameWords);
    364                         if (groupMatch > 0) {
    365                             presetClasification.classification = CLASSIFICATION_GROUP_MATCH + groupMatch;
    366                         }
    367                     }
    368                     if (presetClasification.classification == 0 && inTags) {
    369                         int tagsMatch = presetClasification.isMatchingTags(nameWords);
    370                         if (tagsMatch > 0) {
    371                             presetClasification.classification = CLASSIFICATION_TAGS_MATCH + tagsMatch;
    372                         }
    373                     }
     338        final List<PresetClassification> result = new ArrayList<>();
     339        for (PresetClassification presetClassification : classifications) {
     340            TaggingPreset preset = presetClassification.preset;
     341            presetClassification.classification = 0;
     342
     343            if (onlyApplicable && !preset.typeMatches(getTypesInSelection())) {
     344                final Predicate<Role> memberExpressionMatchesOnePrimitive = new Predicate<Role>() {
     345                    @Override
     346                    public boolean evaluate(Role object) {
     347                        return object.memberExpression != null && Utils.exists(Main.main.getCurrentDataSet().getSelected(), object.memberExpression);
     348                    }
     349                };
     350                if (preset.types.contains(TaggingPresetType.RELATION) && preset.roles != null
     351                        && Utils.exists(preset.roles.roles, memberExpressionMatchesOnePrimitive)) {
     352                    // keep to allow the creation of new relations
    374353                } else {
    375                     presetClasification.classification = CLASSIFICATION_NAME_MATCH + matchName;
    376                 }
    377 
    378                 if (presetClasification.classification > 0) {
    379                     presetClasification.classification += presetClasification.favoriteIndex;
    380                     result.add(presetClasification);
    381                 }
    382             }
     354                    continue;
     355                }
     356            }
     357
     358            if (groupWords != null && presetClassification.isMatchingGroup(groupWords) == 0) {
     359                continue;
     360            }
     361
     362            int matchName = presetClassification.isMatchingName(nameWords);
     363
     364            if (matchName == 0) {
     365                if (groupWords == null) {
     366                    int groupMatch = presetClassification.isMatchingGroup(nameWords);
     367                    if (groupMatch > 0) {
     368                        presetClassification.classification = CLASSIFICATION_GROUP_MATCH + groupMatch;
     369                    }
     370                }
     371                if (presetClassification.classification == 0 && inTags) {
     372                    int tagsMatch = presetClassification.isMatchingTags(nameWords);
     373                    if (tagsMatch > 0) {
     374                        presetClassification.classification = CLASSIFICATION_TAGS_MATCH + tagsMatch;
     375                    }
     376                }
     377            } else {
     378                presetClassification.classification = CLASSIFICATION_NAME_MATCH + matchName;
     379            }
     380
     381            if (presetClassification.classification > 0) {
     382                presetClassification.classification += presetClassification.favoriteIndex;
     383                result.add(presetClassification);
     384            }
     385        }
    383386
    384387        Collections.sort(result);
Note: See TracChangeset for help on using the changeset viewer.