summaryrefslogtreecommitdiff
path: root/javax/swing
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2006-12-08 13:56:34 +0000
committerRoman Kennke <roman@kennke.org>2006-12-08 13:56:34 +0000
commit11b5d0677e5f783f221254e6c3e5a3b97ab0ce23 (patch)
tree2d92d1f0693a0e83c6f989eb1216afdc6714dfb8 /javax/swing
parent499506fed94c7c95e1ddf04e0889b7bd032e3254 (diff)
downloadclasspath-11b5d0677e5f783f221254e6c3e5a3b97ab0ce23.tar.gz
2006-12-07 Roman Kennke <kennke@aicas.com>
* javax/swing/JEditorPane.java (EditorKitMapping): New inner helper class. (editorKits): New static field for caching editor kit instances. (static_initiazer): Initialize static mappings here. (createEditorKitForContentType): Try to use cached instance. Use correct classloader for loading. (getEditorKitClassNameForContentType): Make use of EditorKitMapping class. (getEditorKitForContentType): Store the fetched editor kit. Fallback to createDefaultEditorKit(). (init): Don't clean the static registry here. (registerEditorKitForContentType(String,String,ClassLoader)): Implemented. (registerEditorKitForContentType(String,String)): Delegate to the other version of this method with the thread's context classloader.
Diffstat (limited to 'javax/swing')
-rw-r--r--javax/swing/JEditorPane.java115
1 files changed, 83 insertions, 32 deletions
diff --git a/javax/swing/JEditorPane.java b/javax/swing/JEditorPane.java
index ab683c7a5..8f2b4caa5 100644
--- a/javax/swing/JEditorPane.java
+++ b/javax/swing/JEditorPane.java
@@ -487,6 +487,34 @@ public class JEditorPane extends JTextComponent
}
/**
+ * Used to store a mapping for content-type to editor kit class.
+ */
+ private static class EditorKitMapping
+ {
+ /**
+ * The classname of the editor kit.
+ */
+ String className;
+
+ /**
+ * The classloader with which the kit is to be loaded.
+ */
+ ClassLoader classLoader;
+
+ /**
+ * Creates a new EditorKitMapping object.
+ *
+ * @param cn the classname
+ * @param cl the classloader
+ */
+ EditorKitMapping(String cn, ClassLoader cl)
+ {
+ className = cn;
+ classLoader = cl;
+ }
+ }
+
+ /**
* An EditorKit used for plain text. This is the default editor kit for
* JEditorPanes.
*
@@ -632,9 +660,29 @@ public class JEditorPane extends JTextComponent
boolean focus_root;
+ /**
+ * Maps content-types to editor kit instances.
+ */
+ static HashMap editorKits;
+
// A mapping between content types and registered EditorKit types
static HashMap registerMap;
-
+
+ static
+ {
+ registerMap = new HashMap();
+ editorKits = new HashMap();
+ registerEditorKitForContentType("application/rtf",
+ "javax.swing.text.rtf.RTFEditorKit");
+ registerEditorKitForContentType("text/plain",
+ "javax.swing.JEditorPane$PlainEditorKit");
+ registerEditorKitForContentType("text/html",
+ "javax.swing.text.html.HTMLEditorKit");
+ registerEditorKitForContentType("text/rtf",
+ "javax.swing.text.rtf.RTFEditorKit");
+
+ }
+
// A mapping between content types and used EditorKits
HashMap editorMap;
@@ -675,15 +723,6 @@ public class JEditorPane extends JTextComponent
void init()
{
editorMap = new HashMap();
- registerMap = new HashMap();
- registerEditorKitForContentType("application/rtf",
- "javax.swing.text.rtf.RTFEditorKit");
- registerEditorKitForContentType("text/plain",
- "javax.swing.JEditorPane$PlainEditorKit");
- registerEditorKitForContentType("text/html",
- "javax.swing.text.html.HTMLEditorKit");
- registerEditorKitForContentType("text/rtf",
- "javax.swing.text.rtf.RTFEditorKit");
}
protected EditorKit createDefaultEditorKit()
@@ -703,23 +742,28 @@ public class JEditorPane extends JTextComponent
*/
public static EditorKit createEditorKitForContentType(String type)
{
- // TODO: Have to handle the case where a ClassLoader was specified
- // when the EditorKit was registered
- EditorKit e = null;
- String className = (String) registerMap.get(type);
- if (className != null)
+ // Try cached instance.
+ EditorKit e = (EditorKit) editorKits.get(type);
+ if (e == null)
{
- try
- {
- // XXX - This should actually depend on the classloader
- // registered with the type. See registerEditorKitForContentType.
- ClassLoader ldr = ClassLoader.getSystemClassLoader();
- e = (EditorKit) Class.forName(className, true, ldr).newInstance();
- }
- catch (Exception e2)
- {
- // TODO: Not sure what to do here.
- }
+ EditorKitMapping m = (EditorKitMapping) registerMap.get(type);
+ if (m != null)
+ {
+ String className = m.className;
+ ClassLoader loader = m.classLoader;
+ try
+ {
+ e = (EditorKit) loader.loadClass(className).newInstance();
+ }
+ catch (Exception e2)
+ {
+ // The reference implementation returns null when class is not
+ // loadable or instantiatable.
+ }
+ }
+ // Cache this for later retrieval.
+ if (e != null)
+ editorKits.put(type, e);
}
return e;
}
@@ -780,7 +824,9 @@ public class JEditorPane extends JTextComponent
*/
public static String getEditorKitClassNameForContentType(String type)
{
- return (String) registerMap.get(type);
+ EditorKitMapping m = (EditorKitMapping) registerMap.get(type);
+ String kitName = m != null ? m.className : null;
+ return kitName;
}
/**
@@ -797,16 +843,20 @@ public class JEditorPane extends JTextComponent
* @param type the content type
* @return an appropriate EditorKit for the given content type
*/
- public EditorKit getEditorKitForContentType(String type)
+ public EditorKit (String type)
{
// First check if an EditorKit has been explicitly set.
EditorKit e = (EditorKit) editorMap.get(type);
// Then check to see if we can create one.
if (e == null)
- e = createEditorKitForContentType(type);
+ {
+ e = createEditorKitForContentType(type);
+ if (e != null)
+ setEditorKitForContentType(type, e);
+ }
// Otherwise default to PlainEditorKit.
if (e == null)
- e = new PlainEditorKit();
+ e = createDefaultEditorKit();
return e;
}
@@ -962,7 +1012,8 @@ public class JEditorPane extends JTextComponent
public static void registerEditorKitForContentType(String type,
String classname)
{
- registerMap.put(type, classname);
+ registerEditorKitForContentType(type, classname,
+ Thread.currentThread().getContextClassLoader());
}
/**
@@ -972,7 +1023,7 @@ public class JEditorPane extends JTextComponent
String classname,
ClassLoader loader)
{
- // TODO: Implement this properly.
+ registerMap.put(type, new EditorKitMapping(classname, loader));
}
/**