Ticket #1403: 0001-gtk-patch.2.patch

File 0001-gtk-patch.2.patch, 3.6 KB (added by JohannesRudolph, 17 years ago)

Workaround for JDK Problem

  • src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java

    From 2b18d2bd72c64025b435fe168d45a7e63334de5d Mon Sep 17 00:00:00 2001
    From: Johannes Rudolph <johannes_rudolph@gmx.de>
    Date: Tue, 12 Aug 2008 10:19:18 +0200
    Subject: [PATCH] gtk patch
    
    ---
     .../josm/gui/preferences/ToolbarPreferences.java   |    4 +
     .../openstreetmap/josm/tools/GTKWorkaround.java    |   60 ++++++++++++++++++++
     2 files changed, 64 insertions(+), 0 deletions(-)
     create mode 100644 src/org/openstreetmap/josm/tools/GTKWorkaround.java
    
    diff --git a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
    index 69b9af7..0ed19fe 100644
    a b import javax.swing.event.ListSelectionListener;  
    3232
    3333import org.openstreetmap.josm.Main;
    3434import org.openstreetmap.josm.tools.GBC;
     35import org.openstreetmap.josm.tools.GTKWorkaround;
    3536import org.openstreetmap.josm.tools.ImageProvider;
    3637
    3738public class ToolbarPreferences implements PreferenceSetting {
    public class ToolbarPreferences implements PreferenceSetting {  
    111112                                        s = (String)((Action)value).getValue(Action.NAME);
    112113                                        i = (Icon)((Action)value).getValue(Action.SMALL_ICON);
    113114                                }
     115
     116                                GTKWorkaround.makeBorderInsetsSafe("List.noFocusBorder");
     117
    114118                                JLabel l = (JLabel)oldRenderer.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
    115119                                l.setIcon(i);
    116120                                return l;
  • new file src/org/openstreetmap/josm/tools/GTKWorkaround.java

    diff --git a/src/org/openstreetmap/josm/tools/GTKWorkaround.java b/src/org/openstreetmap/josm/tools/GTKWorkaround.java
    new file mode 100644
    index 0000000..ae19352
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.tools;
     3
     4import java.awt.Component;
     5import java.awt.Graphics;
     6import java.awt.Insets;
     7
     8import javax.swing.UIManager;
     9import javax.swing.border.Border;
     10
     11public class GTKWorkaround {
     12        static class BorderDelegate implements Border {
     13                private final Border delegate;
     14
     15                public BorderDelegate(Border delegate) {
     16                        this.delegate = delegate;
     17                }
     18                public Insets getBorderInsets(Component c) {
     19                        return delegate.getBorderInsets(c);
     20                }
     21                public boolean isBorderOpaque() {
     22                        return delegate.isBorderOpaque();
     23                }
     24                public void paintBorder(Component c, Graphics g, int x, int y,
     25                        int width, int height) {
     26                        delegate.paintBorder(c, g, x, y, width, height);
     27                }
     28        }
     29        static class SafeBorder extends BorderDelegate {
     30                public SafeBorder(Border delegate) {
     31                        super(delegate);
     32                }
     33                @Override public Insets getBorderInsets(Component c) {
     34                        Insets res = super.getBorderInsets(c);
     35                        return res == null ? new Insets(0, 0, 0, 0) : res;
     36                }
     37        }
     38        /**
     39         * This is a workaround for a JDK-Bug. See
     40         * http://josm.openstreetmap.de/ticket/1403
     41         *
     42         * Bug: DefaultListCellRenderer.getListCellRendererComponent calls
     43         * setBorder(UIManager.get(someBorder)) JComponent.setBorder makes an unsafe
     44         * check which throws a NPE if the border's getBorderInsets returns null see
     45         * http://hg.openjdk.java.net/jdk7/swing/jdk/file/37a05a11f281/src/share/classes/javax/swing/JComponent.java
     46         * line 1777
     47         *
     48         * Workaround: Wrap the problematic border and return standard insets in the
     49         * problematic case.
     50         *
     51         * @param borderName
     52         */
     53        public static void makeBorderInsetsSafe(String borderName){
     54                if ("GTK look and feel".equals(UIManager.getLookAndFeel().getName())){
     55                        Border b = UIManager.getBorder(borderName);
     56                        if (!(b instanceof SafeBorder))
     57                                UIManager.put(borderName,new SafeBorder(b));
     58                }
     59        }
     60}