summaryrefslogtreecommitdiff
path: root/libjava/javax/swing/text
diff options
context:
space:
mode:
authorgraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-02 06:58:08 +0000
committergraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-02 06:58:08 +0000
commitd41c2c383b3038a191a247132448797f5abee878 (patch)
tree57dc5b899889b3288ee8c497478f985857cfcd2e /libjava/javax/swing/text
parent41dc12b443303c7422244ad83c673fc022a18aa9 (diff)
downloadgcc-d41c2c383b3038a191a247132448797f5abee878.tar.gz
missing added files from merge
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86958 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/javax/swing/text')
-rw-r--r--libjava/javax/swing/text/SimpleAttributeSet.java192
-rw-r--r--libjava/javax/swing/text/StyleConstants.java439
-rw-r--r--libjava/javax/swing/text/StyleContext.java697
-rw-r--r--libjava/javax/swing/text/TabSet.java102
-rw-r--r--libjava/javax/swing/text/TabStop.java133
-rw-r--r--libjava/javax/swing/text/Utilities.java182
6 files changed, 1745 insertions, 0 deletions
diff --git a/libjava/javax/swing/text/SimpleAttributeSet.java b/libjava/javax/swing/text/SimpleAttributeSet.java
new file mode 100644
index 00000000000..746056dfe7a
--- /dev/null
+++ b/libjava/javax/swing/text/SimpleAttributeSet.java
@@ -0,0 +1,192 @@
+/* SimpleAttributeSet.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.io.Serializable;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.lang.Cloneable;
+
+public class SimpleAttributeSet
+ implements MutableAttributeSet, Serializable, Cloneable
+{
+ Hashtable tab;
+
+ static AttributeSet EMPTY = new SimpleAttributeSet();
+
+ public SimpleAttributeSet()
+ {
+ this(null);
+ }
+
+ public SimpleAttributeSet(AttributeSet a)
+ {
+ tab = new Hashtable();
+ addAttributes(a);
+ }
+
+ public void addAttribute(Object name, Object value)
+ {
+ tab.put(name, value);
+ }
+
+ public void addAttributes(AttributeSet attributes)
+ {
+ Enumeration e = attributes.getAttributeNames();
+ while (e.hasMoreElements())
+ {
+ Object name = e.nextElement();
+ Object val = attributes.getAttribute(name);
+ tab.put(name, val);
+ }
+ }
+
+ public Object clone()
+ {
+ SimpleAttributeSet s = new SimpleAttributeSet();
+ s.tab = (Hashtable) tab.clone();
+ return s;
+ }
+
+ public boolean containsAttribute(Object name, Object value)
+ {
+ return tab.containsKey(name)
+ && tab.get(name).equals(value);
+ }
+
+ public boolean containsAttributes(AttributeSet attributes)
+ {
+ Enumeration e = attributes.getAttributeNames();
+ while (e.hasMoreElements())
+ {
+ Object name = e.nextElement();
+ Object val = attributes.getAttribute(name);
+ if (! containsAttribute(name, val))
+ return false;
+ }
+ return true;
+ }
+
+ public AttributeSet copyAttributes()
+ {
+ return (AttributeSet) clone();
+ }
+
+ public boolean equals(Object obj)
+ {
+ return (obj != null)
+ && (obj instanceof SimpleAttributeSet)
+ && ((SimpleAttributeSet)obj).tab.equals(this.tab);
+ }
+
+ public Object getAttribute(Object name)
+ {
+ Object val = tab.get(name);
+ if (val != null)
+ return val;
+
+ Object p = getResolveParent();
+ if (p != null && p instanceof AttributeSet)
+ return (((AttributeSet)p).getAttribute(name));
+
+ return null;
+ }
+
+ public int getAttributeCount()
+ {
+ return tab.size();
+ }
+
+ public Enumeration getAttributeNames()
+ {
+ return tab.keys();
+ }
+
+ public AttributeSet getResolveParent()
+ {
+ return (AttributeSet) tab.get(ResolveAttribute);
+ }
+
+ public int hashCode()
+ {
+ return tab.hashCode();
+ }
+
+ public boolean isDefined(Object attrName)
+ {
+ return tab.containsKey(attrName);
+ }
+
+ public boolean isEmpty()
+ {
+ return tab.isEmpty();
+ }
+
+ public boolean isEqual(AttributeSet attr)
+ {
+ return this.equals(attr);
+ }
+
+ public void removeAttribute(Object name)
+ {
+ tab.remove(name);
+ }
+
+ public void removeAttributes(AttributeSet attributes)
+ {
+ removeAttributes(attributes.getAttributeNames());
+ }
+
+ public void removeAttributes(Enumeration names)
+ {
+ while (names.hasMoreElements())
+ {
+ removeAttribute(names.nextElement());
+ }
+ }
+
+ public void setResolveParent(AttributeSet parent)
+ {
+ addAttribute(ResolveAttribute, parent);
+ }
+
+ public String toString()
+ {
+ return tab.toString();
+ }
+}
diff --git a/libjava/javax/swing/text/StyleConstants.java b/libjava/javax/swing/text/StyleConstants.java
new file mode 100644
index 00000000000..2201c47b5b9
--- /dev/null
+++ b/libjava/javax/swing/text/StyleConstants.java
@@ -0,0 +1,439 @@
+/* StyleConstants.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.awt.Color;
+import java.awt.Component;
+import javax.swing.Icon;
+
+public class StyleConstants
+{
+
+ String keyname;
+ private StyleConstants(String k)
+ {
+ keyname = k;
+ }
+
+ public String toString()
+ {
+ return keyname;
+ }
+
+ public static int ALIGN_CENTER;
+ public static int ALIGN_JUSTIFIED;
+ public static int ALIGN_LEFT;
+ public static int ALIGN_RIGHT;
+
+ public static Object Background = CharacterConstants.Background;
+ public static Object BidiLevel = CharacterConstants.BidiLevel;
+ public static Object Bold = CharacterConstants.Bold;
+ public static Object ComponentAttribute = CharacterConstants.ComponentAttribute;
+ public static Object FontFamily = CharacterConstants.Family;
+ public static Object FontSize = CharacterConstants.Size;
+ public static Object Foreground = CharacterConstants.Foreground;
+ public static Object IconAttribute = CharacterConstants.IconAttribute;
+ public static Object Italic = CharacterConstants.Italic;
+ public static Object StrikeThrough = CharacterConstants.StrikeThrough;
+ public static Object Subscript = CharacterConstants.Subscript;
+ public static Object Superscript = CharacterConstants.Superscript;
+ public static Object Underline = CharacterConstants.Underline;
+
+ public static Object Alignment = ParagraphConstants.Alignment;
+ public static Object FirstLineIndent = ParagraphConstants.FirstLineIndent;
+ public static Object LeftIndent = ParagraphConstants.LeftIndent;
+ public static Object LineSpacing = ParagraphConstants.LineSpacing;
+ public static Object Orientation = ParagraphConstants.Orientation;
+ public static Object RightIndent = ParagraphConstants.RightIndent;
+ public static Object SpaceAbove = ParagraphConstants.SpaceAbove;
+ public static Object SpaceBelow = ParagraphConstants.SpaceBelow;
+ public static Object TabSet = ParagraphConstants.TabSet;
+
+ public static String ComponentElementName = new String("component");
+ public static String IconElementName = new String("icon");
+
+ public static Object ComposedTextAttribute = new StyleConstants("composed text");
+ public static Object ModelAttribute = new StyleConstants("model");
+ public static Object NameAttribute = new StyleConstants("name");
+ public static Object ResolveAttribute = new StyleConstants("resolver");
+
+ public static int getAlignment(AttributeSet a)
+ {
+ if (a.isDefined(Alignment))
+ return ((Integer)a.getAttribute(Alignment)).intValue();
+ else
+ return ALIGN_LEFT;
+ }
+
+ public static Color getBackground(AttributeSet a)
+ {
+ if (a.isDefined(Background))
+ return (Color) a.getAttribute(Background);
+ else
+ return Color.BLACK;
+ }
+
+ public static int getBidiLevel(AttributeSet a)
+ {
+ if (a.isDefined(BidiLevel))
+ return ((Integer)a.getAttribute(BidiLevel)).intValue();
+ else
+ return 0;
+ }
+
+ public static Component getComponent(AttributeSet a)
+ {
+ if (a.isDefined(ComponentAttribute))
+ return (Component) a.getAttribute(ComponentAttribute);
+ else
+ return (Component) null;
+ }
+
+ public static float getFirstLineIndent(AttributeSet a)
+ {
+ if (a.isDefined(FirstLineIndent))
+ return ((Float)a.getAttribute(FirstLineIndent)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static String getFontFamily(AttributeSet a)
+ {
+ if (a.isDefined(FontFamily))
+ return (String) a.getAttribute(FontFamily);
+ else
+ return "Monospaced";
+ }
+
+ public static int getFontSize(AttributeSet a)
+ {
+ if (a.isDefined(FontSize))
+ return ((Integer)a.getAttribute(FontSize)).intValue();
+ else
+ return 12;
+ }
+
+ public static Color getForeground(AttributeSet a)
+ {
+ if (a.isDefined(Foreground))
+ return (Color) a.getAttribute(Foreground);
+ else
+ return Color.BLACK;
+ }
+
+ public static Icon getIcon(AttributeSet a)
+ {
+ if (a.isDefined(IconAttribute))
+ return (Icon) a.getAttribute(IconAttribute);
+ else
+ return (Icon) null;
+ }
+
+ public static float getLeftIndent(AttributeSet a)
+ {
+ if (a.isDefined(LeftIndent))
+ return ((Float)a.getAttribute(LeftIndent)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static float getLineSpacing(AttributeSet a)
+ {
+ if (a.isDefined(LineSpacing))
+ return ((Float)a.getAttribute(LineSpacing)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static float getRightIndent(AttributeSet a)
+ {
+ if (a.isDefined(RightIndent))
+ return ((Float)a.getAttribute(RightIndent)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static float getSpaceAbove(AttributeSet a)
+ {
+ if (a.isDefined(SpaceAbove))
+ return ((Float)a.getAttribute(SpaceAbove)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static float getSpaceBelow(AttributeSet a)
+ {
+ if (a.isDefined(SpaceBelow))
+ return ((Float)a.getAttribute(SpaceBelow)).floatValue();
+ else
+ return 0.f;
+ }
+
+ public static javax.swing.text.TabSet getTabSet(AttributeSet a)
+ {
+ if (a.isDefined(StyleConstants.TabSet))
+ return (javax.swing.text.TabSet) a.getAttribute(StyleConstants.TabSet);
+ else
+ return (javax.swing.text.TabSet) null;
+ }
+
+ public static boolean isBold(AttributeSet a)
+ {
+ if (a.isDefined(Bold))
+ return ((Boolean) a.getAttribute(Bold)).booleanValue();
+ else
+ return false;
+ }
+
+ public static boolean isItalic(AttributeSet a)
+ {
+ if (a.isDefined(Italic))
+ return ((Boolean) a.getAttribute(Italic)).booleanValue();
+ else
+ return false;
+ }
+
+ public static boolean isStrikeThrough(AttributeSet a)
+ {
+ if (a.isDefined(StrikeThrough))
+ return ((Boolean) a.getAttribute(StrikeThrough)).booleanValue();
+ else
+ return false;
+ }
+
+ public static boolean isSubscript(AttributeSet a)
+ {
+ if (a.isDefined(Subscript))
+ return ((Boolean) a.getAttribute(Subscript)).booleanValue();
+ else
+ return false;
+ }
+
+ public static boolean isSuperscript(AttributeSet a)
+ {
+ if (a.isDefined(Superscript))
+ return ((Boolean) a.getAttribute(Superscript)).booleanValue();
+ else
+ return false;
+ }
+
+ public static boolean isUnderline(AttributeSet a)
+ {
+ if (a.isDefined(Underline))
+ return ((Boolean) a.getAttribute(Underline)).booleanValue();
+ else
+ return false;
+ }
+
+ public static void setAlignment(MutableAttributeSet a, int align)
+ {
+ a.addAttribute(Alignment, new Integer(align));
+ }
+
+ public static void setBackground(MutableAttributeSet a, Color fg)
+ {
+ a.addAttribute(Background, fg);
+ }
+
+ public static void setBidiLevel(MutableAttributeSet a, int lev)
+ {
+ a.addAttribute(BidiLevel, new Integer(lev));
+ }
+
+ public static void setBold(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(Bold, new Boolean(b));
+ }
+
+ public static void setComponent(MutableAttributeSet a, Component c)
+ {
+ a.addAttribute(ComponentAttribute, c);
+ }
+
+ public static void setFirstLineIndent(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(FirstLineIndent, new Float(i));
+ }
+
+ public static void setFontFamily(MutableAttributeSet a, String fam)
+ {
+ a.addAttribute(FontFamily, fam);
+ }
+
+ public static void setFontSize(MutableAttributeSet a, int s)
+ {
+ a.addAttribute(FontSize, new Integer(s));
+ }
+
+ public static void setForeground(MutableAttributeSet a, Color fg)
+ {
+ a.addAttribute(Foreground, fg);
+ }
+
+ public static void setIcon(MutableAttributeSet a, Icon c)
+ {
+ a.addAttribute(IconAttribute, c);
+ }
+
+ public static void setItalic(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(Italic, new Boolean(b));
+ }
+
+ public static void setLeftIndent(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(LeftIndent, new Float(i));
+ }
+
+ public static void setLineSpacing(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(LineSpacing, new Float(i));
+ }
+
+ public static void setRightIndent(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(RightIndent, new Float(i));
+ }
+
+ public static void setSpaceAbove(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(SpaceAbove, new Float(i));
+ }
+
+ public static void setSpaceBelow(MutableAttributeSet a, float i)
+ {
+ a.addAttribute(SpaceBelow, new Float(i));
+ }
+
+ public static void setStrikeThrough(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(StrikeThrough, new Boolean(b));
+ }
+
+ public static void setSubscript(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(Subscript, new Boolean(b));
+ }
+
+ public static void setSuperscript(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(Superscript, new Boolean(b));
+ }
+
+ public static void setTabSet(MutableAttributeSet a, javax.swing.text.TabSet tabs)
+ {
+ a.addAttribute(StyleConstants.TabSet, tabs);
+ }
+
+ public static void setUnderline(MutableAttributeSet a, boolean b)
+ {
+ a.addAttribute(Underline, new Boolean(b));
+ }
+
+ // The remainder are so-called "typesafe enumerations" which
+ // alias subsets of the above constants.
+ public static class CharacterConstants
+ extends StyleConstants
+ implements AttributeSet.CharacterAttribute
+ {
+ private CharacterConstants(String k)
+ {
+ super(k);
+ }
+
+ public static Object Background = ColorConstants.Background;
+ public static Object BidiLevel = new CharacterConstants("bidiLevel");
+ public static Object Bold = FontConstants.Bold;
+ public static Object ComponentAttribute = new CharacterConstants("component");
+ public static Object Family = FontConstants.Family;
+ public static Object Size = FontConstants.Size;
+ public static Object Foreground = ColorConstants.Foreground;
+ public static Object IconAttribute = new CharacterConstants("icon");
+ public static Object Italic = FontConstants.Italic;
+ public static Object StrikeThrough = new CharacterConstants("strikethrough");
+ public static Object Subscript = new CharacterConstants("subscript");
+ public static Object Superscript = new CharacterConstants("superscript");
+ public static Object Underline = new CharacterConstants("underline");
+ }
+
+ public static class ColorConstants
+ extends StyleConstants
+ implements AttributeSet.ColorAttribute, AttributeSet.CharacterAttribute
+ {
+ private ColorConstants(String k)
+ {
+ super(k);
+ }
+ public static Object Foreground = new ColorConstants("foreground");
+ public static Object Background = new ColorConstants("background");
+ }
+
+ public static class FontConstants
+ extends StyleConstants
+ implements AttributeSet.FontAttribute, AttributeSet.CharacterAttribute
+ {
+ private FontConstants(String k)
+ {
+ super(k);
+ }
+ public static Object Bold = new FontConstants("bold");
+ public static Object Family = new FontConstants("family");
+ public static Object Italic = new FontConstants("italic");
+ public static Object Size = new FontConstants("size");
+ }
+
+ public static class ParagraphConstants
+ extends StyleConstants
+ implements AttributeSet.ParagraphAttribute
+ {
+ private ParagraphConstants(String k)
+ {
+ super(k);
+ }
+ public static Object Alignment = new ParagraphConstants("Alignment");
+ public static Object FirstLineIndent = new ParagraphConstants("FirstLineIndent");
+ public static Object LeftIndent = new ParagraphConstants("LeftIndent");
+ public static Object LineSpacing = new ParagraphConstants("LineSpacing");
+ public static Object Orientation = new ParagraphConstants("Orientation");
+ public static Object RightIndent = new ParagraphConstants("RightIndent");
+ public static Object SpaceAbove = new ParagraphConstants("SpaceAbove");
+ public static Object SpaceBelow = new ParagraphConstants("SpaceBelow");
+ public static Object TabSet = new ParagraphConstants("TabSet");
+ }
+
+}
diff --git a/libjava/javax/swing/text/StyleContext.java b/libjava/javax/swing/text/StyleContext.java
new file mode 100644
index 00000000000..8accd9b905b
--- /dev/null
+++ b/libjava/javax/swing/text/StyleContext.java
@@ -0,0 +1,697 @@
+/* StyleContext.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Toolkit;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import javax.swing.event.EventListenerList;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.Hashtable;
+
+public class StyleContext
+ implements Serializable, AbstractDocument.AttributeContext
+{
+ public class NamedStyle
+ implements Serializable, Style
+ {
+ protected ChangeEvent changeEvent;
+ protected EventListenerList listenerList;
+
+ AttributeSet attributes;
+ String name;
+
+ public NamedStyle()
+ {
+ this(null, null);
+ }
+
+ public NamedStyle(Style parent)
+ {
+ this(null, parent);
+ }
+
+ public NamedStyle(String name, Style parent)
+ {
+ this.name = name;
+ this.attributes = getEmptySet();
+ this.changeEvent = new ChangeEvent(this);
+ this.listenerList = new EventListenerList();
+ setResolveParent(parent);
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String n)
+ {
+ name = n;
+ fireStateChanged();
+ }
+
+ public void addChangeListener(ChangeListener l)
+ {
+ listenerList.add(ChangeListener.class, l);
+ }
+
+ public void removeChangeListener(ChangeListener l)
+ {
+ listenerList.remove(ChangeListener.class, l);
+ }
+
+ public EventListener[] getListeners(Class listenerType)
+ {
+ return listenerList.getListeners(listenerType);
+ }
+
+ public ChangeListener[] getChangeListeners()
+ {
+ return (ChangeListener[]) getListeners(ChangeListener.class);
+ }
+
+ protected void fireStateChanged()
+ {
+ ChangeListener[] listeners = getChangeListeners();
+ for (int i = 0; i < listeners.length; ++i)
+ {
+ listeners[i].stateChanged(changeEvent);
+ }
+ }
+
+ public void addAttribute(Object name, Object value)
+ {
+ attributes = StyleContext.this.addAttribute(attributes, name, value);
+ fireStateChanged();
+ }
+
+ public void addAttributes(AttributeSet attr)
+ {
+ attributes = StyleContext.this.addAttributes(attributes, attr);
+ fireStateChanged();
+ }
+
+ public boolean containsAttribute(Object name, Object value)
+ {
+ return attributes.containsAttribute(name, value);
+ }
+
+ public boolean containsAttributes(AttributeSet attrs)
+ {
+ return attributes.containsAttributes(attrs);
+ }
+
+ public AttributeSet copyAttributes()
+ {
+ return attributes.copyAttributes();
+ }
+
+ public Object getAttribute(Object attrName)
+ {
+ return attributes.getAttribute(attrName);
+ }
+
+ public int getAttributeCount()
+ {
+ return attributes.getAttributeCount();
+ }
+
+ public Enumeration getAttributeNames()
+ {
+ return attributes.getAttributeNames();
+ }
+
+ public boolean isDefined(Object attrName)
+ {
+ return attributes.isDefined(attrName);
+ }
+
+ public boolean isEqual(AttributeSet attr)
+ {
+ return attributes.isEqual(attr);
+ }
+
+ public void removeAttribute(Object name)
+ {
+ attributes = StyleContext.this.removeAttribute(attributes, name);
+ fireStateChanged();
+ }
+
+ public void removeAttributes(AttributeSet attrs)
+ {
+ attributes = StyleContext.this.removeAttributes(attributes, attrs);
+ fireStateChanged();
+ }
+
+ public void removeAttributes(Enumeration names)
+ {
+ attributes = StyleContext.this.removeAttributes(attributes, names);
+ fireStateChanged();
+ }
+
+
+ public AttributeSet getResolveParent()
+ {
+ return attributes.getResolveParent();
+ }
+
+ public void setResolveParent(AttributeSet parent)
+ {
+ attributes = StyleContext.this.addAttribute(attributes, ResolveAttribute, parent);
+ fireStateChanged();
+ }
+
+ public String toString()
+ {
+ return ("[NamedStyle: name=" + name + ", attrs=" + attributes.toString() + "]");
+ }
+ }
+
+ public class SmallAttributeSet
+ implements AttributeSet
+ {
+ final Object [] attrs;
+ public SmallAttributeSet(AttributeSet a)
+ {
+ if (a == null)
+ attrs = new Object[0];
+ else
+ {
+ int n = a.getAttributeCount();
+ int i = 0;
+ attrs = new Object[n * 2];
+ Enumeration e = a.getAttributeNames();
+ while (e.hasMoreElements())
+ {
+ Object name = e.nextElement();
+ attrs[i++] = name;
+ attrs[i++] = a.getAttribute(name);
+ }
+ }
+ }
+
+ public SmallAttributeSet(Object [] a)
+ {
+ if (a == null)
+ attrs = new Object[0];
+ else
+ {
+ attrs = new Object[a.length];
+ System.arraycopy(a, 0, attrs, 0, a.length);
+ }
+ }
+
+ public Object clone()
+ {
+ return new SmallAttributeSet(this.attrs);
+ }
+
+ public boolean containsAttribute(Object name, Object value)
+ {
+ for (int i = 0; i < attrs.length; i += 2)
+ {
+ if (attrs[i].equals(name) &&
+ attrs[i+1].equals(value))
+ return true;
+ }
+ return false;
+ }
+
+ public boolean containsAttributes(AttributeSet a)
+ {
+ Enumeration e = a.getAttributeNames();
+ while (e.hasMoreElements())
+ {
+ Object name = e.nextElement();
+ Object val = a.getAttribute(name);
+ if (!containsAttribute(name, val))
+ return false;
+ }
+ return true;
+ }
+
+ public AttributeSet copyAttributes()
+ {
+ return (AttributeSet) clone();
+ }
+
+ public boolean equals(Object obj)
+ {
+ return
+ (obj instanceof SmallAttributeSet)
+ && this.isEqual((AttributeSet)obj);
+ }
+
+ public Object getAttribute(Object key)
+ {
+ for (int i = 0; i < attrs.length; i += 2)
+ {
+ if (attrs[i].equals(key))
+ return attrs[i+1];
+ }
+
+ Object p = getResolveParent();
+ if (p != null && p instanceof AttributeSet)
+ return (((AttributeSet)p).getAttribute(key));
+
+ return null;
+ }
+
+ public int getAttributeCount()
+ {
+ return attrs.length / 2;
+ }
+
+ public Enumeration getAttributeNames()
+ {
+ return new Enumeration()
+ {
+ int i = 0;
+ public boolean hasMoreElements()
+ {
+ return i < attrs.length;
+ }
+ public Object nextElement()
+ {
+ i += 2;
+ return attrs[i-2];
+ }
+ };
+ }
+
+ public AttributeSet getResolveParent()
+ {
+ return (AttributeSet) getAttribute(ResolveAttribute);
+ }
+
+ public int hashCode()
+ {
+ return java.util.Arrays.asList(attrs).hashCode();
+ }
+
+ public boolean isDefined(Object key)
+ {
+ for (int i = 0; i < attrs.length; i += 2)
+ {
+ if (attrs[i].equals(key))
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isEqual(AttributeSet attr)
+ {
+ return attr != null
+ && attr.containsAttributes(this)
+ && this.containsAttributes(attr);
+ }
+
+ public String toString()
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append("[StyleContext.SmallattributeSet:");
+ for (int i = 0; i < attrs.length; ++i)
+ {
+ sb.append(" (");
+ sb.append(attrs[i].toString());
+ sb.append("=");
+ sb.append(attrs[i+1].toString());
+ sb.append(")");
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+ }
+
+ // FIXME: official javadocs suggest that these might be more usefully
+ // implemented using a WeakHashMap, but not sure if that works most
+ // places or whether it really matters anyways.
+ //
+ // FIXME: also not sure if these tables ought to be static (singletons),
+ // shared across all StyleContexts. I think so, but it's not clear in
+ // docs. revert to non-shared if you think it matters.
+
+ public static final String DEFAULT_STYLE = "default";
+
+ static Hashtable sharedAttributeSets = new Hashtable();
+ static Hashtable sharedFonts = new Hashtable();
+
+ static StyleContext defaultStyleContext = new StyleContext();
+ static final int compressionThreshold = 9;
+
+ EventListenerList listenerList;
+ Hashtable styleTable;
+
+ public StyleContext()
+ {
+ listenerList = new EventListenerList();
+ styleTable = new Hashtable();
+ }
+
+ protected SmallAttributeSet createSmallAttributeSet(AttributeSet a)
+ {
+ return new SmallAttributeSet(a);
+ }
+
+ protected MutableAttributeSet createLargeAttributeSet(AttributeSet a)
+ {
+ return new SimpleAttributeSet(a);
+ }
+
+ public void addChangeListener(ChangeListener listener)
+ {
+ listenerList.add(ChangeListener.class, listener);
+ }
+
+ public void removeChangeListener(ChangeListener listener)
+ {
+ listenerList.remove(ChangeListener.class, listener);
+ }
+
+ public ChangeListener[] getChangeListeners()
+ {
+ return (ChangeListener[]) listenerList.getListeners(ChangeListener.class);
+ }
+
+ public Style addStyle(String name, Style parent)
+ {
+ Style newStyle = new NamedStyle(name, parent);
+ if (name != null)
+ styleTable.put(name, newStyle);
+ return newStyle;
+ }
+
+ public void removeStyle(String name)
+ {
+ styleTable.remove(name);
+ }
+
+ public Style getStyle(String name)
+ {
+ return (Style) styleTable.get(name);
+ }
+
+ public Enumeration getStyleNames()
+ {
+ return styleTable.keys();
+ }
+
+ //
+ // StyleContexts only understand the "simple" model of fonts present in
+ // pre-java2d systems: fonts are a family name, a size (integral number
+ // of points), and a mask of style parameters (plain, bold, italic, or
+ // bold|italic). We have an inner class here called SimpleFontSpec which
+ // holds such triples.
+ //
+ // A SimpleFontSpec can be built for *any* AttributeSet because the size,
+ // family, and style keys in an AttributeSet have default values (defined
+ // over in StyleConstants).
+ //
+ // We keep a static cache mapping SimpleFontSpecs to java.awt.Fonts, so
+ // that we reuse Fonts between styles and style contexts.
+ //
+
+ private static class SimpleFontSpec
+ {
+ String family;
+ int style;
+ int size;
+ public SimpleFontSpec(String family,
+ int style,
+ int size)
+ {
+ this.family = family;
+ this.style = style;
+ this.size = size;
+ }
+ public boolean equals(Object obj)
+ {
+ return (obj != null)
+ && (obj instanceof SimpleFontSpec)
+ && (((SimpleFontSpec)obj).family.equals(this.family))
+ && (((SimpleFontSpec)obj).style == this.style)
+ && (((SimpleFontSpec)obj).size == this.size);
+ }
+ public int hashCode()
+ {
+ return family.hashCode() + style + size;
+ }
+ }
+
+ public Font getFont(AttributeSet attr)
+ {
+ String family = StyleConstants.getFontFamily(attr);
+ int style = Font.PLAIN;
+ if (StyleConstants.isBold(attr))
+ style += Font.BOLD;
+ if (StyleConstants.isItalic(attr))
+ style += Font.ITALIC;
+ int size = StyleConstants.getFontSize(attr);
+ return getFont(family, style, size);
+ }
+
+ public Font getFont(String family, int style, int size)
+ {
+ SimpleFontSpec spec = new SimpleFontSpec(family, style, size);
+ if (sharedFonts.containsKey(spec))
+ return (Font) sharedFonts.get(spec);
+ else
+ {
+ Font tmp = new Font(family, style, size);
+ sharedFonts.put(spec, tmp);
+ return tmp;
+ }
+ }
+
+ public FontMetrics getFontMetrics(Font f)
+ {
+ return Toolkit.getDefaultToolkit().getFontMetrics(f);
+ }
+
+ public Color getForeground(AttributeSet a)
+ {
+ return StyleConstants.getForeground(a);
+ }
+
+ public Color getBackground(AttributeSet a)
+ {
+ return StyleConstants.getBackground(a);
+ }
+
+ protected int getCompressionThreshold()
+ {
+ return compressionThreshold;
+ }
+
+ public static StyleContext getDefaultStyleContext()
+ {
+ return defaultStyleContext;
+ }
+
+ public AttributeSet addAttribute(AttributeSet old, Object name, Object value)
+ {
+ if (old instanceof MutableAttributeSet)
+ {
+ ((MutableAttributeSet)old).addAttribute(name, value);
+ return old;
+ }
+ else
+ {
+ MutableAttributeSet mutable = createLargeAttributeSet(old);
+ mutable.addAttribute(name, value);
+ if (mutable.getAttributeCount() >= getCompressionThreshold())
+ return mutable;
+ else
+ {
+ SmallAttributeSet small = createSmallAttributeSet(mutable);
+ if (sharedAttributeSets.containsKey(small))
+ small = (SmallAttributeSet) sharedAttributeSets.get(small);
+ else
+ sharedAttributeSets.put(small,small);
+ return small;
+ }
+ }
+ }
+
+ public AttributeSet addAttributes(AttributeSet old, AttributeSet attributes)
+ {
+ if (old instanceof MutableAttributeSet)
+ {
+ ((MutableAttributeSet)old).addAttributes(attributes);
+ return old;
+ }
+ else
+ {
+ MutableAttributeSet mutable = createLargeAttributeSet(old);
+ mutable.addAttributes(attributes);
+ if (mutable.getAttributeCount() >= getCompressionThreshold())
+ return mutable;
+ else
+ {
+ SmallAttributeSet small = createSmallAttributeSet(mutable);
+ if (sharedAttributeSets.containsKey(small))
+ small = (SmallAttributeSet) sharedAttributeSets.get(small);
+ else
+ sharedAttributeSets.put(small,small);
+ return small;
+ }
+ }
+ }
+
+ public AttributeSet getEmptySet()
+ {
+ AttributeSet e = createSmallAttributeSet(null);
+ if (sharedAttributeSets.containsKey(e))
+ e = (AttributeSet) sharedAttributeSets.get(e);
+ else
+ sharedAttributeSets.put(e, e);
+ return e;
+ }
+
+ public void reclaim(AttributeSet attributes)
+ {
+ if (sharedAttributeSets.containsKey(attributes))
+ sharedAttributeSets.remove(attributes);
+ }
+
+ public AttributeSet removeAttribute(AttributeSet old, Object name)
+ {
+ if (old instanceof MutableAttributeSet)
+ {
+ ((MutableAttributeSet)old).removeAttribute(name);
+ if (old.getAttributeCount() < getCompressionThreshold())
+ {
+ SmallAttributeSet small = createSmallAttributeSet(old);
+ if (!sharedAttributeSets.containsKey(small))
+ sharedAttributeSets.put(small,small);
+ old = (AttributeSet) sharedAttributeSets.get(small);
+ }
+ return old;
+ }
+ else
+ {
+ MutableAttributeSet mutable = createLargeAttributeSet(old);
+ mutable.removeAttribute(name);
+ SmallAttributeSet small = createSmallAttributeSet(mutable);
+ if (sharedAttributeSets.containsKey(small))
+ small = (SmallAttributeSet) sharedAttributeSets.get(small);
+ else
+ sharedAttributeSets.put(small,small);
+ return small;
+ }
+ }
+
+ public AttributeSet removeAttributes(AttributeSet old, AttributeSet attributes)
+ {
+ return removeAttributes(old, attributes.getAttributeNames());
+ }
+
+ public AttributeSet removeAttributes(AttributeSet old, Enumeration names)
+ {
+ if (old instanceof MutableAttributeSet)
+ {
+ ((MutableAttributeSet)old).removeAttributes(names);
+ if (old.getAttributeCount() < getCompressionThreshold())
+ {
+ SmallAttributeSet small = createSmallAttributeSet(old);
+ if (!sharedAttributeSets.containsKey(small))
+ sharedAttributeSets.put(small,small);
+ old = (AttributeSet) sharedAttributeSets.get(small);
+ }
+ return old;
+ }
+ else
+ {
+ MutableAttributeSet mutable = createLargeAttributeSet(old);
+ mutable.removeAttributes(names);
+ SmallAttributeSet small = createSmallAttributeSet(mutable);
+ if (sharedAttributeSets.containsKey(small))
+ small = (SmallAttributeSet) sharedAttributeSets.get(small);
+ else
+ sharedAttributeSets.put(small,small);
+ return small;
+ }
+ }
+
+
+ // FIXME: there's some sort of quasi-serialization stuff in here which I
+ // have left incomplete; I'm not sure I understand the intent properly.
+
+ public static Object getStaticAttribute(Object key)
+ {
+ throw new InternalError("not implemented");
+ }
+
+ public static Object getStaticAttributeKey(Object key)
+ {
+ throw new InternalError("not implemented");
+ }
+
+ public static void readAttributeSet(ObjectInputStream in, MutableAttributeSet a)
+ throws ClassNotFoundException, IOException
+ {
+ throw new InternalError("not implemented");
+ }
+
+ public static void writeAttributeSet(ObjectOutputStream out, AttributeSet a)
+ throws IOException
+ {
+ throw new InternalError("not implemented");
+ }
+
+ public void readAttributes(ObjectInputStream in, MutableAttributeSet a)
+ throws ClassNotFoundException, IOException
+ {
+ throw new InternalError("not implemented");
+ }
+
+ public void writeAttributes(ObjectOutputStream out, AttributeSet a)
+ throws IOException
+ {
+ throw new InternalError("not implemented");
+ }
+}
diff --git a/libjava/javax/swing/text/TabSet.java b/libjava/javax/swing/text/TabSet.java
new file mode 100644
index 00000000000..58ae65ef096
--- /dev/null
+++ b/libjava/javax/swing/text/TabSet.java
@@ -0,0 +1,102 @@
+/* TabSet.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.io.Serializable;
+
+public class TabSet implements Serializable
+{
+ TabStop[] tabs;
+
+ public TabSet(TabStop[] t)
+ {
+ tabs = t;
+ }
+
+ public TabStop getTab(int i)
+ {
+ return tabs[i];
+ }
+
+ public TabStop getTabAfter(float location)
+ {
+ int idx = getTabIndexAfter(location);
+ if (idx == -1)
+ return null;
+ else
+ return tabs[idx];
+ }
+
+ public int getTabCount()
+ {
+ return tabs.length;
+ }
+
+ public int getTabIndex(TabStop tab)
+ {
+ for (int i = 0; i < tabs.length; ++i)
+ if (tabs[i] == tab)
+ return i;
+ return -1;
+ }
+
+ public int getTabIndexAfter(float location)
+ {
+ int idx = -1;
+ for (int i = 0; i < tabs.length; ++i)
+ {
+ if (location < tabs[i].getPosition())
+ idx = i;
+ }
+ return idx;
+ }
+
+ public String toString()
+ {
+ StringBuffer sb = new StringBuffer();
+ sb.append("[");
+ for (int i = 0; i < tabs.length; ++i)
+ {
+ if (i != 0)
+ sb.append(" - ");
+ sb.append(tabs[i].toString());
+ }
+ sb.append("]");
+ return sb.toString();
+ }
+}
diff --git a/libjava/javax/swing/text/TabStop.java b/libjava/javax/swing/text/TabStop.java
new file mode 100644
index 00000000000..2c95a63e4b7
--- /dev/null
+++ b/libjava/javax/swing/text/TabStop.java
@@ -0,0 +1,133 @@
+/* TabSet.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.io.Serializable;
+
+public class TabStop implements Serializable
+{
+ public static final int ALIGN_LEFT = 0;
+ public static final int ALIGN_RIGHT = 1;
+ public static final int ALIGN_CENTER = 2;
+ public static final int ALIGN_DECIMAL = 4;
+ public static final int ALIGN_BAR = 5;
+
+ public static final int LEAD_NONE = 0;
+ public static final int LEAD_DOTS = 1;
+ public static final int LEAD_HYPHENS = 2;
+ public static final int LEAD_UNDERLINE = 3;
+ public static final int LEAD_THICKLINE = 4;
+ public static final int LEAD_EQUALS = 5;
+
+ float pos;
+ int align;
+ int leader;
+
+ public TabStop(float pos)
+ {
+ this(pos, ALIGN_LEFT, LEAD_NONE);
+ }
+
+ public TabStop(float pos, int align, int leader)
+ {
+ this.pos = pos;
+ this.align = align;
+ this.leader = leader;
+ }
+
+ public boolean equals(Object other)
+ {
+ return (other != null)
+ && (other instanceof TabStop)
+ && (((TabStop)other).getPosition() == this.getPosition())
+ && (((TabStop)other).getLeader() == this.getLeader())
+ && (((TabStop)other).getAlignment() == this.getAlignment());
+ }
+
+ public int getAlignment()
+ {
+ return align;
+ }
+
+ public int getLeader()
+ {
+ return leader;
+ }
+
+ public float getPosition()
+ {
+ return pos;
+ }
+
+ public int hashCode()
+ {
+ return (int) pos + (int) leader + (int) align;
+ }
+
+ public String toString()
+ {
+ String prefix = "";
+ switch (align)
+ {
+ case ALIGN_LEFT:
+ prefix = "left ";
+ break;
+ case ALIGN_RIGHT:
+ prefix = "right ";
+ break;
+
+ case ALIGN_CENTER:
+ prefix = "center ";
+ break;
+
+ case ALIGN_DECIMAL:
+ prefix = "decimal ";
+ break;
+
+ case ALIGN_BAR:
+ prefix = "bar ";
+ break;
+
+ default:
+ break;
+ }
+
+ return (prefix + "tab @" + pos + ((leader == LEAD_NONE) ? "" : "(w/leaders)"));
+ }
+
+}
diff --git a/libjava/javax/swing/text/Utilities.java b/libjava/javax/swing/text/Utilities.java
new file mode 100644
index 00000000000..61c13eef509
--- /dev/null
+++ b/libjava/javax/swing/text/Utilities.java
@@ -0,0 +1,182 @@
+/* Utilities.java --
+ Copyright (C) 2004 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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 javax.swing.text;
+
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+
+/**
+ * A set of utilities to deal with text. This is used by several other classes
+ * inside this package.
+ *
+ * @author Roman Kennke <roman@ontographics.com>
+ */
+public class Utilities
+{
+ /**
+ * The length of the char buffer that holds the characters to be drawn.
+ */
+ private static final int BUF_LENGTH = 64;
+
+ /**
+ * Creates a new <code>Utilities</code> object.
+ */
+ public Utilities()
+ {
+ // Nothing to be done here.
+ }
+
+ /**
+ * Draws the given text segment. Contained tabs and newline characters
+ * are taken into account. Tabs are expanded using the
+ * specified {@link TabExpander}.
+ *
+ * @param s the text fragment to be drawn.
+ * @param x the x position for drawing.
+ * @param y the y position for drawing.
+ * @param g the {@link Graphics} context for drawing.
+ * @param e the {@link TabExpander} which specifies the Tab-expanding
+ * technique.
+ * @param startOffset starting offset in the text.
+ * @return the x coordinate at the end of the drawn text.
+ */
+ public static final int drawTabbedText(Segment s, int x, int y, Graphics g,
+ TabExpander e, int startOffset)
+ {
+ // This buffers the chars to be drawn.
+ char[] buffer = s.array;
+
+
+ // The current x and y pixel coordinates.
+ int pixelX = x;
+ int pixelY = y;
+
+ // The font metrics of the current selected font.
+ FontMetrics metrics = g.getFontMetrics();
+ int ascent = metrics.getAscent();
+
+ for (int offset = s.offset; offset < (s.offset + s.count); ++offset)
+ {
+ switch (buffer[offset])
+ {
+ case '\t':
+ // In case we have a tab, we just 'jump' over the tab.
+ // When we have no tab expander we just use the width of 'm'.
+ if (e != null)
+ pixelX = (int) e.nextTabStop((float) pixelX,
+ startOffset + offset - s.offset);
+ else
+ pixelX += metrics.charWidth(' ');
+ break;
+ case '\n':
+ // In case we have a newline, we must draw
+ // the buffer and jump on the next line.
+ g.drawChars(buffer, offset, 1, pixelX, y);
+ pixelY += metrics.getHeight();
+ pixelX = x;
+ break;
+ default:
+ // Here we draw the char.
+ g.drawChars(buffer, offset, 1, pixelX, pixelY + ascent);
+ pixelX += metrics.charWidth(buffer[offset]);
+ break;
+ }
+ }
+
+ return pixelX;
+ }
+
+ /**
+ * Determines the width, that the given text <code>s</code> would take
+ * if it was printed with the given {@link java.awt.FontMetrics} on the
+ * specified screen position.
+ * @param s the text fragment
+ * @param metrics the font metrics of the font to be used
+ * @param x the x coordinate of the point at which drawing should be done
+ * @param e the {@link TabExpander} to be used
+ * @param startOffset the index in <code>s</code> where to start
+ * @returns the width of the given text s. This takes tabs and newlines
+ * into account.
+ */
+ public static final int getTabbedTextWidth(Segment s, FontMetrics metrics,
+ int x, TabExpander e,
+ int startOffset)
+ {
+ // This buffers the chars to be drawn.
+ char[] buffer = s.array;
+
+ // The current x coordinate.
+ int pixelX = x;
+
+ // The current maximum width.
+ int maxWidth = 0;
+
+ for (int offset = s.offset; offset < (s.offset + s.count); ++offset)
+ {
+ switch (buffer[offset])
+ {
+ case '\t':
+ // In case we have a tab, we just 'jump' over the tab.
+ // When we have no tab expander we just use the width of 'm'.
+ if (e != null)
+ pixelX = (int) e.nextTabStop((float) pixelX,
+ startOffset + offset - s.offset);
+ else
+ pixelX += metrics.charWidth(' ');
+ break;
+ case '\n':
+ // In case we have a newline, we must 'draw'
+ // the buffer and jump on the next line.
+ pixelX += metrics.charWidth(buffer[offset]);
+ maxWidth = Math.max(maxWidth, pixelX - x);
+ pixelX = x;
+ break;
+ default:
+ // Here we draw the char.
+ pixelX += metrics.charWidth(buffer[offset]);
+ break;
+ }
+ }
+
+ // Take the last line into account.
+ maxWidth = Math.max(maxWidth, pixelX - x);
+
+ return maxWidth;
+ }
+}