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}