// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.tagging.presets.items;
import java.awt.Dimension;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import org.openstreetmap.josm.data.osm.Tag;
import org.openstreetmap.josm.tools.GBC;
/**
* Multi-select list type.
*/
public class MultiSelect extends ComboMultiSelect {
/**
* Number of rows to display (positive integer, optional).
*/
public String rows; // NOSONAR
protected ConcatenatingJList list;
@Override
protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[lhm.size()]));
component = list;
ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
list.setCellRenderer(renderer);
if (usage.hasUniqueValue() && !usage.unused()) {
originalValue = usage.getFirst();
list.setSelectedItem(originalValue);
} else if ((def != null && !usage.hadKeys()) || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
originalValue = DIFFERENT;
list.setSelectedItem(def);
} else if (usage.unused()) {
originalValue = null;
list.setSelectedItem(originalValue);
} else {
originalValue = DIFFERENT;
list.setSelectedItem(originalValue);
}
JScrollPane sp = new JScrollPane(list);
// if a number of rows has been specified in the preset,
// modify preferred height of scroll pane to match that row count.
if (rows != null) {
double height = renderer.getListCellRendererComponent(list,
new PresetListEntry("x"), 0, false, false).getPreferredSize().getHeight() * Integer.parseInt(rows);
sp.setPreferredSize(new Dimension((int) sp.getPreferredSize().getWidth(), (int) height));
}
p.add(sp, GBC.eol().fill(GBC.HORIZONTAL));
}
@Override
protected Object getSelectedItem() {
return list.getSelectedItem();
}
@Override
public void addCommands(List<Tag> changedTags) {
// Do not create any commands if list has been disabled because of an unknown value (fix #8605)
if (list.isEnabled()) {
super.addCommands(changedTags);
}
}
}