source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java@ 2716

Last change on this file since 2716 was 2710, checked in by stoecker, 14 years ago

close #4222 - unify design of right menus again

File size: 8.5 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.marktr;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.BorderLayout;
8import java.awt.Component;
9import java.awt.GridLayout;
10import java.awt.event.ActionEvent;
11import java.awt.event.ActionListener;
12import java.awt.event.KeyEvent;
13import java.awt.event.MouseEvent;
14
15import javax.swing.JCheckBox;
16import javax.swing.JPanel;
17import javax.swing.JPopupMenu;
18import javax.swing.JScrollPane;
19import javax.swing.JTable;
20import javax.swing.ListSelectionModel;
21import javax.swing.event.TableModelEvent;
22import javax.swing.event.TableModelListener;
23import javax.swing.table.DefaultTableCellRenderer;
24import javax.swing.table.JTableHeader;
25import javax.swing.table.TableCellRenderer;
26
27import org.openstreetmap.josm.actions.search.SearchAction;
28import org.openstreetmap.josm.data.osm.Filter;
29import org.openstreetmap.josm.data.osm.Filters;
30import org.openstreetmap.josm.gui.MapView;
31import org.openstreetmap.josm.gui.SideButton;
32import org.openstreetmap.josm.gui.layer.DataChangeListener;
33import org.openstreetmap.josm.gui.layer.Layer;
34import org.openstreetmap.josm.gui.layer.OsmDataLayer;
35import org.openstreetmap.josm.tools.Shortcut;
36
37/**
38 *
39 * @author Petr_Dlouhý
40 */
41public class FilterDialog extends ToggleDialog implements DataChangeListener, MapView.LayerChangeListener, TableModelListener {
42 private JTable userTable;
43 private Filters filters = new Filters();
44 private SideButton addButton;
45 private SideButton editButton;
46 private SideButton deleteButton;
47 private SideButton upButton;
48 private SideButton downButton;
49 private JPopupMenu popupMenu;
50
51 public FilterDialog(){
52 super(tr("Filter"), "filter", tr("Filter objects and hide/disable them."),
53 Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
54
55 MapView.addLayerChangeListener(this);
56 build();
57 }
58
59 @Override
60 public void tearDown() {
61 MapView.removeLayerChangeListener(this);
62 }
63
64 protected JPanel buildButtonRow() {
65 JPanel pnl = getButtonPanel(5);
66
67 addButton = new SideButton(marktr("Add"), "add", "SelectionList", tr("Add filter."),
68 new ActionListener(){
69 public void actionPerformed(ActionEvent evt){
70 Filter filter = (Filter)SearchAction.showSearchDialog(new Filter());
71 if(filter != null){
72 filters.addFilter(filter);
73 filters.filter();
74 }
75 }
76 });
77 pnl.add(addButton);
78
79 editButton = new SideButton(marktr("Edit"), "edit", "SelectionList", tr("Edit filter."),
80 new ActionListener(){
81 public void actionPerformed(ActionEvent evt){
82 int index = userTable.getSelectionModel().getMinSelectionIndex();
83 if(index < 0) return;
84 Filter f = filters.getFilter(index);
85 Filter filter = (Filter)SearchAction.showSearchDialog(f);
86 if(filter != null){
87 filters.setFilter(index, filter);
88 filters.filter();
89 }
90 }
91 });
92 pnl.add(editButton);
93
94 deleteButton = new SideButton(marktr("Delete"), "delete", "SelectionList", tr("Delete filter."),
95 new ActionListener(){
96 public void actionPerformed(ActionEvent evt){
97 int index = userTable.getSelectionModel().getMinSelectionIndex();
98 if(index < 0) return;
99 filters.removeFilter(index);
100 }
101 });
102 pnl.add(deleteButton);
103
104 upButton = new SideButton(marktr("Up"), "up", "SelectionList", tr("Move filter up."),
105 new ActionListener(){
106 public void actionPerformed(ActionEvent evt){
107 int index = userTable.getSelectionModel().getMinSelectionIndex();
108 if(index < 0) return;
109 filters.moveUpFilter(index);
110 userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
111 }
112 });
113 pnl.add(upButton);
114
115 downButton = new SideButton(marktr("Down"), "down", "SelectionList", tr("Move filter down."),
116 new ActionListener(){
117 public void actionPerformed(ActionEvent evt){
118 int index = userTable.getSelectionModel().getMinSelectionIndex();
119 if(index < 0) return;
120 filters.moveDownFilter(index);
121 userTable.getSelectionModel().setSelectionInterval(index+1, index+1);
122 }
123 });
124 pnl.add(downButton);
125 return pnl;
126 }
127
128 protected String[] columnToolTips = {
129 tr("Enable filter"),
130 tr("Hide elements"),
131 null,
132 tr("Apply also for children"),
133 tr("Inverse filter"),
134 tr("Filter mode")
135 };
136
137 protected void build() {
138 JPanel pnl = new JPanel();
139 pnl.setLayout(new BorderLayout());
140 userTable = new JTable(filters){
141 @Override
142 protected JTableHeader createDefaultTableHeader() {
143 return new JTableHeader(columnModel) {
144 @Override
145 public String getToolTipText(MouseEvent e) {
146 String tip = null;
147 java.awt.Point p = e.getPoint();
148 int index = columnModel.getColumnIndexAtX(p.x);
149 int realIndex = columnModel.getColumn(index).getModelIndex();
150 return columnToolTips[realIndex];
151 }
152 };
153 }
154 };
155
156 filters.addTableModelListener(this);
157
158 userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
159
160 userTable.getColumnModel().getColumn(0).setMaxWidth(1);
161 userTable.getColumnModel().getColumn(1).setMaxWidth(1);
162 userTable.getColumnModel().getColumn(3).setMaxWidth(1);
163 userTable.getColumnModel().getColumn(4).setMaxWidth(1);
164 userTable.getColumnModel().getColumn(5).setMaxWidth(1);
165
166 userTable.getColumnModel().getColumn(0).setResizable(false);
167 userTable.getColumnModel().getColumn(1).setResizable(false);
168 userTable.getColumnModel().getColumn(3).setResizable(false);
169 userTable.getColumnModel().getColumn(4).setResizable(false);
170 userTable.getColumnModel().getColumn(5).setResizable(false);
171
172 userTable.setDefaultRenderer(Boolean.class, new BooleanRenderer());
173 userTable.setDefaultRenderer(String.class, new StringRenderer());
174
175 tableChanged(null);
176
177 pnl.add(new JScrollPane(userTable), BorderLayout.CENTER);
178
179 // -- the button row
180 pnl.add(buildButtonRow(), BorderLayout.SOUTH);
181 /*userTable.addMouseListener(new DoubleClickAdapter());*/
182 add(pnl, BorderLayout.CENTER);
183 }
184
185 public void layerRemoved(Layer a) {
186 if (a instanceof OsmDataLayer) {
187 ((OsmDataLayer)a).listenerDataChanged.remove(this);
188 }
189 }
190
191 public void layerAdded(Layer a) {
192 if (a instanceof OsmDataLayer) {
193 ((OsmDataLayer)a).listenerDataChanged.add(this);
194 }
195 }
196
197 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
198 filters.filter();
199 }
200
201 public void dataChanged(OsmDataLayer l){
202 filters.filter();
203 }
204
205 static class StringRenderer extends DefaultTableCellRenderer {
206 @Override
207 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
208 Filters model = (Filters)table.getModel();
209 Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
210 cell.setEnabled(model.isCellEnabled(row, column));
211 return cell;
212 }
213 }
214
215 static class BooleanRenderer extends JCheckBox implements TableCellRenderer {
216 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
217 Filters model = (Filters)table.getModel();
218 setSelected((Boolean)value);
219 setEnabled(model.isCellEnabled(row, column));
220 setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
221 return this;
222 }
223 }
224
225 public void tableChanged(TableModelEvent e){
226 setTitle("Filter Hidden:" + filters.hiddenCount + " Disabled:" + filters.disabledCount);
227 }
228}
Note: See TracBrowser for help on using the repository browser.