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/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
+++ b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
@@ -32,6 +32,7 @@ import javax.swing.event.ListSelectionListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.GTKWorkaround;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 public class ToolbarPreferences implements PreferenceSetting {
@@ -111,6 +112,9 @@ public class ToolbarPreferences implements PreferenceSetting {
 					s = (String)((Action)value).getValue(Action.NAME);
 					i = (Icon)((Action)value).getValue(Action.SMALL_ICON);
 				}
+
+				GTKWorkaround.makeBorderInsetsSafe("List.noFocusBorder");
+
 				JLabel l = (JLabel)oldRenderer.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
 				l.setIcon(i);
 				return l;
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
--- /dev/null
+++ b/src/org/openstreetmap/josm/tools/GTKWorkaround.java
@@ -0,0 +1,60 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Insets;
+
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+
+public class GTKWorkaround {
+	static class BorderDelegate implements Border {
+		private final Border delegate;
+
+		public BorderDelegate(Border delegate) {
+			this.delegate = delegate;
+		}
+		public Insets getBorderInsets(Component c) {
+			return delegate.getBorderInsets(c);
+		}
+		public boolean isBorderOpaque() {
+			return delegate.isBorderOpaque();
+		}
+		public void paintBorder(Component c, Graphics g, int x, int y,
+		        int width, int height) {
+			delegate.paintBorder(c, g, x, y, width, height);
+		}
+	}
+	static class SafeBorder extends BorderDelegate {
+		public SafeBorder(Border delegate) {
+			super(delegate);
+		}
+		@Override public Insets getBorderInsets(Component c) {
+			Insets res = super.getBorderInsets(c);
+			return res == null ? new Insets(0, 0, 0, 0) : res;
+		}
+	}
+	/**
+	 * This is a workaround for a JDK-Bug. See
+	 * http://josm.openstreetmap.de/ticket/1403
+	 *
+	 * Bug: DefaultListCellRenderer.getListCellRendererComponent calls
+	 * setBorder(UIManager.get(someBorder)) JComponent.setBorder makes an unsafe
+	 * check which throws a NPE if the border's getBorderInsets returns null see
+	 * http://hg.openjdk.java.net/jdk7/swing/jdk/file/37a05a11f281/src/share/classes/javax/swing/JComponent.java
+	 * line 1777
+	 *
+	 * Workaround: Wrap the problematic border and return standard insets in the
+	 * problematic case.
+	 *
+	 * @param borderName
+	 */
+	public static void makeBorderInsetsSafe(String borderName){
+		if ("GTK look and feel".equals(UIManager.getLookAndFeel().getName())){
+			Border b = UIManager.getBorder(borderName);
+			if (!(b instanceof SafeBorder))
+				UIManager.put(borderName,new SafeBorder(b));
+		}
+	}
+}
-- 
1.5.4

