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;
023    protected ConcatenatingJList list;
024
025    @Override
026    protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
027        list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[0]));
028        component = list;
029        ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
030        list.setCellRenderer(renderer);
031
032        if (usage.hasUniqueValue() && !usage.unused()) {
033            originalValue = usage.getFirst();
034            list.setSelectedItem(originalValue);
035        } else if (def != null && !usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
036            originalValue = DIFFERENT;
037            list.setSelectedItem(def);
038        } else if (usage.unused()) {
039            originalValue = null;
040            list.setSelectedItem(originalValue);
041        } else {
042            originalValue = DIFFERENT;
043            list.setSelectedItem(originalValue);
044        }
045
046        JScrollPane sp = new JScrollPane(list);
047        // if a number of rows has been specified in the preset,
048        // modify preferred height of scroll pane to match that row count.
049        if (rows != null) {
050            double height = renderer.getListCellRendererComponent(list,
051                    new PresetListEntry("x"), 0, false, false).getPreferredSize().getHeight() * Integer.parseInt(rows);
052            sp.setPreferredSize(new Dimension((int) sp.getPreferredSize().getWidth(), (int) height));
053        }
054        p.add(sp, GBC.eol().fill(GBC.HORIZONTAL));
055    }
056
057    @Override
058    protected Object getSelectedItem() {
059        return list.getSelectedItem();
060    }
061
062    @Override
063    public void addCommands(List<Tag> changedTags) {
064        // Do not create any commands if list has been disabled because of an unknown value (fix #8605)
065        if (list.isEnabled()) {
066            super.addCommands(changedTags);
067        }
068    }
069}