home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / javax / swing / text / html / StyleSheet.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  16.8 KB  |  1,040 lines

  1. package javax.swing.text.html;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.io.BufferedReader;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.InputStreamReader;
  9. import java.io.ObjectInputStream;
  10. import java.io.Reader;
  11. import java.io.StringReader;
  12. import java.net.URL;
  13. import java.util.Enumeration;
  14. import java.util.Hashtable;
  15. import java.util.Vector;
  16. import javax.swing.ImageIcon;
  17. import javax.swing.border.Border;
  18. import javax.swing.border.EmptyBorder;
  19. import javax.swing.text.AttributeSet;
  20. import javax.swing.text.Element;
  21. import javax.swing.text.MutableAttributeSet;
  22. import javax.swing.text.SimpleAttributeSet;
  23. import javax.swing.text.Style;
  24. import javax.swing.text.StyleConstants;
  25. import javax.swing.text.StyleContext;
  26. import javax.swing.text.View;
  27. import javax.swing.text.html.HTML.Attribute;
  28.  
  29. public class StyleSheet extends StyleContext {
  30.    static final Border noBorder = new EmptyBorder(0, 0, 0, 0);
  31.    static final int DEFAULT_FONT_SIZE = 3;
  32.    private CSS css;
  33.    private Hashtable selectorMapping = new Hashtable();
  34.    private Hashtable resolvedStyles = new Hashtable();
  35.    private Vector linkedStyleSheets;
  36.    private URL base;
  37.    static final SheetAttribute SPECIFICITY = new SheetAttribute("specificity", false);
  38.    static final SheetAttribute RULE = new SheetAttribute("rule", false);
  39.  
  40.    public StyleSheet() {
  41.       if (this.css == null) {
  42.          this.css = new CSS();
  43.       }
  44.  
  45.    }
  46.  
  47.    public Style getRule(HTML.Tag var1, Element var2) {
  48.       SearchBuffer var3 = javax.swing.text.html.StyleSheet.SearchBuffer.obtainSearchBuffer();
  49.  
  50.       Style var13;
  51.       try {
  52.          Vector var4 = var3.getVector();
  53.  
  54.          for(Element var5 = var2; var5 != null; var5 = var5.getParentElement()) {
  55.             var4.addElement(var5);
  56.          }
  57.  
  58.          int var6 = var4.size();
  59.          StringBuffer var7 = var3.getStringBuffer();
  60.  
  61.          for(int var11 = var6 - 1; var11 >= 1; --var11) {
  62.             var2 = (Element)var4.elementAt(var11);
  63.             AttributeSet var8 = var2.getAttributes();
  64.             Object var10 = var8.getAttribute(StyleConstants.NameAttribute);
  65.             String var9 = var10.toString();
  66.             var7.append(var9);
  67.             if (var8 != null) {
  68.                if (var8.isDefined(Attribute.ID)) {
  69.                   var7.append('#');
  70.                   var7.append(var8.getAttribute(Attribute.ID));
  71.                } else if (var8.isDefined(Attribute.CLASS)) {
  72.                   var7.append('.');
  73.                   var7.append(var8.getAttribute(Attribute.CLASS));
  74.                }
  75.             }
  76.  
  77.             var7.append(' ');
  78.          }
  79.  
  80.          var7.append(var1.toString());
  81.          var2 = (Element)var4.elementAt(0);
  82.          AttributeSet var20 = var2.getAttributes();
  83.          if (var2.isLeaf()) {
  84.             Object var12 = var20.getAttribute(var1);
  85.             if (var12 instanceof AttributeSet) {
  86.                var20 = (AttributeSet)var12;
  87.             } else {
  88.                var20 = null;
  89.             }
  90.          }
  91.  
  92.          if (var20 != null) {
  93.             if (var20.isDefined(Attribute.ID)) {
  94.                var7.append('#');
  95.                var7.append(var20.getAttribute(Attribute.ID));
  96.             } else if (var20.isDefined(Attribute.CLASS)) {
  97.                var7.append('.');
  98.                var7.append(var20.getAttribute(Attribute.CLASS));
  99.             }
  100.          }
  101.  
  102.          Style var21 = this.getResolvedStyle(var7.toString(), var4, var1);
  103.          var13 = var21;
  104.       } finally {
  105.          javax.swing.text.html.StyleSheet.SearchBuffer.releaseSearchBuffer(var3);
  106.       }
  107.  
  108.       return var13;
  109.    }
  110.  
  111.    public Style getRule(String var1) {
  112.       var1 = this.cleanSelectorString(var1);
  113.       if (var1 != null) {
  114.          Style var2 = this.getResolvedStyle(var1);
  115.          return var2;
  116.       } else {
  117.          return null;
  118.       }
  119.    }
  120.  
  121.    public void addRule(String var1) {
  122.       if (var1 != null) {
  123.          CssParser var2 = new CssParser(this);
  124.  
  125.          try {
  126.             var2.parse(this.getBase(), new StringReader(var1), false, false);
  127.          } catch (IOException var4) {
  128.          }
  129.       }
  130.  
  131.    }
  132.  
  133.    public AttributeSet getDeclaration(String var1) {
  134.       if (var1 == null) {
  135.          return SimpleAttributeSet.EMPTY;
  136.       } else {
  137.          CssParser var2 = new CssParser(this);
  138.          return var2.parseDeclaration(var1);
  139.       }
  140.    }
  141.  
  142.    public void loadRules(Reader var1, URL var2) throws IOException {
  143.       CssParser var3 = new CssParser(this);
  144.       var3.parse(var2, var1, false, false);
  145.    }
  146.  
  147.    public AttributeSet getViewAttributes(View var1) {
  148.       return new ViewAttributeSet(this, var1);
  149.    }
  150.  
  151.    public void removeStyle(String var1) {
  152.       Style var2 = ((StyleContext)this).getStyle(var1);
  153.       if (var2 != null) {
  154.          String var3 = this.cleanSelectorString(var1);
  155.          String[] var4 = this.getSimpleSelectors(var3);
  156.          synchronized(this) {
  157.             Object var6 = this.getRootSelectorMapping();
  158.  
  159.             for(int var7 = var4.length - 1; var7 >= 0; --var7) {
  160.                var6 = this.getSelectorMapping(var6, var4[var7], true);
  161.             }
  162.  
  163.             Style var8 = this.getMappingStyle(var6);
  164.             if (var8 != null) {
  165.                this.removeMappingStyle(var6);
  166.                if (this.resolvedStyles.size() > 0) {
  167.                   Enumeration var9 = this.resolvedStyles.elements();
  168.  
  169.                   while(var9.hasMoreElements()) {
  170.                      ResolvedStyle var10 = (ResolvedStyle)var9.nextElement();
  171.                      var10.removeStyle(var8);
  172.                   }
  173.                }
  174.             }
  175.          }
  176.       }
  177.  
  178.       super.removeStyle(var1);
  179.    }
  180.  
  181.    public void addStyleSheet(StyleSheet var1) {
  182.       synchronized(this) {
  183.          if (this.linkedStyleSheets == null) {
  184.             this.linkedStyleSheets = new Vector();
  185.          }
  186.  
  187.          if (!this.linkedStyleSheets.contains(var1)) {
  188.             this.linkedStyleSheets.insertElementAt(var1, 0);
  189.             this.linkStyleSheetAt(var1, 0);
  190.          }
  191.  
  192.       }
  193.    }
  194.  
  195.    public void removeStyleSheet(StyleSheet var1) {
  196.       synchronized(this) {
  197.          if (this.linkedStyleSheets != null) {
  198.             int var3 = this.linkedStyleSheets.indexOf(var1);
  199.             if (var3 != -1) {
  200.                this.linkedStyleSheets.removeElementAt(var3);
  201.                this.unlinkStyleSheet(var1, var3);
  202.                if (var3 == 0 && this.linkedStyleSheets.size() == 0) {
  203.                   this.linkedStyleSheets = null;
  204.                }
  205.             }
  206.          }
  207.  
  208.       }
  209.    }
  210.  
  211.    public StyleSheet[] getStyleSheets() {
  212.       synchronized(this) {
  213.          StyleSheet[] var1;
  214.          if (this.linkedStyleSheets != null) {
  215.             var1 = new StyleSheet[this.linkedStyleSheets.size()];
  216.             this.linkedStyleSheets.copyInto(var1);
  217.          } else {
  218.             var1 = null;
  219.          }
  220.  
  221.          return var1;
  222.       }
  223.    }
  224.  
  225.    public void importStyleSheet(URL var1) {
  226.       try {
  227.          InputStream var2 = var1.openStream();
  228.          BufferedReader var3 = new BufferedReader(new InputStreamReader(var2));
  229.          CssParser var4 = new CssParser(this);
  230.          var4.parse(var1, var3, false, true);
  231.          ((Reader)var3).close();
  232.          var2.close();
  233.       } catch (Throwable var5) {
  234.       }
  235.  
  236.    }
  237.  
  238.    public void setBase(URL var1) {
  239.       this.base = var1;
  240.    }
  241.  
  242.    public URL getBase() {
  243.       return this.base;
  244.    }
  245.  
  246.    public void addCSSAttribute(MutableAttributeSet var1, CSS.Attribute var2, String var3) {
  247.       this.css.addInternalCSSValue(var1, var2, var3);
  248.    }
  249.  
  250.    public boolean addCSSAttributeFromHTML(MutableAttributeSet var1, CSS.Attribute var2, String var3) {
  251.       Object var4 = this.css.getCssValue(var2, var3);
  252.       if (var4 != null) {
  253.          var1.addAttribute(var2, var4);
  254.          return true;
  255.       } else {
  256.          return false;
  257.       }
  258.    }
  259.  
  260.    public AttributeSet translateHTMLToCSS(AttributeSet var1) {
  261.       AttributeSet var2 = this.css.translateHTMLToCSS(var1);
  262.       Style var3 = ((StyleContext)this).addStyle((String)null, (Style)null);
  263.       var3.addAttributes(var2);
  264.       return var3;
  265.    }
  266.  
  267.    public AttributeSet addAttribute(AttributeSet var1, Object var2, Object var3) {
  268.       if (this.css == null) {
  269.          this.css = new CSS();
  270.       }
  271.  
  272.       if (var2 instanceof StyleConstants) {
  273.          Object var4 = this.css.styleConstantsValueToCSSValue((StyleConstants)var2, var3);
  274.          if (var4 != null) {
  275.             CSS.Attribute var5 = this.css.styleConstantsKeyToCSSKey((StyleConstants)var2);
  276.             if (var5 != null) {
  277.                return super.addAttribute(var1, var5, var4);
  278.             }
  279.          }
  280.       }
  281.  
  282.       return super.addAttribute(var1, var2, var3);
  283.    }
  284.  
  285.    public AttributeSet addAttributes(AttributeSet var1, AttributeSet var2) {
  286.       return super.addAttributes(var1, this.convertAttributeSet(var2));
  287.    }
  288.  
  289.    public AttributeSet removeAttribute(AttributeSet var1, Object var2) {
  290.       if (var2 instanceof StyleConstants) {
  291.          CSS.Attribute var3 = this.css.styleConstantsKeyToCSSKey((StyleConstants)var2);
  292.          if (var3 != null) {
  293.             return super.removeAttribute(var1, var3);
  294.          }
  295.       }
  296.  
  297.       return super.removeAttribute(var1, var2);
  298.    }
  299.  
  300.    public AttributeSet removeAttributes(AttributeSet var1, Enumeration var2) {
  301.       return super.removeAttributes(var1, var2);
  302.    }
  303.  
  304.    public AttributeSet removeAttributes(AttributeSet var1, AttributeSet var2) {
  305.       return super.removeAttributes(var1, this.convertAttributeSet(var2));
  306.    }
  307.  
  308.    protected StyleContext.SmallAttributeSet createSmallAttributeSet(AttributeSet var1) {
  309.       return new SmallConversionSet(this, var1);
  310.    }
  311.  
  312.    protected MutableAttributeSet createLargeAttributeSet(AttributeSet var1) {
  313.       return new LargeConversionSet(this, var1);
  314.    }
  315.  
  316.    AttributeSet convertAttributeSet(AttributeSet var1) {
  317.       if (!(var1 instanceof LargeConversionSet) && !(var1 instanceof SmallConversionSet)) {
  318.          Enumeration var2 = var1.getAttributeNames();
  319.  
  320.          while(var2.hasMoreElements()) {
  321.             Object var3 = var2.nextElement();
  322.             if (var3 instanceof StyleConstants) {
  323.                LargeConversionSet var4 = new LargeConversionSet(this);
  324.                Enumeration var5 = var1.getAttributeNames();
  325.  
  326.                while(var5.hasMoreElements()) {
  327.                   Object var6 = var5.nextElement();
  328.                   Object var7 = null;
  329.                   if (var6 instanceof StyleConstants) {
  330.                      CSS.Attribute var8 = this.css.styleConstantsKeyToCSSKey((StyleConstants)var6);
  331.                      if (var8 != null) {
  332.                         Object var9 = var1.getAttribute(var6);
  333.                         var7 = this.css.styleConstantsValueToCSSValue((StyleConstants)var6, var9);
  334.                         if (var7 != null) {
  335.                            var4.addAttribute(var8, var7);
  336.                         }
  337.                      }
  338.                   }
  339.  
  340.                   if (var7 == null) {
  341.                      var4.addAttribute(var6, var1.getAttribute(var6));
  342.                   }
  343.                }
  344.  
  345.                return var4;
  346.             }
  347.          }
  348.  
  349.          return var1;
  350.       } else {
  351.          return var1;
  352.       }
  353.    }
  354.  
  355.    public Font getFont(AttributeSet var1) {
  356.       return this.css.getFont(this, var1, 12);
  357.    }
  358.  
  359.    public Color getForeground(AttributeSet var1) {
  360.       Color var2 = this.css.getColor(var1, javax.swing.text.html.CSS.Attribute.COLOR);
  361.       return var2 == null ? Color.black : var2;
  362.    }
  363.  
  364.    public Color getBackground(AttributeSet var1) {
  365.       return this.css.getColor(var1, javax.swing.text.html.CSS.Attribute.BACKGROUND_COLOR);
  366.    }
  367.  
  368.    public BoxPainter getBoxPainter(AttributeSet var1) {
  369.       return new BoxPainter(var1, this.css, this);
  370.    }
  371.  
  372.    public ListPainter getListPainter(AttributeSet var1) {
  373.       return new ListPainter(var1, this);
  374.    }
  375.  
  376.    public void setBaseFontSize(int var1) {
  377.       this.css.setBaseFontSize(var1);
  378.    }
  379.  
  380.    public void setBaseFontSize(String var1) {
  381.       this.css.setBaseFontSize(var1);
  382.    }
  383.  
  384.    public static int getIndexOfSize(float var0) {
  385.       return CSS.getIndexOfSize(var0);
  386.    }
  387.  
  388.    public float getPointSize(int var1) {
  389.       return this.css.getPointSize(var1);
  390.    }
  391.  
  392.    public float getPointSize(String var1) {
  393.       return this.css.getPointSize(var1);
  394.    }
  395.  
  396.    public Color stringToColor(String var1) {
  397.       return CSS.stringToColor(var1);
  398.    }
  399.  
  400.    ImageIcon getBackgroundImage(AttributeSet var1) {
  401.       Object var2 = var1.getAttribute(javax.swing.text.html.CSS.Attribute.BACKGROUND_IMAGE);
  402.       return var2 != null ? ((CSS.BackgroundImage)var2).getImage(this.getBase()) : null;
  403.    }
  404.  
  405.    void addRule(String[] var1, AttributeSet var2, boolean var3) {
  406.       int var4 = var1.length;
  407.       StringBuffer var5 = new StringBuffer();
  408.       var5.append(var1[0]);
  409.  
  410.       for(int var6 = 1; var6 < var4; ++var6) {
  411.          var5.append(' ');
  412.          var5.append(var1[var6]);
  413.       }
  414.  
  415.       String var7 = var5.toString();
  416.       Style var8 = ((StyleContext)this).getStyle(var7);
  417.       if (var8 == null) {
  418.          Style var9 = ((StyleContext)this).addStyle(var7, (Style)null);
  419.          synchronized(this) {
  420.             Object var11 = this.getRootSelectorMapping();
  421.  
  422.             for(int var12 = var4 - 1; var12 >= 0; --var12) {
  423.                var11 = this.getSelectorMapping(var11, var1[var12], true);
  424.             }
  425.  
  426.             var8 = this.getMappingStyle(var11);
  427.             if (var8 == null) {
  428.                var8 = this.createStyleForSelector(var7, var11, var9);
  429.                this.refreshResolvedRules(var7, var1, var8, this.getSpecificity(var11));
  430.             }
  431.          }
  432.       }
  433.  
  434.       if (var3) {
  435.          var8 = this.getLinkedStyle(var8);
  436.       }
  437.  
  438.       var8.addAttributes(var2);
  439.    }
  440.  
  441.    private synchronized void linkStyleSheetAt(StyleSheet var1, int var2) {
  442.       if (this.resolvedStyles.size() > 0) {
  443.          Enumeration var3 = this.resolvedStyles.elements();
  444.  
  445.          while(var3.hasMoreElements()) {
  446.             ResolvedStyle var4 = (ResolvedStyle)var3.nextElement();
  447.             var4.insertExtendedStyleAt(var1.getRule(var4.getName()), var2);
  448.          }
  449.       }
  450.  
  451.    }
  452.  
  453.    private synchronized void unlinkStyleSheet(StyleSheet var1, int var2) {
  454.       if (this.resolvedStyles.size() > 0) {
  455.          Enumeration var3 = this.resolvedStyles.elements();
  456.  
  457.          while(var3.hasMoreElements()) {
  458.             ResolvedStyle var4 = (ResolvedStyle)var3.nextElement();
  459.             var4.removeExtendedStyleAt(var2);
  460.          }
  461.       }
  462.  
  463.    }
  464.  
  465.    String[] getSimpleSelectors(String var1) {
  466.       var1 = this.cleanSelectorString(var1);
  467.       SearchBuffer var2 = javax.swing.text.html.StyleSheet.SearchBuffer.obtainSearchBuffer();
  468.       Vector var3 = var2.getVector();
  469.       int var4 = 0;
  470.       int var5 = var1.length();
  471.  
  472.       while(var4 != -1) {
  473.          int var6 = var1.indexOf(32, var4);
  474.          if (var6 != -1) {
  475.             var3.addElement(var1.substring(var4, var6));
  476.             ++var6;
  477.             if (var6 == var5) {
  478.                var4 = -1;
  479.             } else {
  480.                var4 = var6;
  481.             }
  482.          } else {
  483.             var3.addElement(var1.substring(var4));
  484.             var4 = -1;
  485.          }
  486.       }
  487.  
  488.       String[] var9 = new String[var3.size()];
  489.       var3.copyInto(var9);
  490.       javax.swing.text.html.StyleSheet.SearchBuffer.releaseSearchBuffer(var2);
  491.       return var9;
  492.    }
  493.  
  494.    String cleanSelectorString(String var1) {
  495.       boolean var2 = true;
  496.       int var3 = 0;
  497.  
  498.       for(int var4 = var1.length(); var3 < var4; ++var3) {
  499.          switch (var1.charAt(var3)) {
  500.             case '\t':
  501.             case '\n':
  502.             case '\r':
  503.                return this._cleanSelectorString(var1);
  504.             case ' ':
  505.                if (var2) {
  506.                   return this._cleanSelectorString(var1);
  507.                }
  508.  
  509.                var2 = true;
  510.                break;
  511.             default:
  512.                var2 = false;
  513.          }
  514.       }
  515.  
  516.       if (var2) {
  517.          return this._cleanSelectorString(var1);
  518.       } else {
  519.          return var1;
  520.       }
  521.    }
  522.  
  523.    private String _cleanSelectorString(String var1) {
  524.       SearchBuffer var2 = javax.swing.text.html.StyleSheet.SearchBuffer.obtainSearchBuffer();
  525.       StringBuffer var3 = var2.getStringBuffer();
  526.       boolean var4 = true;
  527.       int var5 = 0;
  528.       char[] var6 = var1.toCharArray();
  529.       int var7 = var6.length;
  530.       Object var8 = null;
  531.  
  532.       try {
  533.          for(int var9 = 0; var9 < var7; ++var9) {
  534.             switch (var6[var9]) {
  535.                case '\t':
  536.                case '\n':
  537.                case '\r':
  538.                   if (!var4) {
  539.                      var4 = true;
  540.                      if (var5 < var9) {
  541.                         var3.append(var6, var5, var9 - var5);
  542.                         var3.append(' ');
  543.                      }
  544.                   }
  545.  
  546.                   var5 = var9 + 1;
  547.                   break;
  548.                case ' ':
  549.                   if (!var4) {
  550.                      var4 = true;
  551.                      if (var5 < var9) {
  552.                         var3.append(var6, var5, 1 + var9 - var5);
  553.                      }
  554.                   }
  555.  
  556.                   var5 = var9 + 1;
  557.                   break;
  558.                default:
  559.                   var4 = false;
  560.             }
  561.          }
  562.  
  563.          if (var4 && var3.length() > 0) {
  564.             var3.setLength(var3.length() - 1);
  565.          } else if (var5 < var7) {
  566.             var3.append(var6, var5, var7 - var5);
  567.          }
  568.  
  569.          var14 = var3.toString();
  570.       } finally {
  571.          javax.swing.text.html.StyleSheet.SearchBuffer.releaseSearchBuffer(var2);
  572.       }
  573.  
  574.       return var14;
  575.    }
  576.  
  577.    private Object getRootSelectorMapping() {
  578.       return this.selectorMapping;
  579.    }
  580.  
  581.    private synchronized Object getSelectorMapping(Object var1, String var2, boolean var3) {
  582.       Hashtable var4 = (Hashtable)((Hashtable)var1).get(var2);
  583.       if (var4 == null && var3) {
  584.          var4 = new Hashtable(7);
  585.          ((Hashtable)var1).put(var2, var4);
  586.          int var5 = 0;
  587.          if (var1 != null) {
  588.             Object var6 = ((Hashtable)var1).get(SPECIFICITY);
  589.             if (var6 != null) {
  590.                var5 = (Integer)var6;
  591.             }
  592.          }
  593.  
  594.          char var8 = var2.charAt(0);
  595.          if (var8 == '.') {
  596.             var5 += 100;
  597.          } else if (var8 == '#') {
  598.             var5 += 10000;
  599.          } else {
  600.             ++var5;
  601.             if (var2.indexOf(46) != -1) {
  602.                var5 += 100;
  603.             }
  604.  
  605.             if (var2.indexOf(35) != -1) {
  606.                var5 += 10000;
  607.             }
  608.          }
  609.  
  610.          var4.put(SPECIFICITY, new Integer(var5));
  611.       }
  612.  
  613.       return var4;
  614.    }
  615.  
  616.    static int getSpecificity(String var0) {
  617.       int var1 = 0;
  618.       boolean var2 = true;
  619.       int var3 = 0;
  620.  
  621.       for(int var4 = var0.length(); var3 < var4; ++var3) {
  622.          switch (var0.charAt(var3)) {
  623.             case ' ':
  624.                var2 = true;
  625.                break;
  626.             case '#':
  627.                var1 += 10000;
  628.                break;
  629.             case '.':
  630.                var1 += 100;
  631.                break;
  632.             default:
  633.                if (var2) {
  634.                   var2 = false;
  635.                   ++var1;
  636.                }
  637.          }
  638.       }
  639.  
  640.       return var1;
  641.    }
  642.  
  643.    private int getSpecificity(Object var1) {
  644.       Object var2 = ((Hashtable)var1).get(SPECIFICITY);
  645.       return var2 != null ? (Integer)var2 : 0;
  646.    }
  647.  
  648.    private Style getMappingStyle(Object var1) {
  649.       return (Style)((Hashtable)var1).get(RULE);
  650.    }
  651.  
  652.    private void removeMappingStyle(Object var1) {
  653.       ((Hashtable)var1).remove(RULE);
  654.    }
  655.  
  656.    private Style getLinkedStyle(Style var1) {
  657.       Style var2 = (Style)var1.getResolveParent();
  658.       if (var2 == null) {
  659.          var2 = ((StyleContext)this).addStyle((String)null, (Style)null);
  660.          var1.setResolveParent(var2);
  661.       }
  662.  
  663.       return var2;
  664.    }
  665.  
  666.    private synchronized Style createStyleForSelector(String var1, Object var2, Style var3) {
  667.       Style var4 = (Style)((Hashtable)var2).get(RULE);
  668.       if (var4 == null) {
  669.          var4 = var3;
  670.          ((Hashtable)var2).put(RULE, var3);
  671.       }
  672.  
  673.       return var4;
  674.    }
  675.  
  676.    private synchronized Style getResolvedStyle(String var1, Vector var2, HTML.Tag var3) {
  677.       Style var4 = (Style)this.resolvedStyles.get(var1);
  678.       if (var4 == null) {
  679.          var4 = this.createResolvedStyle(var1, var2, var3);
  680.       }
  681.  
  682.       return var4;
  683.    }
  684.  
  685.    private synchronized Style getResolvedStyle(String var1) {
  686.       Style var2 = (Style)this.resolvedStyles.get(var1);
  687.       if (var2 == null) {
  688.          var2 = this.createResolvedStyle(var1);
  689.       }
  690.  
  691.       return var2;
  692.    }
  693.  
  694.    private void addSortedStyle(Object var1, Vector var2) {
  695.       int var3 = var2.size();
  696.       if (var3 > 0) {
  697.          int var4 = this.getSpecificity(var1);
  698.  
  699.          for(int var5 = 0; var5 < var3; ++var5) {
  700.             if (var4 >= this.getSpecificity(var2.elementAt(var5))) {
  701.                var2.insertElementAt(var1, var5);
  702.                return;
  703.             }
  704.          }
  705.       }
  706.  
  707.       var2.addElement(var1);
  708.    }
  709.  
  710.    private synchronized void getStyles(Object var1, Vector var2, String[] var3, String[] var4, String[] var5, int var6, int var7, Hashtable var8) {
  711.       if (!var8.contains(var1)) {
  712.          var8.put(var1, var1);
  713.          Style var9 = this.getMappingStyle(var1);
  714.          if (var9 != null) {
  715.             this.addSortedStyle(var1, var2);
  716.          }
  717.  
  718.          for(int var10 = var6; var10 < var7; ++var10) {
  719.             String var11 = var3[var10];
  720.             if (var11 != null) {
  721.                Object var12 = this.getSelectorMapping(var1, var11, false);
  722.                if (var12 != null) {
  723.                   this.getStyles(var12, var2, var3, var4, var5, var10 + 1, var7, var8);
  724.                }
  725.  
  726.                if (var5[var10] != null) {
  727.                   String var13 = var5[var10];
  728.                   var12 = this.getSelectorMapping(var1, var11 + "." + var13, false);
  729.                   if (var12 != null) {
  730.                      this.getStyles(var12, var2, var3, var4, var5, var10 + 1, var7, var8);
  731.                   }
  732.  
  733.                   var12 = this.getSelectorMapping(var1, "." + var13, false);
  734.                   if (var12 != null) {
  735.                      this.getStyles(var12, var2, var3, var4, var5, var10 + 1, var7, var8);
  736.                   }
  737.                }
  738.  
  739.                if (var4[var10] != null) {
  740.                   String var18 = var4[var10];
  741.                   var12 = this.getSelectorMapping(var1, var11 + "#" + var18, false);
  742.                   if (var12 != null) {
  743.                      this.getStyles(var12, var2, var3, var4, var5, var10 + 1, var7, var8);
  744.                   }
  745.  
  746.                   var12 = this.getSelectorMapping(var1, "#" + var18, false);
  747.                   if (var12 != null) {
  748.                      this.getStyles(var12, var2, var3, var4, var5, var10 + 1, var7, var8);
  749.                   }
  750.                }
  751.             }
  752.          }
  753.  
  754.       }
  755.    }
  756.  
  757.    private synchronized Style createResolvedStyle(String var1, String[] var2, String[] var3, String[] var4) {
  758.       SearchBuffer var5 = javax.swing.text.html.StyleSheet.SearchBuffer.obtainSearchBuffer();
  759.       Vector var6 = var5.getVector();
  760.       Hashtable var7 = var5.getHashtable();
  761.  
  762.       ResolvedStyle var18;
  763.       try {
  764.          Object var8 = this.getRootSelectorMapping();
  765.          int var9 = var2.length;
  766.          String var10 = var2[0];
  767.          Object var11 = this.getSelectorMapping(var8, var10, false);
  768.          if (var11 != null) {
  769.             this.getStyles(var11, var6, var2, var3, var4, 1, var9, var7);
  770.          }
  771.  
  772.          if (var4[0] != null) {
  773.             String var12 = var4[0];
  774.             var11 = this.getSelectorMapping(var8, var10 + "." + var12, false);
  775.             if (var11 != null) {
  776.                this.getStyles(var11, var6, var2, var3, var4, 1, var9, var7);
  777.             }
  778.  
  779.             var11 = this.getSelectorMapping(var8, "." + var12, false);
  780.             if (var11 != null) {
  781.                this.getStyles(var11, var6, var2, var3, var4, 1, var9, var7);
  782.             }
  783.          }
  784.  
  785.          if (var3[0] != null) {
  786.             String var27 = var3[0];
  787.             var11 = this.getSelectorMapping(var8, var10 + "#" + var27, false);
  788.             if (var11 != null) {
  789.                this.getStyles(var11, var6, var2, var3, var4, 1, var9, var7);
  790.             }
  791.  
  792.             var11 = this.getSelectorMapping(var8, "#" + var27, false);
  793.             if (var11 != null) {
  794.                this.getStyles(var11, var6, var2, var3, var4, 1, var9, var7);
  795.             }
  796.          }
  797.  
  798.          int var28 = this.linkedStyleSheets != null ? this.linkedStyleSheets.size() : 0;
  799.          int var13 = var6.size();
  800.          AttributeSet[] var14 = new AttributeSet[var13 + var28];
  801.  
  802.          for(int var15 = 0; var15 < var13; ++var15) {
  803.             var14[var15] = this.getMappingStyle(var6.elementAt(var15));
  804.          }
  805.  
  806.          for(int var16 = 0; var16 < var28; ++var16) {
  807.             Style var17 = ((StyleSheet)this.linkedStyleSheets.elementAt(var16)).getRule(var1);
  808.             if (var17 == null) {
  809.                var14[var16 + var13] = SimpleAttributeSet.EMPTY;
  810.             } else {
  811.                var14[var16 + var13] = var17;
  812.             }
  813.          }
  814.  
  815.          ResolvedStyle var29 = new ResolvedStyle(var1, var14, var13);
  816.          this.resolvedStyles.put(var1, var29);
  817.          var18 = var29;
  818.       } finally {
  819.          javax.swing.text.html.StyleSheet.SearchBuffer.releaseSearchBuffer(var5);
  820.       }
  821.  
  822.       return var18;
  823.    }
  824.  
  825.    private Style createResolvedStyle(String var1, Vector var2, HTML.Tag var3) {
  826.       int var4 = var2.size();
  827.       String[] var5 = new String[var4];
  828.       String[] var6 = new String[var4];
  829.       String[] var7 = new String[var4];
  830.  
  831.       for(int var8 = 0; var8 < var4; ++var8) {
  832.          Element var9 = (Element)var2.elementAt(var8);
  833.          AttributeSet var10 = var9.getAttributes();
  834.          if (var8 == 0 && var9.isLeaf()) {
  835.             Object var11 = var10.getAttribute(var3);
  836.             if (var11 instanceof AttributeSet) {
  837.                var10 = (AttributeSet)var11;
  838.             } else {
  839.                var10 = null;
  840.             }
  841.          }
  842.  
  843.          if (var10 != null) {
  844.             HTML.Tag var12 = (HTML.Tag)var10.getAttribute(StyleConstants.NameAttribute);
  845.             if (var12 != null) {
  846.                var5[var8] = var12.toString();
  847.             } else {
  848.                var5[var8] = null;
  849.             }
  850.  
  851.             if (var10.isDefined(Attribute.CLASS)) {
  852.                var7[var8] = var10.getAttribute(Attribute.CLASS).toString();
  853.             } else {
  854.                var7[var8] = null;
  855.             }
  856.  
  857.             if (var10.isDefined(Attribute.ID)) {
  858.                var6[var8] = var10.getAttribute(Attribute.ID).toString();
  859.             } else {
  860.                var6[var8] = null;
  861.             }
  862.          } else {
  863.             var5[var8] = var6[var8] = var7[var8] = null;
  864.          }
  865.       }
  866.  
  867.       var5[0] = var3.toString();
  868.       return this.createResolvedStyle(var1, var5, var6, var7);
  869.    }
  870.  
  871.    private Style createResolvedStyle(String var1) {
  872.       SearchBuffer var2 = javax.swing.text.html.StyleSheet.SearchBuffer.obtainSearchBuffer();
  873.       Vector var3 = var2.getVector();
  874.  
  875.       Style var17;
  876.       try {
  877.          int var5 = 0;
  878.          int var6 = 0;
  879.          int var7 = 0;
  880.          int var8 = 0;
  881.  
  882.          for(int var9 = var1.length(); var8 < var9; var8 = var6 + 1) {
  883.             if (var5 == var8) {
  884.                var5 = var1.indexOf(46, var8);
  885.             }
  886.  
  887.             if (var7 == var8) {
  888.                var7 = var1.indexOf(35, var8);
  889.             }
  890.  
  891.             var6 = var1.indexOf(32, var8);
  892.             if (var6 == -1) {
  893.                var6 = var9;
  894.             }
  895.  
  896.             if (var5 != -1 && var7 != -1 && var5 < var6 && var7 < var6) {
  897.                if (var7 < var5) {
  898.                   if (var8 == var7) {
  899.                      var3.addElement("");
  900.                   } else {
  901.                      var3.addElement(var1.substring(var8, var7));
  902.                   }
  903.  
  904.                   if (var5 + 1 < var6) {
  905.                      var3.addElement(var1.substring(var5 + 1, var6));
  906.                   } else {
  907.                      var3.addElement((Object)null);
  908.                   }
  909.  
  910.                   if (var7 + 1 == var5) {
  911.                      var3.addElement((Object)null);
  912.                   } else {
  913.                      var3.addElement(var1.substring(var7 + 1, var5));
  914.                   }
  915.                } else if (var7 < var6) {
  916.                   if (var8 == var5) {
  917.                      var3.addElement("");
  918.                   } else {
  919.                      var3.addElement(var1.substring(var8, var5));
  920.                   }
  921.  
  922.                   if (var5 + 1 < var7) {
  923.                      var3.addElement(var1.substring(var5 + 1, var7));
  924.                   } else {
  925.                      var3.addElement((Object)null);
  926.                   }
  927.  
  928.                   if (var7 + 1 == var6) {
  929.                      var3.addElement((Object)null);
  930.                   } else {
  931.                      var3.addElement(var1.substring(var7 + 1, var6));
  932.                   }
  933.                }
  934.  
  935.                var5 = var7 = var6 + 1;
  936.             } else if (var5 != -1 && var5 < var6) {
  937.                if (var5 == var8) {
  938.                   var3.addElement("");
  939.                } else {
  940.                   var3.addElement(var1.substring(var8, var5));
  941.                }
  942.  
  943.                if (var5 + 1 == var6) {
  944.                   var3.addElement((Object)null);
  945.                } else {
  946.                   var3.addElement(var1.substring(var5 + 1, var6));
  947.                }
  948.  
  949.                var3.addElement((Object)null);
  950.                var5 = var6 + 1;
  951.             } else if (var7 != -1 && var7 < var6) {
  952.                if (var7 == var8) {
  953.                   var3.addElement("");
  954.                } else {
  955.                   var3.addElement(var1.substring(var8, var7));
  956.                }
  957.  
  958.                var3.addElement((Object)null);
  959.                if (var7 + 1 == var6) {
  960.                   var3.addElement((Object)null);
  961.                } else {
  962.                   var3.addElement(var1.substring(var7 + 1, var6));
  963.                }
  964.  
  965.                var7 = var6 + 1;
  966.             } else {
  967.                var3.addElement(var1.substring(var8, var6));
  968.                var3.addElement((Object)null);
  969.                var3.addElement((Object)null);
  970.             }
  971.          }
  972.  
  973.          int var10 = var3.size();
  974.          int var11 = var10 / 3;
  975.          String[] var12 = new String[var11];
  976.          String[] var13 = new String[var11];
  977.          String[] var14 = new String[var11];
  978.          int var15 = 0;
  979.  
  980.          for(int var16 = var10 - 3; var15 < var11; var16 -= 3) {
  981.             var12[var15] = (String)var3.elementAt(var16);
  982.             var13[var15] = (String)var3.elementAt(var16 + 1);
  983.             var14[var15] = (String)var3.elementAt(var16 + 2);
  984.             ++var15;
  985.          }
  986.  
  987.          var17 = this.createResolvedStyle(var1, var12, var13, var14);
  988.       } finally {
  989.          javax.swing.text.html.StyleSheet.SearchBuffer.releaseSearchBuffer(var2);
  990.       }
  991.  
  992.       return var17;
  993.    }
  994.  
  995.    private synchronized void refreshResolvedRules(String var1, String[] var2, Style var3, int var4) {
  996.       if (this.resolvedStyles.size() > 0) {
  997.          Enumeration var5 = this.resolvedStyles.elements();
  998.  
  999.          while(var5.hasMoreElements()) {
  1000.             ResolvedStyle var6 = (ResolvedStyle)var5.nextElement();
  1001.             if (var6.matches(var1)) {
  1002.                var6.insertStyle(var3, var4);
  1003.             }
  1004.          }
  1005.       }
  1006.  
  1007.    }
  1008.  
  1009.    private void readObject(ObjectInputStream var1) throws ClassNotFoundException, IOException {
  1010.       var1.defaultReadObject();
  1011.       this.updateSheetAttributes(this.selectorMapping);
  1012.    }
  1013.  
  1014.    private void updateSheetAttributes(Hashtable var1) {
  1015.       Enumeration var2 = var1.keys();
  1016.  
  1017.       while(var2.hasMoreElements()) {
  1018.          Object var3 = var2.nextElement();
  1019.          Object var4 = var1.get(var3);
  1020.          if (var3 instanceof SheetAttribute) {
  1021.             if (var3.toString().equals("specificity")) {
  1022.                var1.remove(var3);
  1023.                var1.put(SPECIFICITY, var4);
  1024.             } else if (var3.toString().equals("rule")) {
  1025.                var1.remove(var3);
  1026.                var1.put(RULE, var4);
  1027.             }
  1028.          } else if (var4 instanceof Hashtable) {
  1029.             this.updateSheetAttributes((Hashtable)var4);
  1030.          }
  1031.       }
  1032.  
  1033.    }
  1034.  
  1035.    // $FF: synthetic method
  1036.    static CSS access$000(StyleSheet var0) {
  1037.       return var0.css;
  1038.    }
  1039. }
  1040.