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}