Ticket #14923: preset-search-v2.patch

File preset-search-v2.patch, 5.7 KB (added by bafonins, 4 months ago)

Refactored the code a bit

  • src/org/openstreetmap/josm/actions/search/SearchAction.java

     
    454454                .addKeyword("type:node", "type:node ", tr("all nodes"))
    455455                .addKeyword("type:way", "type:way ", tr("all ways"))
    456456                .addKeyword("type:relation", "type:relation ", tr("all relations"))
     457                .addKeyword("preset:water", "preset:water", tr("all objects that use the water preset"))
     458                .addKeyword("preset:\"fast food\"", "preset:\"fast food\"", tr("all objects that use the fast food preset"))
    457459                .addKeyword("closed", "closed ", tr("all closed ways"))
    458460                .addKeyword("untagged", "untagged ", tr("object without useful tags")),
    459461                GBC.eol());
     
    888890    public List<ActionParameter<?>> getActionParameters() {
    889891        return Collections.<ActionParameter<?>>singletonList(new SearchSettingsActionParameter(SEARCH_EXPRESSION));
    890892    }
    891 }
     893}
     894 No newline at end of file
  • src/org/openstreetmap/josm/actions/search/SearchCompiler.java

     
    2020import java.util.regex.Matcher;
    2121import java.util.regex.Pattern;
    2222import java.util.regex.PatternSyntaxException;
     23import java.util.stream.Collectors;
     24import java.util.Objects;
    2325
    2426import org.openstreetmap.josm.Main;
    2527import org.openstreetmap.josm.actions.search.PushbackTokenizer.Range;
     
    3840import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
    3941import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
    4042import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
     43import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
     44import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
    4145import org.openstreetmap.josm.tools.AlphanumComparator;
    4246import org.openstreetmap.josm.tools.Geometry;
    4347import org.openstreetmap.josm.tools.UncheckedParseException;
     
    115119        private final Collection<String> keywords = Arrays.asList("id", "version", "type", "user", "role",
    116120                "changeset", "nodes", "ways", "tags", "areasize", "waylength", "modified", "deleted", "selected",
    117121                "incomplete", "untagged", "closed", "new", "indownloadedarea",
    118                 "allindownloadedarea", "inview", "allinview", "timestamp", "nth", "nth%", "hasRole");
     122                "allindownloadedarea", "inview", "allinview", "timestamp", "nth", "nth%", "hasRole", "preset");
    119123
    120124        @Override
    121125        public Match get(String keyword, PushbackTokenizer tokenizer) throws ParseError {
     
    151155                        return new Version(tokenizer);
    152156                    case "type":
    153157                        return new ExactType(tokenizer.readTextOrNumber());
     158                    case "preset":
     159                        return new Preset(tokenizer.readTextOrNumber());
    154160                    case "user":
    155161                        return new UserMatch(tokenizer.readTextOrNumber());
    156162                    case "role":
     
    15541560        }
    15551561    }
    15561562
     1563    /**
     1564     * Matches presets.
     1565     */
     1566    private static class Preset extends Match {
     1567        private List<TaggingPreset> presets;
     1568
     1569        Preset(String presetName) throws ParseError {
     1570
     1571            Objects.requireNonNull(presetName);
     1572
     1573            this.presets = TaggingPresets.getTaggingPresets()
     1574                    .stream()
     1575                    .filter(preset -> presetName.equalsIgnoreCase(preset.getSimpleName()))
     1576                    .collect(Collectors.toList());
     1577
     1578            if (this.presets.isEmpty()) {
     1579                throw new ParseError(tr("Unknown preset name: ") + presetName);
     1580            }
     1581        }
     1582
     1583        /**
     1584         * Since presets can have common names, the primitive is considered to
     1585         * belong to a certain preset if it matches at least one of them.
     1586         */
     1587        @Override
     1588        public boolean match(OsmPrimitive osm) {
     1589            for (TaggingPreset p : this.presets) {
     1590                if (p.test(osm)) {
     1591                    return true;
     1592                }
     1593            }
     1594
     1595            return false;
     1596        }
     1597    }
     1598
    15571599    public static class ParseError extends Exception {
    15581600        public ParseError(String msg) {
    15591601            super(msg);
     
    18031845            return forKey + '"' + escapeStringForSearch(value) + '"';
    18041846        }
    18051847    }
    1806 }
     1848}
     1849 No newline at end of file
  • src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java

     
    173173    }
    174174
    175175    /**
     176     * Returns the non translated name without any prefixes.
     177     * @return returns the non translated name without any prefixes.
     178     */
     179    public String getSimpleName() {
     180        return this.name;
     181    }
     182
     183    /**
    176184     * Returns the preset icon (16px).
    177185     * @return The preset icon, or {@code null} if none defined
    178186     * @since 6403
     
    634642        ToolbarPreferences.ActionParser actionParser = new ToolbarPreferences.ActionParser(null);
    635643        return actionParser.saveAction(new ToolbarPreferences.ActionDefinition(this));
    636644    }
    637 }
     645}
     646 No newline at end of file