package org.openstreetmap.josm.plugins.rasterfilters.preferences; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.List; import javax.json.JsonObject; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.EmptyBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane; import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting; import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting; import org.openstreetmap.josm.gui.preferences.map.MapPreference; import org.openstreetmap.josm.tools.GBC; /** * This class draws subtab 'Image Filters' in the Preferences menu. * * @author Nipel-Crumple */ public class RasterFiltersPreferences implements SubPreferenceSetting { private FiltersDownloader downloader = new FiltersDownloader(); AbstractTableModel model; JPanel holder; @Override public void addGui(PreferenceTabbedPane gui) { model = new FiltersTableModel(); if (holder == null) { holder = new JPanel(); holder.setLayout(new GridBagLayout()); holder.setBorder(new EmptyBorder(10, 10, 10, 10)); model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int col = e.getColumn(); TableModel model = (TableModel) e.getSource(); Boolean isDownloadedUpdate = (Boolean) model.getValueAt( row, col); List<FilterInfo> filtersList = ((FiltersTableModel) model).filtersInfoList; filtersList.get(row).setNeedToDownload(isDownloadedUpdate); } }); JTable table = new JTable(model); table.getTableHeader().setReorderingAllowed(false); table.getColumnModel().getColumn(3).setMaxWidth(20); JScrollPane pane = new JScrollPane(table); holder.add(pane, GBC.eol().fill(GBC.BOTH)); GridBagConstraints c = GBC.eol(); c.anchor = GBC.EAST; JButton download = new JButton("Download"); download.addActionListener(downloader); holder.add(download, c); } MapPreference pref = gui.getMapPreference(); pref.addSubTab(this, "Image Filters", holder); } @Override public boolean ok() { List<FilterInfo> filtersInfoList = ((FiltersTableModel) model).getFiltersInfoList(); for (FilterInfo temp : filtersInfoList) { JsonObject meta = temp.getMeta(); String paramName = meta.getString("name"); paramName = "rasterfilters." + paramName; Main.pref.put(paramName, temp.isNeedToDownload()); } return false; } @Override public boolean isExpert() { // TODO Auto-generated method stub return false; } @Override public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) { return gui.getMapPreference(); } static class FiltersTableModel extends AbstractTableModel { String[] columnNames = {"Filter Name", "Author", "Description", ""}; Class<?>[] columnClasses = {String.class, String.class, String.class, Boolean.class}; List<FilterInfo> filtersInfoList; Object[][] data; FiltersTableModel() { filtersInfoList = FiltersDownloader.downloadFiltersInfoList(); data = new Object[filtersInfoList.size()][4]; for (int i = 0; i < filtersInfoList.size(); i++) { data[i][0] = filtersInfoList.get(i).getName(); data[i][1] = filtersInfoList.get(i).getOwner(); data[i][2] = filtersInfoList.get(i).getDescription(); data[i][3] = filtersInfoList.get(i).isNeedToDownload(); } } @Override public int getRowCount() { return filtersInfoList.size(); } @Override public int getColumnCount() { return columnNames.length; } @Override public Object getValueAt(int rowIndex, int columnIndex) { switch (columnIndex) { case 0: return filtersInfoList.get(rowIndex).getName(); case 1: return filtersInfoList.get(rowIndex).getOwner(); case 2: return filtersInfoList.get(rowIndex).getDescription(); case 3: return filtersInfoList.get(rowIndex).isNeedToDownload(); default: return null; } } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Class<?> getColumnClass(int col) { return columnClasses[col]; } @Override public boolean isCellEditable(int row, int col) { if (col == 3) { return true; } return false; } @Override public void setValueAt(Object value, int row, int col) { if (col == 3) { filtersInfoList.get(row).setNeedToDownload((boolean) value); fireTableCellUpdated(row, col); } } public List<FilterInfo> getFiltersInfoList() { return filtersInfoList; } } } class FilterInfo { private String name; private String description; private JsonObject meta; private boolean needToDownload; private String owner; FilterInfo(String name, String description, JsonObject meta, boolean needToDownload) { this.setName(name); this.setDescription(description); this.meta = meta; this.setNeedToDownload(needToDownload); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public JsonObject getMeta() { return meta; } public void setMeta(JsonObject meta) { this.meta = meta; } public boolean isNeedToDownload() { return needToDownload; } public void setNeedToDownload(boolean needToDownload) { this.needToDownload = needToDownload; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } @Override public String toString() { return "name: " + getName() + "\nDescription: " + getDescription() + "\nMeta: " + getMeta(); } @Override public boolean equals(Object o) { return (o instanceof FilterInfo) && name.equals(((FilterInfo) o).getName()) && meta.equals(((FilterInfo) o).getMeta()) && description.equals(((FilterInfo) o).getDescription()); } }