// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.tageditor.preset.ui;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
public class PresetsTableModel extends AbstractTableModel {
//private static final Logger logger = Logger.getLogger(PresetsTableModel.class.getName());
private final ArrayList<TableModelListener> listeners = new ArrayList<>();
private final ArrayList<TaggingPreset> items = new ArrayList<>();
private final ArrayList<TaggingPreset> visibleItems = new ArrayList<>();
protected void initModelFromPresets(Collection<TaggingPreset> presets) {
items.clear();
visibleItems.clear();
items.addAll(presets);
visibleItems.addAll(presets);
}
public PresetsTableModel() {
}
public Collection<TaggingPreset> getPresets() {
return items;
}
public void setPresets(Collection<TaggingPreset> presets) {
initModelFromPresets(presets);
fireTableDataChanged();
}
@Override
public void addTableModelListener(TableModelListener l) {
synchronized (listeners) {
if (l == null)
return;
if (!listeners.contains(l)) {
listeners.add(l);
}
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return visibleItems.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
TaggingPreset item = visibleItems.get(rowIndex);
switch(columnIndex) {
case 0: return item.group;
case 1: return item;
default: return "unknown";
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public void removeTableModelListener(TableModelListener l) {
synchronized (listeners) {
if (listeners.contains(l)) {
listeners.remove(l);
}
}
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
// do nothing. No editing allowed
}
public TaggingPreset getVisibleItem(int idx) {
if (idx < 0 || idx >= this.visibleItems.size())
throw new IndexOutOfBoundsException("index out of bounds. idx=" + idx);
return visibleItems.get(idx);
}
public void filter(String filter) {
synchronized (this) {
if (filter == null || filter.trim().equals("")) {
visibleItems.clear();
for (TaggingPreset item: items) {
visibleItems.add(item);
}
} else {
visibleItems.clear();
filter = filter.toLowerCase();
for (TaggingPreset item: items) {
if ((item.getName() != null && item.getName().toLowerCase().trim().contains(filter))
|| (item.group != null && item.group.getName() != null && item.group.getName().toLowerCase().trim().contains(filter))) {
visibleItems.add(item);
}
}
}
fireTableDataChanged();
fireTableStructureChanged();
}
}
}