// License: GPL. Copyright 2007 by Immanuel Scholz and others package org.openstreetmap.josm.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.ListCellRenderer; import javax.swing.UIManager; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.Preferences; import org.openstreetmap.josm.data.Preferences.Bookmark; import org.openstreetmap.josm.tools.ImageProvider; /** * List class that read and save its content from the bookmark file. * @author imi */ public class BookmarkList extends JList { /** * Create a bookmark list as well as the Buttons add and remove. */ public BookmarkList() { setModel(new DefaultListModel()); load(); setVisibleRowCount(7); setCellRenderer(new BookmarkCellRenderer()); } /** * Loads the bookmarks from file. */ public void load() { DefaultListModel model = (DefaultListModel)getModel(); model.removeAllElements(); try { for (Preferences.Bookmark b : Main.pref.loadBookmarks()) { model.addElement(b); } } catch (IOException e) { e.printStackTrace(); JOptionPane.showMessageDialog( Main.parent, tr("<html>Could not read bookmarks from<br>''{0}''<br>Error was: {1}</html>", Main.pref.getBookmarksFile(), e.getMessage() ), tr("Error"), JOptionPane.ERROR_MESSAGE ); } } /** * Save all bookmarks to the preferences file */ public void save() { try { Collection<Preferences.Bookmark> bookmarks = new LinkedList<Preferences.Bookmark>(); for (Object o : ((DefaultListModel)getModel()).toArray()) { bookmarks.add((Preferences.Bookmark)o); } Main.pref.saveBookmarks(bookmarks); } catch (IOException e) { JOptionPane.showMessageDialog( Main.parent, tr("<html>Could not write bookmark.<br>{0}</html>", e.getMessage()), tr("Error"), JOptionPane.ERROR_MESSAGE ); } } static class BookmarkCellRenderer extends JLabel implements ListCellRenderer { private ImageIcon icon; public BookmarkCellRenderer() { setOpaque(true); icon = ImageProvider.get("dialogs", "bookmark"); setIcon(icon); } protected void renderColor(boolean selected) { if (selected) { setBackground(UIManager.getColor("List.selectionBackground")); setForeground(UIManager.getColor("List.selectionForeground")); } else { setBackground(UIManager.getColor("List.background")); setForeground(UIManager.getColor("List.foreground")); } } protected String buildToolTipText(Bookmark b) { Bounds area = b.getArea(); StringBuffer sb = new StringBuffer(); sb.append("<html>min[latitude,longitude]=<strong>[") .append(area.getMin().lat()).append(",").append(area.getMin().lon()).append("]</strong>") .append("<br>") .append("max[latitude,longitude]=<strong>[") .append(area.getMax().lat()).append(",").append(area.getMax().lon()).append("]</strong>") .append("</html>"); return sb.toString(); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Bookmark b = (Bookmark) value; renderColor(isSelected); setText(b.getName()); setToolTipText(buildToolTipText(b)); return this; } } }