Changeset 8213 in josm


Ignore:
Timestamp:
2015-04-18T10:41:38+02:00 (9 years ago)
Author:
simon04
Message:

Base note drawing on JTextArea - fixes #10864 - overflow for long URLs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java

    r8079 r8213  
    22package org.openstreetmap.josm.gui.layer;
    33
     4import static org.openstreetmap.josm.tools.I18n.marktr;
    45import static org.openstreetmap.josm.tools.I18n.tr;
    56
    6 import java.awt.Dimension;
     7import java.awt.Color;
    78import java.awt.Graphics2D;
    89import java.awt.Point;
     
    1011import java.awt.event.MouseListener;
    1112import java.io.File;
    12 import java.text.SimpleDateFormat;
     13import java.text.DateFormat;
    1314import java.util.ArrayList;
    1415import java.util.List;
    1516
    1617import javax.swing.Action;
     18import javax.swing.BorderFactory;
    1719import javax.swing.Icon;
    1820import javax.swing.ImageIcon;
    19 import javax.swing.JToolTip;
     21import javax.swing.JTextArea;
    2022
    2123import org.openstreetmap.josm.Main;
     
    2729import org.openstreetmap.josm.data.osm.NoteData;
    2830import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
     31import org.openstreetmap.josm.data.preferences.ColorProperty;
    2932import org.openstreetmap.josm.gui.MapView;
    3033import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
     
    3235import org.openstreetmap.josm.gui.dialogs.NotesDialog;
    3336import org.openstreetmap.josm.io.NoteExporter;
    34 import org.openstreetmap.josm.io.XmlWriter;
    3537import org.openstreetmap.josm.tools.ColorHelper;
     38import org.openstreetmap.josm.tools.date.DateUtils;
    3639
    3740/**
     
    4144
    4245    private final NoteData noteData;
     46
     47    /**
     48     * Property for note comment background
     49     */
     50    public static final ColorProperty PROP_BACKGROUND_COLOR = new ColorProperty(
     51            marktr("Note comment background"), Color.decode("#b8cfe5"));
    4352
    4453    /**
     
    110119        }
    111120        if (noteData.getSelectedNote() != null) {
    112             StringBuilder sb = new StringBuilder("<html>");
     121            StringBuilder sb = new StringBuilder();
    113122            sb.append(tr("Note"));
    114             sb.append(" " + noteData.getSelectedNote().getId());
    115             List<NoteComment> comments = noteData.getSelectedNote().getComments();
    116             SimpleDateFormat dayFormat = new SimpleDateFormat("MMM d, yyyy");
    117             for (NoteComment comment : comments) {
     123            sb.append(" ").append(noteData.getSelectedNote().getId());
     124            for (NoteComment comment : noteData.getSelectedNote().getComments()) {
    118125                String commentText = comment.getText();
    119126                //closing a note creates an empty comment that we don't want to show
    120127                if (commentText != null && commentText.trim().length() > 0) {
    121                     sb.append("<hr/>");
    122                     String userName = XmlWriter.encode(comment.getUser().getName());
    123                     if (userName == null || userName.trim().length() == 0) {
    124                         userName = "&lt;Anonymous&gt;";
    125                     }
    126                     sb.append(userName);
     128                    sb.append("\n\n");
     129                    String userName = comment.getUser().getName().trim();
     130                    sb.append(userName.isEmpty() ? "<Anonymous>" : userName);
    127131                    sb.append(" on ");
    128                     sb.append(dayFormat.format(comment.getCommentTimestamp()));
    129                     sb.append(":<br/>");
    130                     String htmlText = XmlWriter.encode(comment.getText(), true);
    131                     htmlText = htmlText.replace("&#xA;", "<br/>"); //encode method leaves us with entity instead of \n
    132                     sb.append(htmlText);
     132                    sb.append(DateUtils.getDateFormat(DateFormat.MEDIUM).format(comment.getCommentTimestamp()));
     133                    sb.append(":\n");
     134                    sb.append(comment.getText().trim());
    133135                }
    134136            }
    135             sb.append("</html>");
    136             JToolTip toolTip = new JToolTip();
    137             toolTip.setTipText(sb.toString());
     137            JTextArea toolTip = new JTextArea();
     138            toolTip.setText(sb.toString());
     139            toolTip.setLineWrap(true);
     140            toolTip.setWrapStyleWord(true);
     141            toolTip.setBackground(PROP_BACKGROUND_COLOR.get());
     142            toolTip.setSize(Math.min(480, mv.getWidth() / 2), 1);
     143            toolTip.setSize(toolTip.getPreferredSize().width + 6, toolTip.getPreferredSize().height + 6); // +6 for border
     144            toolTip.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
     145
    138146            Point p = mv.getPoint(noteData.getSelectedNote().getLatLon());
    139147
     
    144152            int ty = p.y - NotesDialog.ICON_SMALL_SIZE - 1;
    145153            g.translate(tx, ty);
    146 
    147             //Carried over from the OSB plugin. Not entirely sure why it is needed
    148             //but without it, the tooltip doesn't get sized correctly
    149             for (int x = 0; x < 2; x++) {
    150                 Dimension d = toolTip.getUI().getPreferredSize(toolTip);
    151                 d.width = Math.min(d.width, (mv.getWidth() * 1 / 2));
    152                 if (d.width > 0 && d.height > 0) {
    153                     toolTip.setSize(d);
    154                     try {
    155                         toolTip.paint(g);
    156                     } catch (IllegalArgumentException e) {
    157                         // See #11123 - https://bugs.openjdk.java.net/browse/JDK-6719550
    158                         // Ignore the exception, as Netbeans does: http://hg.netbeans.org/main-silver/rev/c96f4d5fbd20
    159                         Main.error(e, false);
    160                     }
    161                 }
    162             }
     154            toolTip.paint(g);
    163155            g.translate(-tx, -ty);
    164156        }
Note: See TracChangeset for help on using the changeset viewer.