Changeset 18221 in josm for trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
- Timestamp:
- 2021-09-13T00:41:53+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
r17651 r18221 6 6 import java.awt.Color; 7 7 import java.awt.Cursor; 8 import java.awt.Insets; 8 9 import java.awt.event.ActionEvent; 9 10 import java.awt.event.ActionListener; 11 import java.awt.event.ComponentAdapter; 12 import java.awt.event.ComponentEvent; 13 import java.util.Arrays; 14 import java.util.Comparator; 10 15 11 16 import javax.swing.AbstractAction; 12 17 import javax.swing.JButton; 13 18 import javax.swing.JColorChooser; 19 import javax.swing.JComponent; 14 20 import javax.swing.JPanel; 15 21 22 import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem; 16 23 import org.openstreetmap.josm.data.tagging.ac.AutoCompletionPriority; 17 24 import org.openstreetmap.josm.gui.MainApplication; 18 25 import org.openstreetmap.josm.gui.mappaint.mapcss.CSSColors; 19 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 20 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 26 import org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxEditor; 27 import org.openstreetmap.josm.gui.tagging.ac.AutoCompComboBoxModel; 28 import org.openstreetmap.josm.gui.tagging.ac.AutoCompTextField; 21 29 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem; 22 30 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport; … … 36 44 public boolean editable = true; // NOSONAR 37 45 /** The length of the combo box (number of characters allowed). */ 38 public short length; // NOSONAR46 public int length; // NOSONAR 39 47 40 48 protected JosmComboBox<PresetListEntry> combobox; 49 protected AutoCompComboBoxModel<PresetListEntry> dropDownModel; 50 protected AutoCompComboBoxModel<AutoCompletionItem> autoCompModel; 51 52 class ComponentListener extends ComponentAdapter { 53 @Override 54 public void componentResized(ComponentEvent e) { 55 // Make multi-line JLabels the correct size 56 // Only needed if there is any short_description 57 JComponent component = (JComponent) e.getSource(); 58 int width = component.getWidth(); 59 if (width == 0) 60 width = 200; 61 Insets insets = component.getInsets(); 62 width -= insets.left + insets.right + 10; 63 ComboMultiSelectListCellRenderer renderer = (ComboMultiSelectListCellRenderer) combobox.getRenderer(); 64 renderer.setWidth(width); 65 combobox.setRenderer(null); // needed to make prop change fire 66 combobox.setRenderer(renderer); 67 } 68 } 41 69 42 70 /** … … 48 76 49 77 @Override 50 protected voidaddToPanelAnchor(JPanel p, String def, TaggingPresetItemGuiSupport support) {78 protected JComponent addToPanelAnchor(JPanel p, String def, TaggingPresetItemGuiSupport support) { 51 79 if (!usage.unused()) { 52 80 for (String s : usage.values) { … … 59 87 presetListEntries.add(new PresetListEntry("")); 60 88 61 combobox = new JosmComboBox<>(presetListEntries.toArray(new PresetListEntry[0])); 62 component = combobox; 63 combobox.setRenderer(getListCellRenderer()); 64 combobox.setEditable(true); // fix incorrect height, see #6157 65 combobox.reinitialize(presetListEntries); 66 combobox.setEditable(editable); // see #6157 67 AutoCompletingTextField tf = new AutoCompletingTextField(); 68 initAutoCompletionField(tf, key); 89 dropDownModel = new AutoCompComboBoxModel<PresetListEntry>(Comparator.naturalOrder()); 90 autoCompModel = new AutoCompComboBoxModel<AutoCompletionItem>(Comparator.naturalOrder()); 91 presetListEntries.forEach(dropDownModel::addElement); 92 93 combobox = new JosmComboBox<>(dropDownModel); 94 AutoCompComboBoxEditor<AutoCompletionItem> editor = new AutoCompComboBoxEditor<>(); 95 combobox.setEditor(editor); 96 97 // The default behaviour of JComboBox is to size the editor according to the tallest item in 98 // the dropdown list. We don't want that to happen because we want to show taller items in 99 // the list than in the editor. We can't use 100 // {@code combobox.setPrototypeDisplayValue(new PresetListEntry(" "));} because that would 101 // set a fixed cell height in JList. 102 combobox.setPreferredHeight(combobox.getPreferredSize().height); 103 104 // a custom cell renderer capable of displaying a short description text along with the 105 // value 106 combobox.setRenderer(new ComboMultiSelectListCellRenderer(combobox, combobox.getRenderer(), 200, key)); 107 combobox.setEditable(editable); 108 109 getAllForKeys(Arrays.asList(key)).forEach(autoCompModel::addElement); 110 getDisplayValues().forEach(s -> autoCompModel.addElement(new AutoCompletionItem(s, AutoCompletionPriority.IS_IN_STANDARD))); 111 112 AutoCompTextField<AutoCompletionItem> tf = editor.getEditorComponent(); 113 tf.setModel(autoCompModel); 114 69 115 if (TaggingPresetItem.DISPLAY_KEYS_AS_HINT.get()) { 70 tf.setHint(key);116 combobox.setHint(key); 71 117 } 72 118 if (length > 0) { 73 tf.setMax Chars((int)length);119 tf.setMaxTextLength(length); 74 120 } 75 AutoCompletionList acList = tf.getAutoCompletionList();76 if (acList != null) {77 acList.add(getDisplayValues(), AutoCompletionPriority.IS_IN_STANDARD);78 }79 combobox.setEditor(tf);80 combobox.setSelectedItem(getItemToSelect(def, support, false));81 121 82 122 if (key != null && ("colour".equals(key) || key.startsWith("colour:") || key.endsWith(":colour"))) { … … 93 133 p.add(combobox, GBC.eol().fill(GBC.HORIZONTAL)); 94 134 } 135 136 Object itemToSelect = getItemToSelect(default_, support, false); 137 combobox.setSelectedItemText(itemToSelect == null ? null : itemToSelect.toString()); 95 138 combobox.addActionListener(l -> support.fireItemValueModified(this, key, getSelectedValue())); 139 combobox.addComponentListener(new ComponentListener()); 140 return combobox; 96 141 } 97 142
Note:
See TracChangeset
for help on using the changeset viewer.