Changeset 16057 in josm


Ignore:
Timestamp:
2020-03-07T15:27:23+01:00 (5 years ago)
Author:
simon04
Message:

see #18864 - ComboMultiSelect: use array-based set for storing PresetListEntry

Reduces retained size of TaggingPreset from 1_633_288 to 1_468_680 (de).

Location:
trunk/src/org/openstreetmap/josm/gui/tagging/presets/items
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java

    r16045 r16057  
    3737        if (!usage.unused()) {
    3838            for (String s : usage.values) {
    39                 if (!lhm.containsKey(s)) {
    40                     lhm.put(s, new PresetListEntry(s));
    41                 }
     39                presetListEntries.add(new PresetListEntry(s));
    4240            }
    4341        }
    44         if (def != null && !lhm.containsKey(def)) {
    45             lhm.put(def, new PresetListEntry(def));
     42        if (def != null) {
     43            presetListEntries.add(new PresetListEntry(def));
    4644        }
    47         if (!lhm.containsKey("")) {
    48             lhm.put("", new PresetListEntry(""));
    49         }
     45        presetListEntries.add(new PresetListEntry(""));
    5046
    51         combobox = new JosmComboBox<>(lhm.values().toArray(new PresetListEntry[lhm.size()]));
     47        combobox = new JosmComboBox<>(presetListEntries.toArray(new PresetListEntry[0]));
    5248        component = combobox;
    5349        combobox.setRenderer(getListCellRenderer());
    5450        combobox.setEditable(editable);
    55         combobox.reinitialize(lhm.values());
     51        combobox.reinitialize(presetListEntries);
    5652        AutoCompletingTextField tf = new AutoCompletingTextField();
    5753        initAutoCompletionField(tf, key);
     
    7066        if (usage.hasUniqueValue()) {
    7167            // all items have the same value (and there were no unset items)
    72             originalValue = lhm.get(usage.getFirst());
     68            originalValue = getListEntry(usage.getFirst());
    7369            combobox.setSelectedItem(originalValue);
    7470        } else if (def != null && usage.unused()) {
     
    7672            if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || isForceUseLastAsDefault()) {
    7773                // selected osm primitives are untagged or filling default feature is enabled
    78                 combobox.setSelectedItem(lhm.get(def).getDisplayValue(true));
     74                combobox.setSelectedItem(getListEntry(def).getDisplayValue());
    7975            } else {
    8076                // selected osm primitives are tagged and filling default feature is disabled
    8177                combobox.setSelectedItem("");
    8278            }
    83             originalValue = lhm.get(DIFFERENT);
     79            originalValue = getListEntry(DIFFERENT);
    8480        } else if (usage.unused()) {
    8581            // all items were unset (and so is default)
    86             originalValue = lhm.get("");
     82            originalValue = getListEntry("");
    8783            if (!presetInitiallyMatches && isForceUseLastAsDefault() && LAST_VALUES.containsKey(key)) {
    88                 combobox.setSelectedItem(lhm.get(LAST_VALUES.get(key)));
     84                combobox.setSelectedItem(getListEntry(LAST_VALUES.get(key)));
    8985            } else {
    9086                combobox.setSelectedItem(originalValue);
    9187            }
    9288        } else {
    93             originalValue = lhm.get(DIFFERENT);
     89            originalValue = getListEntry(DIFFERENT);
    9490            combobox.setSelectedItem(originalValue);
    9591        }
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java

    r16053 r16057  
    1414import java.util.Collection;
    1515import java.util.Collections;
    16 import java.util.LinkedHashMap;
    1716import java.util.List;
    18 import java.util.Map;
    19 import java.util.Map.Entry;
     17import java.util.Objects;
    2018import java.util.Set;
    2119import java.util.TreeSet;
     20import java.util.concurrent.CopyOnWriteArraySet;
    2221import java.util.stream.Collectors;
    2322
     
    9897
    9998    protected JComponent component;
    100     protected final Map<String, PresetListEntry> lhm = new LinkedHashMap<>();
     99    protected final Set<PresetListEntry> presetListEntries = new CopyOnWriteArraySet<>();
    101100    private boolean initialized;
    102101    protected Usage usage;
     
    253252                return "<b>" + Utils.escapeReservedCharactersHTML(DIFFERENT) + "</b>";
    254253
    255             String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue(true));
     254            String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue());
    256255            String shortDescription = getShortDescription(true);
    257256
     
    279278        /**
    280279         * Returns the value to display.
    281          * @param translated whether the text must be translated
    282280         * @return the value to display
    283281         */
    284         public String getDisplayValue(boolean translated) {
    285             return translated
    286                     ? Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value))
    287                             : Utils.firstNonNull(display_value, value);
     282        public String getDisplayValue() {
     283            return Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value));
    288284        }
    289285
     
    304300            if (DIFFERENT.equals(value))
    305301                return DIFFERENT;
    306             String displayValue = getDisplayValue(true);
     302            String displayValue = getDisplayValue();
    307303            return displayValue != null ? displayValue.replaceAll("<.*>", "") : ""; // remove additional markup, e.g. <br>
     304        }
     305
     306        @Override
     307        public boolean equals(Object o) {
     308            if (this == o) return true;
     309            if (o == null || getClass() != o.getClass()) return false;
     310            PresetListEntry that = (PresetListEntry) o;
     311            return Objects.equals(value, that.value);
     312        }
     313
     314        @Override
     315        public int hashCode() {
     316            return Objects.hash(value);
    308317        }
    309318
    310319        @Override
    311320        public int compareTo(PresetListEntry o) {
    312             return AlphanumComparator.getInstance().compare(this.getDisplayValue(true), o.getDisplayValue(true));
     321            return AlphanumComparator.getInstance().compare(this.getDisplayValue(), o.getDisplayValue());
    313322        }
    314323    }
     
    355364    public Collection<String> getValues() {
    356365        initListEntries();
    357         return lhm.keySet();
     366        return presetListEntries.stream().map(x -> x.value).collect(Collectors.toSet());
    358367    }
    359368
     
    364373    public Collection<String> getDisplayValues() {
    365374        initListEntries();
    366         return lhm.values().stream().map(x -> x.getDisplayValue(true)).collect(Collectors.toList());
     375        return presetListEntries.stream().map(PresetListEntry::getDisplayValue).collect(Collectors.toList());
    367376    }
    368377
     
    374383        usage = determineTextUsage(sel, key);
    375384        if (!usage.hasUniqueValue() && !usage.unused()) {
    376             lhm.put(DIFFERENT, new PresetListEntry(DIFFERENT));
     385            presetListEntries.add(new PresetListEntry(DIFFERENT));
    377386        }
    378387
     
    389398    private void initListEntries() {
    390399        if (initialized) {
    391             lhm.remove(DIFFERENT); // possibly added in #addToPanel
     400            presetListEntries.remove(new PresetListEntry(DIFFERENT)); // possibly added in #addToPanel
    392401            return;
    393         } else if (lhm.isEmpty()) {
     402        } else if (presetListEntries.isEmpty()) {
    394403            initListEntriesFromAttributes();
    395404        } else {
     
    409418                        key, text, "short_descriptions", "list_entry"));
    410419            }
    411             for (PresetListEntry e : lhm.values()) {
     420            for (PresetListEntry e : presetListEntries) {
    412421                if (e.value_context == null) {
    413422                    e.value_context = values_context;
     
    493502        }
    494503
    495         for (PresetListEntry i : entries) {
    496             lhm.put(i.value, i);
    497         }
     504        addListEntries(entries);
    498505    }
    499506
     
    509516
    510517        if (display != null) {
    511             for (Entry<String, PresetListEntry> entry : lhm.entrySet()) {
    512                 String k = entry.getValue().toString();
     518            for (PresetListEntry entry : presetListEntries) {
     519                String k = entry.toString();
    513520                if (k.equals(display)) {
    514                     value = entry.getKey();
     521                    value = entry.value;
    515522                    break;
    516523                }
     
    560567     */
    561568    public void addListEntry(PresetListEntry e) {
    562         lhm.put(e.value, e);
     569        presetListEntries.add(e);
    563570    }
    564571
     
    573580    }
    574581
     582    protected PresetListEntry getListEntry(String value) {
     583        return presetListEntries.stream().filter(e -> Objects.equals(e.value, value)).findFirst().orElse(null);
     584    }
     585
    575586    protected ListCellRenderer<PresetListEntry> getListCellRenderer() {
    576587        return RENDERER;
  • trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java

    r16045 r16057  
    2626    @Override
    2727    protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
    28         list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[lhm.size()]));
     28        list = new ConcatenatingJList(delimiter, presetListEntries.toArray(new PresetListEntry[0]));
    2929        component = list;
    3030        ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
Note: See TracChangeset for help on using the changeset viewer.