001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 package org.openstreetmap.josm.gui.download;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.GridBagConstraints;
007 import java.awt.GridBagLayout;
008 import java.awt.Insets;
009 import java.awt.event.ActionEvent;
010 import java.awt.event.MouseAdapter;
011 import java.awt.event.MouseEvent;
012
013 import javax.swing.AbstractAction;
014 import javax.swing.DefaultListModel;
015 import javax.swing.JButton;
016 import javax.swing.JOptionPane;
017 import javax.swing.JPanel;
018 import javax.swing.JScrollPane;
019 import javax.swing.JTextArea;
020 import javax.swing.SwingUtilities;
021 import javax.swing.event.ListSelectionEvent;
022 import javax.swing.event.ListSelectionListener;
023
024 import org.openstreetmap.josm.Main;
025 import org.openstreetmap.josm.data.Bounds;
026 import org.openstreetmap.josm.data.coor.CoordinateFormat;
027 import org.openstreetmap.josm.data.osm.BBox;
028 import org.openstreetmap.josm.gui.BookmarkList;
029 import org.openstreetmap.josm.gui.BookmarkList.Bookmark;
030 import org.openstreetmap.josm.gui.JMultilineLabel;
031 import org.openstreetmap.josm.tools.ImageProvider;
032
033 /**
034 * DownloadAreaSelector which manages a list of "bookmarks", i.e. a list of
035 * name download areas.
036 *
037 */
038 public class BookmarkSelection implements DownloadSelection {
039
040 /** the currently selected download area. One can add bookmarks for this
041 * area, if not null
042 */
043 private Bounds currentArea;
044 /** the list of bookmarks */
045 private BookmarkList bookmarks;
046
047 /** the parent download GUI */
048 private DownloadDialog parent;
049
050 /** displays information about the current download area */
051 private JMultilineLabel lblCurrentDownloadArea;
052 final private JTextArea bboxDisplay = new JTextArea();
053 /** the add action */
054 private AddAction actAdd;
055
056 /**
057 * Creates the panel with the action buttons on the left
058 *
059 * @return the panel with the action buttons on the left
060 */
061 protected JPanel buildButtonPanel() {
062 JPanel pnl = new JPanel();
063 pnl.setLayout(new GridBagLayout());
064 GridBagConstraints gc = new GridBagConstraints();
065 gc.gridy = 0;
066 RemoveAction removeAction = new RemoveAction();
067 bookmarks.addListSelectionListener(removeAction);
068 pnl.add(new JButton(removeAction), gc);
069
070 gc.gridy = 1;
071 RenameAction renameAction = new RenameAction();
072 bookmarks.addListSelectionListener(renameAction);
073 pnl.add(new JButton(renameAction), gc);
074
075 gc.fill = GridBagConstraints.BOTH;
076 gc.weightx = 1.0;
077 gc.weighty = 1.0;
078 gc.gridy = 3;
079 pnl.add(new JPanel(), gc); // just a filler
080 return pnl;
081 }
082
083 protected JPanel buildDownloadAreaAddPanel() {
084 JPanel pnl = new JPanel();
085 pnl.setLayout(new GridBagLayout());
086
087 GridBagConstraints gc = new GridBagConstraints();
088 gc.anchor = GridBagConstraints.NORTHWEST;
089 gc.insets = new Insets(5,5,5,5);
090 pnl.add(lblCurrentDownloadArea = new JMultilineLabel(""), gc);
091
092 gc.weightx = 1.0;
093 gc.weighty = 1.0;
094 bboxDisplay.setEditable(false);
095 bboxDisplay.setBackground(pnl.getBackground());
096 bboxDisplay.addFocusListener(new BoundingBoxSelection.SelectAllOnFocusHandler(bboxDisplay));
097 pnl.add(bboxDisplay, gc);
098
099 gc.anchor = GridBagConstraints.NORTHEAST;
100 gc.fill = GridBagConstraints.HORIZONTAL;
101 gc.weightx = 0.0;
102 gc.weighty = 0.0;
103 gc.insets = new Insets(5,5,5,5);
104 pnl.add(new JButton(actAdd = new AddAction()), gc);
105 return pnl;
106 }
107
108 public void addGui(final DownloadDialog gui) {
109 JPanel dlg = new JPanel(new GridBagLayout());
110 gui.addDownloadAreaSelector(dlg, tr("Bookmarks"));
111 GridBagConstraints gc = new GridBagConstraints();
112
113 bookmarks = new BookmarkList();
114 bookmarks.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
115 public void valueChanged(ListSelectionEvent e) {
116 Bookmark b = (Bookmark)bookmarks.getSelectedValue();
117 if (b != null) {
118 gui.boundingBoxChanged(b.getArea(),BookmarkSelection.this);
119 }
120 }
121 });
122 bookmarks.addMouseListener(new DoubleClickAdapter());
123
124 gc.fill = GridBagConstraints.HORIZONTAL;
125 gc.weightx = 1.0;
126 gc.weighty = 0.0;
127 gc.gridwidth = 2;
128 dlg.add(buildDownloadAreaAddPanel(),gc);
129
130 gc.gridwidth = 1;
131 gc.gridx = 0;
132 gc.gridy = 1;
133 gc.fill = GridBagConstraints.VERTICAL;
134 gc.weightx = 0.0;
135 gc.weighty = 1.0;
136 dlg.add(buildButtonPanel(),gc);
137
138 gc.gridwidth = 1;
139 gc.gridx = 1;
140 gc.gridy = 1;
141 gc.fill = GridBagConstraints.BOTH;
142 gc.weightx = 1.0;
143 gc.weighty = 1.0;
144 gc.gridx = 1;
145 dlg.add(new JScrollPane(bookmarks), gc);
146
147 this.parent = gui;
148 }
149
150 protected void updateDownloadAreaLabel() {
151 if (currentArea == null) {
152 lblCurrentDownloadArea.setText(tr("<html>There is currently no download area selected.</html>"));
153 } else {
154 lblCurrentDownloadArea.setText(tr("<html><strong>Current download area</strong> (minlon, minlat, maxlon, maxlat): </html>"));
155 bboxDisplay.setText(new BBox(currentArea).toStringCSV(","));
156 }
157 }
158
159 /**
160 * Sets the current download area
161 *
162 * @param area the download area.
163 */
164 public void setDownloadArea(Bounds area) {
165 if (area == null) return;
166 this.currentArea = area;
167 bookmarks.clearSelection();
168 updateDownloadAreaLabel();
169 actAdd.setEnabled(true);
170 }
171
172 /**
173 * The action to add a new bookmark for the current download area.
174 *
175 */
176 class AddAction extends AbstractAction {
177 public AddAction() {
178 putValue(NAME, tr("Create bookmark"));
179 putValue(SMALL_ICON, ImageProvider.get("dialogs", "bookmark-new"));
180 putValue(SHORT_DESCRIPTION, tr("Add a bookmark for the currently selected download area"));
181 }
182
183 public void actionPerformed(ActionEvent e) {
184 if (currentArea == null) {
185 JOptionPane.showMessageDialog(
186 Main.parent,
187 tr("Currently, there is no download area selected. Please select an area first."),
188 tr("Information"),
189 JOptionPane.INFORMATION_MESSAGE
190 );
191 return;
192 }
193 Bookmark b = new Bookmark();
194 b.setName(
195 JOptionPane.showInputDialog(
196 Main.parent,tr("Please enter a name for the bookmarked download area."),
197 tr("Name of location"),
198 JOptionPane.QUESTION_MESSAGE)
199 );
200 b.setArea(currentArea);
201 if (b.getName() != null && !b.getName().equals("")) {
202 ((DefaultListModel)bookmarks.getModel()).addElement(b);
203 bookmarks.save();
204 }
205 }
206 }
207
208 class RemoveAction extends AbstractAction implements ListSelectionListener{
209 public RemoveAction() {
210 //putValue(NAME, tr("Remove"));
211 putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
212 putValue(SHORT_DESCRIPTION, tr("Remove the currently selected bookmarks"));
213 updateEnabledState();
214 }
215
216 public void actionPerformed(ActionEvent e) {
217 Object[] sels = bookmarks.getSelectedValues();
218 if (sels == null || sels.length == 0)
219 return;
220 for (Object sel: sels) {
221 ((DefaultListModel)bookmarks.getModel()).removeElement(sel);
222 }
223 bookmarks.save();
224 }
225 protected void updateEnabledState() {
226 setEnabled(bookmarks.getSelectedIndices().length > 0);
227 }
228 public void valueChanged(ListSelectionEvent e) {
229 updateEnabledState();
230 }
231 }
232
233 class RenameAction extends AbstractAction implements ListSelectionListener{
234 public RenameAction() {
235 //putValue(NAME, tr("Remove"));
236 putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
237 putValue(SHORT_DESCRIPTION, tr("Rename the currently selected bookmark"));
238 updateEnabledState();
239 }
240
241 public void actionPerformed(ActionEvent e) {
242 Object[] sels = bookmarks.getSelectedValues();
243 if (sels == null || sels.length != 1)
244 return;
245 Bookmark b = (Bookmark)sels[0];
246 Object value =
247 JOptionPane.showInputDialog(
248 Main.parent,tr("Please enter a name for the bookmarked download area."),
249 tr("Name of location"),
250 JOptionPane.QUESTION_MESSAGE,
251 null,
252 null,
253 b.getName()
254 );
255 if (value != null) {
256 b.setName(value.toString());
257 bookmarks.save();
258 bookmarks.repaint();
259 }
260 }
261 protected void updateEnabledState() {
262 setEnabled(bookmarks.getSelectedIndices().length == 1);
263 }
264 public void valueChanged(ListSelectionEvent e) {
265 updateEnabledState();
266 }
267 }
268
269 class DoubleClickAdapter extends MouseAdapter {
270 @Override
271 public void mouseClicked(MouseEvent e) {
272 if (!(SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2))
273 return;
274 int idx = bookmarks.locationToIndex(e.getPoint());
275 if (idx < 0 || idx >= bookmarks.getModel().getSize())
276 return;
277 Bookmark b = (Bookmark)bookmarks.getModel().getElementAt(idx);
278 parent.startDownload(b.getArea());
279 }
280 }
281 }