Changeset 7412 in josm


Ignore:
Timestamp:
2014-08-16T03:15:37+02:00 (10 years ago)
Author:
Don-vip
Message:

see #9645 - fix handling of selection in TaggingPresetSelector

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java

    r7324 r7412  
    1616import java.awt.event.MouseEvent;
    1717import java.util.ArrayList;
     18import java.util.Arrays;
    1819import java.util.Collection;
    1920import java.util.Collections;
     
    2223import java.util.Iterator;
    2324import java.util.List;
     25import java.util.Objects;
    2426
    2527import javax.swing.AbstractAction;
     
    6971    private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
    7072
    71     private JosmTextField edSearchText;
    72     private JList<TaggingPreset> lsResult;
    73     private JCheckBox ckOnlyApplicable;
    74     private JCheckBox ckSearchInTags;
     73    private final JosmTextField edSearchText;
     74    private final JList<TaggingPreset> lsResult;
     75    private final JCheckBox ckOnlyApplicable;
     76    private final JCheckBox ckSearchInTags;
    7577    private final EnumSet<TaggingPresetType> typesInSelection = EnumSet.noneOf(TaggingPresetType.class);
    7678    private boolean typesInSelectionDirty = true;
    7779    private final PresetClassifications classifications = new PresetClassifications();
    78     private ResultListModel lsResultModel = new ResultListModel();
     80    private final ResultListModel lsResultModel = new ResultListModel();
     81
     82    private final List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
    7983
    8084    private ActionListener dblClickListener;
     
    96100        private List<PresetClassification> presets = new ArrayList<>();
    97101
    98         public void setPresets(List<PresetClassification> presets) {
     102        public synchronized void setPresets(List<PresetClassification> presets) {
    99103            this.presets = presets;
    100104            fireContentsChanged(this, 0, Integer.MAX_VALUE);
    101105        }
    102106
    103         public List<PresetClassification> getPresets() {
    104             return presets;
    105         }
    106 
    107107        @Override
    108         public TaggingPreset getElementAt(int index) {
     108        public synchronized TaggingPreset getElementAt(int index) {
    109109            return presets.get(index).preset;
    110110        }
    111111
    112112        @Override
    113         public int getSize() {
     113        public synchronized int getSize() {
    114114            return presets.size();
     115        }
     116
     117        public synchronized boolean isEmpty() {
     118            return presets.isEmpty();
    115119        }
    116120    }
     
    246250        add(edSearchText, BorderLayout.NORTH);
    247251
    248         lsResult = new JList<>();
    249         lsResult.setModel(lsResultModel);
     252        lsResult = new JList<>(lsResultModel);
    250253        lsResult.setCellRenderer(new ResultListCellRenderer());
    251254        lsResult.addMouseListener(new MouseAdapter() {
     
    276279                }
    277280            });
     281        } else {
     282            ckOnlyApplicable = null;
    278283        }
    279284
     
    289294            });
    290295            pnChecks.add(ckSearchInTags);
     296        } else {
     297            ckSearchInTags = null;
    291298        }
    292299
     
    306313    }
    307314
    308     private void selectPreset(int newIndex) {
     315    private synchronized void selectPreset(int newIndex) {
    309316        if (newIndex < 0) {
    310317            newIndex = 0;
     
    320327     * Search expression can be in form: "group1/group2/name" where names can contain multiple words
    321328     */
    322     private void filterPresets() {
     329    private synchronized void filterPresets() {
    323330        //TODO Save favorites to file
    324331        String text = edSearchText.getText().toLowerCase();
     
    331338                text, onlyApplicable, inTags, getTypesInSelection(), selected);
    332339
     340        TaggingPreset oldPreset = getSelectedPreset();
    333341        lsResultModel.setPresets(result);
    334 
     342        TaggingPreset newPreset = getSelectedPreset();
     343        if (!Objects.equals(oldPreset, newPreset)) {
     344            int[] indices = lsResult.getSelectedIndices();
     345            System.out.println(newPreset + " / "+Arrays.toString(indices));
     346            for (ListSelectionListener listener : listSelectionListeners) {
     347                listener.valueChanged(new ListSelectionEvent(lsResult, lsResult.getSelectedIndex(),
     348                        indices.length > 0 ? indices[indices.length-1] : -1, false));
     349            }
     350        }
    335351    }
    336352
     
    456472    }
    457473
    458     public void init() {
     474    public synchronized void init() {
    459475        if (ckOnlyApplicable != null) {
    460476            ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
    461477            ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
    462478        }
     479        listSelectionListeners.clear();
    463480        edSearchText.setText("");
    464481        filterPresets();
     
    471488    }
    472489
    473     public void clearSelection() {
     490    public synchronized void clearSelection() {
    474491        lsResult.getSelectionModel().clearSelection();
    475492    }
     
    491508     * @return selected preset (as action)
    492509     */
    493     public TaggingPreset getSelectedPreset() {
    494         List<PresetClassification> presets = lsResultModel.getPresets();
    495         if (presets.isEmpty()) return null;
     510    public synchronized TaggingPreset getSelectedPreset() {
     511        if (lsResultModel.isEmpty()) return null;
    496512        int idx = lsResult.getSelectedIndex();
    497         if (idx == -1) {
     513        if (idx < 0 || idx >= lsResultModel.getSize()) {
    498514            idx = 0;
    499515        }
    500         TaggingPreset preset = presets.get(idx).preset;
     516        TaggingPreset preset = lsResultModel.getElementAt(idx);
    501517        for (PresetClassification pc: classifications) {
    502518            if (pc.preset == preset) {
     
    509525    }
    510526
    511     public void setSelectedPreset(TaggingPreset p) {
     527    public synchronized void setSelectedPreset(TaggingPreset p) {
    512528        lsResult.setSelectedValue(p, true);
    513529    }
    514530
    515     public int getItemCount() {
     531    public synchronized int getItemCount() {
    516532        return lsResultModel.getSize();
    517533    }
     
    525541    }
    526542
    527     public void addSelectionListener(final ActionListener selectListener) {
    528         lsResult.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    529             @Override
    530             public void valueChanged(ListSelectionEvent e) {
    531                 if (!e.getValueIsAdjusting())
    532                     selectListener.actionPerformed(null);
    533             }
    534         });
     543    /**
     544     * Adds a selection listener to the presets list.
     545     * @param selectListener The list selection listener
     546     * @since 7412
     547     */
     548    public synchronized void addSelectionListener(ListSelectionListener selectListener) {
     549        lsResult.getSelectionModel().addListSelectionListener(selectListener);
     550        listSelectionListeners.add(selectListener);
     551    }
     552
     553    /**
     554     * Removes a selection listener from the presets list.
     555     * @param selectListener The list selection listener
     556     * @since 7412
     557     */
     558    public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
     559        listSelectionListeners.remove(selectListener);
     560        lsResult.getSelectionModel().removeListSelectionListener(selectListener);
    535561    }
    536562}
Note: See TracChangeset for help on using the changeset viewer.