< prev index next >
src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java
Print this page
*** 39,82 ****
/**
* A document that models HTML. The purpose of this model is to
* support both browsing and editing. As a result, the structure
* described by an HTML document is not exactly replicated by default.
* The element structure that is modeled by default, is built by the
! * class <code>HTMLDocument.HTMLReader</code>, which implements the
! * <code>HTMLEditorKit.ParserCallback</code> protocol that the parser
* expects. To change the structure one can subclass
! * <code>HTMLReader</code>, and reimplement the method {@link
* #getReader(int)} to return the new reader implementation. The
! * documentation for <code>HTMLReader</code> should be consulted for
* the details of the default structure created. The intent is that
* the document be non-lossy (although reproducing the HTML format may
* result in a different format).
*
* <p>The document models only HTML, and makes no attempt to store
* view attributes in it. The elements are identified by the
! * <code>StyleContext.NameAttribute</code> attribute, which should
! * always have a value of type <code>HTML.Tag</code> that identifies
* the kind of element. Some of the elements (such as comments) are
! * synthesized. The <code>HTMLFactory</code> uses this attribute to
* determine what kind of view to build.</p>
*
* <p>This document supports incremental loading. The
! * <code>TokenThreshold</code> property controls how much of the parse
* is buffered before trying to update the element structure of the
! * document. This property is set by the <code>EditorKit</code> so
* that subclasses can disable it.</p>
*
! * <p>The <code>Base</code> property determines the URL against which
* relative URLs are resolved. By default, this will be the
! * <code>Document.StreamDescriptionProperty</code> if the value of the
* property is a URL. If a <BASE> tag is encountered, the base
* will become the URL specified by that tag. Because the base URL is
* a property, it can of course be set directly.</p>
*
* <p>The default content storage mechanism for this document is a gap
! * buffer (<code>GapContent</code>). Alternatives can be supplied by
! * using the constructor that takes a <code>Content</code>
* implementation.</p>
*
* <h2>Modifying HTMLDocument</h2>
*
* <p>In addition to the methods provided by Document and
--- 39,82 ----
/**
* A document that models HTML. The purpose of this model is to
* support both browsing and editing. As a result, the structure
* described by an HTML document is not exactly replicated by default.
* The element structure that is modeled by default, is built by the
! * class {@code HTMLDocument.HTMLReader}, which implements the
! * {@code HTMLEditorKit.ParserCallback} protocol that the parser
* expects. To change the structure one can subclass
! * {@code HTMLReader}, and reimplement the method {@link
* #getReader(int)} to return the new reader implementation. The
! * documentation for {@code HTMLReader} should be consulted for
* the details of the default structure created. The intent is that
* the document be non-lossy (although reproducing the HTML format may
* result in a different format).
*
* <p>The document models only HTML, and makes no attempt to store
* view attributes in it. The elements are identified by the
! * {@code StyleContext.NameAttribute} attribute, which should
! * always have a value of type {@code HTML.Tag} that identifies
* the kind of element. Some of the elements (such as comments) are
! * synthesized. The {@code HTMLFactory} uses this attribute to
* determine what kind of view to build.</p>
*
* <p>This document supports incremental loading. The
! * {@code TokenThreshold} property controls how much of the parse
* is buffered before trying to update the element structure of the
! * document. This property is set by the {@code EditorKit} so
* that subclasses can disable it.</p>
*
! * <p>The {@code Base} property determines the URL against which
* relative URLs are resolved. By default, this will be the
! * {@code Document.StreamDescriptionProperty} if the value of the
* property is a URL. If a <BASE> tag is encountered, the base
* will become the URL specified by that tag. Because the base URL is
* a property, it can of course be set directly.</p>
*
* <p>The default content storage mechanism for this document is a gap
! * buffer ({@code GapContent}). Alternatives can be supplied by
! * using the constructor that takes a {@code Content}
* implementation.</p>
*
* <h2>Modifying HTMLDocument</h2>
*
* <p>In addition to the methods provided by Document and
*** 104,199 ****
* HTMLDocument d = (HTMLDocument) p.getDocument();
* </pre>
*
* <p>With the following HTML content:</p>
*
! * <pre>
! * <html>
! * <head>
! * <title>An example HTMLDocument</title>
! * <style type="text/css">
* div { background-color: silver; }
* ul { color: red; }
! * </style>
! * </head>
! * <body>
! * <div id="BOX">
! * <p>Paragraph 1</p>
! * <p>Paragraph 2</p>
! * </div>
! * </body>
! * </html>
! * </pre>
*
* <p>All the methods for modifying an HTML document require an {@link
* Element}. Elements can be obtained from an HTML document by using
* the method {@link #getElement(Element e, Object attribute, Object
* value)}. It returns the first descendant element that contains the
* specified attribute with the given value, in depth-first order.
! * For example, <code>d.getElement(d.getDefaultRootElement(),
! * StyleConstants.NameAttribute, HTML.Tag.P)</code> returns the first
* paragraph element.</p>
*
* <p>A convenient shortcut for locating elements is the method {@link
! * #getElement(String)}; returns an element whose <code>ID</code>
* attribute matches the specified value. For example,
! * <code>d.getElement("BOX")</code> returns the <code>DIV</code>
* element.</p>
*
* <p>The {@link #getIterator(HTML.Tag t)} method can also be used for
* finding all occurrences of the specified HTML tag in the
* document.</p>
*
* <h3>Inserting elements</h3>
*
* <p>Elements can be inserted before or after the existing children
* of any non-leaf element by using the methods
! * <code>insertAfterStart</code> and <code>insertBeforeEnd</code>.
! * For example, if <code>e</code> is the <code>DIV</code> element,
! * <code>d.insertAfterStart(e, "<ul><li>List
! * Item</li></ul>")</code> inserts the list before the first
! * paragraph, and <code>d.insertBeforeEnd(e, "<ul><li>List
! * Item</li></ul>")</code> inserts the list after the last
! * paragraph. The <code>DIV</code> block becomes the parent of the
* newly inserted elements.</p>
*
* <p>Sibling elements can be inserted before or after any element by
! * using the methods <code>insertBeforeStart</code> and
! * <code>insertAfterEnd</code>. For example, if <code>e</code> is the
! * <code>DIV</code> element, <code>d.insertBeforeStart(e,
! * "<ul><li>List Item</li></ul>")</code> inserts the list
! * before the <code>DIV</code> element, and <code>d.insertAfterEnd(e,
! * "<ul><li>List Item</li></ul>")</code> inserts the list
! * after the <code>DIV</code> element. The newly inserted elements
! * become siblings of the <code>DIV</code> element.</p>
*
* <h3>Replacing elements</h3>
*
* <p>Elements and all their descendants can be replaced by using the
! * methods <code>setInnerHTML</code> and <code>setOuterHTML</code>.
! * For example, if <code>e</code> is the <code>DIV</code> element,
! * <code>d.setInnerHTML(e, "<ul><li>List
! * Item</li></ul>")</code> replaces all children paragraphs with
! * the list, and <code>d.setOuterHTML(e, "<ul><li>List
! * Item</li></ul>")</code> replaces the <code>DIV</code> element
* itself. In latter case the parent of the list is the
! * <code>BODY</code> element.
*
* <h3>Summary</h3>
*
* <p>The following table shows the example document and the results
* of various methods described above.</p>
*
* <table border=1 cellspacing=0 summary="HTML Content of example above">
* <tr>
* <th>Example</th>
! * <th><code>insertAfterStart</code></th>
! * <th><code>insertBeforeEnd</code></th>
! * <th><code>insertBeforeStart</code></th>
! * <th><code>insertAfterEnd</code></th>
! * <th><code>setInnerHTML</code></th>
! * <th><code>setOuterHTML</code></th>
* </tr>
* <tr valign="top">
* <td style="white-space:nowrap">
* <div style="background-color: silver;">
* <p>Paragraph 1</p>
--- 104,202 ----
* HTMLDocument d = (HTMLDocument) p.getDocument();
* </pre>
*
* <p>With the following HTML content:</p>
*
! * <pre>{@code
! * <html>
! * <head>
! * <title>An example HTMLDocument</title>
! * <style type="text/css">
* div { background-color: silver; }
* ul { color: red; }
! * </style>
! * </head>
! * <body>
! * <div id="BOX">
! * <p>Paragraph 1</p>
! * <p>Paragraph 2</p>
! * </div>
! * </body>
! * </html>
! * }</pre>
*
* <p>All the methods for modifying an HTML document require an {@link
* Element}. Elements can be obtained from an HTML document by using
* the method {@link #getElement(Element e, Object attribute, Object
* value)}. It returns the first descendant element that contains the
* specified attribute with the given value, in depth-first order.
! * For example, {@code d.getElement(d.getDefaultRootElement(),
! * StyleConstants.NameAttribute, HTML.Tag.P)} returns the first
* paragraph element.</p>
*
* <p>A convenient shortcut for locating elements is the method {@link
! * #getElement(String)}; returns an element whose {@code ID}
* attribute matches the specified value. For example,
! * {@code d.getElement("BOX")} returns the {@code DIV}
* element.</p>
*
* <p>The {@link #getIterator(HTML.Tag t)} method can also be used for
* finding all occurrences of the specified HTML tag in the
* document.</p>
*
* <h3>Inserting elements</h3>
*
* <p>Elements can be inserted before or after the existing children
* of any non-leaf element by using the methods
! * {@code insertAfterStart} and {@code insertBeforeEnd}.
! * For example, if {@code e} is the {@code DIV} element,
! * {@code d.insertAfterStart(e, "<ul><li>List Item</li></ul>")}
! * inserts the list before the first
! * paragraph, and
! * {@code d.insertBeforeEnd(e, "<ul><li>List Item</li></ul>")}
! * inserts the list after the last
! * paragraph. The {@code DIV} block becomes the parent of the
* newly inserted elements.</p>
*
* <p>Sibling elements can be inserted before or after any element by
! * using the methods {@code insertBeforeStart} and
! * {@code insertAfterEnd}. For example, if {@code e} is the
! * {@code DIV} element,
! * {@code d.insertBeforeStart(e, "<ul><li>List Item</li></ul>")}
! * inserts the list before the {@code DIV} element, and
! * {@code d.insertAfterEnd(e, "<ul><li>List Item</li></ul>")}
! * inserts the list after the {@code DIV} element.
! * The newly inserted elements
! * become siblings of the {@code DIV} element.</p>
*
* <h3>Replacing elements</h3>
*
* <p>Elements and all their descendants can be replaced by using the
! * methods {@code setInnerHTML} and {@code setOuterHTML}.
! * For example, if {@code e} is the {@code DIV} element,
! * {@code d.setInnerHTML(e, "<ul><li>List Item</li></ul>")}
! * replaces all children paragraphs with
! * the list, and
! * {@code d.setOuterHTML(e, "<ul><li>List Item</li></ul>")}
! * replaces the {@code DIV} element
* itself. In latter case the parent of the list is the
! * {@code BODY} element.
*
* <h3>Summary</h3>
*
* <p>The following table shows the example document and the results
* of various methods described above.</p>
*
* <table border=1 cellspacing=0 summary="HTML Content of example above">
* <tr>
* <th>Example</th>
! * <th>{@code insertAfterStart}</th>
! * <th>{@code insertBeforeEnd}</th>
! * <th>{@code insertBeforeStart}</th>
! * <th>{@code insertAfterEnd}</th>
! * <th>{@code setInnerHTML}</th>
! * <th>{@code setOuterHTML}</th>
* </tr>
* <tr valign="top">
* <td style="white-space:nowrap">
* <div style="background-color: silver;">
* <p>Paragraph 1</p>
*** 261,295 ****
* not be compatible with future Swing releases. The current
* serialization support is appropriate for short term storage or RMI
* between applications running the same version of Swing. As of 1.4,
* support for long term storage of all JavaBeans™
* has been added to the
! * <code>java.beans</code> package. Please see {@link
* java.beans.XMLEncoder}.</p>
*
* @author Timothy Prinzing
* @author Scott Violet
* @author Sunita Mani
*/
@SuppressWarnings("serial") // Same-version serialization only
public class HTMLDocument extends DefaultStyledDocument {
/**
* Constructs an HTML document using the default buffer size
! * and a default <code>StyleSheet</code>. This is a convenience
* method for the constructor
! * <code>HTMLDocument(Content, StyleSheet)</code>.
*/
public HTMLDocument() {
this(new GapContent(BUFFER_SIZE_DEFAULT), new StyleSheet());
}
/**
* Constructs an HTML document with the default content
* storage implementation and the specified style/attribute
* storage mechanism. This is a convenience method for the
* constructor
! * <code>HTMLDocument(Content, StyleSheet)</code>.
*
* @param styles the styles
*/
public HTMLDocument(StyleSheet styles) {
this(new GapContent(BUFFER_SIZE_DEFAULT), styles);
--- 264,298 ----
* not be compatible with future Swing releases. The current
* serialization support is appropriate for short term storage or RMI
* between applications running the same version of Swing. As of 1.4,
* support for long term storage of all JavaBeans™
* has been added to the
! * {@code java.beans} package. Please see {@link
* java.beans.XMLEncoder}.</p>
*
* @author Timothy Prinzing
* @author Scott Violet
* @author Sunita Mani
*/
@SuppressWarnings("serial") // Same-version serialization only
public class HTMLDocument extends DefaultStyledDocument {
/**
* Constructs an HTML document using the default buffer size
! * and a default {@code StyleSheet}. This is a convenience
* method for the constructor
! * {@code HTMLDocument(Content, StyleSheet)}.
*/
public HTMLDocument() {
this(new GapContent(BUFFER_SIZE_DEFAULT), new StyleSheet());
}
/**
* Constructs an HTML document with the default content
* storage implementation and the specified style/attribute
* storage mechanism. This is a convenience method for the
* constructor
! * {@code HTMLDocument(Content, StyleSheet)}.
*
* @param styles the styles
*/
public HTMLDocument(StyleSheet styles) {
this(new GapContent(BUFFER_SIZE_DEFAULT), styles);
*** 308,318 ****
}
/**
* Fetches the reader for the parser to use when loading the document
* with HTML. This is implemented to return an instance of
! * <code>HTMLDocument.HTMLReader</code>.
* Subclasses can reimplement this
* method to change how the document gets structured if desired.
* (For example, to handle custom tags, or structurally represent character
* style elements.)
*
--- 311,321 ----
}
/**
* Fetches the reader for the parser to use when loading the document
* with HTML. This is implemented to return an instance of
! * {@code HTMLDocument.HTMLReader}.
* Subclasses can reimplement this
* method to change how the document gets structured if desired.
* (For example, to handle custom tags, or structurally represent character
* style elements.)
*
*** 329,351 ****
}
/**
* Returns the reader for the parser to use to load the document
* with HTML. This is implemented to return an instance of
! * <code>HTMLDocument.HTMLReader</code>.
* Subclasses can reimplement this
* method to change how the document gets structured if desired.
* (For example, to handle custom tags, or structurally represent character
* style elements.)
* <p>This is a convenience method for
! * <code>getReader(int, int, int, HTML.Tag, TRUE)</code>.
*
* @param pos the starting position
! * @param popDepth the number of <code>ElementSpec.EndTagTypes</code>
* to generate before inserting
! * @param pushDepth the number of <code>ElementSpec.StartTagTypes</code>
! * with a direction of <code>ElementSpec.JoinNextDirection</code>
* that should be generated before inserting,
* but after the end tags have been generated
* @param insertTag the first tag to start inserting into document
* @return the reader used by the parser to load the document
*/
--- 332,354 ----
}
/**
* Returns the reader for the parser to use to load the document
* with HTML. This is implemented to return an instance of
! * {@code HTMLDocument.HTMLReader}.
* Subclasses can reimplement this
* method to change how the document gets structured if desired.
* (For example, to handle custom tags, or structurally represent character
* style elements.)
* <p>This is a convenience method for
! * {@code getReader(int, int, int, HTML.Tag, TRUE)}.
*
* @param pos the starting position
! * @param popDepth the number of {@code ElementSpec.EndTagTypes}
* to generate before inserting
! * @param pushDepth the number of {@code ElementSpec.StartTagTypes}
! * with a direction of {@code ElementSpec.JoinNextDirection}
* that should be generated before inserting,
* but after the end tags have been generated
* @param insertTag the first tag to start inserting into document
* @return the reader used by the parser to load the document
*/
*** 361,374 ****
* HTMLDocument.HTMLReader. Subclasses can reimplement this
* method to change how the document get structured if desired
* (e.g. to handle custom tags, structurally represent character
* style elements, etc.).
*
! * @param popDepth the number of <code>ElementSpec.EndTagTypes</code>
* to generate before inserting
! * @param pushDepth the number of <code>ElementSpec.StartTagTypes</code>
! * with a direction of <code>ElementSpec.JoinNextDirection</code>
* that should be generated before inserting,
* but after the end tags have been generated
* @param insertTag the first tag to start inserting into document
* @param insertInsertTag false if all the Elements after insertTag should
* be inserted; otherwise insertTag will be inserted
--- 364,377 ----
* HTMLDocument.HTMLReader. Subclasses can reimplement this
* method to change how the document get structured if desired
* (e.g. to handle custom tags, structurally represent character
* style elements, etc.).
*
! * @param popDepth the number of {@code ElementSpec.EndTagTypes}
* to generate before inserting
! * @param pushDepth the number of {@code ElementSpec.StartTagTypes}
! * with a direction of {@code ElementSpec.JoinNextDirection}
* that should be generated before inserting,
* but after the end tags have been generated
* @param insertTag the first tag to start inserting into document
* @param insertInsertTag false if all the Elements after insertTag should
* be inserted; otherwise insertTag will be inserted
*** 403,414 ****
/**
* Sets the location to resolve relative URLs against. By
* default this will be the document's URL if the document
* was loaded from a URL. If a base tag is found and
* can be parsed, it will be used as the base location.
! * <p>This also sets the base of the <code>StyleSheet</code>
! * to be <code>u</code> as well as the base of the document.
*
* @param u the desired base URL
*/
public void setBase(URL u) {
base = u;
--- 406,417 ----
/**
* Sets the location to resolve relative URLs against. By
* default this will be the document's URL if the document
* was loaded from a URL. If a base tag is found and
* can be parsed, it will be used as the base location.
! * <p>This also sets the base of the {@code StyleSheet}
! * to be {@code u} as well as the base of the document.
*
* @param u the desired base URL
*/
public void setBase(URL u) {
base = u;
*** 522,535 ****
writeUnlock();
}
}
/**
! * Fetches the <code>StyleSheet</code> with the document-specific display
* rules (CSS) that were specified in the HTML document itself.
*
! * @return the <code>StyleSheet</code>
*/
public StyleSheet getStyleSheet() {
return (StyleSheet) getAttributeContext();
}
--- 525,538 ----
writeUnlock();
}
}
/**
! * Fetches the {@code StyleSheet} with the document-specific display
* rules (CSS) that were specified in the HTML document itself.
*
! * @return the {@code StyleSheet}
*/
public StyleSheet getStyleSheet() {
return (StyleSheet) getAttributeContext();
}
*** 537,548 ****
* Fetches an iterator for the specified HTML tag.
* This can be used for things like iterating over the
* set of anchors contained, or iterating over the input
* elements.
*
! * @param t the requested <code>HTML.Tag</code>
! * @return the <code>Iterator</code> for the given HTML tag
* @see javax.swing.text.html.HTML.Tag
*/
public Iterator getIterator(HTML.Tag t) {
if (t.isBlock()) {
// TBD
--- 540,551 ----
* Fetches an iterator for the specified HTML tag.
* This can be used for things like iterating over the
* set of anchors contained, or iterating over the input
* elements.
*
! * @param t the requested {@code HTML.Tag}
! * @return the {@code Iterator} for the given HTML tag
* @see javax.swing.text.html.HTML.Tag
*/
public Iterator getIterator(HTML.Tag t) {
if (t.isBlock()) {
// TBD
*** 553,563 ****
/**
* Creates a document leaf element that directly represents
* text (doesn't have any children). This is implemented
* to return an element of type
! * <code>HTMLDocument.RunElement</code>.
*
* @param parent the parent element
* @param a the attributes for the element
* @param p0 the beginning of the range (must be at least 0)
* @param p1 the end of the range (must be at least p0)
--- 556,566 ----
/**
* Creates a document leaf element that directly represents
* text (doesn't have any children). This is implemented
* to return an element of type
! * {@code HTMLDocument.RunElement}.
*
* @param parent the parent element
* @param a the attributes for the element
* @param p0 the beginning of the range (must be at least 0)
* @param p1 the end of the range (must be at least p0)
*** 568,578 ****
}
/**
* Creates a document branch element, that can contain other elements.
* This is implemented to return an element of type
! * <code>HTMLDocument.BlockElement</code>.
*
* @param parent the parent element
* @param a the attributes
* @return the element
*/
--- 571,581 ----
}
/**
* Creates a document branch element, that can contain other elements.
* This is implemented to return an element of type
! * {@code HTMLDocument.BlockElement}.
*
* @param parent the parent element
* @param a the attributes
* @return the element
*/
*** 627,637 ****
}
/**
* Gets the number of tokens to buffer before trying to update
* the documents element structure. The default value is
! * <code>Integer.MAX_VALUE</code>.
*
* @return the number of tokens to buffer
*/
public int getTokenThreshold() {
Integer i = (Integer) getProperty(TokenThreshold);
--- 630,640 ----
}
/**
* Gets the number of tokens to buffer before trying to update
* the documents element structure. The default value is
! * {@code Integer.MAX_VALUE}.
*
* @return the number of tokens to buffer
*/
public int getTokenThreshold() {
Integer i = (Integer) getProperty(TokenThreshold);
*** 664,679 ****
public boolean getPreservesUnknownTags() {
return preservesUnknownTags;
}
/**
! * Processes <code>HyperlinkEvents</code> that
* are generated by documents in an HTML frame.
! * The <code>HyperlinkEvent</code> type, as the parameter suggests,
! * is <code>HTMLFrameHyperlinkEvent</code>.
* In addition to the typical information contained in a
! * <code>HyperlinkEvent</code>,
* this event contains the element that corresponds to the frame in
* which the click happened (the source element) and the
* target name. The target name has 4 possible values:
* <ul>
* <li> _self
--- 667,682 ----
public boolean getPreservesUnknownTags() {
return preservesUnknownTags;
}
/**
! * Processes {@code HyperlinkEvents} that
* are generated by documents in an HTML frame.
! * The {@code HyperlinkEvent} type, as the parameter suggests,
! * is {@code HTMLFrameHyperlinkEvent}.
* In addition to the typical information contained in a
! * {@code HyperlinkEvent},
* this event contains the element that corresponds to the frame in
* which the click happened (the source element) and the
* target name. The target name has 4 possible values:
* <ul>
* <li> _self
*** 681,709 ****
* <li> _top
* <li> a named frame
* </ul>
*
* If target is _self, the action is to change the value of the
! * <code>HTML.Attribute.SRC</code> attribute and fires a
! * <code>ChangedUpdate</code> event.
*<p>
* If the target is _parent, then it deletes the parent element,
* which is a <FRAMESET> element, and inserts a new <FRAME>
! * element, and sets its <code>HTML.Attribute.SRC</code> attribute
* to have a value equal to the destination URL and fire a
! * <code>RemovedUpdate</code> and <code>InsertUpdate</code>.
*<p>
* If the target is _top, this method does nothing. In the implementation
! * of the view for a frame, namely the <code>FrameView</code>,
* the processing of _top is handled. Given that _top implies
* replacing the entire document, it made sense to handle this outside
* of the document that it will replace.
*<p>
* If the target is a named frame, then the element hierarchy is searched
* for an element with a name equal to the target, its
! * <code>HTML.Attribute.SRC</code> attribute is updated and a
! * <code>ChangedUpdate</code> event is fired.
*
* @param e the event
*/
public void processHTMLFrameHyperlinkEvent(HTMLFrameHyperlinkEvent e) {
String frameName = e.getTarget();
--- 684,712 ----
* <li> _top
* <li> a named frame
* </ul>
*
* If target is _self, the action is to change the value of the
! * {@code HTML.Attribute.SRC} attribute and fires a
! * {@code ChangedUpdate} event.
*<p>
* If the target is _parent, then it deletes the parent element,
* which is a <FRAMESET> element, and inserts a new <FRAME>
! * element, and sets its {@code HTML.Attribute.SRC} attribute
* to have a value equal to the destination URL and fire a
! * {@code RemovedUpdate} and {@code InsertUpdate}.
*<p>
* If the target is _top, this method does nothing. In the implementation
! * of the view for a frame, namely the {@code FrameView},
* the processing of _top is handled. Given that _top implies
* replacing the entire document, it made sense to handle this outside
* of the document that it will replace.
*<p>
* If the target is a named frame, then the element hierarchy is searched
* for an element with a name equal to the target, its
! * {@code HTML.Attribute.SRC} attribute is updated and a
! * {@code ChangedUpdate} event is fired.
*
* @param e the event
*/
public void processHTMLFrameHyperlinkEvent(HTMLFrameHyperlinkEvent e) {
String frameName = e.getTarget();
*** 733,747 ****
}
/**
* Searches the element hierarchy for an FRAME element
! * that has its name attribute equal to the <code>frameName</code>.
*
* @param frameName
* @return the element whose NAME attribute has a value of
! * <code>frameName</code>; returns <code>null</code>
* if not found
*/
private Element findFrame(String frameName) {
ElementIterator it = new ElementIterator(this);
Element next;
--- 736,750 ----
}
/**
* Searches the element hierarchy for an FRAME element
! * that has its name attribute equal to the {@code frameName}.
*
* @param frameName
* @return the element whose NAME attribute has a value of
! * {@code frameName}; returns {@code null}
* if not found
*/
private Element findFrame(String frameName) {
ElementIterator it = new ElementIterator(this);
Element next;
*** 757,767 ****
}
return next;
}
/**
! * Returns true if <code>StyleConstants.NameAttribute</code> is
* equal to the tag that is passed in as a parameter.
*
* @param attr the attributes to be matched
* @param tag the value to be matched
* @return true if there is a match, false otherwise
--- 760,770 ----
}
return next;
}
/**
! * Returns true if {@code StyleConstants.NameAttribute} is
* equal to the tag that is passed in as a parameter.
*
* @param attr the attributes to be matched
* @param tag the value to be matched
* @return true if there is a match, false otherwise
*** 803,814 ****
}
}
/**
! * Updates the Frame elements <code>HTML.Attribute.SRC attribute</code>
! * and fires a <code>ChangedUpdate</code> event.
*
* @param element a FRAME element whose SRC attribute will be updated
* @param url a string specifying the new value for the SRC attribute
*/
private void updateFrame(Element element, String url) {
--- 806,817 ----
}
}
/**
! * Updates the Frame elements {@code HTML.Attribute.SRC attribute}
! * and fires a {@code ChangedUpdate} event.
*
* @param element a FRAME element whose SRC attribute will be updated
* @param url a string specifying the new value for the SRC attribute
*/
private void updateFrame(Element element, String url) {
*** 852,862 ****
/**
* Adds the specified map, this will remove a Map that has been
* previously registered with the same name.
*
! * @param map the <code>Map</code> to be registered
*/
void addMap(Map map) {
String name = map.getName();
if (name != null) {
--- 855,865 ----
/**
* Adds the specified map, this will remove a Map that has been
* previously registered with the same name.
*
! * @param map the {@code Map} to be registered
*/
void addMap(Map map) {
String name = map.getName();
if (name != null) {
*** 874,884 ****
}
}
/**
* Removes a previously registered map.
! * @param map the <code>Map</code> to be removed
*/
void removeMap(Map map) {
String name = map.getName();
if (name != null) {
--- 877,887 ----
}
}
/**
* Removes a previously registered map.
! * @param map the {@code Map} to be removed
*/
void removeMap(Map map) {
String name = map.getName();
if (name != null) {
*** 890,902 ****
}
}
/**
* Returns the Map associated with the given name.
! * @param name the name of the desired <code>Map</code>
! * @return the <code>Map</code> or <code>null</code> if it can't
! * be found, or if <code>name</code> is <code>null</code>
*/
Map getMap(String name) {
if (name != null) {
Object maps = getProperty(MAP_PROPERTY);
--- 893,905 ----
}
}
/**
* Returns the Map associated with the given name.
! * @param name the name of the desired {@code Map}
! * @return the {@code Map} or {@code null} if it can't
! * be found, or if {@code name} is {@code null}
*/
Map getMap(String name) {
if (name != null) {
Object maps = getProperty(MAP_PROPERTY);
*** 906,918 ****
}
return null;
}
/**
! * Returns an <code>Enumeration</code> of the possible Maps.
! * @return the enumerated list of maps, or <code>null</code>
! * if the maps are not an instance of <code>Hashtable</code>
*/
Enumeration<Object> getMaps() {
Object maps = getProperty(MAP_PROPERTY);
if (maps instanceof Hashtable) {
--- 909,921 ----
}
return null;
}
/**
! * Returns an {@code Enumeration} of the possible Maps.
! * @return the enumerated list of maps, or {@code null}
! * if the maps are not an instance of {@code Hashtable}
*/
Enumeration<Object> getMaps() {
Object maps = getProperty(MAP_PROPERTY);
if (maps instanceof Hashtable) {
*** 947,961 ****
return retValue;
}
/**
* Sets the parser that is used by the methods that insert html
! * into the existing document, such as <code>setInnerHTML</code>,
! * and <code>setOuterHTML</code>.
* <p>
! * <code>HTMLEditorKit.createDefaultDocument</code> will set the parser
! * for you. If you create an <code>HTMLDocument</code> by hand,
* be sure and set the parser accordingly.
* @param parser the parser to be used for text insertion
*
* @since 1.3
*/
--- 950,964 ----
return retValue;
}
/**
* Sets the parser that is used by the methods that insert html
! * into the existing document, such as {@code setInnerHTML},
! * and {@code setOuterHTML}.
* <p>
! * {@code HTMLEditorKit.createDefaultDocument} will set the parser
! * for you. If you create an {@code HTMLDocument} by hand,
* be sure and set the parser accordingly.
* @param parser the parser to be used for text insertion
*
* @since 1.3
*/
*** 985,1006 ****
* specified as an HTML string.
*
* <p>This will be seen as at least two events, n inserts followed by
* a remove.</p>
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>setInnerHTML(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
--- 988,1009 ----
* specified as an HTML string.
*
* <p>This will be seen as at least two events, n inserts followed by
* a remove.</p>
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking {@code setInnerHTML(elem, "<ul><li>")}
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
*** 1010,1033 ****
* <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Parameter <code>elem</code> must not be a leaf element,
! * otherwise an <code>IllegalArgumentException</code> is thrown.
! * If either <code>elem</code> or <code>htmlText</code> parameter
! * is <code>null</code>, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * <code>HTMLEditorKit.Parser</code> set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the branch element whose children will be replaced
! * @param htmlText the string to be parsed and assigned to <code>elem</code>
! * @throws IllegalArgumentException if <code>elem</code> is a leaf
! * @throws IllegalStateException if an <code>HTMLEditorKit.Parser</code>
* has not been defined
* @throws BadLocationException if replacement is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
* @since 1.3
--- 1013,1036 ----
* <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Parameter {@code elem} must not be a leaf element,
! * otherwise an {@code IllegalArgumentException} is thrown.
! * If either {@code elem} or {@code htmlText} parameter
! * is {@code null}, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * {@code HTMLEditorKit.Parser} set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the branch element whose children will be replaced
! * @param htmlText the string to be parsed and assigned to {@code elem}
! * @throws IllegalArgumentException if {@code elem} is a leaf
! * @throws IllegalStateException if an {@code HTMLEditorKit.Parser}
* has not been defined
* @throws BadLocationException if replacement is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
* @since 1.3
*** 1064,1090 ****
* element that contained a newline with <img> this would create
* two elements, one for the image, and one for the newline.</p>
*
* <p>If you try to replace the element at length you will most
* likely end up with two elements, eg
! * <code>setOuterHTML(getCharacterElement (getLength()),
! * "blah")</code> will result in two leaf elements at the end, one
* representing 'blah', and the other representing the end
* element.</p>
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>setOuterHTML(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
--- 1067,1093 ----
* element that contained a newline with <img> this would create
* two elements, one for the image, and one for the newline.</p>
*
* <p>If you try to replace the element at length you will most
* likely end up with two elements, eg
! * {@code setOuterHTML(getCharacterElement (getLength()), "blah")}
! * will result in two leaf elements at the end, one
* representing 'blah', and the other representing the end
* element.</p>
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking {@code setOuterHTML(elem, "<ul><li>")}
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
*** 1092,1112 ****
* <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>If either <code>elem</code> or <code>htmlText</code>
! * parameter is <code>null</code>, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
* HTMLEditorKit.Parser set. This will be the case if the document
* was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the element to replace
! * @param htmlText the string to be parsed and inserted in place of <code>elem</code>
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set
* @throws BadLocationException if replacement is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
--- 1095,1115 ----
* <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>If either {@code elem} or {@code htmlText}
! * parameter is {@code null}, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
* HTMLEditorKit.Parser set. This will be the case if the document
* was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the element to replace
! * @param htmlText the string to be parsed and inserted in place of {@code elem}
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set
* @throws BadLocationException if replacement is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
*** 1142,1164 ****
/**
* Inserts the HTML specified as a string at the start
* of the element.
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>insertAfterStart(elem,
! * "<ul><li>")</code> results in the following structure
* (new elements are <font style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
* |
--- 1145,1168 ----
/**
* Inserts the HTML specified as a string at the start
* of the element.
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking
! * {@code insertAfterStart(elem, "<ul><li>")}
! * results in the following structure
* (new elements are <font style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
* |
*** 1167,1193 ****
* <font style="color: red;"><ul></font> <p> <p>
* /
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the <code>insertBeforeStart</code> method, new
* elements become <em>children</em> of the specified element,
* not siblings.</p>
*
! * <p>Parameter <code>elem</code> must not be a leaf element,
! * otherwise an <code>IllegalArgumentException</code> is thrown.
! * If either <code>elem</code> or <code>htmlText</code> parameter
! * is <code>null</code>, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * <code>HTMLEditorKit.Parser</code> set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the branch element to be the root for the new text
! * @param htmlText the string to be parsed and assigned to <code>elem</code>
! * @throws IllegalArgumentException if <code>elem</code> is a leaf
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
--- 1171,1197 ----
* <font style="color: red;"><ul></font> <p> <p>
* /
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the {@code insertBeforeStart} method, new
* elements become <em>children</em> of the specified element,
* not siblings.</p>
*
! * <p>Parameter {@code elem} must not be a leaf element,
! * otherwise an {@code IllegalArgumentException} is thrown.
! * If either {@code elem} or {@code htmlText} parameter
! * is {@code null}, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * {@code HTMLEditorKit.Parser} set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the branch element to be the root for the new text
! * @param htmlText the string to be parsed and assigned to {@code elem}
! * @throws IllegalArgumentException if {@code elem} is a leaf
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
*** 1210,1236 ****
/**
* Inserts the HTML specified as a string at the end of
* the element.
*
! * <p> If <code>elem</code>'s children are leaves, and the
! * character at a <code>elem.getEndOffset() - 1</code> is a newline,
* this will insert before the newline so that there isn't text after
* the newline.</p>
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>insertBeforeEnd(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
--- 1214,1240 ----
/**
* Inserts the HTML specified as a string at the end of
* the element.
*
! * <p> If {@code elem}'s children are leaves, and the
! * character at a {@code elem.getEndOffset() - 1} is a newline,
* this will insert before the newline so that there isn't text after
* the newline.</p>
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking {@code insertBeforeEnd(elem, "<ul><li>")}
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
*** 1240,1266 ****
* <p> <p> <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the <code>insertAfterEnd</code> method, new elements
* become <em>children</em> of the specified element, not
* siblings.</p>
*
! * <p>Parameter <code>elem</code> must not be a leaf element,
! * otherwise an <code>IllegalArgumentException</code> is thrown.
! * If either <code>elem</code> or <code>htmlText</code> parameter
! * is <code>null</code>, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * <code>HTMLEditorKit.Parser</code> set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the element to be the root for the new text
! * @param htmlText the string to be parsed and assigned to <code>elem</code>
! * @throws IllegalArgumentException if <code>elem</code> is a leaf
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
--- 1244,1270 ----
* <p> <p> <font style="color: red;"><ul></font>
* \
* <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the {@code insertAfterEnd} method, new elements
* become <em>children</em> of the specified element, not
* siblings.</p>
*
! * <p>Parameter {@code elem} must not be a leaf element,
! * otherwise an {@code IllegalArgumentException} is thrown.
! * If either {@code elem} or {@code htmlText} parameter
! * is {@code null}, no changes are made to the document.</p>
*
* <p>For this to work correctly, the document must have an
! * {@code HTMLEditorKit.Parser} set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the element to be the root for the new text
! * @param htmlText the string to be parsed and assigned to {@code elem}
! * @throws IllegalArgumentException if {@code elem} is a leaf
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
*** 1285,1332 ****
/**
* Inserts the HTML specified as a string before the start of
* the given element.
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>insertBeforeStart(elem,
! * "<ul><li>")</code> results in the following structure
* (new elements are <font style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
* / \
* <font style="color: red;"><ul></font> <b><div></b>
* / / \
* <font style="color: red;"><li></font> <p> <p>
* </pre>
*
! * <p>Unlike the <code>insertAfterStart</code> method, new
* elements become <em>siblings</em> of the specified element, not
* children.</p>
*
! * <p>If either <code>elem</code> or <code>htmlText</code>
! * parameter is <code>null</code>, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
! * <code>HTMLEditorKit.Parser</code> set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the element the content is inserted before
! * @param htmlText the string to be parsed and inserted before <code>elem</code>
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
--- 1289,1337 ----
/**
* Inserts the HTML specified as a string before the start of
* the given element.
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking
! * {@code insertBeforeStart(elem, "<ul><li>")}
! * results in the following structure
* (new elements are <font style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
* / \
* <font style="color: red;"><ul></font> <b><div></b>
* / / \
* <font style="color: red;"><li></font> <p> <p>
* </pre>
*
! * <p>Unlike the {@code insertAfterStart} method, new
* elements become <em>siblings</em> of the specified element, not
* children.</p>
*
! * <p>If either {@code elem} or {@code htmlText}
! * parameter is {@code null}, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
! * {@code HTMLEditorKit.Parser} set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the element the content is inserted before
! * @param htmlText the string to be parsed and inserted before {@code elem}
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
*** 1346,1367 ****
/**
* Inserts the HTML specified as a string after the end of the
* given element.
*
! * <p>Consider the following structure (the <code>elem</code>
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking <code>insertAfterEnd(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
--- 1351,1372 ----
/**
* Inserts the HTML specified as a string after the end of the
* given element.
*
! * <p>Consider the following structure (the {@code elem}
* parameter is <b>in bold</b>).</p>
*
* <pre>
* <body>
* |
* <b><div></b>
* / \
* <p> <p>
* </pre>
*
! * <p>Invoking {@code insertAfterEnd(elem, "<ul><li>")}
* results in the following structure (new elements are <font
* style="color: red;">in red</font>).</p>
*
* <pre>
* <body>
*** 1369,1393 ****
* <b><div></b> <font style="color: red;"><ul></font>
* / \ \
* <p> <p> <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the <code>insertBeforeEnd</code> method, new elements
* become <em>siblings</em> of the specified element, not
* children.</p>
*
! * <p>If either <code>elem</code> or <code>htmlText</code>
! * parameter is <code>null</code>, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
! * <code>HTMLEditorKit.Parser</code> set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * <code>createDefaultDocument</code> method.</p>
*
* @param elem the element the content is inserted after
! * @param htmlText the string to be parsed and inserted after <code>elem</code>
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
--- 1374,1398 ----
* <b><div></b> <font style="color: red;"><ul></font>
* / \ \
* <p> <p> <font style="color: red;"><li></font>
* </pre>
*
! * <p>Unlike the {@code insertBeforeEnd} method, new elements
* become <em>siblings</em> of the specified element, not
* children.</p>
*
! * <p>If either {@code elem} or {@code htmlText}
! * parameter is {@code null}, no changes are made to the
* document.</p>
*
* <p>For this to work correctly, the document must have an
! * {@code HTMLEditorKit.Parser} set. This will be the case
* if the document was created from an HTMLEditorKit via the
! * {@code createDefaultDocument} method.</p>
*
* @param elem the element the content is inserted after
! * @param htmlText the string to be parsed and inserted after {@code elem}
* @throws IllegalStateException if an HTMLEditorKit.Parser has not
* been set on the document
* @throws BadLocationException if insertion is impossible because of
* a structural issue
* @throws IOException if an I/O exception occurs
*** 1421,1444 ****
}
}
}
/**
! * Returns the element that has the given id <code>Attribute</code>.
! * If the element can't be found, <code>null</code> is returned.
! * Note that this method works on an <code>Attribute</code>,
* <i>not</i> a character tag. In the following HTML snippet:
! * <code><a id="HelloThere"></code> the attribute is
* 'id' and the character tag is 'a'.
* This is a convenience method for
! * <code>getElement(RootElement, HTML.Attribute.id, id)</code>.
* This is not thread-safe.
*
! * @param id the string representing the desired <code>Attribute</code>
! * @return the element with the specified <code>Attribute</code>
! * or <code>null</code> if it can't be found,
! * or <code>null</code> if <code>id</code> is <code>null</code>
* @see javax.swing.text.html.HTML.Attribute
* @since 1.3
*/
public Element getElement(String id) {
if (id == null) {
--- 1426,1449 ----
}
}
}
/**
! * Returns the element that has the given id {@code Attribute}.
! * If the element can't be found, {@code null} is returned.
! * Note that this method works on an {@code Attribute},
* <i>not</i> a character tag. In the following HTML snippet:
! * {@code <a id="HelloThere">} the attribute is
* 'id' and the character tag is 'a'.
* This is a convenience method for
! * {@code getElement(RootElement, HTML.Attribute.id, id)}.
* This is not thread-safe.
*
! * @param id the string representing the desired {@code Attribute}
! * @return the element with the specified {@code Attribute}
! * or {@code null} if it can't be found,
! * or {@code null} if {@code id} is {@code null}
* @see javax.swing.text.html.HTML.Attribute
* @since 1.3
*/
public Element getElement(String id) {
if (id == null) {
*** 1447,1487 ****
return getElement(getDefaultRootElement(), HTML.Attribute.ID, id,
true);
}
/**
! * Returns the child element of <code>e</code> that contains the
! * attribute, <code>attribute</code> with value <code>value</code>, or
! * <code>null</code> if one isn't found. This is not thread-safe.
*
* @param e the root element where the search begins
! * @param attribute the desired <code>Attribute</code>
! * @param value the values for the specified <code>Attribute</code>
! * @return the element with the specified <code>Attribute</code>
! * and the specified <code>value</code>, or <code>null</code>
* if it can't be found
* @see javax.swing.text.html.HTML.Attribute
* @since 1.3
*/
public Element getElement(Element e, Object attribute, Object value) {
return getElement(e, attribute, value, true);
}
/**
! * Returns the child element of <code>e</code> that contains the
! * attribute, <code>attribute</code> with value <code>value</code>, or
! * <code>null</code> if one isn't found. This is not thread-safe.
* <p>
! * If <code>searchLeafAttributes</code> is true, and <code>e</code> is
! * a leaf, any attributes that are instances of <code>HTML.Tag</code>
! * with a value that is an <code>AttributeSet</code> will also be checked.
*
* @param e the root element where the search begins
! * @param attribute the desired <code>Attribute</code>
! * @param value the values for the specified <code>Attribute</code>
! * @return the element with the specified <code>Attribute</code>
! * and the specified <code>value</code>, or <code>null</code>
* if it can't be found
* @see javax.swing.text.html.HTML.Attribute
*/
private Element getElement(Element e, Object attribute, Object value,
boolean searchLeafAttributes) {
--- 1452,1492 ----
return getElement(getDefaultRootElement(), HTML.Attribute.ID, id,
true);
}
/**
! * Returns the child element of {@code e} that contains the
! * attribute, {@code attribute} with value {@code value}, or
! * {@code null} if one isn't found. This is not thread-safe.
*
* @param e the root element where the search begins
! * @param attribute the desired {@code Attribute}
! * @param value the values for the specified {@code Attribute}
! * @return the element with the specified {@code Attribute}
! * and the specified {@code value}, or {@code null}
* if it can't be found
* @see javax.swing.text.html.HTML.Attribute
* @since 1.3
*/
public Element getElement(Element e, Object attribute, Object value) {
return getElement(e, attribute, value, true);
}
/**
! * Returns the child element of {@code e} that contains the
! * attribute, {@code attribute} with value {@code value}, or
! * {@code null} if one isn't found. This is not thread-safe.
* <p>
! * If {@code searchLeafAttributes} is true, and {@code e} is
! * a leaf, any attributes that are instances of {@code HTML.Tag}
! * with a value that is an {@code AttributeSet} will also be checked.
*
* @param e the root element where the search begins
! * @param attribute the desired {@code Attribute}
! * @param value the values for the specified {@code Attribute}
! * @return the element with the specified {@code Attribute}
! * and the specified {@code value}, or {@code null}
* if it can't be found
* @see javax.swing.text.html.HTML.Attribute
*/
private Element getElement(Element e, Object attribute, Object value,
boolean searchLeafAttributes) {
*** 1525,1536 ****
}
return null;
}
/**
! * Verifies the document has an <code>HTMLEditorKit.Parser</code> set.
! * If <code>getParser</code> returns <code>null</code>, this will throw an
* IllegalStateException.
*
* @throws IllegalStateException if the document does not have a Parser
*/
private void verifyParser() {
--- 1530,1541 ----
}
return null;
}
/**
! * Verifies the document has an {@code HTMLEditorKit.Parser} set.
! * If {@code getParser} returns {@code null}, this will throw an
* IllegalStateException.
*
* @throws IllegalStateException if the document does not have a Parser
*/
private void verifyParser() {
*** 1548,1559 ****
}
}
/**
* Inserts a string of HTML into the document at the given position.
! * <code>parent</code> is used to identify the location to insert the
! * <code>html</code>. If <code>parent</code> is a leaf this can have
* unexpected results.
*/
private void insertHTML(Element parent, int offset, String html,
boolean wantsTrailingNewline)
throws BadLocationException, IOException {
--- 1553,1564 ----
}
}
/**
* Inserts a string of HTML into the document at the given position.
! * {@code parent} is used to identify the location to insert the
! * {@code html}. If {@code parent} is a leaf this can have
* unexpected results.
*/
private void insertHTML(Element parent, int offset, String html,
boolean wantsTrailingNewline)
throws BadLocationException, IOException {
*** 1593,1608 ****
}
}
}
/**
! * Removes child Elements of the passed in Element <code>e</code>. This
* will do the necessary cleanup to ensure the element representing the
* end character is correctly created.
! * <p>This is not a general purpose method, it assumes that <code>e</code>
* will still have at least one child after the remove, and it assumes
! * the character at <code>e.getStartOffset() - 1</code> is a newline and
* is of length 1.
*/
private void removeElements(Element e, int index, int count) throws BadLocationException {
writeLock();
try {
--- 1598,1613 ----
}
}
}
/**
! * Removes child Elements of the passed in Element {@code e}. This
* will do the necessary cleanup to ensure the element representing the
* end character is correctly created.
! * <p>This is not a general purpose method, it assumes that {@code e}
* will still have at least one child after the remove, and it assumes
! * the character at {@code e.getStartOffset() - 1} is a newline and
* is of length 1.
*/
private void removeElements(Element e, int index, int count) throws BadLocationException {
writeLock();
try {
*** 1618,1635 ****
writeUnlock();
}
}
/**
! * Called to remove child elements of <code>e</code> when one of the
* elements to remove is representing the end character.
* <p>Since the Content will not allow a removal to the end character
! * this will do a remove from <code>start - 1</code> to <code>end</code>.
* The end Element(s) will be removed, and the element representing
! * <code>start - 1</code> to <code>start</code> will be recreated. This
* Element has to be recreated as after the content removal its offsets
! * become <code>start - 1</code> to <code>start - 1</code>.
*/
private void removeElementsAtEnd(Element e, int index, int count,
int start, int end) throws BadLocationException {
// index must be > 0 otherwise no insert would have happened.
boolean isLeaf = (e.getElement(index - 1).isLeaf());
--- 1623,1640 ----
writeUnlock();
}
}
/**
! * Called to remove child elements of {@code e} when one of the
* elements to remove is representing the end character.
* <p>Since the Content will not allow a removal to the end character
! * this will do a remove from {@code start - 1} to {@code end}.
* The end Element(s) will be removed, and the element representing
! * {@code start - 1} to {@code start} will be recreated. This
* Element has to be recreated as after the content removal its offsets
! * become {@code start - 1} to {@code start - 1}.
*/
private void removeElementsAtEnd(Element e, int index, int count,
int start, int end) throws BadLocationException {
// index must be > 0 otherwise no insert would have happened.
boolean isLeaf = (e.getElement(index - 1).isLeaf());
*** 1671,1685 ****
fireRemoveUpdate(dde);
fireUndoableEditUpdate(new UndoableEditEvent(this, dde));
}
/**
! * This is used by <code>removeElementsAtEnd</code>, it removes
! * <code>count</code> elements starting at <code>start</code> from
! * <code>e</code>. If <code>remove</code> is true text of length
! * <code>start - 1</code> to <code>end - 1</code> is removed. If
! * <code>create</code> is true a new leaf is created of length 1.
*/
private void replace(DefaultDocumentEvent dde, Element e, int index,
int count, int start, int end, boolean remove,
boolean create) throws BadLocationException {
Element[] added;
--- 1676,1690 ----
fireRemoveUpdate(dde);
fireUndoableEditUpdate(new UndoableEditEvent(this, dde));
}
/**
! * This is used by {@code removeElementsAtEnd}, it removes
! * {@code count} elements starting at {@code start} from
! * {@code e}. If {@code remove} is true text of length
! * {@code start - 1} to {@code end - 1} is removed. If
! * {@code create} is true a new leaf is created of length 1.
*/
private void replace(DefaultDocumentEvent dde, Element e, int index,
int count, int start, int end, boolean remove,
boolean create) throws BadLocationException {
Element[] added;
*** 1887,1898 ****
*/
public abstract static class Iterator {
/**
* Return the attributes for this tag.
! * @return the <code>AttributeSet</code> for this tag, or
! * <code>null</code> if none can be found
*/
public abstract AttributeSet getAttributes();
/**
* Returns the start of the range for which the current occurrence of
--- 1892,1903 ----
*/
public abstract static class Iterator {
/**
* Return the attributes for this tag.
! * @return the {@code AttributeSet} for this tag, or
! * {@code null} if none can be found
*/
public abstract AttributeSet getAttributes();
/**
* Returns the start of the range for which the current occurrence of
*** 1944,1955 ****
next();
}
/**
* Returns the attributes for this tag.
! * @return the <code>AttributeSet</code> for this tag,
! * or <code>null</code> if none can be found
*/
public AttributeSet getAttributes() {
Element elem = pos.current();
if (elem != null) {
AttributeSet a = (AttributeSet)
--- 1949,1960 ----
next();
}
/**
* Returns the attributes for this tag.
! * @return the {@code AttributeSet} for this tag,
! * or {@code null} if none can be found
*/
public AttributeSet getAttributes() {
Element elem = pos.current();
if (elem != null) {
AttributeSet a = (AttributeSet)
*** 2008,2027 ****
}
/**
* Returns the type of tag this iterator represents.
*
! * @return the <code>HTML.Tag</code> that this iterator represents.
* @see javax.swing.text.html.HTML.Tag
*/
public HTML.Tag getTag() {
return tag;
}
/**
! * Returns true if the current position is not <code>null</code>.
! * @return true if current position is not <code>null</code>,
* otherwise returns false
*/
public boolean isValid() {
return (pos.current() != null);
}
--- 2013,2032 ----
}
/**
* Returns the type of tag this iterator represents.
*
! * @return the {@code HTML.Tag} that this iterator represents.
* @see javax.swing.text.html.HTML.Tag
*/
public HTML.Tag getTag() {
return tag;
}
/**
! * Returns true if the current position is not {@code null}.
! * @return true if current position is not {@code null},
* otherwise returns false
*/
public boolean isValid() {
return (pos.current() != null);
}
*** 2039,2049 ****
}
}
/**
* Marches a cloned iterator forward to locate the end
! * of the run. This sets the value of <code>endOffset</code>.
*/
void setEndOffset() {
AttributeSet a0 = getAttributes();
endOffset = pos.current().getEndOffset();
ElementIterator fwd = (ElementIterator) pos.clone();
--- 2044,2054 ----
}
}
/**
* Marches a cloned iterator forward to locate the end
! * of the run. This sets the value of {@code endOffset}.
*/
void setEndOffset() {
AttributeSet a0 = getAttributes();
endOffset = pos.current().getEndOffset();
ElementIterator fwd = (ElementIterator) pos.clone();
*** 2072,2082 ****
* and burst it into the document under the protection of
* a write lock using the insert method on the document
* outer class.
* <p>
* The reader can be configured by registering actions
! * (of type <code>HTMLDocument.HTMLReader.TagAction</code>)
* that describe how to handle the action. The idea behind
* the actions provided is that the most natural text editing
* operations can be provided if the element structure boils
* down to paragraphs with runs of some kind of style
* in them. Some things are more naturally specified
--- 2077,2087 ----
* and burst it into the document under the protection of
* a write lock using the insert method on the document
* outer class.
* <p>
* The reader can be configured by registering actions
! * (of type {@code HTMLDocument.HTMLReader.TagAction})
* that describe how to handle the action. The idea behind
* the actions provided is that the most natural text editing
* operations can be provided if the element structure boils
* down to paragraphs with runs of some kind of style
* in them. Some things are more naturally specified
*** 2126,2210 ****
* Currently, <APPLET>, <PARAM>, <MAP>, <AREA>, <LINK>,
* <SCRIPT> and <STYLE> are unsupported.
*
* <p>
* The assignment of the actions described is shown in the
! * following table for the tags defined in <code>HTML.Tag</code>.
* <table border=1 summary="HTML tags and assigned actions">
* <tr><th>Tag</th><th>Action</th></tr>
! * <tr><td><code>HTML.Tag.A</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.ADDRESS</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.APPLET</code> <td>HiddenAction
! * <tr><td><code>HTML.Tag.AREA</code> <td>AreaAction
! * <tr><td><code>HTML.Tag.B</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.BASE</code> <td>BaseAction
! * <tr><td><code>HTML.Tag.BASEFONT</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.BIG</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.BLOCKQUOTE</code><td>BlockAction
! * <tr><td><code>HTML.Tag.BODY</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.BR</code> <td>SpecialAction
! * <tr><td><code>HTML.Tag.CAPTION</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.CENTER</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.CITE</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.CODE</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.DD</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.DFN</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.DIR</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.DIV</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.DL</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.DT</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.EM</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.FONT</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.FORM</code> <td>As of 1.4 a BlockAction
! * <tr><td><code>HTML.Tag.FRAME</code> <td>SpecialAction
! * <tr><td><code>HTML.Tag.FRAMESET</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.H1</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.H2</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.H3</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.H4</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.H5</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.H6</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.HEAD</code> <td>HeadAction
! * <tr><td><code>HTML.Tag.HR</code> <td>SpecialAction
! * <tr><td><code>HTML.Tag.HTML</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.I</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.IMG</code> <td>SpecialAction
! * <tr><td><code>HTML.Tag.INPUT</code> <td>FormAction
! * <tr><td><code>HTML.Tag.ISINDEX</code> <td>IsndexAction
! * <tr><td><code>HTML.Tag.KBD</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.LI</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.LINK</code> <td>LinkAction
! * <tr><td><code>HTML.Tag.MAP</code> <td>MapAction
! * <tr><td><code>HTML.Tag.MENU</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.META</code> <td>MetaAction
! * <tr><td><code>HTML.Tag.NOFRAMES</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.OBJECT</code> <td>SpecialAction
! * <tr><td><code>HTML.Tag.OL</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.OPTION</code> <td>FormAction
! * <tr><td><code>HTML.Tag.P</code> <td>ParagraphAction
! * <tr><td><code>HTML.Tag.PARAM</code> <td>HiddenAction
! * <tr><td><code>HTML.Tag.PRE</code> <td>PreAction
! * <tr><td><code>HTML.Tag.SAMP</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.SCRIPT</code> <td>HiddenAction
! * <tr><td><code>HTML.Tag.SELECT</code> <td>FormAction
! * <tr><td><code>HTML.Tag.SMALL</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.STRIKE</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.S</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.STRONG</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.STYLE</code> <td>StyleAction
! * <tr><td><code>HTML.Tag.SUB</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.SUP</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.TABLE</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.TD</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.TEXTAREA</code> <td>FormAction
! * <tr><td><code>HTML.Tag.TH</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.TITLE</code> <td>TitleAction
! * <tr><td><code>HTML.Tag.TR</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.TT</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.U</code> <td>CharacterAction
! * <tr><td><code>HTML.Tag.UL</code> <td>BlockAction
! * <tr><td><code>HTML.Tag.VAR</code> <td>CharacterAction
* </table>
* <p>
* Once </html> is encountered, the Actions are no longer notified.
*/
public class HTMLReader extends HTMLEditorKit.ParserCallback {
--- 2131,2215 ----
* Currently, <APPLET>, <PARAM>, <MAP>, <AREA>, <LINK>,
* <SCRIPT> and <STYLE> are unsupported.
*
* <p>
* The assignment of the actions described is shown in the
! * following table for the tags defined in {@code HTML.Tag}.
* <table border=1 summary="HTML tags and assigned actions">
* <tr><th>Tag</th><th>Action</th></tr>
! * <tr><td>{@code HTML.Tag.A} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.ADDRESS} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.APPLET} <td>HiddenAction
! * <tr><td>{@code HTML.Tag.AREA} <td>AreaAction
! * <tr><td>{@code HTML.Tag.B} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.BASE} <td>BaseAction
! * <tr><td>{@code HTML.Tag.BASEFONT} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.BIG} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.BLOCKQUOTE}<td>BlockAction
! * <tr><td>{@code HTML.Tag.BODY} <td>BlockAction
! * <tr><td>{@code HTML.Tag.BR} <td>SpecialAction
! * <tr><td>{@code HTML.Tag.CAPTION} <td>BlockAction
! * <tr><td>{@code HTML.Tag.CENTER} <td>BlockAction
! * <tr><td>{@code HTML.Tag.CITE} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.CODE} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.DD} <td>BlockAction
! * <tr><td>{@code HTML.Tag.DFN} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.DIR} <td>BlockAction
! * <tr><td>{@code HTML.Tag.DIV} <td>BlockAction
! * <tr><td>{@code HTML.Tag.DL} <td>BlockAction
! * <tr><td>{@code HTML.Tag.DT} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.EM} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.FONT} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.FORM} <td>As of 1.4 a BlockAction
! * <tr><td>{@code HTML.Tag.FRAME} <td>SpecialAction
! * <tr><td>{@code HTML.Tag.FRAMESET} <td>BlockAction
! * <tr><td>{@code HTML.Tag.H1} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.H2} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.H3} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.H4} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.H5} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.H6} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.HEAD} <td>HeadAction
! * <tr><td>{@code HTML.Tag.HR} <td>SpecialAction
! * <tr><td>{@code HTML.Tag.HTML} <td>BlockAction
! * <tr><td>{@code HTML.Tag.I} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.IMG} <td>SpecialAction
! * <tr><td>{@code HTML.Tag.INPUT} <td>FormAction
! * <tr><td>{@code HTML.Tag.ISINDEX} <td>IsndexAction
! * <tr><td>{@code HTML.Tag.KBD} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.LI} <td>BlockAction
! * <tr><td>{@code HTML.Tag.LINK} <td>LinkAction
! * <tr><td>{@code HTML.Tag.MAP} <td>MapAction
! * <tr><td>{@code HTML.Tag.MENU} <td>BlockAction
! * <tr><td>{@code HTML.Tag.META} <td>MetaAction
! * <tr><td>{@code HTML.Tag.NOFRAMES} <td>BlockAction
! * <tr><td>{@code HTML.Tag.OBJECT} <td>SpecialAction
! * <tr><td>{@code HTML.Tag.OL} <td>BlockAction
! * <tr><td>{@code HTML.Tag.OPTION} <td>FormAction
! * <tr><td>{@code HTML.Tag.P} <td>ParagraphAction
! * <tr><td>{@code HTML.Tag.PARAM} <td>HiddenAction
! * <tr><td>{@code HTML.Tag.PRE} <td>PreAction
! * <tr><td>{@code HTML.Tag.SAMP} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.SCRIPT} <td>HiddenAction
! * <tr><td>{@code HTML.Tag.SELECT} <td>FormAction
! * <tr><td>{@code HTML.Tag.SMALL} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.STRIKE} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.S} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.STRONG} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.STYLE} <td>StyleAction
! * <tr><td>{@code HTML.Tag.SUB} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.SUP} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.TABLE} <td>BlockAction
! * <tr><td>{@code HTML.Tag.TD} <td>BlockAction
! * <tr><td>{@code HTML.Tag.TEXTAREA} <td>FormAction
! * <tr><td>{@code HTML.Tag.TH} <td>BlockAction
! * <tr><td>{@code HTML.Tag.TITLE} <td>TitleAction
! * <tr><td>{@code HTML.Tag.TR} <td>BlockAction
! * <tr><td>{@code HTML.Tag.TT} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.U} <td>CharacterAction
! * <tr><td>{@code HTML.Tag.UL} <td>BlockAction
! * <tr><td>{@code HTML.Tag.VAR} <td>CharacterAction
* </table>
* <p>
* Once </html> is encountered, the Actions are no longer notified.
*/
public class HTMLReader extends HTMLEditorKit.ParserCallback {
*** 2233,2244 ****
}
/**
* Generates a RuntimeException (will eventually generate
* a BadLocationException when API changes are alloced) if inserting
! * into non empty document, <code>insertTag</code> is
! * non-<code>null</code>, and <code>offset</code> is not in the body.
*/
// PENDING(sky): Add throws BadLocationException and remove
// RuntimeException
HTMLReader(int offset, int popDepth, int pushDepth,
HTML.Tag insertTag, boolean insertInsertTag,
--- 2238,2249 ----
}
/**
* Generates a RuntimeException (will eventually generate
* a BadLocationException when API changes are alloced) if inserting
! * into non empty document, {@code insertTag} is
! * non-{@code null}, and {@code offset} is not in the body.
*/
// PENDING(sky): Add throws BadLocationException and remove
// RuntimeException
HTMLReader(int offset, int popDepth, int pushDepth,
HTML.Tag insertTag, boolean insertInsertTag,
*** 2358,2369 ****
generateEndsSpecsForMidInsert();
}
}
/**
! * This block initializes the <code>inParagraph</code> flag.
! * It is left in <code>false</code> value automatically
* if the target document is empty or future inserts
* were positioned into the 'body' tag.
*/
if (!emptyDocument && !midInsert) {
int targetOffset = Math.max(this.offset - 1, 0);
--- 2363,2374 ----
generateEndsSpecsForMidInsert();
}
}
/**
! * This block initializes the {@code inParagraph} flag.
! * It is left in {@code false} value automatically
* if the target document is empty or future inserts
* were positioned into the 'body' tag.
*/
if (!emptyDocument && !midInsert) {
int targetOffset = Math.max(this.offset - 1, 0);
*** 2388,2398 ****
}
}
}
/**
! * Generates an initial batch of end <code>ElementSpecs</code>
* in parseBuffer to position future inserts into the body.
*/
private void generateEndsSpecsForMidInsert() {
int count = heightToElementWithName(HTML.Tag.BODY,
Math.max(0, offset - 1));
--- 2393,2403 ----
}
}
}
/**
! * Generates an initial batch of end {@code ElementSpecs}
* in parseBuffer to position future inserts into the body.
*/
private void generateEndsSpecsForMidInsert() {
int count = heightToElementWithName(HTML.Tag.BODY,
Math.max(0, offset - 1));
*** 2453,2466 ****
}
return count;
}
/**
! * @return number of parents of the leaf at <code>offset</code>
! * until a parent with name, <code>name</code> has been
* found. -1 indicates no matching parent with
! * <code>name</code>.
*/
private int heightToElementWithName(Object name, int offset) {
Element e = getCharacterElement(offset).getParentElement();
int count = 0;
--- 2458,2471 ----
}
return count;
}
/**
! * @return number of parents of the leaf at {@code offset}
! * until a parent with name, {@code name} has been
* found. -1 indicates no matching parent with
! * {@code name}.
*/
private int heightToElementWithName(Object name, int offset) {
Element e = getCharacterElement(offset).getParentElement();
int count = 0;
*** 2702,2712 ****
action.end(HTML.Tag.COMMENT);
}
}
/**
! * Adds the comment <code>comment</code> to the set of comments
* maintained outside of the scope of elements.
*/
private void addExternalComment(String comment) {
Object comments = getProperty(AdditionalComments);
if (comments != null && !(comments instanceof Vector)) {
--- 2707,2717 ----
action.end(HTML.Tag.COMMENT);
}
}
/**
! * Adds the comment {@code comment} to the set of comments
* maintained outside of the scope of elements.
*/
private void addExternalComment(String comment) {
Object comments = getProperty(AdditionalComments);
if (comments != null && !(comments instanceof Vector)) {
*** 2776,2786 ****
}
}
/**
* This is invoked after the stream has been parsed, but before
! * <code>flush</code>. <code>eol</code> will be one of \n, \r
* or \r\n, which ever is encountered the most in parsing the
* stream.
*
* @since 1.3
*/
--- 2781,2791 ----
}
}
/**
* This is invoked after the stream has been parsed, but before
! * {@code flush}. {@code eol} will be one of \n, \r
* or \r\n, which ever is encountered the most in parsing the
* stream.
*
* @since 1.3
*/
*** 3377,3387 ****
* Action to support forms by building all of the elements
* used to represent form controls. This will process
* the <INPUT>, <TEXTAREA>, <SELECT>,
* and <OPTION> tags. The element created by
* this action is expected to have the attribute
! * <code>StyleConstants.ModelAttribute</code> set to
* the model that holds the state for the form control.
* This enables multiple views, and allows document to
* be iterated over picking up the data of the form.
* The following are the model assignments for the
* various type of form elements.
--- 3382,3392 ----
* Action to support forms by building all of the elements
* used to represent form controls. This will process
* the <INPUT>, <TEXTAREA>, <SELECT>,
* and <OPTION> tags. The element created by
* this action is expected to have the attribute
! * {@code StyleConstants.ModelAttribute} set to
* the model that holds the state for the form control.
* This enables multiple views, and allows document to
* be iterated over picking up the data of the form.
* The following are the model assignments for the
* various type of form elements.
*** 3565,3575 ****
/**
* If a <SELECT> tag is being processed, this
* model will be a reference to the model being filled
* with the <OPTION> elements (which produce
! * objects of type <code>Option</code>.
*/
Object selectModel;
int optionCount;
}
--- 3570,3580 ----
/**
* If a <SELECT> tag is being processed, this
* model will be a reference to the model being filled
* with the <OPTION> elements (which produce
! * objects of type {@code Option}.
*/
Object selectModel;
int optionCount;
}
*** 3824,3834 ****
offset += HTMLDocument.this.getLength() - oldLength;
flushCount++;
}
/**
! * This will be invoked for the last flush, if <code>insertTag</code>
* is non null.
*/
private void adjustEndSpecsForPartialInsert() {
int size = parseBuffer.size();
if (insertTagDepthDelta < 0) {
--- 3829,3839 ----
offset += HTMLDocument.this.getLength() - oldLength;
flushCount++;
}
/**
! * This will be invoked for the last flush, if {@code insertTag}
* is non null.
*/
private void adjustEndSpecsForPartialInsert() {
int size = parseBuffer.size();
if (insertTagDepthDelta < 0) {
*** 3902,3920 ****
}
}
}
/**
! * Adds the CSS rules in <code>rules</code>.
*/
void addCSSRules(String rules) {
StyleSheet ss = getStyleSheet();
ss.addRule(rules);
}
/**
! * Adds the CSS stylesheet at <code>href</code> to the known list
* of stylesheets.
*/
void linkCSSStyleSheet(String href) {
URL url;
try {
--- 3907,3925 ----
}
}
}
/**
! * Adds the CSS rules in {@code rules}.
*/
void addCSSRules(String rules) {
StyleSheet ss = getStyleSheet();
ss.addRule(rules);
}
/**
! * Adds the CSS stylesheet at {@code href} to the known list
* of stylesheets.
*/
void linkCSSStyleSheet(String href) {
URL url;
try {
*** 3930,3940 ****
getStyleSheet().importStyleSheet(url);
}
}
/**
! * Returns true if can insert starting at <code>t</code>. This
* will return false if the insert tag is set, and hasn't been found
* yet.
*/
private boolean canInsertTag(HTML.Tag t, AttributeSet attr,
boolean isBlockTag) {
--- 3935,3945 ----
getStyleSheet().importStyleSheet(url);
}
}
/**
! * Returns true if can insert starting at {@code t}. This
* will return false if the insert tag is set, and hasn't been found
* yet.
*/
private boolean canInsertTag(HTML.Tag t, AttributeSet attr,
boolean isBlockTag) {
*** 4068,4078 ****
/**
* This is set to true when and end is invoked for {@literal <html>}.
*/
private boolean receivedEndHTML;
! /** Number of times <code>flushBuffer</code> has been invoked. */
private int flushCount;
/** If true, behavior is similar to insertTag, but instead of
* waiting for insertTag will wait for first Element without
* an 'implied' attribute and begin inserting then. */
private boolean insertAfterImplied;
--- 4073,4083 ----
/**
* This is set to true when and end is invoked for {@literal <html>}.
*/
private boolean receivedEndHTML;
! /** Number of times {@code flushBuffer} has been invoked. */
private int flushCount;
/** If true, behavior is similar to insertTag, but instead of
* waiting for insertTag will wait for first Element without
* an 'implied' attribute and begin inserting then. */
private boolean insertAfterImplied;
< prev index next >