summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2006-12-05 11:20:40 +0000
committerRoman Kennke <roman@kennke.org>2006-12-05 11:20:40 +0000
commitaa254a34c023455b1d8492d16e247450b4afed66 (patch)
treecfc2c0f0115e796556973fbbe539c250e6e761ad
parentd041c878a2feb668fc0608be77db342b57138265 (diff)
downloadclasspath-0.93.tar.gz
2006-12-05 Roman Kennke <kennke@aicas.com>classpath-0.93
* javax/swing/text/html/ImageView.java (imageUpdate): Use spans field to determine if the CSS width/height are set. Call safePreferenceChanged to protect view structure from threading issues. (spans): Made package private. (ImageView): Initialize loadOnDemand with false. (loadImage): Call Toolkit.prepareImage() to make sure we have our Observer registered. (safePreferenceChanged): New helper method. Calls preferenceChanged in a thread safe environment.
-rw-r--r--ChangeLog13
-rw-r--r--javax/swing/text/html/ImageView.java63
2 files changed, 66 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 1bd1f90bb..15f910a7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2006-12-05 Roman Kennke <kennke@aicas.com>
+ * javax/swing/text/html/ImageView.java
+ (imageUpdate): Use spans field to determine if the CSS width/height
+ are set. Call safePreferenceChanged to protect view structure
+ from threading issues.
+ (spans): Made package private.
+ (ImageView): Initialize loadOnDemand with false.
+ (loadImage): Call Toolkit.prepareImage() to make sure we have
+ our Observer registered.
+ (safePreferenceChanged): New helper method. Calls preferenceChanged
+ in a thread safe environment.
+
+2006-12-05 Roman Kennke <kennke@aicas.com>
+
* gnu/java/awt/peer/gtk/AsyncImage.java: New class. Supports
asynchronous loading of images.
* gnu/java/awt/peer/gtk/CairoGraphics2D.java
diff --git a/javax/swing/text/html/ImageView.java b/javax/swing/text/html/ImageView.java
index 050eb16e2..0ebf1293d 100644
--- a/javax/swing/text/html/ImageView.java
+++ b/javax/swing/text/html/ImageView.java
@@ -1,6 +1,5 @@
package javax.swing.text.html;
-import gnu.javax.swing.text.html.CombinedAttributes;
import gnu.javax.swing.text.html.ImageViewIconFactory;
import gnu.javax.swing.text.html.css.Length;
@@ -15,6 +14,8 @@ import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.Icon;
+import javax.swing.SwingUtilities;
+import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
@@ -40,16 +41,15 @@ public class ImageView extends View
public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height)
{
boolean widthChanged = false;
- if ((flags & ImageObserver.WIDTH) != 0
- && ! getElement().getAttributes().isDefined(HTML.Attribute.WIDTH))
+ if ((flags & ImageObserver.WIDTH) != 0 && spans[X_AXIS] == null)
widthChanged = true;
boolean heightChanged = false;
- if ((flags & ImageObserver.HEIGHT) != 0
- && ! getElement().getAttributes().isDefined(HTML.Attribute.HEIGHT))
- widthChanged = true;
+ if ((flags & ImageObserver.HEIGHT) != 0 && spans[Y_AXIS] == null)
+ heightChanged = true;
if (widthChanged || heightChanged)
- preferenceChanged(ImageView.this, widthChanged, heightChanged);
- return (flags & ALLBITS) != 0;
+ safePreferenceChanged(ImageView.this, widthChanged, heightChanged);
+ boolean ret = (flags & ALLBITS) != 0;
+ return ret;
}
}
@@ -112,8 +112,10 @@ public class ImageView extends View
/**
* The CSS width and height.
+ *
+ * Package private to avoid synthetic accessor methods.
*/
- private Length[] spans;
+ Length[] spans;
/**
* The cached attributes.
@@ -131,6 +133,7 @@ public class ImageView extends View
observer = new Observer();
reloadProperties = true;
reloadImage = true;
+ loadOnDemand = false;
}
/**
@@ -487,7 +490,9 @@ public class ImageView extends View
if (src != null)
{
// Call getImage(URL) to allow the toolkit caching of that image URL.
- newImage = Toolkit.getDefaultToolkit().getImage(src);
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ newImage = tk.getImage(src);
+ tk.prepareImage(newImage, -1, -1, observer);
if (newImage != null && getLoadsSynchronously())
{
// Load image synchronously.
@@ -548,4 +553,42 @@ public class ImageView extends View
tk.prepareImage(newIm, -1, -1, observer);
}
}
+
+ /**
+ * Calls preferenceChanged from the event dispatch thread and within
+ * a read lock to protect us from threading issues.
+ *
+ * @param v the view
+ * @param width true when the width changed
+ * @param height true when the height changed
+ */
+ void safePreferenceChanged(final View v, final boolean width,
+ final boolean height)
+ {
+ if (SwingUtilities.isEventDispatchThread())
+ {
+ Document doc = getDocument();
+ if (doc instanceof AbstractDocument)
+ ((AbstractDocument) doc).readLock();
+ try
+ {
+ preferenceChanged(v, width, height);
+ }
+ finally
+ {
+ if (doc instanceof AbstractDocument)
+ ((AbstractDocument) doc).readUnlock();
+ }
+ }
+ else
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ safePreferenceChanged(v, width, height);
+ }
+ });
+ }
+ }
}