Ticket #10500: NoteLayer.patch

File NoteLayer.patch, 4.8 KB (added by ToeBee, 12 years ago)
  • src/org/openstreetmap/josm/gui/layer/NoteLayer.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.layer;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.Graphics2D;
     7import java.awt.Point;
     8import java.util.ArrayList;
     9import java.util.List;
     10
     11import javax.swing.Action;
     12import javax.swing.Icon;
     13import javax.swing.ImageIcon;
     14
     15import org.openstreetmap.josm.Main;
     16import org.openstreetmap.josm.data.Bounds;
     17import org.openstreetmap.josm.data.notes.Note;
     18import org.openstreetmap.josm.data.notes.Note.State;
     19import org.openstreetmap.josm.data.notes.NoteComment;
     20import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
     21import org.openstreetmap.josm.gui.MapView;
     22import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
     23import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
     24import org.openstreetmap.josm.tools.ImageProvider;
     25
     26/**
     27 * A layer to hold Note objects
     28 */
     29public class NoteLayer extends AbstractModifiableLayer {
     30
     31    private List<Note> notes;
     32
     33    /**
     34     * Create a new note layer with a set of notes
     35     * @param notes A list of notes to show in this layer
     36     * @param name The name of the layer. Typically "Notes"
     37     */
     38    public NoteLayer(List<Note> notes, String name) {
     39        super(name);
     40        this.notes = notes;
     41    }
     42
     43    @Override
     44    public boolean isModified() {
     45        for(Note note : notes) {
     46            if(note.getId() < 0) { //notes with negative IDs are new
     47                return true;
     48            }
     49            for(NoteComment comment : note.getComments()) {
     50                if(comment.getIsNew()) {
     51                    return true;
     52                }
     53            }
     54        }
     55        return false;
     56    }
     57
     58    @Override
     59    public boolean requiresUploadToServer() {
     60        return isModified();
     61    }
     62
     63    @Override
     64    public void paint(Graphics2D g, MapView mv, Bounds box) {
     65        for(Note note : notes) {
     66            Point p = mv.getPoint(note.getLatLon());
     67
     68            ImageIcon icon = null;
     69            if(note.getId() < 0) {
     70                icon = ImageProvider.get("notes", "note_new_16x16.png");
     71            } else if(note.getState() == State.closed) {
     72                icon = ImageProvider.get("notes", "note_closed_16x16.png");
     73            } else {
     74                icon = ImageProvider.get("notes", "note_open_16x16.png");
     75            }
     76            int width = icon.getIconWidth();
     77            int height = icon.getIconHeight();
     78            g.drawImage(icon.getImage(), p.x - (width / 2), p.y - height, Main.map.mapView);
     79        }
     80    }
     81
     82    @Override
     83    public Icon getIcon() {
     84        return ImageProvider.get("notes", "note_open_16x16.png");
     85    }
     86
     87    @Override
     88    public String getToolTipText() {
     89        return notes.size() + " " + tr("Notes");
     90    }
     91
     92    @Override
     93    public void mergeFrom(Layer from) {
     94        throw new UnsupportedOperationException("Notes layer does not support merging yet");
     95    }
     96
     97    @Override
     98    public boolean isMergable(Layer other) {
     99        return false;
     100    }
     101
     102    @Override
     103    public void visitBoundingBox(BoundingXYVisitor v) {
     104    }
     105
     106    @Override
     107    public Object getInfoComponent() {
     108        StringBuffer buffer = new StringBuffer();
     109        buffer.append(tr("Notes layer"));
     110        buffer.append("\n");
     111        buffer.append(tr("Total notes:"));
     112        buffer.append(" ");
     113        buffer.append(notes.size());
     114        buffer.append("\n");
     115        buffer.append(tr("Changes need uploading?"));
     116        buffer.append(" ");
     117        buffer.append(isModified());
     118        return buffer.toString();
     119    }
     120
     121    @Override
     122    public Action[] getMenuEntries() {
     123        List<Action> actions = new ArrayList<>();
     124        actions.add(LayerListDialog.getInstance().createShowHideLayerAction());
     125        actions.add(LayerListDialog.getInstance().createDeleteLayerAction());
     126        actions.add(new LayerListPopup.InfoAction(this));
     127        return actions.toArray(new Action[actions.size()]);
     128    }
     129
     130    /**
     131     * Returns the notes stored in this layer
     132     * @return List of Note objects
     133     */
     134    public List<Note> getNotes() {
     135        return notes;
     136    }
     137
     138    /**
     139     * Add notes to the layer. It only adds a note if the ID is not already present
     140     * @param newNotes A list of notes to add
     141     */
     142    public void addNotes(List<Note> newNotes) {
     143        for(Note newNote : newNotes) {
     144            if(!notes.contains(newNote)) {
     145                notes.add(newNote);
     146            }
     147        }
     148        Main.map.mapView.repaint();
     149        Main.debug("notes in layer: " + notes.size());
     150    }
     151}