home *** CD-ROM | disk | FTP | other *** search
- package netscape.application;
-
- import netscape.util.ClassInfo;
- import netscape.util.Codable;
- import netscape.util.CodingException;
- import netscape.util.Decoder;
- import netscape.util.Encoder;
- import netscape.util.Enumeration;
- import netscape.util.Hashtable;
- import netscape.util.Vector;
-
- public class TextStyleRun implements Codable {
- private static final String CONTENTS_KEY = "contents";
- private static final String ATTRIBUTES_KEY = "attributes";
- TextParagraph _paragraph;
- FastStringBuffer _contents;
- Hashtable _attributes;
- FontMetrics _fontMetricsCache;
- int _remainder;
-
- public TextStyleRun() {
- }
-
- TextStyleRun(TextParagraph var1) {
- this();
- this.init(var1);
- }
-
- TextStyleRun(TextParagraph var1, String var2, Hashtable var3) {
- this();
- this.init(var1, var2, var3);
- }
-
- TextStyleRun(TextParagraph var1, String var2, int var3, int var4, Hashtable var5) {
- this();
- this.init(var1, var2, var3, var4, var5);
- }
-
- void init(TextParagraph var1) {
- this._paragraph = var1;
- }
-
- void init(TextParagraph var1, String var2, Hashtable var3) {
- this.init(var1);
- this.setText(var2);
- this.setAttributes(var3);
- }
-
- void init(TextParagraph var1, String var2, int var3, int var4, Hashtable var5) {
- this.init(var1);
- this.setText(var2, var3, var4);
- this.setAttributes(var5);
- }
-
- TextStyleRun createEmptyRun() {
- return new TextStyleRun(this._paragraph, "", TextView.attributesByRemovingStaticAttributes(this._attributes));
- }
-
- TextStyleRun createEmptyRun(Hashtable var1) {
- return new TextStyleRun(this._paragraph, "", var1);
- }
-
- void setParagraph(TextParagraph var1) {
- this._paragraph = var1;
- }
-
- TextParagraph paragraph() {
- return this._paragraph;
- }
-
- void setText(String var1) {
- this._contents = new FastStringBuffer(var1);
- }
-
- void setText(String var1, int var2, int var3) {
- this._contents = new FastStringBuffer(var1, var2, var3);
- }
-
- void setText(StringBuffer var1) {
- this.setText(var1.toString());
- }
-
- int rangeIndex() {
- int var1 = this._paragraph._startChar;
- Vector var2 = this._paragraph.runsBefore(this);
- int var3 = 0;
-
- for(int var4 = var2.count(); var3 < var4; ++var3) {
- var1 += ((TextStyleRun)var2.elementAt(var3)).charCount();
- }
-
- return var1;
- }
-
- Range range() {
- return TextView.allocateRange(this.rangeIndex(), this.charCount());
- }
-
- private Font getFont() {
- Font var1 = null;
- if (this._paragraph.owner().usesSingleFont()) {
- var1 = (Font)this._paragraph.owner().defaultAttributes().get("FontKey");
- return var1;
- } else {
- if (this._attributes != null) {
- var1 = (Font)this._attributes.get("FontKey");
- }
-
- if (var1 == null) {
- var1 = (Font)this._paragraph.owner().defaultAttributes().get("FontKey");
- }
-
- return var1;
- }
- }
-
- private Color getColor() {
- Object var1 = null;
- Color var2;
- if (this._attributes != null) {
- if (this._attributes.get("LinkKey") != null) {
- if (this._attributes.get("_IFCLinkPressedKey") != null) {
- var2 = (Color)this._attributes.get("PressedLinkColorKey");
- } else {
- var2 = (Color)this._attributes.get("LinkColorKey");
- }
- } else {
- var2 = (Color)this._attributes.get("TextColorKey");
- }
- } else {
- var2 = (Color)this._paragraph.owner().defaultAttributes().get("TextColorKey");
- }
-
- return var2;
- }
-
- private void validateFontMetricsCache() {
- if (!this._paragraph.owner().usesSingleFont() && this._attributes != null && this._attributes.get("FontKey") != null) {
- if (this._fontMetricsCache == null) {
- this._fontMetricsCache = this.getFont().fontMetrics();
- }
-
- } else {
- this._fontMetricsCache = this._paragraph.owner().defaultFontMetrics();
- }
- }
-
- private void invalidateFontMetricsCache() {
- this._fontMetricsCache = null;
- }
-
- boolean containsATextAttachment() {
- return this._attributes != null && this._attributes.get("TextAttachmentKey") != null;
- }
-
- Rect textAttachmentBoundsForOrigin(int var1, int var2, int var3) {
- Rect var5 = new Rect();
- TextAttachment var4;
- if (this._attributes != null && (var4 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- var5.x = var1;
- var5.y = var2 + var3 - var4.height() + this.attachmentBaselineOffset();
- var5.width = var4.width();
- var5.height = var4.height();
- return var5;
- } else {
- return null;
- }
- }
-
- char charAt(int var1) {
- FastStringBuffer var2 = this._contents;
- return var2.length() != 0 && var1 < var2.length() ? var2.charAt(var1) : '\u0000';
- }
-
- void insertCharAt(char var1, int var2) {
- if (this._contents == null) {
- FastStringBuffer var4 = new FastStringBuffer(var1);
- this._contents = var4;
- } else {
- FastStringBuffer var3 = this._contents;
- var3.insert(var1, var2);
- }
- }
-
- void insertStringAt(String var1, int var2) {
- if (var2 >= 0 && var1 != null) {
- if (this._contents == null) {
- FastStringBuffer var4 = new FastStringBuffer(var1);
- this._contents = var4;
- } else {
- FastStringBuffer var3 = this._contents;
- var3.insert(var1, var2);
- }
- }
- }
-
- void removeCharAt(int var1) {
- FastStringBuffer var2 = this._contents;
- if (var2.length() != 0 && var1 < var2.length()) {
- var2.removeCharAt(var1);
- }
- }
-
- TextStyleRun breakAt(int var1) {
- FastStringBuffer var4 = this._contents;
- if (var4.length() != 0 && var1 < var4.length()) {
- String var3 = var4.toString();
- TextStyleRun var2 = new TextStyleRun(this._paragraph, var3.substring(var1, var4.length()), TextView.attributesByRemovingStaticAttributes(this._attributes));
- var4.truncateToLength(var1);
- return var2;
- } else {
- return this.createEmptyRun(TextView.attributesByRemovingStaticAttributes(this._attributes));
- }
- }
-
- void cutBefore(int var1) {
- FastStringBuffer var2 = this._contents;
- if (var2.length() != 0 && var1 < var2.length()) {
- var2.moveChars(var1, 0);
- }
- }
-
- void cutAfter(int var1) {
- FastStringBuffer var2 = this._contents;
- if (var2.length() != 0 && var1 < var2.length()) {
- var2.truncateToLength(var1);
- }
- }
-
- String text() {
- return this._contents.toString();
- }
-
- public String toString() {
- String var1 = "";
- if (this._attributes != null) {
- var1 = var1 + this._attributes.toString();
- } else {
- var1 = var1 + "{DefAttr}";
- }
-
- var1 = var1 + "**(";
- var1 = var1 + this._contents.toString();
- var1 = var1 + ")**";
- return var1;
- }
-
- int charCount() {
- return this._contents.length();
- }
-
- int attachmentBaselineOffset() {
- Integer var1;
- return this._attributes != null && (var1 = (Integer)this._attributes.get("TextAttachmentBaselineOffsetKey")) != null ? var1 : 0;
- }
-
- int height() {
- TextAttachment var1;
- if (this._attributes != null && (var1 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- int var2 = this.attachmentBaselineOffset();
- return var2 > 0 ? Math.max(var1.height(), var2) : var1.height() + Math.abs(var2);
- } else {
- this.validateFontMetricsCache();
- return this._fontMetricsCache.ascent() + this._fontMetricsCache.descent();
- }
- }
-
- int baseline() {
- TextAttachment var1;
- if (this._attributes != null && (var1 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- int var2 = this.attachmentBaselineOffset();
- return Math.max(var1.height() - var2, 0);
- } else {
- this.validateFontMetricsCache();
- return this._fontMetricsCache.ascent();
- }
- }
-
- int _widthForTab(int var1, int[] var2) {
- if (var2 == null) {
- return 0;
- } else {
- for(int var3 = 0; var3 < var2.length; ++var3) {
- if (var1 < var2[var3]) {
- return var2[var3] - var1;
- }
- }
-
- return 0;
- }
- }
-
- int _breakForSubstring(int var1, int var2, int var3) {
- for(int var4 = this._widthOfSubstring(var1, var2, 0, (int[])null); var4 > var3 && var2 > 0; var4 = this._widthOfSubstring(var1, var2, 0, (int[])null)) {
- --var2;
- }
-
- return var2;
- }
-
- int charsForWidth(int var1, int var2, int var3, int var4, int[] var5) {
- int var13 = -1;
- int var14 = var3;
- char[] var16 = new char[1];
- if (this._contents == null) {
- this._remainder = var3;
- return 0;
- } else {
- TextAttachment var6;
- if (this._attributes != null && (var6 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- if (var6.width() > var4) {
- if (var3 == var4) {
- this._remainder = 0;
- return 1;
- } else {
- return 0;
- }
- } else if (var6.width() <= var3) {
- this._remainder = var3 - var6.width();
- return 1;
- } else {
- this._remainder = var3;
- return 0;
- }
- } else {
- this.validateFontMetricsCache();
- int[] var7 = this._fontMetricsCache.widthsArray();
- int var8 = this._contents.length();
-
- int var9;
- int var10;
- int var11;
- for(var9 = var1; var9 < var8 && var14 > 0; var14 -= var10 + var11) {
- var11 = 0;
- var10 = 0;
- int var12 = var9;
- int var15 = -1;
-
- while(var9 < var8 && this._contents.buffer[var9] != ' ' && this._contents.buffer[var9] != '\t') {
- if (this._contents.buffer[var9] < 256) {
- var10 += var7[this._contents.buffer[var9]];
- } else {
- var16[0] = this._contents.buffer[var9];
- var10 += this._fontMetricsCache.stringWidth(new String(var16));
- }
-
- ++var9;
- if (var10 > var14 && var15 == -1) {
- var15 = var9;
- break;
- }
- }
-
- if (var9 < var8 && (this._contents.buffer[var9] == ' ' || this._contents.buffer[var9] == '\t')) {
- for(; var9 < var8 && (this._contents.buffer[var9] == ' ' || this._contents.buffer[var9] == '\t'); ++var9) {
- if (this._contents.buffer[var9] == ' ') {
- var11 += var7[32];
- } else {
- var11 += this._widthForTab(var2 + var10 + var11, var5);
- if (var13 == -1) {
- var13 = var9;
- }
- }
- }
- }
-
- if (var10 + var11 > var14) {
- if (var14 < var4 && var10 <= var14) {
- var14 -= var10;
- break;
- }
-
- if (var10 > var14 && var14 >= var4) {
- if (var15 != -1) {
- var8 = this._breakForSubstring(var12, var15 - var12, var14);
- } else {
- var8 = this._breakForSubstring(var12, var9 - var12, var14);
- }
-
- if (var8 > 0) {
- var9 = var1 + var8;
- var14 -= this._widthOfSubstring(var1, var8, 0, (int[])null);
- } else {
- var9 = var12;
- }
- break;
- }
-
- var9 = var12;
- break;
- }
- }
-
- if (var14 > 0) {
- this._remainder = var14;
- } else {
- this._remainder = 0;
- }
-
- if (var9 == var1 && var14 == var4) {
- this._remainder = 0;
- return 1;
- } else {
- return var9 - var1;
- }
- }
- }
- }
-
- int _widthOfSubstring(int var1, int var2, int var3, int[] var4) {
- int var6 = 0;
- char[] var9 = new char[1];
- this.validateFontMetricsCache();
- int[] var5 = this._fontMetricsCache.widthsArray();
- int var8 = var1 + var2;
-
- for(int var7 = var1; var7 < var8; ++var7) {
- if (this._contents.buffer[var7] == '\t' && var4 != null) {
- var6 += this._widthForTab(var3 + var6, var4);
- } else if (this._contents.buffer[var7] < 256) {
- var6 += var5[this._contents.buffer[var7]];
- } else {
- var9[0] = this._contents.buffer[var7];
- var6 += this._fontMetricsCache.stringWidth(new String(var9));
- }
- }
-
- return var6;
- }
-
- int widthOfContents(int var1, int var2, int var3, int[] var4) {
- TextAttachment var5;
- if (this._attributes != null && (var5 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- return var5.width();
- } else {
- this.validateFontMetricsCache();
- if (var2 == 0) {
- return 0;
- } else {
- if (var1 < 0) {
- var1 = 0;
- }
-
- if (var1 + var2 > this._contents.length()) {
- var2 = this._contents.length() - var1;
- }
-
- return this._widthOfSubstring(var1, var2, var3, var4);
- }
- }
- }
-
- int drawCharacters(Graphics var1, int var2, int var3, int var4, int var5, int[] var6) {
- if (var1 == null) {
- return 0;
- } else {
- TextAttachment var7;
- if (this._attributes != null && (var7 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
- int var16 = this.attachmentBaselineOffset();
- Rect var8 = Rect.newRect(var4, var5 - var7.height() + var16, 0, 0);
- var8.width = var7.width();
- var8.height = var7.height();
- var7.drawInRect(var1, var8);
- Rect.returnRect(var8);
- return var7.width();
- } else {
- this.validateFontMetricsCache();
- if (this._fontMetricsCache != null && var3 > 0) {
- var1.setFont(this.getFont());
- var1.setColor(this.getColor());
- if (var2 < 0) {
- var2 = 0;
- }
-
- if (var2 + var3 > this._contents.length()) {
- var3 = this._contents.length() - var2;
- }
-
- char[] var9 = this._contents.charArray();
- int[] var10 = this._fontMetricsCache.widthsArray();
- int var11 = var2 + var3;
-
- int var14;
- int var15;
- for(var15 = 0; var2 < var11; var2 += var14) {
- int var13 = this._contents.indexOf('\t', var2);
- if (var13 == -1) {
- var14 = var11 - var2;
- } else {
- var14 = var13 - var2;
- }
-
- if (var14 > 0) {
- var1.drawChars(var9, var2, var14, var4, var5);
- }
-
- if (var13 != -1) {
- ++var14;
- }
-
- int var12 = this._widthOfSubstring(var2, var14, var4, var6);
- var4 += var12;
- var15 += var12;
- }
-
- return var15;
- } else {
- return 0;
- }
- }
- }
- }
-
- public void describeClassInfo(ClassInfo var1) {
- var1.addClass("netscape.application.TextStyleRun", 1);
- var1.addField("contents", (byte)16);
- var1.addField("attributes", (byte)18);
- }
-
- public void encode(Encoder var1) throws CodingException {
- var1.encodeString("contents", this._contents.toString());
- var1.encodeObject("attributes", this._attributes);
- }
-
- public void decode(Decoder var1) throws CodingException {
- this._contents = new FastStringBuffer(var1.decodeString("contents"));
- this._attributes = (Hashtable)var1.decodeObject("attributes");
- }
-
- public void finishDecoding() throws CodingException {
- }
-
- void setAttributes(Hashtable var1) {
- if (var1 != null) {
- this.invalidateFontMetricsCache();
- this._attributes = (Hashtable)var1.clone();
- } else {
- this._attributes = null;
- }
-
- if (this._attributes != null && this._attributes.get("ParagraphFormatKey") != null) {
- this._attributes.remove("ParagraphFormatKey");
- }
-
- }
-
- void appendAttributes(Hashtable var1) {
- if (var1 != null) {
- if (this._attributes == null) {
- this._attributes = (Hashtable)this._paragraph.owner().defaultAttributes().clone();
- }
-
- String var3;
- for(Enumeration var2 = var1.keys(); var2.hasMoreElements(); this._attributes.put(var3, var1.get(var3))) {
- var3 = (String)var2.nextElement();
- if (var3.equals("FontKey")) {
- this.invalidateFontMetricsCache();
- }
- }
-
- }
- }
-
- Hashtable attributes() {
- if (this._attributes != null) {
- this._attributes.put("ParagraphFormatKey", this._paragraph.currentParagraphFormat());
- return this._attributes;
- } else {
- return null;
- }
- }
- }
-