// License: GPL. Copyright 2007 by Immanuel Scholz and others package org.openstreetmap.josm.gui.dialogs; import static org.openstreetmap.josm.tools.I18n.marktr; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import org.openstreetmap.josm.actions.search.SearchAction; import org.openstreetmap.josm.data.osm.Filter; import org.openstreetmap.josm.data.osm.Filters; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListener; import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter; import org.openstreetmap.josm.data.osm.event.DatasetEventManager; import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener; import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.tools.Shortcut; /** * * @author Petr_DlouhĂ˝ */ public class FilterDialog extends ToggleDialog implements Listener , TableModelListener { private JTable userTable; private Filters filters = new Filters(); private SideButton addButton; private SideButton editButton; private SideButton deleteButton; private SideButton upButton; private SideButton downButton; private final DataSetListener listenerAdapter = new DataSetListenerAdapter(this); public FilterDialog(){ super(tr("Filter"), "filter", tr("Filter objects and hide/disable them."), Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162); build(); } @Override public void showNotify() { DatasetEventManager.getInstance().addDatasetListener(listenerAdapter, FireMode.IN_EDT_CONSOLIDATED); filters.executeFilters(); } @Override public void hideNotify() { DatasetEventManager.getInstance().removeDatasetListener(listenerAdapter); filters.clearFilterFlags(); } protected JPanel buildButtonRow() { JPanel pnl = getButtonPanel(5); addButton = new SideButton(marktr("Add"), "add", "SelectionList", tr("Add filter."), new ActionListener(){ public void actionPerformed(ActionEvent evt){ Filter filter = (Filter)SearchAction.showSearchDialog(new Filter()); if(filter != null){ filters.addFilter(filter); filters.executeFilters(); } } }); pnl.add(addButton); editButton = new SideButton(marktr("Edit"), "edit", "SelectionList", tr("Edit filter."), new ActionListener(){ public void actionPerformed(ActionEvent evt){ int index = userTable.getSelectionModel().getMinSelectionIndex(); if(index < 0) return; Filter f = filters.getFilter(index); Filter filter = (Filter)SearchAction.showSearchDialog(f); if(filter != null){ filters.setFilter(index, filter); filters.executeFilters(); } } }); pnl.add(editButton); deleteButton = new SideButton(marktr("Delete"), "delete", "SelectionList", tr("Delete filter."), new ActionListener(){ public void actionPerformed(ActionEvent evt){ int index = userTable.getSelectionModel().getMinSelectionIndex(); if(index < 0) return; filters.removeFilter(index); } }); pnl.add(deleteButton); upButton = new SideButton(marktr("Up"), "up", "SelectionList", tr("Move filter up."), new ActionListener(){ public void actionPerformed(ActionEvent evt){ int index = userTable.getSelectionModel().getMinSelectionIndex(); if(index < 0) return; filters.moveUpFilter(index); userTable.getSelectionModel().setSelectionInterval(index-1, index-1); } }); pnl.add(upButton); downButton = new SideButton(marktr("Down"), "down", "SelectionList", tr("Move filter down."), new ActionListener(){ public void actionPerformed(ActionEvent evt){ int index = userTable.getSelectionModel().getMinSelectionIndex(); if(index < 0) return; filters.moveDownFilter(index); userTable.getSelectionModel().setSelectionInterval(index+1, index+1); } }); pnl.add(downButton); return pnl; } protected String[] columnToolTips = { tr("Enable filter"), tr("Hide elements"), null, tr("Apply also for children"), tr("Inverse filter"), tr("Filter mode") }; protected void build() { JPanel pnl = new JPanel(); pnl.setLayout(new BorderLayout()); userTable = new JTable(filters){ @Override protected JTableHeader createDefaultTableHeader() { return new JTableHeader(columnModel) { @Override public String getToolTipText(MouseEvent e) { java.awt.Point p = e.getPoint(); int index = columnModel.getColumnIndexAtX(p.x); int realIndex = columnModel.getColumn(index).getModelIndex(); return columnToolTips[realIndex]; } }; } }; filters.addTableModelListener(this); userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); userTable.getColumnModel().getColumn(0).setMaxWidth(1); userTable.getColumnModel().getColumn(1).setMaxWidth(1); userTable.getColumnModel().getColumn(3).setMaxWidth(1); userTable.getColumnModel().getColumn(4).setMaxWidth(1); userTable.getColumnModel().getColumn(5).setMaxWidth(1); userTable.getColumnModel().getColumn(0).setResizable(false); userTable.getColumnModel().getColumn(1).setResizable(false); userTable.getColumnModel().getColumn(3).setResizable(false); userTable.getColumnModel().getColumn(4).setResizable(false); userTable.getColumnModel().getColumn(5).setResizable(false); userTable.setDefaultRenderer(Boolean.class, new BooleanRenderer()); userTable.setDefaultRenderer(String.class, new StringRenderer()); tableChanged(null); pnl.add(new JScrollPane(userTable), BorderLayout.CENTER); // -- the button row pnl.add(buildButtonRow(), BorderLayout.SOUTH); /*userTable.addMouseListener(new DoubleClickAdapter());*/ add(pnl, BorderLayout.CENTER); } public void processDatasetEvent(AbstractDatasetChangedEvent event) { filters.executeFilters(); } static class StringRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) { Filters model = (Filters)table.getModel(); Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); cell.setEnabled(model.isCellEnabled(row, column)); return cell; } } static class BooleanRenderer extends JCheckBox implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) { Filters model = (Filters)table.getModel(); setSelected((Boolean)value); setEnabled(model.isCellEnabled(row, column)); setHorizontalAlignment(javax.swing.SwingConstants.CENTER); return this; } } public void tableChanged(TableModelEvent e){ setTitle(tr("Filter Hidden: {0} Disabled: {0}", filters.hiddenCount, filters.disabledCount)); } public void drawOSDText(Graphics2D g) { filters.drawOSDText(g); } }