source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java@ 3848

Last change on this file since 3848 was 3848, checked in by bastiK, 13 years ago

Experimental mapcss support. All *.java files in the gui/mappaint/mapcss/parser folder are generated from the javacc source file MapCSSParser.jj in the same folder. The generated code sums up to 2700 lines, there is no further build dependency.

  • Property svn:eol-style set to native
File size: 8.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Dimension;
8import java.awt.Point;
9import java.awt.event.ActionEvent;
10import java.awt.event.KeyEvent;
11import java.awt.event.MouseEvent;
12import java.util.ArrayList;
13import java.util.Collection;
14import java.util.List;
15
16import javax.swing.AbstractAction;
17import javax.swing.DefaultListSelectionModel;
18import javax.swing.JPanel;
19import javax.swing.JPopupMenu;
20import javax.swing.JScrollPane;
21import javax.swing.JTable;
22import javax.swing.ListSelectionModel;
23import javax.swing.SwingUtilities;
24import javax.swing.UIManager;
25import javax.swing.event.ListSelectionEvent;
26import javax.swing.event.ListSelectionListener;
27import javax.swing.table.AbstractTableModel;
28
29import org.openstreetmap.josm.Main;
30import org.openstreetmap.josm.gui.SideButton;
31import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
32import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
33import org.openstreetmap.josm.gui.mappaint.StyleSource;
34import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
35import org.openstreetmap.josm.tools.ImageProvider;
36import org.openstreetmap.josm.tools.Shortcut;
37
38public class MapPaintDialog extends ToggleDialog {
39
40 protected JTable tblStyles;
41 protected StylesModel model;
42 protected DefaultListSelectionModel selectionModel;
43
44 protected OnOffAction onoffAction;
45 protected ReloadAction reloadAction;
46
47 public MapPaintDialog() {
48 super(tr("Map Paint Styles"), "mapstyle", tr("configure the map painting style"),
49 Shortcut.registerShortcut("subwindow:authors", tr("Toggle: {0}", tr("Authors")), KeyEvent.VK_M, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 250);
50 build();
51 }
52
53 protected void build() {
54 JPanel pnl = new JPanel();
55 pnl.setLayout(new BorderLayout());
56
57 model = new StylesModel();
58 model.setStyles(MapPaintStyles.getStyles().getStyleSources());
59
60 tblStyles = new JTable(model);
61 tblStyles.setSelectionModel(selectionModel= new DefaultListSelectionModel());
62 tblStyles.addMouseListener(new PopupMenuHandler());
63 tblStyles.putClientProperty("terminateEditOnFocusLost", true);
64 tblStyles.setBackground(UIManager.getColor("Panel.background"));
65 tblStyles.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
66 tblStyles.setTableHeader(null);
67 tblStyles.getColumnModel().getColumn(0).setMaxWidth(1);
68 tblStyles.getColumnModel().getColumn(0).setResizable(false);
69 tblStyles.setShowGrid(false);
70 tblStyles.setIntercellSpacing(new Dimension(0, 0));
71
72 pnl.add(new JScrollPane(tblStyles), BorderLayout.CENTER);
73
74 pnl.add(buildButtonRow(), BorderLayout.SOUTH);
75
76 add(pnl, BorderLayout.CENTER);
77 }
78
79 protected JPanel buildButtonRow() {
80 JPanel p = getButtonPanel(1);
81 reloadAction = new ReloadAction();
82 onoffAction = new OnOffAction();
83 selectionModel.addListSelectionListener(onoffAction);
84 selectionModel.addListSelectionListener(reloadAction);
85 p.add(new SideButton(onoffAction));
86 return p;
87 }
88
89 protected class StylesModel extends AbstractTableModel {
90 List<StyleSource> data;
91
92 public StylesModel() {
93 this.data = new ArrayList<StyleSource>();
94 }
95
96 @Override
97 public int getColumnCount() {
98 return 2;
99 }
100
101 @Override
102 public int getRowCount() {
103 return data.size();
104 }
105
106 @Override
107 public Object getValueAt(int row, int column) {
108 if (column == 0)
109 return data.get(row).active;
110 else
111 return data.get(row).getDisplayString();
112 }
113
114 @Override
115 public boolean isCellEditable(int row, int column) {
116 return column == 0;
117 }
118
119 Class<?>[] columnClasses = {Boolean.class, StyleSource.class};
120
121 @Override
122 public Class<?> getColumnClass(int column) {
123 return columnClasses[column];
124 }
125
126 @Override
127 public void setValueAt(Object aValue, int row, int column) {
128 if (row < 0 || row >= getRowCount() || aValue == null)
129 return;
130 if (column == 0) {
131 toggleOnOff(row);
132 }
133 }
134
135 public void setStyles(Collection<? extends StyleSource> styles) {
136 data.clear();
137 if (styles !=null) {
138 data.addAll(styles);
139 }
140 fireTableDataChanged();
141 }
142
143 public void toggleOnOff(int... rows) {
144 for (Integer p : rows) {
145 StyleSource s = model.data.get(p);
146 s.active = !s.active;
147 }
148 if (rows.length == 1) {
149 model.fireTableCellUpdated(rows[0], 0);
150 } else {
151 model.fireTableDataChanged();
152 }
153 MapPaintStyles.getStyles().clearCached();
154 Main.map.mapView.preferenceChanged(null);
155 Main.map.mapView.repaint();
156 }
157 }
158
159 protected class OnOffAction extends AbstractAction implements ListSelectionListener {
160 public OnOffAction() {
161 putValue(SHORT_DESCRIPTION, tr("Turn selected styles on or off"));
162 putValue(SMALL_ICON, ImageProvider.get("apply"));
163 updateEnabledState();
164 }
165
166 protected void updateEnabledState() {
167 setEnabled(tblStyles.getSelectedRowCount() > 0);
168 }
169
170 @Override
171 public void valueChanged(ListSelectionEvent e) {
172 updateEnabledState();
173 }
174
175 @Override
176 public void actionPerformed(ActionEvent e) {
177 int[] pos = tblStyles.getSelectedRows();
178 model.toggleOnOff(pos);
179 }
180 }
181
182 protected class ReloadAction extends AbstractAction implements ListSelectionListener {
183 public ReloadAction() {
184 putValue(NAME, tr("Reload from file"));
185 putValue(SHORT_DESCRIPTION, tr("reload selected styles from file"));
186 putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
187 updateEnabledState();
188 }
189
190 protected void updateEnabledState() {
191 int[] pos = tblStyles.getSelectedRows();
192 boolean e = pos.length > 0;
193 for (int i : pos) {
194 if (!model.data.get(i).isLocal()) {
195 e = false;
196 break;
197 }
198 }
199 setEnabled(e);
200 }
201
202 @Override
203 public void valueChanged(ListSelectionEvent e) {
204 updateEnabledState();
205 }
206
207 @Override
208 public void actionPerformed(ActionEvent e) {
209
210 final int[] rows = tblStyles.getSelectedRows();
211 List<StyleSource> sources = new ArrayList<StyleSource>();
212 for (int p : rows) {
213 sources.add(model.data.get(p));
214 }
215 Main.worker.submit(new MapPaintStyleLoader(sources));
216 Main.worker.submit(new Runnable() {
217 @Override
218 public void run() {
219 SwingUtilities.invokeLater(new Runnable() {
220 @Override
221 public void run() {
222 if (rows.length == 1) {
223 model.fireTableCellUpdated(rows[0], 1);
224 } else {
225 model.fireTableDataChanged();
226 }
227 MapPaintStyles.getStyles().clearCached();
228 Main.map.mapView.preferenceChanged(null);
229 Main.map.mapView.repaint();
230 }
231 });
232 }
233 });
234 }
235 }
236
237 class PopupMenuHandler extends PopupMenuLauncher {
238 @Override
239 public void launch(MouseEvent evt) {
240 Point p = evt.getPoint();
241 int index = tblStyles.rowAtPoint(p);
242 if (index < 0) return;
243 if (!tblStyles.getCellRect(index, 1, false).contains(evt.getPoint()))
244 return;
245 if (!tblStyles.isRowSelected(index)) {
246 tblStyles.setRowSelectionInterval(index, index);
247 }
248 MapPaintPopup menu = new MapPaintPopup();
249 menu.show(MapPaintDialog.this, p.x, p.y);
250 }
251 }
252
253 public class MapPaintPopup extends JPopupMenu {
254 public MapPaintPopup() {
255 add(reloadAction);
256 }
257 }
258}
Note: See TracBrowser for help on using the repository browser.