From 2f94810a11e0e3cdeb4bed695a4bf9eb9ce41c34 Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Thu, 8 Jun 2006 20:19:53 +0000 Subject: 2006-06-07 Guilhem Lavaux * Merged HEAD as of 2006-06-06. * native/jni/native-lib/cpproc.h (CPIO_EXEC_NUM_PIPES): Compilation fix. --- .../text/html/CharacterAttributeTranslator.java | 156 ++++++++++++ gnu/javax/swing/text/html/CombinedAttributes.java | 213 ++++++++++++++++ .../swing/text/html/ImageViewIconFactory.java | 282 +++++++++++++++++++++ 3 files changed, 651 insertions(+) create mode 100644 gnu/javax/swing/text/html/CharacterAttributeTranslator.java create mode 100644 gnu/javax/swing/text/html/CombinedAttributes.java create mode 100644 gnu/javax/swing/text/html/ImageViewIconFactory.java (limited to 'gnu/javax/swing') diff --git a/gnu/javax/swing/text/html/CharacterAttributeTranslator.java b/gnu/javax/swing/text/html/CharacterAttributeTranslator.java new file mode 100644 index 000000000..9718189da --- /dev/null +++ b/gnu/javax/swing/text/html/CharacterAttributeTranslator.java @@ -0,0 +1,156 @@ +/* CharacterAttributeTranslator.java -- + Copyright (C) 2006 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.javax.swing.text.html; + +import java.awt.Color; +import java.util.HashMap; +import javax.swing.text.AbstractDocument; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultStyledDocument; +import javax.swing.text.Element; +import javax.swing.text.ElementIterator; +import javax.swing.text.GapContent; +import javax.swing.text.MutableAttributeSet; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; +import javax.swing.text.html.HTML.Tag; + +/** + * This is a small utility class to translate HTML character attributes to + * Swing StyleConstants + */ +public class CharacterAttributeTranslator +{ + private static final HashMap colorMap = new HashMap(); + static + { + colorMap.put("aqua" , "#00FFFF"); + colorMap.put("blue" , "#0000FF"); + colorMap.put("black", "#000000"); + colorMap.put("fuchsia" , "#FF00FF"); + colorMap.put("gray" , "#808080"); + colorMap.put("green" , "#008000"); + colorMap.put("lime" , "#00FF00"); + colorMap.put("maroon" , "#800000"); + colorMap.put("navy" , "#000080"); + colorMap.put("olive" , "#808000"); + colorMap.put("purple" , "#800080"); + colorMap.put("red" , "#FF0000"); + colorMap.put("silver" , "#C0C0C0"); + colorMap.put("teal" , "#008080"); + colorMap.put("white" , "#FFFFFF"); + colorMap.put("yellow" , "#FFFF00"); + }; + + private static Color getColor(String s) + { + String s2 = (String)colorMap.get(s.toLowerCase()); + if( s2 == null ) + s2 = s; + try + { + return Color.decode(s2); + } + catch(NumberFormatException nfe) + { + return null; + } + } + + public static boolean translateTag(MutableAttributeSet charAttr, + Tag t, MutableAttributeSet a) + { + if(t == Tag.FONT) + { + if(a.getAttribute("color") != null) + { + Color c = getColor(""+a.getAttribute("color")); + if( c == null ) + return false; + charAttr.addAttribute(StyleConstants.Foreground, c); + return true; + } + + if(a.getAttribute("size") != null) + { + // FIXME + // charAttr.addAttribute(StyleConstants.FontSize, + // new java.lang.Integer(72)); + return true; + } + } + + if( t == Tag.B ) + { + charAttr.addAttribute(StyleConstants.Bold, new Boolean(true)); + return true; + } + + if( t == Tag.I ) + { + charAttr.addAttribute(StyleConstants.Italic, new Boolean(true)); + return true; + } + + if( t == Tag.U ) + { + charAttr.addAttribute(StyleConstants.Underline, new Boolean(true)); + return true; + } + + if( t == Tag.STRIKE ) + { + charAttr.addAttribute(StyleConstants.StrikeThrough, new Boolean(true)); + return true; + } + + if( t == Tag.SUP ) + { + charAttr.addAttribute(StyleConstants.Superscript, new Boolean(true)); + return true; + } + + if( t == Tag.SUB ) + { + charAttr.addAttribute(StyleConstants.Subscript, new Boolean(true)); + return true; + } + return false; + } +} diff --git a/gnu/javax/swing/text/html/CombinedAttributes.java b/gnu/javax/swing/text/html/CombinedAttributes.java new file mode 100644 index 000000000..b1e3de604 --- /dev/null +++ b/gnu/javax/swing/text/html/CombinedAttributes.java @@ -0,0 +1,213 @@ +/* CombinedAttributes.java -- A two combined sets of attributes + Copyright (C) 2006 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package gnu.javax.swing.text.html; + +import java.io.Serializable; +import java.util.Enumeration; + +import javax.swing.text.AttributeSet; +import javax.swing.text.SimpleAttributeSet; + +/** + * Contains the two combined attribute sets what are searched subsequently. + * This is used to combine style sheet attributes with the HTML view attributes. + * The parent cannot be used as the view may have its own attribute hierarchy. + * + * @author Audrius Meskauskas (AudriusA@Bioinformatics.org) + */ +public class CombinedAttributes implements AttributeSet, Serializable +{ + /** + * Returns the elements from both enumerations. + */ + class CombinedEnumeration implements Enumeration + { + /** + * Create a combined enumeration that enumerates over two enumerations. + * + * @param first the first enumeration to enumerate + * @param second the second enumeration to enumerate + */ + CombinedEnumeration(Enumeration first, Enumeration second) + { + a = first; + b = second; + } + + /** + * The first enumeration (elements returned first) + */ + final Enumeration a; + + /** + * The second enumeration (elements returned later) + */ + final Enumeration b; + + /** @inheritDoc */ + public boolean hasMoreElements() + { + return a.hasMoreElements() || b.hasMoreElements(); + } + + /** @inheritDoc */ + public Object nextElement() + { + return a.hasMoreElements() ? a.nextElement():b.nextElement(); + } + } + + + /** + * The first attribute set. + */ + final AttributeSet a; + + /** + * The second attribute set. + */ + final AttributeSet b; + + /** + * Create the CombinedAttributes what search in the two sets. If any of the + * two passed sets is null, another set is returned. Otherwise, the combined + * attribute set is returned. + * + * @param primary the first set (searched first) + * @param secondary the second set (searched later). + */ + public static AttributeSet combine(AttributeSet primary, + AttributeSet secondary) + { + if (primary == null) + return secondary; + else if (secondary == null) + return primary; + else + return new CombinedAttributes(primary, secondary); + } + + /** + * Create the CombinedAttributes what search in the two sets. + * + * @param primary the first set (searched first) + * @param secondary the second set (searched later). + */ + private CombinedAttributes(AttributeSet primary, AttributeSet secondary) + { + a = primary; + b = secondary; + } + + /** @inheritDoc */ + public boolean containsAttribute(Object name, Object value) + { + return a.containsAttribute(name, value) || b.containsAttribute(name, value); + } + + /** @inheritDoc */ + public boolean containsAttributes(AttributeSet attributes) + { + Enumeration names = attributes.getAttributeNames(); + Object name; + while (names.hasMoreElements()) + { + name = names.nextElement(); + if (!containsAttribute(name, attributes.getAttribute(name))) + return false; + } + return true; + } + + /** @inheritDoc */ + public AttributeSet copyAttributes() + { + SimpleAttributeSet copy = new SimpleAttributeSet(); + copy.addAttributes(a); + copy.addAttributes(b); + return copy; + } + + /** @inheritDoc */ + public Object getAttribute(Object key) + { + Object value = a.getAttribute(key); + if (value == null) + value = b.getAttribute(key); + + return value; + } + + /** @inheritDoc */ + public int getAttributeCount() + { + return a.getAttributeCount()+b.getAttributeCount(); + } + + /** @inheritDoc */ + public Enumeration getAttributeNames() + { + return new CombinedEnumeration(a.getAttributeNames(), b.getAttributeNames()); + } + + /** + * There is no one. + * + * @return null, always. + */ + public AttributeSet getResolveParent() + { + return null; + } + + /** @inheritDoc */ + public boolean isDefined(Object attrName) + { + return a.isDefined(attrName) || b.isDefined(attrName); + } + + /** @inheritDoc */ + public boolean isEqual(AttributeSet attr) + { + if (attr.getAttributeCount() == getAttributeCount()) + return containsAttributes(attr); + else + return false; + } +} diff --git a/gnu/javax/swing/text/html/ImageViewIconFactory.java b/gnu/javax/swing/text/html/ImageViewIconFactory.java new file mode 100644 index 000000000..862e690c9 --- /dev/null +++ b/gnu/javax/swing/text/html/ImageViewIconFactory.java @@ -0,0 +1,282 @@ +package gnu.javax.swing.text.html; + + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.io.Serializable; + +import javax.swing.Icon; +import javax.swing.plaf.metal.MetalLookAndFeel; + +/** + * Creates icons for ImageView. The icons reflect the basic ideas of the Sun's + * icons as they would be described in the text (sheet of paper with image and + * broken sheet of paper with image). They are not pixel to pixel identical and + * contain elements from the metal icon factory. + * + * @author Audrius Meskauskas (audriusa@bioinformatics.org) + */ +public class ImageViewIconFactory +{ + private static Icon noImageIcon; + + private static Icon loadingImageIcon; + + /** + * This icon reflects the general concept (broken sheet of paper with + * image), but is currently not pixel to pixel identical with the Sun's + * implementation. + */ + public static class NoImageIcon implements Icon, Serializable + { + /** + * Creates a new icon. + */ + public NoImageIcon() + { + // Nothing to do here. + } + + /** + * Returns the width of the icon, in pixels. + * + * @return The width of the icon. + */ + public int getIconWidth() + { + return 38; + } + + /** + * Returns the height of the icon, in pixels. + * + * @return The height of the icon. + */ + public int getIconHeight() + { + return 38; + } + + /** + * Paints the icon using colors from the {@link MetalLookAndFeel}. + * + * @param c + * the component (ignored). + * @param g + * the graphics device. + * @param x + * the x-coordinate for the top-left of the icon. + * @param y + * the y-coordinate for the top-left of the icon. + */ + public void paintIcon(Component c, Graphics g, int x, int y) + { + // frame + Color savedColor = g.getColor(); + + g.setColor(MetalLookAndFeel.getBlack()); + + g.drawLine(x, y, x + 19, y); + + g.drawLine(x, y + 1, x, y + 5); + g.drawLine(x, y + 13, x, y + 25); + + g.drawLine(x, y + 25, x + 22, y + 25); + + g.drawLine(x + 22, y + 25, x + 22, y + 21); + g.drawLine(x + 22, y + 13, x + 22, y + 6); + + g.drawLine(x + 22, y + 6, x + 19, y); + + g.drawLine(x + 17, y + 2, x + 21, y + 6); + + g.drawLine(x + 18, y + 1, x + 19, y + 1); + + g.setColor(MetalLookAndFeel.getControlShadow()); + + g.drawLine(x + 1, y + 1, x + 17, y + 1); + + g.drawLine(x + 1, y + 1, x + 1, y + 5); + g.drawLine(x + 1, y + 13, x + 1, y + 24); + + g.drawLine(x + 1, y + 24, x + 21, y + 24); + + g.drawLine(x + 21, y + 24, x + 21, y + 21); + g.drawLine(x + 21, y + 13, x + 21, y + 7); + + g.drawLine(x + 18, y + 2, x + 20, y + 4); + + // Breaking line + + // Shadow + g.drawLine(x + 1, y + 6, x + 20, y + 13); + g.drawLine(x + 1, y + 13, x + 20, y + 20); + + // Edge + g.setColor(MetalLookAndFeel.getBlack()); + g.drawLine(x, y + 6, x + 21, y + 14); + g.drawLine(x, y + 12, x + 21, y + 20); + + // Picture + + y += 1; + x += 3; + + g.setColor(MetalLookAndFeel.getBlack()); + + // roof + g.drawLine(x + 4, y + 5, x + 8, y + 1); + g.drawLine(x + 8, y + 1, x + 15, y + 8); + + // chimney + g.drawLine(x + 11, y + 2, x + 11, y + 4); + g.drawLine(x + 12, y + 2, x + 12, y + 5); + + g.setColor(MetalLookAndFeel.getControlDarkShadow()); + + // roof paint + int xx = x + 8; + for (int i = 0; i < 4; i++) + g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i); + g.fillRect(x + 4, y + 6, 9, 2); + + // base of house + g.drawLine(x + 3, y + 14, x + 3, y + 18); + g.drawLine(x + 3, y + 18, x + 13, y + 18); + + g.setColor(savedColor); + } + } + + /** + * This icon reflects the general concept (sheet of paper with image), but is + * currently not pixel to pixel identical with the Sun's implementation. + */ + public static class LoadingImageIcon implements Icon, Serializable + { + + /** + * Creates a new icon. + */ + public LoadingImageIcon() + { + // Nothing to do here. + } + + /** + * Returns the width of the icon, in pixels. + * + * @return The width of the icon. + */ + public int getIconWidth() + { + return 38; + } + + /** + * Returns the height of the icon, in pixels. + * + * @return The height of the icon. + */ + public int getIconHeight() + { + return 38; + } + + /** + * Paints the icon using colors from the {@link MetalLookAndFeel}. + * + * @param c + * the component (ignored). + * @param g + * the graphics device. + * @param x + * the x-coordinate for the top-left of the icon. + * @param y + * the y-coordinate for the top-left of the icon. + */ + public void paintIcon(Component c, Graphics g, int x, int y) + { + // frame + Color savedColor = g.getColor(); + + g.setColor(Color.black); + g.drawLine(x, y, x + 19, y); + g.drawLine(x, y + 1, x, y + 25); + g.drawLine(x, y + 25, x + 22, y + 25); + g.drawLine(x + 22, y + 25, x + 22, y + 6); + g.drawLine(x + 22, y + 6, x + 19, y); + + g.drawLine(x + 17, y + 2, x + 21, y + 6); + g.drawLine(x + 18, y + 1, x + 19, y + 1); + + g.setColor(new Color(204, 204, 255)); + + g.drawLine(x + 1, y + 1, x + 17, y + 1); + g.drawLine(x + 1, y + 1, x + 1, y + 24); + g.drawLine(x + 1, y + 24, x + 21, y + 24); + g.drawLine(x + 21, y + 24, x + 21, y + 7); + g.drawLine(x + 18, y + 2, x + 20, y + 4); + + // Picture (house) + + y += 3; + x += 3; + + g.setColor(MetalLookAndFeel.getBlack()); + + // roof + g.drawLine(x + 1, y + 8, x + 8, y + 1); + g.drawLine(x + 8, y + 1, x + 15, y + 8); + + // base of house + g.drawLine(x + 3, y + 6, x + 3, y + 15); + g.drawLine(x + 3, y + 15, x + 13, y + 15); + g.drawLine(x + 13, y + 6, x + 13, y + 15); + + // door frame + g.drawLine(x + 6, y + 9, x + 6, y + 15); + g.drawLine(x + 6, y + 9, x + 10, y + 9); + g.drawLine(x + 10, y + 9, x + 10, y + 15); + + // chimney + g.drawLine(x + 11, y + 2, x + 11, y + 4); + g.drawLine(x + 12, y + 2, x + 12, y + 5); + + g.setColor(MetalLookAndFeel.getControlDarkShadow()); + + // roof paint + int xx = x + 8; + for (int i = 0; i < 4; i++) + g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i); + g.fillRect(x + 4, y + 6, 9, 2); + + // door knob + g.drawLine(x + 9, y + 12, x + 9, y + 12); + + // house paint + g.setColor(MetalLookAndFeel.getPrimaryControl()); + g.drawLine(x + 4, y + 8, x + 12, y + 8); + g.fillRect(x + 4, y + 9, 2, 6); + g.fillRect(x + 11, y + 9, 2, 6); + + g.setColor(savedColor); + } + } + + public static Icon getNoImageIcon() + { + if (noImageIcon == null) + noImageIcon = new NoImageIcon(); + return noImageIcon; + } + + public static Icon getLoadingImageIcon() + { + if (loadingImageIcon == null) + loadingImageIcon = new LoadingImageIcon(); + return loadingImageIcon; + } + +} -- cgit v1.2.1