home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / CFJava.cab / CFJavaRuntime.cab / netscape / application / TextStyleRun.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-10-01  |  11.3 KB  |  573 lines

  1. package netscape.application;
  2.  
  3. import netscape.util.ClassInfo;
  4. import netscape.util.Codable;
  5. import netscape.util.CodingException;
  6. import netscape.util.Decoder;
  7. import netscape.util.Encoder;
  8. import netscape.util.Enumeration;
  9. import netscape.util.Hashtable;
  10. import netscape.util.Vector;
  11.  
  12. public class TextStyleRun implements Codable {
  13.    private static final String CONTENTS_KEY = "contents";
  14.    private static final String ATTRIBUTES_KEY = "attributes";
  15.    TextParagraph _paragraph;
  16.    FastStringBuffer _contents;
  17.    Hashtable _attributes;
  18.    FontMetrics _fontMetricsCache;
  19.    int _remainder;
  20.  
  21.    public TextStyleRun() {
  22.    }
  23.  
  24.    TextStyleRun(TextParagraph var1) {
  25.       this();
  26.       this.init(var1);
  27.    }
  28.  
  29.    TextStyleRun(TextParagraph var1, String var2, Hashtable var3) {
  30.       this();
  31.       this.init(var1, var2, var3);
  32.    }
  33.  
  34.    TextStyleRun(TextParagraph var1, String var2, int var3, int var4, Hashtable var5) {
  35.       this();
  36.       this.init(var1, var2, var3, var4, var5);
  37.    }
  38.  
  39.    void init(TextParagraph var1) {
  40.       this._paragraph = var1;
  41.    }
  42.  
  43.    void init(TextParagraph var1, String var2, Hashtable var3) {
  44.       this.init(var1);
  45.       this.setText(var2);
  46.       this.setAttributes(var3);
  47.    }
  48.  
  49.    void init(TextParagraph var1, String var2, int var3, int var4, Hashtable var5) {
  50.       this.init(var1);
  51.       this.setText(var2, var3, var4);
  52.       this.setAttributes(var5);
  53.    }
  54.  
  55.    TextStyleRun createEmptyRun() {
  56.       return new TextStyleRun(this._paragraph, "", TextView.attributesByRemovingStaticAttributes(this._attributes));
  57.    }
  58.  
  59.    TextStyleRun createEmptyRun(Hashtable var1) {
  60.       return new TextStyleRun(this._paragraph, "", var1);
  61.    }
  62.  
  63.    void setParagraph(TextParagraph var1) {
  64.       this._paragraph = var1;
  65.    }
  66.  
  67.    TextParagraph paragraph() {
  68.       return this._paragraph;
  69.    }
  70.  
  71.    void setText(String var1) {
  72.       this._contents = new FastStringBuffer(var1);
  73.    }
  74.  
  75.    void setText(String var1, int var2, int var3) {
  76.       this._contents = new FastStringBuffer(var1, var2, var3);
  77.    }
  78.  
  79.    void setText(StringBuffer var1) {
  80.       this.setText(var1.toString());
  81.    }
  82.  
  83.    int rangeIndex() {
  84.       int var1 = this._paragraph._startChar;
  85.       Vector var2 = this._paragraph.runsBefore(this);
  86.       int var3 = 0;
  87.  
  88.       for(int var4 = var2.count(); var3 < var4; ++var3) {
  89.          var1 += ((TextStyleRun)var2.elementAt(var3)).charCount();
  90.       }
  91.  
  92.       return var1;
  93.    }
  94.  
  95.    Range range() {
  96.       return TextView.allocateRange(this.rangeIndex(), this.charCount());
  97.    }
  98.  
  99.    private Font getFont() {
  100.       Font var1 = null;
  101.       if (this._paragraph.owner().usesSingleFont()) {
  102.          var1 = (Font)this._paragraph.owner().defaultAttributes().get("FontKey");
  103.          return var1;
  104.       } else {
  105.          if (this._attributes != null) {
  106.             var1 = (Font)this._attributes.get("FontKey");
  107.          }
  108.  
  109.          if (var1 == null) {
  110.             var1 = (Font)this._paragraph.owner().defaultAttributes().get("FontKey");
  111.          }
  112.  
  113.          return var1;
  114.       }
  115.    }
  116.  
  117.    private Color getColor() {
  118.       Object var1 = null;
  119.       Color var2;
  120.       if (this._attributes != null) {
  121.          if (this._attributes.get("LinkKey") != null) {
  122.             if (this._attributes.get("_IFCLinkPressedKey") != null) {
  123.                var2 = (Color)this._attributes.get("PressedLinkColorKey");
  124.             } else {
  125.                var2 = (Color)this._attributes.get("LinkColorKey");
  126.             }
  127.          } else {
  128.             var2 = (Color)this._attributes.get("TextColorKey");
  129.          }
  130.       } else {
  131.          var2 = (Color)this._paragraph.owner().defaultAttributes().get("TextColorKey");
  132.       }
  133.  
  134.       return var2;
  135.    }
  136.  
  137.    private void validateFontMetricsCache() {
  138.       if (!this._paragraph.owner().usesSingleFont() && this._attributes != null && this._attributes.get("FontKey") != null) {
  139.          if (this._fontMetricsCache == null) {
  140.             this._fontMetricsCache = this.getFont().fontMetrics();
  141.          }
  142.  
  143.       } else {
  144.          this._fontMetricsCache = this._paragraph.owner().defaultFontMetrics();
  145.       }
  146.    }
  147.  
  148.    private void invalidateFontMetricsCache() {
  149.       this._fontMetricsCache = null;
  150.    }
  151.  
  152.    boolean containsATextAttachment() {
  153.       return this._attributes != null && this._attributes.get("TextAttachmentKey") != null;
  154.    }
  155.  
  156.    Rect textAttachmentBoundsForOrigin(int var1, int var2, int var3) {
  157.       Rect var5 = new Rect();
  158.       TextAttachment var4;
  159.       if (this._attributes != null && (var4 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  160.          var5.x = var1;
  161.          var5.y = var2 + var3 - var4.height() + this.attachmentBaselineOffset();
  162.          var5.width = var4.width();
  163.          var5.height = var4.height();
  164.          return var5;
  165.       } else {
  166.          return null;
  167.       }
  168.    }
  169.  
  170.    char charAt(int var1) {
  171.       FastStringBuffer var2 = this._contents;
  172.       return var2.length() != 0 && var1 < var2.length() ? var2.charAt(var1) : '\u0000';
  173.    }
  174.  
  175.    void insertCharAt(char var1, int var2) {
  176.       if (this._contents == null) {
  177.          FastStringBuffer var4 = new FastStringBuffer(var1);
  178.          this._contents = var4;
  179.       } else {
  180.          FastStringBuffer var3 = this._contents;
  181.          var3.insert(var1, var2);
  182.       }
  183.    }
  184.  
  185.    void insertStringAt(String var1, int var2) {
  186.       if (var2 >= 0 && var1 != null) {
  187.          if (this._contents == null) {
  188.             FastStringBuffer var4 = new FastStringBuffer(var1);
  189.             this._contents = var4;
  190.          } else {
  191.             FastStringBuffer var3 = this._contents;
  192.             var3.insert(var1, var2);
  193.          }
  194.       }
  195.    }
  196.  
  197.    void removeCharAt(int var1) {
  198.       FastStringBuffer var2 = this._contents;
  199.       if (var2.length() != 0 && var1 < var2.length()) {
  200.          var2.removeCharAt(var1);
  201.       }
  202.    }
  203.  
  204.    TextStyleRun breakAt(int var1) {
  205.       FastStringBuffer var4 = this._contents;
  206.       if (var4.length() != 0 && var1 < var4.length()) {
  207.          String var3 = var4.toString();
  208.          TextStyleRun var2 = new TextStyleRun(this._paragraph, var3.substring(var1, var4.length()), TextView.attributesByRemovingStaticAttributes(this._attributes));
  209.          var4.truncateToLength(var1);
  210.          return var2;
  211.       } else {
  212.          return this.createEmptyRun(TextView.attributesByRemovingStaticAttributes(this._attributes));
  213.       }
  214.    }
  215.  
  216.    void cutBefore(int var1) {
  217.       FastStringBuffer var2 = this._contents;
  218.       if (var2.length() != 0 && var1 < var2.length()) {
  219.          var2.moveChars(var1, 0);
  220.       }
  221.    }
  222.  
  223.    void cutAfter(int var1) {
  224.       FastStringBuffer var2 = this._contents;
  225.       if (var2.length() != 0 && var1 < var2.length()) {
  226.          var2.truncateToLength(var1);
  227.       }
  228.    }
  229.  
  230.    String text() {
  231.       return this._contents.toString();
  232.    }
  233.  
  234.    public String toString() {
  235.       String var1 = "";
  236.       if (this._attributes != null) {
  237.          var1 = var1 + this._attributes.toString();
  238.       } else {
  239.          var1 = var1 + "{DefAttr}";
  240.       }
  241.  
  242.       var1 = var1 + "**(";
  243.       var1 = var1 + this._contents.toString();
  244.       var1 = var1 + ")**";
  245.       return var1;
  246.    }
  247.  
  248.    int charCount() {
  249.       return this._contents.length();
  250.    }
  251.  
  252.    int attachmentBaselineOffset() {
  253.       Integer var1;
  254.       return this._attributes != null && (var1 = (Integer)this._attributes.get("TextAttachmentBaselineOffsetKey")) != null ? var1 : 0;
  255.    }
  256.  
  257.    int height() {
  258.       TextAttachment var1;
  259.       if (this._attributes != null && (var1 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  260.          int var2 = this.attachmentBaselineOffset();
  261.          return var2 > 0 ? Math.max(var1.height(), var2) : var1.height() + Math.abs(var2);
  262.       } else {
  263.          this.validateFontMetricsCache();
  264.          return this._fontMetricsCache.ascent() + this._fontMetricsCache.descent();
  265.       }
  266.    }
  267.  
  268.    int baseline() {
  269.       TextAttachment var1;
  270.       if (this._attributes != null && (var1 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  271.          int var2 = this.attachmentBaselineOffset();
  272.          return Math.max(var1.height() - var2, 0);
  273.       } else {
  274.          this.validateFontMetricsCache();
  275.          return this._fontMetricsCache.ascent();
  276.       }
  277.    }
  278.  
  279.    int _widthForTab(int var1, int[] var2) {
  280.       if (var2 == null) {
  281.          return 0;
  282.       } else {
  283.          for(int var3 = 0; var3 < var2.length; ++var3) {
  284.             if (var1 < var2[var3]) {
  285.                return var2[var3] - var1;
  286.             }
  287.          }
  288.  
  289.          return 0;
  290.       }
  291.    }
  292.  
  293.    int _breakForSubstring(int var1, int var2, int var3) {
  294.       for(int var4 = this._widthOfSubstring(var1, var2, 0, (int[])null); var4 > var3 && var2 > 0; var4 = this._widthOfSubstring(var1, var2, 0, (int[])null)) {
  295.          --var2;
  296.       }
  297.  
  298.       return var2;
  299.    }
  300.  
  301.    int charsForWidth(int var1, int var2, int var3, int var4, int[] var5) {
  302.       int var13 = -1;
  303.       int var14 = var3;
  304.       char[] var16 = new char[1];
  305.       if (this._contents == null) {
  306.          this._remainder = var3;
  307.          return 0;
  308.       } else {
  309.          TextAttachment var6;
  310.          if (this._attributes != null && (var6 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  311.             if (var6.width() > var4) {
  312.                if (var3 == var4) {
  313.                   this._remainder = 0;
  314.                   return 1;
  315.                } else {
  316.                   return 0;
  317.                }
  318.             } else if (var6.width() <= var3) {
  319.                this._remainder = var3 - var6.width();
  320.                return 1;
  321.             } else {
  322.                this._remainder = var3;
  323.                return 0;
  324.             }
  325.          } else {
  326.             this.validateFontMetricsCache();
  327.             int[] var7 = this._fontMetricsCache.widthsArray();
  328.             int var8 = this._contents.length();
  329.  
  330.             int var9;
  331.             int var10;
  332.             int var11;
  333.             for(var9 = var1; var9 < var8 && var14 > 0; var14 -= var10 + var11) {
  334.                var11 = 0;
  335.                var10 = 0;
  336.                int var12 = var9;
  337.                int var15 = -1;
  338.  
  339.                while(var9 < var8 && this._contents.buffer[var9] != ' ' && this._contents.buffer[var9] != '\t') {
  340.                   if (this._contents.buffer[var9] < 256) {
  341.                      var10 += var7[this._contents.buffer[var9]];
  342.                   } else {
  343.                      var16[0] = this._contents.buffer[var9];
  344.                      var10 += this._fontMetricsCache.stringWidth(new String(var16));
  345.                   }
  346.  
  347.                   ++var9;
  348.                   if (var10 > var14 && var15 == -1) {
  349.                      var15 = var9;
  350.                      break;
  351.                   }
  352.                }
  353.  
  354.                if (var9 < var8 && (this._contents.buffer[var9] == ' ' || this._contents.buffer[var9] == '\t')) {
  355.                   for(; var9 < var8 && (this._contents.buffer[var9] == ' ' || this._contents.buffer[var9] == '\t'); ++var9) {
  356.                      if (this._contents.buffer[var9] == ' ') {
  357.                         var11 += var7[32];
  358.                      } else {
  359.                         var11 += this._widthForTab(var2 + var10 + var11, var5);
  360.                         if (var13 == -1) {
  361.                            var13 = var9;
  362.                         }
  363.                      }
  364.                   }
  365.                }
  366.  
  367.                if (var10 + var11 > var14) {
  368.                   if (var14 < var4 && var10 <= var14) {
  369.                      var14 -= var10;
  370.                      break;
  371.                   }
  372.  
  373.                   if (var10 > var14 && var14 >= var4) {
  374.                      if (var15 != -1) {
  375.                         var8 = this._breakForSubstring(var12, var15 - var12, var14);
  376.                      } else {
  377.                         var8 = this._breakForSubstring(var12, var9 - var12, var14);
  378.                      }
  379.  
  380.                      if (var8 > 0) {
  381.                         var9 = var1 + var8;
  382.                         var14 -= this._widthOfSubstring(var1, var8, 0, (int[])null);
  383.                      } else {
  384.                         var9 = var12;
  385.                      }
  386.                      break;
  387.                   }
  388.  
  389.                   var9 = var12;
  390.                   break;
  391.                }
  392.             }
  393.  
  394.             if (var14 > 0) {
  395.                this._remainder = var14;
  396.             } else {
  397.                this._remainder = 0;
  398.             }
  399.  
  400.             if (var9 == var1 && var14 == var4) {
  401.                this._remainder = 0;
  402.                return 1;
  403.             } else {
  404.                return var9 - var1;
  405.             }
  406.          }
  407.       }
  408.    }
  409.  
  410.    int _widthOfSubstring(int var1, int var2, int var3, int[] var4) {
  411.       int var6 = 0;
  412.       char[] var9 = new char[1];
  413.       this.validateFontMetricsCache();
  414.       int[] var5 = this._fontMetricsCache.widthsArray();
  415.       int var8 = var1 + var2;
  416.  
  417.       for(int var7 = var1; var7 < var8; ++var7) {
  418.          if (this._contents.buffer[var7] == '\t' && var4 != null) {
  419.             var6 += this._widthForTab(var3 + var6, var4);
  420.          } else if (this._contents.buffer[var7] < 256) {
  421.             var6 += var5[this._contents.buffer[var7]];
  422.          } else {
  423.             var9[0] = this._contents.buffer[var7];
  424.             var6 += this._fontMetricsCache.stringWidth(new String(var9));
  425.          }
  426.       }
  427.  
  428.       return var6;
  429.    }
  430.  
  431.    int widthOfContents(int var1, int var2, int var3, int[] var4) {
  432.       TextAttachment var5;
  433.       if (this._attributes != null && (var5 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  434.          return var5.width();
  435.       } else {
  436.          this.validateFontMetricsCache();
  437.          if (var2 == 0) {
  438.             return 0;
  439.          } else {
  440.             if (var1 < 0) {
  441.                var1 = 0;
  442.             }
  443.  
  444.             if (var1 + var2 > this._contents.length()) {
  445.                var2 = this._contents.length() - var1;
  446.             }
  447.  
  448.             return this._widthOfSubstring(var1, var2, var3, var4);
  449.          }
  450.       }
  451.    }
  452.  
  453.    int drawCharacters(Graphics var1, int var2, int var3, int var4, int var5, int[] var6) {
  454.       if (var1 == null) {
  455.          return 0;
  456.       } else {
  457.          TextAttachment var7;
  458.          if (this._attributes != null && (var7 = (TextAttachment)this._attributes.get("TextAttachmentKey")) != null) {
  459.             int var16 = this.attachmentBaselineOffset();
  460.             Rect var8 = Rect.newRect(var4, var5 - var7.height() + var16, 0, 0);
  461.             var8.width = var7.width();
  462.             var8.height = var7.height();
  463.             var7.drawInRect(var1, var8);
  464.             Rect.returnRect(var8);
  465.             return var7.width();
  466.          } else {
  467.             this.validateFontMetricsCache();
  468.             if (this._fontMetricsCache != null && var3 > 0) {
  469.                var1.setFont(this.getFont());
  470.                var1.setColor(this.getColor());
  471.                if (var2 < 0) {
  472.                   var2 = 0;
  473.                }
  474.  
  475.                if (var2 + var3 > this._contents.length()) {
  476.                   var3 = this._contents.length() - var2;
  477.                }
  478.  
  479.                char[] var9 = this._contents.charArray();
  480.                int[] var10 = this._fontMetricsCache.widthsArray();
  481.                int var11 = var2 + var3;
  482.  
  483.                int var14;
  484.                int var15;
  485.                for(var15 = 0; var2 < var11; var2 += var14) {
  486.                   int var13 = this._contents.indexOf('\t', var2);
  487.                   if (var13 == -1) {
  488.                      var14 = var11 - var2;
  489.                   } else {
  490.                      var14 = var13 - var2;
  491.                   }
  492.  
  493.                   if (var14 > 0) {
  494.                      var1.drawChars(var9, var2, var14, var4, var5);
  495.                   }
  496.  
  497.                   if (var13 != -1) {
  498.                      ++var14;
  499.                   }
  500.  
  501.                   int var12 = this._widthOfSubstring(var2, var14, var4, var6);
  502.                   var4 += var12;
  503.                   var15 += var12;
  504.                }
  505.  
  506.                return var15;
  507.             } else {
  508.                return 0;
  509.             }
  510.          }
  511.       }
  512.    }
  513.  
  514.    public void describeClassInfo(ClassInfo var1) {
  515.       var1.addClass("netscape.application.TextStyleRun", 1);
  516.       var1.addField("contents", (byte)16);
  517.       var1.addField("attributes", (byte)18);
  518.    }
  519.  
  520.    public void encode(Encoder var1) throws CodingException {
  521.       var1.encodeString("contents", this._contents.toString());
  522.       var1.encodeObject("attributes", this._attributes);
  523.    }
  524.  
  525.    public void decode(Decoder var1) throws CodingException {
  526.       this._contents = new FastStringBuffer(var1.decodeString("contents"));
  527.       this._attributes = (Hashtable)var1.decodeObject("attributes");
  528.    }
  529.  
  530.    public void finishDecoding() throws CodingException {
  531.    }
  532.  
  533.    void setAttributes(Hashtable var1) {
  534.       if (var1 != null) {
  535.          this.invalidateFontMetricsCache();
  536.          this._attributes = (Hashtable)var1.clone();
  537.       } else {
  538.          this._attributes = null;
  539.       }
  540.  
  541.       if (this._attributes != null && this._attributes.get("ParagraphFormatKey") != null) {
  542.          this._attributes.remove("ParagraphFormatKey");
  543.       }
  544.  
  545.    }
  546.  
  547.    void appendAttributes(Hashtable var1) {
  548.       if (var1 != null) {
  549.          if (this._attributes == null) {
  550.             this._attributes = (Hashtable)this._paragraph.owner().defaultAttributes().clone();
  551.          }
  552.  
  553.          String var3;
  554.          for(Enumeration var2 = var1.keys(); var2.hasMoreElements(); this._attributes.put(var3, var1.get(var3))) {
  555.             var3 = (String)var2.nextElement();
  556.             if (var3.equals("FontKey")) {
  557.                this.invalidateFontMetricsCache();
  558.             }
  559.          }
  560.  
  561.       }
  562.    }
  563.  
  564.    Hashtable attributes() {
  565.       if (this._attributes != null) {
  566.          this._attributes.put("ParagraphFormatKey", this._paragraph.currentParagraphFormat());
  567.          return this._attributes;
  568.       } else {
  569.          return null;
  570.       }
  571.    }
  572. }
  573.