Ticket #3365: osb_breakable_tooltips.patch

File osb_breakable_tooltips.patch, 5.5 KB (added by xeen, 3 years ago)
  • src/org/openstreetmap/josm/plugins/osb/OsbLayer.java

     
    3030import static org.openstreetmap.josm.tools.I18n.tr; 
    3131 
    3232import java.awt.Component; 
     33import java.awt.Dimension; 
    3334import java.awt.Graphics; 
    3435import java.awt.Image; 
    3536import java.awt.Point; 
     
    6768    private Collection<? extends OsmPrimitive> selection; 
    6869 
    6970    private JToolTip tooltip = new JToolTip(); 
     71     
     72    private static ImageIcon iconError = OsbPlugin.loadIcon("icon_error16.png"); 
     73    private static ImageIcon iconValid = OsbPlugin.loadIcon("icon_valid16.png"); 
    7074 
    7175    public OsbLayer(DataSet dataSet, String name) { 
    7276        super(name); 
     
    116120    @Override 
    117121    public void paint(Graphics g, MapView mv) { 
    118122        Object[] nodes = data.nodes.toArray(); 
     123        // This loop renders all the bug icons 
    119124        for (int i = 0; i < nodes.length; i++) { 
    120125            Node node = (Node) nodes[i]; 
    121126 
    122127            // don't paint deleted nodes 
    123             if(node.deleted) { 
     128            if(node.deleted) 
    124129                continue; 
    125             } 
    126130 
    127131            Point p = mv.getPoint(node); 
    128132 
    129             ImageIcon icon = OsbPlugin.loadIcon("icon_error16.png"); 
    130             if("1".equals(node.get("state"))) { 
    131                 icon = OsbPlugin.loadIcon("icon_valid16.png"); 
    132             } 
     133            ImageIcon icon = ("1".equals(node.get("state"))) ? iconValid : iconError; 
    133134            int width = icon.getIconWidth(); 
    134135            int height = icon.getIconHeight(); 
    135136 
     
    138139                    return false; 
    139140                } 
    140141            }); 
    141  
    142  
    143             if(selection != null && selection.contains(node)) { 
    144                 // draw description 
    145                 String desc = node.get("note"); 
    146                 if(desc != null) { 
    147                     // format with html 
    148                     StringBuilder sb = new StringBuilder("<html>"); 
    149                     //sb.append(desc.replaceAll("\\|", "<br>")); 
    150                     sb.append(desc.replaceAll("<hr />", "<hr>")); 
    151                     sb.append("</html>"); 
    152                     desc = sb.toString(); 
    153  
    154                     // determine tooltip dimensions 
    155                     int tooltipWidth = 0; 
    156                     Rectangle2D fontBounds = null; 
    157                     String[] lines = desc.split("<hr>"); 
    158                     for (int j = 0; j < lines.length; j++) { 
    159                         String line = lines[j]; 
    160                         fontBounds = g.getFontMetrics().getStringBounds(line, g); 
    161                         tooltipWidth = Math.max(tooltipWidth, (int)fontBounds.getWidth()); 
    162                     } 
     142        } 
     143         
     144        if(selection == null) 
     145            return; 
     146         
     147        // This loop renders the selection border and tooltips so they get drawn 
     148        // on top of the bug icons 
     149        for (int i = 0; i < nodes.length; i++) { 
     150            Node node = (Node) nodes[i]; 
     151             
     152            if(node.deleted || !selection.contains(node)) 
     153                continue; 
     154             
     155            // draw selection border 
     156            Point p = mv.getPoint(node); 
     157             
     158            ImageIcon icon = ("1".equals(node.get("state"))) ? iconValid : iconError; 
     159            int width = icon.getIconWidth(); 
     160            int height = icon.getIconHeight(); 
     161             
     162            g.setColor(ColorHelper.html2color(Main.pref.get("color.selected"))); 
     163            g.drawRect(p.x - (width / 2), p.y - (height / 2), 16, 16); 
     164             
     165            // draw description 
     166            String desc = node.get("note"); 
     167            if(desc == null) 
     168                continue; 
    163169 
    164                     // draw description as a tooltip 
    165                     tooltip.setTipText(desc); 
    166                     tooltip.setSize(tooltip.getUI().getPreferredSize(tooltip)); 
    167                      
    168                     int tx = p.x + (width / 2) + 5; 
    169                     int ty = (int)(p.y - height / 2) -1; 
    170                     g.translate(tx, ty); 
    171                     tooltip.paint(g); 
    172                     g.translate(-tx, -ty); 
    173                 } 
     170            // format with html 
     171            StringBuilder sb = new StringBuilder("<html>"); 
     172            sb.append(desc.replaceAll("<hr />", "<hr>")); 
     173            sb.append("</html>"); 
     174            desc = sb.toString(); 
    174175 
    175                 // draw selection border 
    176                 g.setColor(ColorHelper.html2color(Main.pref.get("color.selected"))); 
    177                 g.drawRect(p.x - (width / 2), p.y - (height / 2), 16, 16); 
     176            // draw description as a tooltip 
     177            tooltip.setTipText(desc); 
     178             
     179            int tx = p.x + (width / 2) + 5; 
     180            int ty = (int)(p.y - height / 2) -1; 
     181            g.translate(tx, ty); 
     182             
     183            // This limits the width of the tooltip to 2/3 of the drawing 
     184            // area, which makes longer tooltips actually readable (they 
     185            // would disappear if scrolled to much too the right) 
     186             
     187            // Need to do this twice as otherwise getPreferredSize doesn't take 
     188            // the reduced width into account 
     189            for(int x = 0; x < 2; x++) { 
     190                Dimension d = tooltip.getUI().getPreferredSize(tooltip);                 
     191                d.width = Math.min(d.width, (int)(mv.getWidth()*2/3)); 
     192                tooltip.setSize(d); 
     193                tooltip.paint(g); 
    178194            } 
     195             
     196            g.translate(-tx, -ty); 
    179197        } 
    180198    } 
    181199