// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.tageditor.tagspec.ui; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.table.AbstractTableModel; import org.openstreetmap.josm.data.osm.Tag; import org.openstreetmap.josm.plugins.tageditor.tagspec.TagSpecifications; public class TagsTableModel extends AbstractTableModel { private static Logger logger = Logger.getLogger(TagsTableModel.class.getName()); private ArrayList<Tag> items = null; private ArrayList<Tag> visibleItems = null; public TagsTableModel() { items = new ArrayList<>(); visibleItems = new ArrayList<>(); } protected void sort() { Collections.sort( items, new Comparator<Tag>() { @Override public int compare(Tag self, Tag other) { int ret = self.getKey().compareToIgnoreCase(other.getKey()); if (ret == 0) return self.getValue().compareToIgnoreCase(other.getValue()); else return ret; } } ); } protected void clear() { items.clear(); visibleItems.clear(); } public void initFromTagSpecifications() { clear(); TagSpecifications spec; try { spec = TagSpecifications.getInstance(); } catch (Exception e) { logger.log(Level.SEVERE, "failed to init TagTableModel. Exception:" + e); return; } items = spec.asList(); sort(); for (Tag item : items) { visibleItems.add(item); } } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return visibleItems.size(); } @Override public Object getValueAt(int row, int col) { Tag pair = visibleItems.get(row); switch(col) { case 0: return pair.getKey(); case 1: return pair.getValue(); default: /* should not happen */ throw new IllegalArgumentException(tr("unexpected column number {0}", col)); } } public void filter(String filter) { synchronized (this) { if (filter == null || filter.trim().equals("")) { visibleItems.clear(); for (Tag pair: items) { visibleItems.add(pair); } } else { visibleItems.clear(); filter = filter.toLowerCase(); for (Tag pair: items) { if (pair.getKey().toLowerCase().trim().startsWith(filter) || pair.getValue().toLowerCase().trim().startsWith(filter)) { visibleItems.add(pair); } } } fireTableDataChanged(); fireTableStructureChanged(); } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public Tag getVisibleItem(int row) { if (row < 0 || row >= visibleItems.size()) throw new IndexOutOfBoundsException("row is out of bound: row=" + row); return visibleItems.get(row); } }