source: josm/trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java@ 10634

Last change on this file since 10634 was 10634, checked in by Don-vip, 8 years ago

sonar - pmd:UselessQualifiedThis - Useless qualified this usage in the same class

  • Property svn:eol-style set to native
File size: 9.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.download;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.GridBagConstraints;
7import java.awt.GridBagLayout;
8import java.awt.Insets;
9import java.awt.event.ActionEvent;
10import java.awt.event.MouseAdapter;
11import java.awt.event.MouseEvent;
12import java.util.List;
13
14import javax.swing.AbstractAction;
15import javax.swing.DefaultListModel;
16import javax.swing.JButton;
17import javax.swing.JOptionPane;
18import javax.swing.JPanel;
19import javax.swing.JScrollPane;
20import javax.swing.SwingUtilities;
21import javax.swing.event.ListSelectionEvent;
22import javax.swing.event.ListSelectionListener;
23
24import org.openstreetmap.josm.Main;
25import org.openstreetmap.josm.data.Bounds;
26import org.openstreetmap.josm.gui.download.BookmarkList.Bookmark;
27import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
28import org.openstreetmap.josm.gui.widgets.JosmTextArea;
29import org.openstreetmap.josm.tools.ImageProvider;
30
31/**
32 * DownloadAreaSelector which manages a list of "bookmarks", i.e. a list of
33 * name download areas.
34 *
35 */
36public class BookmarkSelection implements DownloadSelection {
37
38 /** the currently selected download area. One can add bookmarks for this
39 * area, if not null
40 */
41 private Bounds currentArea;
42 /** the list of bookmarks */
43 private BookmarkList bookmarks;
44
45 /** the parent download GUI */
46 private DownloadDialog parent;
47
48 /** displays information about the current download area */
49 private final JMultilineLabel lblCurrentDownloadArea = new JMultilineLabel("");
50 private final JosmTextArea bboxDisplay = new JosmTextArea();
51 /** the add action */
52 private final AddAction actAdd = new AddAction();
53
54 /**
55 * Creates the panel with the action buttons on the left
56 *
57 * @return the panel with the action buttons on the left
58 */
59 protected JPanel buildButtonPanel() {
60 JPanel pnl = new JPanel(new GridBagLayout());
61 GridBagConstraints gc = new GridBagConstraints();
62 gc.gridy = 0;
63 RemoveAction removeAction = new RemoveAction();
64 bookmarks.addListSelectionListener(removeAction);
65 pnl.add(new JButton(removeAction), gc);
66
67 gc.gridy = 1;
68 RenameAction renameAction = new RenameAction();
69 bookmarks.addListSelectionListener(renameAction);
70 pnl.add(new JButton(renameAction), gc);
71
72 gc.fill = GridBagConstraints.BOTH;
73 gc.weightx = 1.0;
74 gc.weighty = 1.0;
75 gc.gridy = 3;
76 pnl.add(new JPanel(), gc); // just a filler
77 return pnl;
78 }
79
80 protected JPanel buildDownloadAreaAddPanel() {
81 JPanel pnl = new JPanel(new GridBagLayout());
82
83 GridBagConstraints gc = new GridBagConstraints();
84 gc.anchor = GridBagConstraints.NORTHWEST;
85 gc.insets = new Insets(5, 5, 5, 5);
86 pnl.add(lblCurrentDownloadArea, gc);
87
88 gc.weightx = 1.0;
89 gc.weighty = 1.0;
90 bboxDisplay.setEditable(false);
91 bboxDisplay.setBackground(pnl.getBackground());
92 bboxDisplay.addFocusListener(new BoundingBoxSelection.SelectAllOnFocusHandler(bboxDisplay));
93 pnl.add(bboxDisplay, gc);
94
95 gc.anchor = GridBagConstraints.NORTHEAST;
96 gc.fill = GridBagConstraints.HORIZONTAL;
97 gc.weightx = 0.0;
98 gc.weighty = 0.0;
99 gc.insets = new Insets(5, 5, 5, 5);
100 pnl.add(new JButton(actAdd), gc);
101 return pnl;
102 }
103
104 @Override
105 public void addGui(final DownloadDialog gui) {
106 JPanel dlg = new JPanel(new GridBagLayout());
107 if (gui != null)
108 gui.addDownloadAreaSelector(dlg, tr("Bookmarks"));
109 GridBagConstraints gc = new GridBagConstraints();
110
111 bookmarks = new BookmarkList();
112 bookmarks.getSelectionModel().addListSelectionListener(e -> {
113 Bookmark b = bookmarks.getSelectedValue();
114 if (b != null && gui != null) {
115 gui.boundingBoxChanged(b.getArea(), this);
116 }
117 });
118 bookmarks.addMouseListener(new DoubleClickAdapter());
119
120 gc.fill = GridBagConstraints.HORIZONTAL;
121 gc.weightx = 1.0;
122 gc.weighty = 0.0;
123 gc.gridwidth = 2;
124 dlg.add(buildDownloadAreaAddPanel(), gc);
125
126 gc.gridwidth = 1;
127 gc.gridx = 0;
128 gc.gridy = 1;
129 gc.fill = GridBagConstraints.VERTICAL;
130 gc.weightx = 0.0;
131 gc.weighty = 1.0;
132 dlg.add(buildButtonPanel(), gc);
133
134 gc.gridwidth = 1;
135 gc.gridx = 1;
136 gc.gridy = 1;
137 gc.fill = GridBagConstraints.BOTH;
138 gc.weightx = 1.0;
139 gc.weighty = 1.0;
140 gc.gridx = 1;
141 dlg.add(new JScrollPane(bookmarks), gc);
142
143 this.parent = gui;
144 }
145
146 protected void updateDownloadAreaLabel() {
147 if (currentArea == null) {
148 lblCurrentDownloadArea.setText(tr("<html>There is currently no download area selected.</html>"));
149 } else {
150 lblCurrentDownloadArea.setText(tr("<html><strong>Current download area</strong> (minlon, minlat, maxlon, maxlat): </html>"));
151 bboxDisplay.setText(currentArea.toBBox().toStringCSV(","));
152 }
153 }
154
155 /**
156 * Sets the current download area
157 *
158 * @param area the download area.
159 */
160 @Override
161 public void setDownloadArea(Bounds area) {
162 if (area == null)
163 return;
164 this.currentArea = area;
165 bookmarks.clearSelection();
166 updateDownloadAreaLabel();
167 actAdd.setEnabled(true);
168 }
169
170 /**
171 * The action to add a new bookmark for the current download area.
172 *
173 */
174 class AddAction extends AbstractAction {
175 AddAction() {
176 putValue(NAME, tr("Create bookmark"));
177 putValue(SMALL_ICON, ImageProvider.get("dialogs", "bookmark-new"));
178 putValue(SHORT_DESCRIPTION, tr("Add a bookmark for the currently selected download area"));
179 }
180
181 @Override
182 public void actionPerformed(ActionEvent e) {
183 if (currentArea == null) {
184 JOptionPane.showMessageDialog(
185 Main.parent,
186 tr("Currently, there is no download area selected. Please select an area first."),
187 tr("Information"),
188 JOptionPane.INFORMATION_MESSAGE
189 );
190 return;
191 }
192 Bookmark b = new Bookmark();
193 b.setName(
194 JOptionPane.showInputDialog(
195 Main.parent, tr("Please enter a name for the bookmarked download area."),
196 tr("Name of location"),
197 JOptionPane.QUESTION_MESSAGE)
198 );
199 b.setArea(currentArea);
200 if (b.getName() != null && !b.getName().isEmpty()) {
201 ((DefaultListModel<BookmarkList.Bookmark>) bookmarks.getModel()).addElement(b);
202 bookmarks.save();
203 }
204 }
205 }
206
207 class RemoveAction extends AbstractAction implements ListSelectionListener {
208 /**
209 * Constructs a new {@code RemoveAction}.
210 */
211 RemoveAction() {
212 putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
213 putValue(SHORT_DESCRIPTION, tr("Remove the currently selected bookmarks"));
214 updateEnabledState();
215 }
216
217 @Override
218 public void actionPerformed(ActionEvent e) {
219 List<Bookmark> sels = bookmarks.getSelectedValuesList();
220 if (sels == null || sels.isEmpty())
221 return;
222 for (Object sel: sels) {
223 ((DefaultListModel<Bookmark>) bookmarks.getModel()).removeElement(sel);
224 }
225 bookmarks.save();
226 }
227
228 protected final void updateEnabledState() {
229 setEnabled(bookmarks.getSelectedIndices().length > 0);
230 }
231
232 @Override
233 public void valueChanged(ListSelectionEvent e) {
234 updateEnabledState();
235 }
236 }
237
238 class RenameAction extends AbstractAction implements ListSelectionListener {
239 /**
240 * Constructs a new {@code RenameAction}.
241 */
242 RenameAction() {
243 putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
244 putValue(SHORT_DESCRIPTION, tr("Rename the currently selected bookmark"));
245 updateEnabledState();
246 }
247
248 @Override
249 public void actionPerformed(ActionEvent e) {
250 List<Bookmark> sels = bookmarks.getSelectedValuesList();
251 if (sels == null || sels.size() != 1)
252 return;
253 Bookmark b = sels.get(0);
254 Object value =
255 JOptionPane.showInputDialog(
256 Main.parent, tr("Please enter a name for the bookmarked download area."),
257 tr("Name of location"),
258 JOptionPane.QUESTION_MESSAGE,
259 null,
260 null,
261 b.getName()
262 );
263 if (value != null) {
264 b.setName(value.toString());
265 bookmarks.save();
266 bookmarks.repaint();
267 }
268 }
269
270 protected final void updateEnabledState() {
271 setEnabled(bookmarks.getSelectedIndices().length == 1);
272 }
273
274 @Override
275 public void valueChanged(ListSelectionEvent e) {
276 updateEnabledState();
277 }
278 }
279
280 class DoubleClickAdapter extends MouseAdapter {
281 @Override
282 public void mouseClicked(MouseEvent e) {
283 if (!(SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2))
284 return;
285 int idx = bookmarks.locationToIndex(e.getPoint());
286 if (idx < 0 || idx >= bookmarks.getModel().getSize())
287 return;
288 Bookmark b = bookmarks.getModel().getElementAt(idx);
289 parent.startDownload(b.getArea());
290 }
291 }
292}
Note: See TracBrowser for help on using the repository browser.