001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.tagging.presets.items;
003
004import java.awt.Dimension;
005import java.util.List;
006
007import javax.swing.JPanel;
008import javax.swing.JScrollPane;
009import javax.swing.ListCellRenderer;
010
011import org.openstreetmap.josm.data.osm.Tag;
012import org.openstreetmap.josm.tools.GBC;
013
014/**
015 * Multi-select list type.
016 */
017public class MultiSelect extends ComboMultiSelect {
018
019    /**
020     * Number of rows to display (positive integer, optional).
021     */
022    public String rows; // NOSONAR
023
024    protected ConcatenatingJList list;
025
026    @Override
027    protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
028        list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[0]));
029        component = list;
030        ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
031        list.setCellRenderer(renderer);
032
033        if (usage.hasUniqueValue() && !usage.unused()) {
034            originalValue = usage.getFirst();
035            list.setSelectedItem(originalValue);
036        } else if (def != null && !usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
037            originalValue = DIFFERENT;
038            list.setSelectedItem(def);
039        } else if (usage.unused()) {
040            originalValue = null;
041            list.setSelectedItem(originalValue);
042        } else {
043            originalValue = DIFFERENT;
044            list.setSelectedItem(originalValue);
045        }
046
047        JScrollPane sp = new JScrollPane(list);
048        // if a number of rows has been specified in the preset,
049        // modify preferred height of scroll pane to match that row count.
050        if (rows != null) {
051            double height = renderer.getListCellRendererComponent(list,
052                    new PresetListEntry("x"), 0, false, false).getPreferredSize().getHeight() * Integer.parseInt(rows);
053            sp.setPreferredSize(new Dimension((int) sp.getPreferredSize().getWidth(), (int) height));
054        }
055        p.add(sp, GBC.eol().fill(GBC.HORIZONTAL));
056    }
057
058    @Override
059    protected Object getSelectedItem() {
060        return list.getSelectedItem();
061    }
062
063    @Override
064    public void addCommands(List<Tag> changedTags) {
065        // Do not create any commands if list has been disabled because of an unknown value (fix #8605)
066        if (list.isEnabled()) {
067            super.addCommands(changedTags);
068        }
069    }
070}