From 33eb11b8f6ccfc75e4f7f036bc49a774baab921e Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Sat, 4 May 2002 05:13:54 +0000 Subject: [PATCH] Fixed yet another bug with the Swing rendering code: apparently the JEditorPane, when displaying HTML that contains forms, pointlessly wraps its Swing components in heavy weight AWT components which would otherwise trigger some funny business that we don't want it to trigger. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1332 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../threerings/media/FrameRepaintManager.java | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/java/com/threerings/media/FrameRepaintManager.java b/src/java/com/threerings/media/FrameRepaintManager.java index b8e706966..4f0935384 100644 --- a/src/java/com/threerings/media/FrameRepaintManager.java +++ b/src/java/com/threerings/media/FrameRepaintManager.java @@ -1,5 +1,5 @@ // -// $Id: FrameRepaintManager.java,v 1.6 2002/05/04 03:09:46 mdb Exp $ +// $Id: FrameRepaintManager.java,v 1.7 2002/05/04 05:13:54 mdb Exp $ package com.threerings.media; @@ -15,6 +15,7 @@ import java.awt.Window; import javax.swing.CellRendererPane; import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.JEditorPane; import javax.swing.RepaintManager; import javax.swing.SwingUtilities; @@ -292,18 +293,25 @@ public class FrameRepaintManager extends RepaintManager break; } - if (!(c instanceof JComponent)) { - root = c; - break; - } + if (c instanceof JComponent) { + // make a note of the first opaque parent we find + if (ocomp == null && ((JComponent)c).isOpaque()) { + ocomp = c; + // we need to obtain the opaque parent's coordinates + // in the root coordinate system for when we repaint + _cbounds.setBounds( + 0, 0, ocomp.getWidth(), ocomp.getHeight()); + } - // make a note of the first opaque parent we find - if (ocomp == null && ((JComponent)c).isOpaque()) { - ocomp = c; - // we need to obtain the opaque parent's coordinates - // in the root coordinate system for when we repaint - _cbounds.setBounds( - 0, 0, ocomp.getWidth(), ocomp.getHeight()); + } else { + // oh god the hackery. apparently the fscking + // JEditorPane wraps a heavy weight component around + // every swing component it uses when doing forms + Component tp = c.getParent(); + if (!(tp instanceof JEditorPane)) { + root = c; + break; + } } // translate the coordinates into this component's @@ -345,8 +353,10 @@ public class FrameRepaintManager extends RepaintManager Log.info("Repainting old-school " + "[comp=" + toString(comp) + ", ocomp=" + toString(ocomp) + + ", root=" + toString(root) + ", bounds=" + StringUtil.toString(_cbounds) + "]."); + dumpHierarchy(comp); } // otherwise, repaint with standard swing double buffers @@ -377,12 +387,23 @@ public class FrameRepaintManager extends RepaintManager /** * Used to dump a component when debugging. */ - protected String toString (Component comp) + protected static String toString (Component comp) { return comp.getClass().getName() + StringUtil.toString(comp.getBounds()); } + /** + * Dumps the containment hierarchy for the supplied component. + */ + protected static void dumpHierarchy (Component comp) + { + for (String indent = ""; comp != null; indent += " ") { + Log.info(indent + toString(comp)); + comp = comp.getParent(); + } + } + /** The managed frame. */ protected Frame _rootFrame;