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 / HTMLDocument.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  18.2 KB  |  904 lines

  1. package javax.swing.text.html;
  2.  
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.net.URL;
  6. import java.net.URLEncoder;
  7. import java.util.BitSet;
  8. import java.util.Enumeration;
  9. import java.util.Hashtable;
  10. import javax.swing.ButtonGroup;
  11. import javax.swing.ButtonModel;
  12. import javax.swing.ComboBoxModel;
  13. import javax.swing.DefaultComboBoxModel;
  14. import javax.swing.DefaultListModel;
  15. import javax.swing.JToggleButton;
  16. import javax.swing.event.DocumentEvent;
  17. import javax.swing.event.HyperlinkEvent;
  18. import javax.swing.event.UndoableEditEvent;
  19. import javax.swing.event.DocumentEvent.EventType;
  20. import javax.swing.text.AbstractDocument;
  21. import javax.swing.text.AttributeSet;
  22. import javax.swing.text.BadLocationException;
  23. import javax.swing.text.DefaultStyledDocument;
  24. import javax.swing.text.Document;
  25. import javax.swing.text.Element;
  26. import javax.swing.text.ElementIterator;
  27. import javax.swing.text.GapContent;
  28. import javax.swing.text.MutableAttributeSet;
  29. import javax.swing.text.PlainDocument;
  30. import javax.swing.text.SimpleAttributeSet;
  31. import javax.swing.text.StyleConstants;
  32. import javax.swing.text.html.HTML.Attribute;
  33. import javax.swing.text.html.HTML.Tag;
  34. import javax.swing.undo.CompoundEdit;
  35. import javax.swing.undo.UndoableEdit;
  36.  
  37. public class HTMLDocument extends DefaultStyledDocument {
  38.    private boolean frameDocument;
  39.    private boolean preservesUnknownTags;
  40.    private ButtonGroup radioButtonGroup;
  41.    static final String TokenThreshold = "token threshold";
  42.    public static final String AdditionalComments = "AdditionalComments";
  43.    static final String StyleType = "StyleType";
  44.    URL base;
  45.    private HTMLEditorKit.Parser parser;
  46.    private static AttributeSet contentAttributeSet = new SimpleAttributeSet();
  47.    static String MAP_PROPERTY = "__MAP__";
  48.    private static char[] NEWLINE;
  49.  
  50.    public HTMLDocument() {
  51.       this(new GapContent(4096), new StyleSheet());
  52.    }
  53.  
  54.    public HTMLDocument(StyleSheet var1) {
  55.       this(new GapContent(4096), var1);
  56.    }
  57.  
  58.    public HTMLDocument(AbstractDocument.Content var1, StyleSheet var2) {
  59.       super(var1, var2);
  60.       this.frameDocument = false;
  61.       this.preservesUnknownTags = true;
  62.    }
  63.  
  64.    public HTMLEditorKit.ParserCallback getReader(int var1) {
  65.       Object var2 = ((AbstractDocument)this).getProperty("stream");
  66.       if (var2 instanceof URL) {
  67.          this.setBase((URL)var2);
  68.       }
  69.  
  70.       HTMLReader var3 = new HTMLReader(this, var1);
  71.       return var3;
  72.    }
  73.  
  74.    public HTMLEditorKit.ParserCallback getReader(int var1, int var2, int var3, HTML.Tag var4) {
  75.       return this.getReader(var1, var2, var3, var4, true);
  76.    }
  77.  
  78.    HTMLEditorKit.ParserCallback getReader(int var1, int var2, int var3, HTML.Tag var4, boolean var5) {
  79.       Object var6 = ((AbstractDocument)this).getProperty("stream");
  80.       if (var6 instanceof URL) {
  81.          this.setBase((URL)var6);
  82.       }
  83.  
  84.       HTMLReader var7 = new HTMLReader(this, var1, var2, var3, var4, var5, false, true);
  85.       return var7;
  86.    }
  87.  
  88.    public URL getBase() {
  89.       return this.base;
  90.    }
  91.  
  92.    public void setBase(URL var1) {
  93.       this.base = var1;
  94.       this.getStyleSheet().setBase(var1);
  95.    }
  96.  
  97.    protected void insert(int var1, DefaultStyledDocument.ElementSpec[] var2) throws BadLocationException {
  98.       super.insert(var1, var2);
  99.    }
  100.  
  101.    protected void insertUpdate(AbstractDocument.DefaultDocumentEvent var1, AttributeSet var2) {
  102.       if (var2 == null) {
  103.          var2 = contentAttributeSet;
  104.       } else if (var2.isDefined(StyleConstants.ComposedTextAttribute)) {
  105.          ((MutableAttributeSet)var2).addAttributes(contentAttributeSet);
  106.       }
  107.  
  108.       super.insertUpdate(var1, var2);
  109.    }
  110.  
  111.    protected void create(DefaultStyledDocument.ElementSpec[] var1) {
  112.       super.create(var1);
  113.    }
  114.  
  115.    public void setParagraphAttributes(int var1, int var2, AttributeSet var3, boolean var4) {
  116.       try {
  117.          ((AbstractDocument)this).writeLock();
  118.          int var5 = Math.min(var1 + var2, ((AbstractDocument)this).getLength());
  119.          Element var6 = ((DefaultStyledDocument)this).getParagraphElement(var1);
  120.          var1 = var6.getStartOffset();
  121.          var6 = ((DefaultStyledDocument)this).getParagraphElement(var5);
  122.          var2 = Math.max(0, var6.getEndOffset() - var1);
  123.          AbstractDocument.DefaultDocumentEvent var7 = new AbstractDocument.DefaultDocumentEvent(this, var1, var2, EventType.CHANGE);
  124.          AttributeSet var8 = var3.copyAttributes();
  125.          int var9 = Integer.MAX_VALUE;
  126.  
  127.          for(int var10 = var1; var10 <= var5; var10 = var9) {
  128.             Element var11 = ((DefaultStyledDocument)this).getParagraphElement(var10);
  129.             if (var9 == var11.getEndOffset()) {
  130.                ++var9;
  131.             } else {
  132.                var9 = var11.getEndOffset();
  133.             }
  134.  
  135.             MutableAttributeSet var12 = (MutableAttributeSet)var11.getAttributes();
  136.             var7.addEdit(new DefaultStyledDocument.AttributeUndoableEdit(var11, var8, var4));
  137.             if (var4) {
  138.                var12.removeAttributes(var12);
  139.             }
  140.  
  141.             var12.addAttributes(var3);
  142.          }
  143.  
  144.          ((CompoundEdit)var7).end();
  145.          this.fireChangedUpdate(var7);
  146.          this.fireUndoableEditUpdate(new UndoableEditEvent(this, var7));
  147.       } finally {
  148.          ((AbstractDocument)this).writeUnlock();
  149.       }
  150.  
  151.    }
  152.  
  153.    public StyleSheet getStyleSheet() {
  154.       return (StyleSheet)((AbstractDocument)this).getAttributeContext();
  155.    }
  156.  
  157.    public Iterator getIterator(HTML.Tag var1) {
  158.       return var1.isBlock() ? null : new LeafIterator(var1, this);
  159.    }
  160.  
  161.    protected Element createLeafElement(Element var1, AttributeSet var2, int var3, int var4) {
  162.       return new RunElement(this, var1, var2, var3, var4);
  163.    }
  164.  
  165.    protected Element createBranchElement(Element var1, AttributeSet var2) {
  166.       return new BlockElement(this, var1, var2);
  167.    }
  168.  
  169.    protected AbstractDocument.AbstractElement createDefaultRoot() {
  170.       ((AbstractDocument)this).writeLock();
  171.       SimpleAttributeSet var1 = new SimpleAttributeSet();
  172.       var1.addAttribute(StyleConstants.NameAttribute, Tag.HTML);
  173.       BlockElement var2 = new BlockElement(this, (Element)null, var1.copyAttributes());
  174.       var1.removeAttributes(var1);
  175.       var1.addAttribute(StyleConstants.NameAttribute, Tag.BODY);
  176.       BlockElement var3 = new BlockElement(this, var2, var1.copyAttributes());
  177.       var1.removeAttributes(var1);
  178.       var1.addAttribute(StyleConstants.NameAttribute, Tag.P);
  179.       BlockElement var4 = new BlockElement(this, var3, var1.copyAttributes());
  180.       var1.removeAttributes(var1);
  181.       var1.addAttribute(StyleConstants.NameAttribute, Tag.CONTENT);
  182.       RunElement var5 = new RunElement(this, var4, var1, 0, 1);
  183.       Element[] var6 = new Element[]{var5};
  184.       ((AbstractDocument.BranchElement)var4).replace(0, 0, var6);
  185.       var6[0] = var4;
  186.       ((AbstractDocument.BranchElement)var3).replace(0, 0, var6);
  187.       var6[0] = var3;
  188.       ((AbstractDocument.BranchElement)var2).replace(0, 0, var6);
  189.       ((AbstractDocument)this).writeUnlock();
  190.       return var2;
  191.    }
  192.  
  193.    public void setTokenThreshold(int var1) {
  194.       ((AbstractDocument)this).putProperty("token threshold", new Integer(var1));
  195.    }
  196.  
  197.    public int getTokenThreshold() {
  198.       Integer var1 = (Integer)((AbstractDocument)this).getProperty("token threshold");
  199.       return var1 != null ? var1 : Integer.MAX_VALUE;
  200.    }
  201.  
  202.    public void setPreservesUnknownTags(boolean var1) {
  203.       this.preservesUnknownTags = var1;
  204.    }
  205.  
  206.    public boolean getPreservesUnknownTags() {
  207.       return this.preservesUnknownTags;
  208.    }
  209.  
  210.    public void processHTMLFrameHyperlinkEvent(HTMLFrameHyperlinkEvent var1) {
  211.       String var2 = var1.getTarget();
  212.       Element var3 = var1.getSourceElement();
  213.       String var4 = ((HyperlinkEvent)var1).getURL().toString();
  214.       if (var2.equals("_self")) {
  215.          this.updateFrame(var3, var4);
  216.       } else if (var2.equals("_parent")) {
  217.          this.updateFrameSet(var3.getParentElement(), var4);
  218.       } else {
  219.          Element var5 = this.findFrame(var2);
  220.          if (var5 != null) {
  221.             this.updateFrame(var5, var4);
  222.          }
  223.       }
  224.  
  225.    }
  226.  
  227.    private Element findFrame(String var1) {
  228.       ElementIterator var2 = new ElementIterator(this);
  229.       Object var3 = null;
  230.  
  231.       while((var6 = var2.next()) != null) {
  232.          AttributeSet var4 = var6.getAttributes();
  233.          if (this.matchNameAttribute(var4, Tag.FRAME)) {
  234.             String var5 = (String)var4.getAttribute(Attribute.NAME);
  235.             if (var5 != null && var5.equals(var1)) {
  236.                break;
  237.             }
  238.          }
  239.       }
  240.  
  241.       return var6;
  242.    }
  243.  
  244.    boolean matchNameAttribute(AttributeSet var1, HTML.Tag var2) {
  245.       Object var3 = var1.getAttribute(StyleConstants.NameAttribute);
  246.       if (var3 instanceof HTML.Tag) {
  247.          HTML.Tag var4 = (HTML.Tag)var3;
  248.          if (var4 == var2) {
  249.             return true;
  250.          }
  251.       }
  252.  
  253.       return false;
  254.    }
  255.  
  256.    private void updateFrameSet(Element var1, String var2) {
  257.       try {
  258.          int var3 = var1.getStartOffset();
  259.          int var4 = var1.getEndOffset();
  260.          ((AbstractDocument)this).remove(var3, var4 - var3);
  261.          SimpleAttributeSet var5 = new SimpleAttributeSet();
  262.          var5.addAttribute(Attribute.SRC, var2);
  263.          var5.addAttribute(StyleConstants.NameAttribute, Tag.FRAME);
  264.          ((AbstractDocument)this).insertString(var3, " ", var5);
  265.       } catch (BadLocationException var6) {
  266.       }
  267.  
  268.    }
  269.  
  270.    private void updateFrame(Element var1, String var2) {
  271.       try {
  272.          ((AbstractDocument)this).writeLock();
  273.          AbstractDocument.DefaultDocumentEvent var3 = new AbstractDocument.DefaultDocumentEvent(this, var1.getStartOffset(), 1, EventType.CHANGE);
  274.          AttributeSet var4 = var1.getAttributes().copyAttributes();
  275.          MutableAttributeSet var5 = (MutableAttributeSet)var1.getAttributes();
  276.          var3.addEdit(new DefaultStyledDocument.AttributeUndoableEdit(var1, var4, false));
  277.          var5.removeAttribute(Attribute.SRC);
  278.          var5.addAttribute(Attribute.SRC, var2);
  279.          ((CompoundEdit)var3).end();
  280.          this.fireChangedUpdate(var3);
  281.          this.fireUndoableEditUpdate(new UndoableEditEvent(this, var3));
  282.       } finally {
  283.          ((AbstractDocument)this).writeUnlock();
  284.       }
  285.  
  286.    }
  287.  
  288.    boolean isFrameDocument() {
  289.       return this.frameDocument;
  290.    }
  291.  
  292.    void setFrameDocumentState(boolean var1) {
  293.       this.frameDocument = var1;
  294.    }
  295.  
  296.    void addMap(Map var1) {
  297.       String var2 = var1.getName();
  298.       if (var2 != null) {
  299.          Object var3 = ((AbstractDocument)this).getProperty(MAP_PROPERTY);
  300.          if (var3 == null) {
  301.             var3 = new Hashtable(11);
  302.             ((AbstractDocument)this).putProperty(MAP_PROPERTY, var3);
  303.          }
  304.  
  305.          if (var3 instanceof Hashtable) {
  306.             ((Hashtable)var3).put("#" + var2, var1);
  307.          }
  308.       }
  309.  
  310.    }
  311.  
  312.    void removeMap(Map var1) {
  313.       String var2 = var1.getName();
  314.       if (var2 != null) {
  315.          Object var3 = ((AbstractDocument)this).getProperty(MAP_PROPERTY);
  316.          if (var3 instanceof Hashtable) {
  317.             ((Hashtable)var3).remove("#" + var2);
  318.          }
  319.       }
  320.  
  321.    }
  322.  
  323.    Map getMap(String var1) {
  324.       if (var1 != null) {
  325.          Object var2 = ((AbstractDocument)this).getProperty(MAP_PROPERTY);
  326.          if (var2 != null && var2 instanceof Hashtable) {
  327.             return (Map)((Hashtable)var2).get(var1);
  328.          }
  329.       }
  330.  
  331.       return null;
  332.    }
  333.  
  334.    Enumeration getMaps() {
  335.       Object var1 = ((AbstractDocument)this).getProperty(MAP_PROPERTY);
  336.       return var1 instanceof Hashtable ? ((Hashtable)var1).elements() : null;
  337.    }
  338.  
  339.    void setDefaultStyleSheetType(String var1) {
  340.       ((AbstractDocument)this).putProperty("StyleType", var1);
  341.    }
  342.  
  343.    String getDefaultStyleSheetType() {
  344.       String var1 = (String)((AbstractDocument)this).getProperty("StyleType");
  345.       return var1 == null ? "text/css" : var1;
  346.    }
  347.  
  348.    public void setParser(HTMLEditorKit.Parser var1) {
  349.       this.parser = var1;
  350.       ((AbstractDocument)this).putProperty("__PARSER__", (Object)null);
  351.    }
  352.  
  353.    public HTMLEditorKit.Parser getParser() {
  354.       Object var1 = ((AbstractDocument)this).getProperty("__PARSER__");
  355.       return var1 instanceof HTMLEditorKit.Parser ? (HTMLEditorKit.Parser)var1 : this.parser;
  356.    }
  357.  
  358.    public void setInnerHTML(Element var1, String var2) throws BadLocationException, IOException {
  359.       this.verifyParser();
  360.       if (var1 != null && var1.isLeaf()) {
  361.          throw new IllegalArgumentException("Can not set inner HTML of a leaf");
  362.       } else {
  363.          if (var1 != null && var2 != null) {
  364.             int var3 = var1.getElementCount();
  365.             int var4 = var1.getStartOffset();
  366.             this.insertHTML(var1, var1.getStartOffset(), var2, true);
  367.             if (var1.getElementCount() > var3) {
  368.                this.removeElements(var1, var1.getElementCount() - var3, var3);
  369.             }
  370.          }
  371.  
  372.       }
  373.    }
  374.  
  375.    public void setOuterHTML(Element var1, String var2) throws BadLocationException, IOException {
  376.       this.verifyParser();
  377.       if (var1 != null && var1.getParentElement() != null && var2 != null) {
  378.          int var3 = var1.getStartOffset();
  379.          int var4 = var1.getEndOffset();
  380.          int var5 = ((AbstractDocument)this).getLength();
  381.          boolean var6 = !var1.isLeaf();
  382.          if (!var6 && (var4 > var5 || ((AbstractDocument)this).getText(var4 - 1, 1).charAt(0) == NEWLINE[0])) {
  383.             var6 = true;
  384.          }
  385.  
  386.          Element var7 = var1.getParentElement();
  387.          int var8 = var7.getElementCount();
  388.          this.insertHTML(var7, var3, var2, var6);
  389.          int var9 = ((AbstractDocument)this).getLength();
  390.          if (var8 != var7.getElementCount()) {
  391.             int var10 = var7.getElementIndex(var3 + var9 - var5);
  392.             this.removeElements(var7, var10, 1);
  393.          }
  394.       }
  395.  
  396.    }
  397.  
  398.    public void insertAfterStart(Element var1, String var2) throws BadLocationException, IOException {
  399.       this.verifyParser();
  400.       if (var1 != null && var1.isLeaf()) {
  401.          throw new IllegalArgumentException("Can not insert HTML after start of a leaf");
  402.       } else {
  403.          this.insertHTML(var1, var1.getStartOffset(), var2, false);
  404.       }
  405.    }
  406.  
  407.    public void insertBeforeEnd(Element var1, String var2) throws BadLocationException, IOException {
  408.       this.verifyParser();
  409.       if (var1 != null && var1.isLeaf()) {
  410.          throw new IllegalArgumentException("Can not set inner HTML before end of leaf");
  411.       } else {
  412.          int var3 = var1.getEndOffset();
  413.          if (var1.getElement(var1.getElementIndex(var3 - 1)).isLeaf() && ((AbstractDocument)this).getText(var3 - 1, 1).charAt(0) == NEWLINE[0]) {
  414.             --var3;
  415.          }
  416.  
  417.          this.insertHTML(var1, var3, var2, false);
  418.       }
  419.    }
  420.  
  421.    public void insertBeforeStart(Element var1, String var2) throws BadLocationException, IOException {
  422.       this.verifyParser();
  423.       if (var1 != null) {
  424.          Element var3 = var1.getParentElement();
  425.          if (var3 != null) {
  426.             this.insertHTML(var3, var1.getStartOffset(), var2, false);
  427.          }
  428.       }
  429.  
  430.    }
  431.  
  432.    public void insertAfterEnd(Element var1, String var2) throws BadLocationException, IOException {
  433.       this.verifyParser();
  434.       if (var1 != null) {
  435.          Element var3 = var1.getParentElement();
  436.          if (var3 != null) {
  437.             int var4 = var1.getEndOffset();
  438.             if (var1.isLeaf() && ((AbstractDocument)this).getText(var4 - 1, 1).charAt(0) == NEWLINE[0]) {
  439.                --var4;
  440.             }
  441.  
  442.             this.insertHTML(var3, var4, var2, false);
  443.          }
  444.       }
  445.  
  446.    }
  447.  
  448.    public Element getElement(String var1) {
  449.       return var1 == null ? null : this.getElement(((DefaultStyledDocument)this).getDefaultRootElement(), Attribute.ID, var1, true);
  450.    }
  451.  
  452.    public Element getElement(Element var1, Object var2, Object var3) {
  453.       return this.getElement(var1, var2, var3, false);
  454.    }
  455.  
  456.    private Element getElement(Element var1, Object var2, Object var3, boolean var4) {
  457.       AttributeSet var5 = var1.getAttributes();
  458.       if (var5 != null && var5.isDefined(var2) && var3.equals(var5.getAttribute(var2))) {
  459.          return var1;
  460.       } else {
  461.          if (!var1.isLeaf()) {
  462.             int var6 = 0;
  463.  
  464.             for(int var7 = var1.getElementCount(); var6 < var7; ++var6) {
  465.                Element var8 = this.getElement(var1.getElement(var6), var2, var3, var4);
  466.                if (var8 != null) {
  467.                   return var8;
  468.                }
  469.             }
  470.          } else if (var4 && var5 != null) {
  471.             Enumeration var9 = var5.getAttributeNames();
  472.             if (var9 != null) {
  473.                while(var9.hasMoreElements()) {
  474.                   Object var10 = var9.nextElement();
  475.                   if (var10 instanceof HTML.Tag && var5.getAttribute(var10) instanceof AttributeSet) {
  476.                      AttributeSet var11 = (AttributeSet)var5.getAttribute(var10);
  477.                      if (var11.isDefined(var2) && var3.equals(var11.getAttribute(var2))) {
  478.                         return var1;
  479.                      }
  480.                   }
  481.                }
  482.             }
  483.          }
  484.  
  485.          return null;
  486.       }
  487.    }
  488.  
  489.    private void verifyParser() {
  490.       if (this.getParser() == null) {
  491.          throw new IllegalStateException("No HTMLEditorKit.Parser");
  492.       }
  493.    }
  494.  
  495.    private void insertHTML(Element var1, int var2, String var3, boolean var4) throws BadLocationException, IOException {
  496.       if (var1 != null && var3 != null) {
  497.          HTMLEditorKit.Parser var5 = this.getParser();
  498.          if (var5 != null) {
  499.             int var6 = Math.max(0, var2 - 1);
  500.             Element var7 = ((DefaultStyledDocument)this).getCharacterElement(var6);
  501.             Element var8 = var1;
  502.             int var9 = 0;
  503.             int var10 = 0;
  504.             if (var1.getStartOffset() > var6) {
  505.                while(var8 != null && var8.getStartOffset() > var6) {
  506.                   var8 = var8.getParentElement();
  507.                   ++var10;
  508.                }
  509.  
  510.                if (var8 == null) {
  511.                   throw new BadLocationException("No common parent", var2);
  512.                }
  513.             }
  514.  
  515.             while(var7 != null && var7 != var8) {
  516.                ++var9;
  517.                var7 = var7.getParentElement();
  518.             }
  519.  
  520.             if (var7 != null) {
  521.                HTMLReader var11 = new HTMLReader(this, var2, var9 - 1, var10, (HTML.Tag)null, false, true, var4);
  522.                var5.parse(new StringReader(var3), var11, true);
  523.                var11.flush();
  524.             }
  525.          }
  526.       }
  527.  
  528.    }
  529.  
  530.    private void removeElements(Element var1, int var2, int var3) throws BadLocationException {
  531.       ((AbstractDocument)this).writeLock();
  532.  
  533.       try {
  534.          int var4 = var1.getElement(var2).getStartOffset();
  535.          int var5 = var1.getElement(var2 + var3 - 1).getEndOffset();
  536.          if (var5 > ((AbstractDocument)this).getLength()) {
  537.             this.removeElementsAtEnd(var1, var2, var3, var4, var5);
  538.          } else {
  539.             this.removeElements(var1, var2, var3, var4, var5);
  540.          }
  541.       } finally {
  542.          ((AbstractDocument)this).writeUnlock();
  543.       }
  544.  
  545.    }
  546.  
  547.    private void removeElementsAtEnd(Element var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  548.       Element[] var6 = new Element[0];
  549.       boolean var7 = var1.getElement(var2 - 1).isLeaf();
  550.       if (var7) {
  551.          --var2;
  552.       }
  553.  
  554.       Element[] var8 = new Element[var3];
  555.  
  556.       for(int var9 = 0; var9 < var3; ++var9) {
  557.          var8[var9] = var1.getElement(var9 + var2);
  558.       }
  559.  
  560.       AbstractDocument.DefaultDocumentEvent var10 = new AbstractDocument.DefaultDocumentEvent(this, var4 - 1, var5 - var4 + 1, EventType.REMOVE);
  561.       var10.addEdit(new AbstractDocument.ElementEdit(var1, var2, var8, var6));
  562.       ((AbstractDocument.BranchElement)var1).replace(var2, var8.length, var6);
  563.       UndoableEdit var11;
  564.       if (var7) {
  565.          var11 = ((AbstractDocument)this).getContent().remove(var4 - 1, var5 - var4);
  566.       } else {
  567.          Element var12;
  568.          for(var12 = var1.getElement(var2 - 1); !var12.isLeaf(); var12 = var12.getElement(var12.getElementCount() - 1)) {
  569.          }
  570.  
  571.          Element[] var13 = new Element[1];
  572.          Element[] var14 = new Element[1];
  573.          var13[0] = var12;
  574.          AttributeSet var15 = var12.getAttributes();
  575.          var12 = var12.getParentElement();
  576.          var11 = ((AbstractDocument)this).getContent().remove(var4 - 1, var5 - var4);
  577.          var14[0] = this.createLeafElement(var12, var15, var4 - 1, var4);
  578.          ((AbstractDocument.BranchElement)var12).replace(var12.getElementCount() - 1, 1, var14);
  579.          var10.addEdit(new AbstractDocument.ElementEdit(var12, var12.getElementCount() - 1, var13, var14));
  580.       }
  581.  
  582.       if (var11 != null) {
  583.          var10.addEdit(var11);
  584.       }
  585.  
  586.       ((AbstractDocument)this).postRemoveUpdate(var10);
  587.       ((CompoundEdit)var10).end();
  588.       ((AbstractDocument)this).fireRemoveUpdate(var10);
  589.       if (var11 != null) {
  590.          this.fireUndoableEditUpdate(new UndoableEditEvent(this, var10));
  591.       }
  592.  
  593.    }
  594.  
  595.    private void removeElements(Element var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  596.       Element[] var6 = new Element[var3];
  597.       Element[] var7 = new Element[0];
  598.  
  599.       for(int var8 = 0; var8 < var3; ++var8) {
  600.          var6[var8] = var1.getElement(var8 + var2);
  601.       }
  602.  
  603.       AbstractDocument.DefaultDocumentEvent var9 = new AbstractDocument.DefaultDocumentEvent(this, var4, var5 - var4, EventType.REMOVE);
  604.       ((AbstractDocument.BranchElement)var1).replace(var2, var6.length, var7);
  605.       var9.addEdit(new AbstractDocument.ElementEdit(var1, var2, var6, var7));
  606.       UndoableEdit var10 = ((AbstractDocument)this).getContent().remove(var4, var5 - var4);
  607.       if (var10 != null) {
  608.          var9.addEdit(var10);
  609.       }
  610.  
  611.       ((AbstractDocument)this).postRemoveUpdate(var9);
  612.       ((CompoundEdit)var9).end();
  613.       ((AbstractDocument)this).fireRemoveUpdate(var9);
  614.       if (var10 != null) {
  615.          this.fireUndoableEditUpdate(new UndoableEditEvent(this, var9));
  616.       }
  617.  
  618.    }
  619.  
  620.    void obtainLock() {
  621.       ((AbstractDocument)this).writeLock();
  622.    }
  623.  
  624.    void releaseLock() {
  625.       ((AbstractDocument)this).writeUnlock();
  626.    }
  627.  
  628.    protected void fireChangedUpdate(DocumentEvent var1) {
  629.       super.fireChangedUpdate(var1);
  630.    }
  631.  
  632.    protected void fireUndoableEditUpdate(UndoableEditEvent var1) {
  633.       super.fireUndoableEditUpdate(var1);
  634.    }
  635.  
  636.    AttributeSet getFormAttributes(AttributeSet var1) {
  637.       Enumeration var2 = var1.getAttributeNames();
  638.  
  639.       while(var2.hasMoreElements()) {
  640.          Object var3 = var2.nextElement();
  641.          if (var3 instanceof HTML.Tag) {
  642.             HTML.Tag var4 = (HTML.Tag)var3;
  643.             if (var4 == Tag.FORM) {
  644.                Object var5 = var1.getAttribute(var4);
  645.                if (var5 != null && var5 instanceof AttributeSet) {
  646.                   return (AttributeSet)var5;
  647.                }
  648.             }
  649.          }
  650.       }
  651.  
  652.       return null;
  653.    }
  654.  
  655.    private boolean formMatchesSubmissionRequest(AttributeSet var1, AttributeSet var2) {
  656.       AttributeSet var3 = this.getFormAttributes(var1);
  657.       return var3 != null ? var2.isEqual(var3) : false;
  658.    }
  659.  
  660.    void getFormData(StringBuffer var1, Element var2) {
  661.       AttributeSet var3 = var2.getAttributes();
  662.       AttributeSet var4 = this.getFormAttributes(var3);
  663.       ElementIterator var5 = new ElementIterator(((DefaultStyledDocument)this).getDefaultRootElement());
  664.       if (var4 != null) {
  665.          boolean var7 = false;
  666.  
  667.          Element var6;
  668.          while((var6 = var5.next()) != null) {
  669.             AttributeSet var8 = var6.getAttributes();
  670.             if (this.formMatchesSubmissionRequest(var8, var4)) {
  671.                var7 = true;
  672.                String var9 = (String)var8.getAttribute(Attribute.TYPE);
  673.                if ((var9 == null || !var9.equals("submit") || var6 == var2) && (var9 == null || !var9.equals("image"))) {
  674.                   this.loadElementDataIntoBuffer(var6, var1);
  675.                }
  676.             } else if (var7 && var6.isLeaf()) {
  677.                break;
  678.             }
  679.          }
  680.  
  681.       }
  682.    }
  683.  
  684.    private void loadElementDataIntoBuffer(Element var1, StringBuffer var2) {
  685.       AttributeSet var3 = var1.getAttributes();
  686.       String var4 = (String)var3.getAttribute(Attribute.NAME);
  687.       if (var4 != null) {
  688.          String var5 = null;
  689.          HTML.Tag var6 = (HTML.Tag)var1.getAttributes().getAttribute(StyleConstants.NameAttribute);
  690.          if (var6 == Tag.INPUT) {
  691.             var5 = this.getInputElementData(var3);
  692.          } else if (var6 == Tag.TEXTAREA) {
  693.             var5 = this.getTextAreaData(var3);
  694.          } else if (var6 == Tag.SELECT) {
  695.             this.loadSelectData(var3, var2);
  696.          }
  697.  
  698.          if (var4 != null && var5 != null) {
  699.             this.appendBuffer(var2, var4, var5);
  700.          }
  701.  
  702.       }
  703.    }
  704.  
  705.    private String getInputElementData(AttributeSet var1) {
  706.       Object var2 = var1.getAttribute(StyleConstants.ModelAttribute);
  707.       String var3 = (String)var1.getAttribute(Attribute.TYPE);
  708.       String var4 = null;
  709.       if (!var3.equals("text") && !var3.equals("password")) {
  710.          if (!var3.equals("submit") && !var3.equals("hidden")) {
  711.             if (var3.equals("radio") || var3.equals("checkbox")) {
  712.                ButtonModel var8 = (ButtonModel)var2;
  713.                if (var8.isSelected()) {
  714.                   var4 = (String)var1.getAttribute(Attribute.VALUE);
  715.                   if (var4 == null) {
  716.                      var4 = "on";
  717.                   }
  718.                }
  719.             }
  720.          } else {
  721.             var4 = (String)var1.getAttribute(Attribute.VALUE);
  722.             if (var4 == null) {
  723.                var4 = "";
  724.             }
  725.          }
  726.       } else {
  727.          Document var5 = (Document)var2;
  728.  
  729.          try {
  730.             var4 = var5.getText(0, var5.getLength());
  731.          } catch (BadLocationException var7) {
  732.             var4 = null;
  733.          }
  734.       }
  735.  
  736.       return var4;
  737.    }
  738.  
  739.    private String getTextAreaData(AttributeSet var1) {
  740.       Document var2 = (Document)var1.getAttribute(StyleConstants.ModelAttribute);
  741.  
  742.       try {
  743.          return var2.getText(0, var2.getLength());
  744.       } catch (BadLocationException var4) {
  745.          return null;
  746.       }
  747.    }
  748.  
  749.    private void loadSelectData(AttributeSet var1, StringBuffer var2) {
  750.       String var3 = (String)var1.getAttribute(Attribute.NAME);
  751.       if (var3 != null) {
  752.          Object var4 = var1.getAttribute(StyleConstants.ModelAttribute);
  753.          if (var4 instanceof OptionListModel) {
  754.             OptionListModel var5 = (OptionListModel)var4;
  755.  
  756.             for(int var6 = 0; var6 < ((DefaultListModel)var5).getSize(); ++var6) {
  757.                if (var5.isSelectedIndex(var6)) {
  758.                   Option var7 = (Option)((DefaultListModel)var5).getElementAt(var6);
  759.                   this.appendBuffer(var2, var3, var7.getValue());
  760.                }
  761.             }
  762.          } else if (var4 instanceof ComboBoxModel) {
  763.             ComboBoxModel var8 = (ComboBoxModel)var4;
  764.             Option var9 = (Option)var8.getSelectedItem();
  765.             if (var9 != null) {
  766.                this.appendBuffer(var2, var3, var9.getValue());
  767.             }
  768.          }
  769.  
  770.       }
  771.    }
  772.  
  773.    private void appendBuffer(StringBuffer var1, String var2, String var3) {
  774.       this.ampersand(var1);
  775.       String var4 = URLEncoder.encode(var2);
  776.       var1.append(var4);
  777.       var1.append('=');
  778.       String var5 = URLEncoder.encode(var3);
  779.       var1.append(var5);
  780.    }
  781.  
  782.    private void ampersand(StringBuffer var1) {
  783.       if (var1.length() > 0) {
  784.          var1.append('&');
  785.       }
  786.  
  787.    }
  788.  
  789.    boolean isLastTextOrPasswordField(Element var1) {
  790.       ElementIterator var2 = new ElementIterator(((DefaultStyledDocument)this).getDefaultRootElement());
  791.       boolean var4 = false;
  792.       AttributeSet var5 = this.getFormAttributes(var1.getAttributes());
  793.  
  794.       while(true) {
  795.          Element var3;
  796.          if ((var3 = var2.next()) != null) {
  797.             AttributeSet var6 = var3.getAttributes();
  798.             if (this.formMatchesSubmissionRequest(var6, var5)) {
  799.                if (var4 && this.matchNameAttribute(var6, Tag.INPUT)) {
  800.                   String var7 = (String)var6.getAttribute(Attribute.TYPE);
  801.                   if (var7.equals("text") || var7.equals("password")) {
  802.                      return false;
  803.                   }
  804.                }
  805.  
  806.                if (var3 == var1) {
  807.                   var4 = true;
  808.                }
  809.                continue;
  810.             }
  811.  
  812.             if (!var4 || !var3.isLeaf()) {
  813.                continue;
  814.             }
  815.          }
  816.  
  817.          return true;
  818.       }
  819.    }
  820.  
  821.    void resetForm(Element var1) {
  822.       ElementIterator var2 = new ElementIterator(((DefaultStyledDocument)this).getDefaultRootElement());
  823.       boolean var4 = false;
  824.       AttributeSet var5 = this.getFormAttributes(var1.getAttributes());
  825.  
  826.       Element var3;
  827.       while((var3 = var2.next()) != null) {
  828.          AttributeSet var6 = var3.getAttributes();
  829.          if (!this.formMatchesSubmissionRequest(var6, var5)) {
  830.             if (var4 && var3.isLeaf()) {
  831.                break;
  832.             }
  833.          } else {
  834.             Object var7 = var6.getAttribute(StyleConstants.ModelAttribute);
  835.             if (var7 instanceof TextAreaDocument) {
  836.                TextAreaDocument var8 = (TextAreaDocument)var7;
  837.                var8.reset();
  838.             } else if (var7 instanceof PlainDocument) {
  839.                try {
  840.                   PlainDocument var14 = (PlainDocument)var7;
  841.                   ((AbstractDocument)var14).remove(0, ((AbstractDocument)var14).getLength());
  842.                   if (this.matchNameAttribute(var6, Tag.INPUT)) {
  843.                      String var9 = (String)var6.getAttribute(Attribute.VALUE);
  844.                      if (var9 != null) {
  845.                         ((AbstractDocument)var14).insertString(0, var9, (AttributeSet)null);
  846.                      }
  847.                   }
  848.                } catch (BadLocationException var13) {
  849.                }
  850.             } else if (var7 instanceof OptionListModel) {
  851.                OptionListModel var15 = (OptionListModel)var7;
  852.                int var18 = ((DefaultListModel)var15).getSize();
  853.  
  854.                for(int var10 = 0; var10 < var18; ++var10) {
  855.                   var15.removeIndexInterval(var10, var10);
  856.                }
  857.  
  858.                BitSet var11 = var15.getInitialSelection();
  859.  
  860.                for(int var12 = 0; var12 < var11.size(); ++var12) {
  861.                   if (var11.get(var12)) {
  862.                      var15.addSelectionInterval(var12, var12);
  863.                   }
  864.                }
  865.             } else if (var7 instanceof OptionComboBoxModel) {
  866.                OptionComboBoxModel var16 = (OptionComboBoxModel)var7;
  867.                Option var19 = var16.getInitialSelection();
  868.                if (var19 != null) {
  869.                   ((DefaultComboBoxModel)var16).setSelectedItem(var19);
  870.                }
  871.             } else if (var7 instanceof JToggleButton.ToggleButtonModel) {
  872.                boolean var17 = (String)var6.getAttribute(Attribute.CHECKED) != null;
  873.                JToggleButton.ToggleButtonModel var20 = (JToggleButton.ToggleButtonModel)var7;
  874.                var20.setSelected(var17);
  875.             }
  876.  
  877.             var4 = true;
  878.          }
  879.       }
  880.  
  881.    }
  882.  
  883.    // $FF: synthetic method
  884.    static char[] access$000() {
  885.       return NEWLINE;
  886.    }
  887.  
  888.    // $FF: synthetic method
  889.    static ButtonGroup access$402(HTMLDocument var0, ButtonGroup var1) {
  890.       return var0.radioButtonGroup = var1;
  891.    }
  892.  
  893.    // $FF: synthetic method
  894.    static ButtonGroup access$400(HTMLDocument var0) {
  895.       return var0.radioButtonGroup;
  896.    }
  897.  
  898.    static {
  899.       ((MutableAttributeSet)contentAttributeSet).addAttribute(StyleConstants.NameAttribute, Tag.CONTENT);
  900.       NEWLINE = new char[1];
  901.       NEWLINE[0] = '\n';
  902.    }
  903. }
  904.