//# 11 errors, 659 messages
//#
/*
    //#IRCDocument.java:1:1: class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#IRCDocument.java:1:1: method: com.dmdirc.addons.ui_swing.textpane.IRCDocument.com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.dmdirc.addons.ui_swing.textpane;

import com.dmdirc.config.ConfigManager;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.util.RollingList;

import java.io.Serializable;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.List;

import javax.swing.event.EventListenerList;

/**
 * Data contained in a TextPane.
 */
public final class IRCDocument implements Serializable, ConfigChangeListener {

    /**
     * A version number for this class. It should be changed whenever the class
     * structure is changed (or anything else that would prevent serialized
     * objects being unserialized with the new class).
     */
    private static final long serialVersionUID = 4;
    /** List of lines of text. */
    private final List<Line> lines;
    /** Listener list. */
    private final EventListenerList listeners;
    /** Cached lines. */
    private RollingList<Line> cachedLines;
    /** Cached attributed strings. */
    private RollingList<AttributedString> cachedStrings;
    /** Configuration manager. */
    private ConfigManager config;

    /** 
     * Creates a new instance of IRCDocument.
     * 
     * @param config Document's config manager
     */
    public IRCDocument(final ConfigManager config) {
    //#IRCDocument.java:63: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)
    //#input(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): config
    //#input(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new ArrayList(IRCDocument#1) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new EventListenerList(IRCDocument#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#3) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#4) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.cachedLines
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.cachedStrings
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.config
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.lines
    //#output(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.listeners
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new ArrayList(IRCDocument#1)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new EventListenerList(IRCDocument#2)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#3)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#4)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.cachedLines == &new RollingList(IRCDocument#3)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.cachedStrings == &new RollingList(IRCDocument#4)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.config == config
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): init'ed(this.config)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.lines == &new ArrayList(IRCDocument#1)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): this.listeners == &new EventListenerList(IRCDocument#2)
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new ArrayList(IRCDocument#1) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new EventListenerList(IRCDocument#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#3) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)): new RollingList(IRCDocument#4) num objects == 1
        this.config = config;
        lines = new ArrayList<Line>();
        listeners = new EventListenerList();

        cachedLines = new RollingList<Line>(50);
    //#IRCDocument.java:68: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList(int)
        cachedStrings = new RollingList<AttributedString>(50);
    //#IRCDocument.java:69: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList(int)
    }
    //#IRCDocument.java:70: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.com.dmdirc.addons.ui_swing.textpane.IRCDocument(ConfigManager)

    /**
     * Returns the number of lines in this document.
     *
     * @return Number of lines
     */
    public int getNumLines() {
        return lines.size();
    //#IRCDocument.java:78: method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getNumLines()
    //#input(int getNumLines()): this
    //#input(int getNumLines()): this.lines
    //#output(int getNumLines()): return_value
    //#pre[2] (int getNumLines()): this.lines != null
    //#post(int getNumLines()): init'ed(return_value)
    //#IRCDocument.java:78: end of method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getNumLines()
    }

    /**
     * Returns the Line at the specified number.
     *
     * @param lineNumber Line number to retrieve
     *
     * @return Line at the specified number or null
     */
    Line getLine(final int lineNumber) {
        return lines.get(lineNumber);
    //#IRCDocument.java:89: method: Line com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLine(int)
    //#input(Line getLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(Line getLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(Line getLine(int)): lineNumber
    //#input(Line getLine(int)): this
    //#input(Line getLine(int)): this.lines
    //#output(Line getLine(int)): return_value
    //#pre[3] (Line getLine(int)): this.lines != null
    //#presumption(Line getLine(int)): java.util.List:get(...).__Tag@89 == com/dmdirc/addons/ui_swing/textpane/Line
    //#post(Line getLine(int)): init'ed(return_value)
    //#IRCDocument.java:89: end of method: Line com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLine(int)
    }

    /**
     * Adds the stylised string to the canvas.
     * 
     * @param text stylised string to add to the text
     */
    public void addText(final String[] text) {
        synchronized (lines) {
    //#IRCDocument.java:98: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addText(String[])
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.lineAdded(II)V
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.lineAdded(II)V
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void addText(String[])): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void addText(String[])): text
    //#input(void addText(String[])): this
    //#input(void addText(String[])): this.config
    //#input(void addText(String[])): this.lines
    //#input(void addText(String[])): this.lines.__Lock
    //#input(void addText(String[])): this.listeners
    //#pre[3] (void addText(String[])): init'ed(this.config)
    //#pre[4] (void addText(String[])): this.lines != null
    //#pre[5] (void addText(String[])): this.listeners != null
    //#unanalyzed(void addText(String[])): Effects-of-calling:java.util.List:size
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void addText(String[])): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void addText(String[])): Effects-of-calling:setScrollBarMax
    //#unanalyzed(void addText(String[])): Effects-of-calling:getNumLines
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void addText(String[])): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void addText(String[])): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(void addText(String[])): Effects-of-calling:java.awt.Font:getSize
    //#unanalyzed(void addText(String[])): Effects-of-calling:lineAdded
            lines.add(new Line(text, config));
            fireLineAdded(lines.indexOf(text));
        }
    }
    //#IRCDocument.java:102: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addText(String[])

    /**
     * Adds the stylised string to the canvas.
     * 
     * @param text stylised string to add to the text
     */
    public void addText(final List<String[]> text) {
        synchronized (lines) {
    //#IRCDocument.java:110: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addText(List)
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.linesAdded(III)V
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.linesAdded(III)V
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void addText(List)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void addText(List)): text
    //#input(void addText(List)): this
    //#input(void addText(List)): this.config
    //#input(void addText(List)): this.lines
    //#input(void addText(List)): this.lines.__Lock
    //#input(void addText(List)): this.listeners
    //#pre[1] (void addText(List)): text != null
    //#pre[4] (void addText(List)): this.lines != null
    //#pre[5] (void addText(List)): this.listeners != null
    //#pre[3] (void addText(List)): (soft) init'ed(this.config)
    //#unanalyzed(void addText(List)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void addText(List)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void addText(List)): Effects-of-calling:setScrollBarMax
    //#unanalyzed(void addText(List)): Effects-of-calling:getNumLines
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void addText(List)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void addText(List)): Effects-of-calling:linesAdded
    //#unanalyzed(void addText(List)): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(void addText(List)): Effects-of-calling:java.awt.Font:getSize
    //#test_vector(void addText(List)): java.util.Iterator:hasNext(...)@112: {0}, {1}
            final int start = lines.size();
            for (String[] string : text) {
                lines.add(new Line(string, config));
            }
            fireLinesAdded(start, text.size());
        }
    }
    //#IRCDocument.java:117: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addText(List)

    /**
     * Trims the document to the specified number of lines.
     *
     * @param numLines Number of lines to trim the document to
     */
    public void trim(final int numLines) {
        synchronized (lines) {
    //#IRCDocument.java:125: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.trim(int)
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.trimmed(I)V
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.trimmed(I)V
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void trim(int)): numLines
    //#input(void trim(int)): this
    //#input(void trim(int)): this.lines
    //#input(void trim(int)): this.lines.__Lock
    //#input(void trim(int)): this.listeners
    //#pre[3] (void trim(int)): this.lines != null
    //#pre[4] (void trim(int)): this.listeners != null
    //#unanalyzed(void trim(int)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void trim(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void trim(int)): Effects-of-calling:getNumLines
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void trim(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void trim(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#unanalyzed(void trim(int)): Effects-of-calling:trimmed
            while (lines.size() > numLines) {
                lines.remove(0);
            }
            fireTrimmed();
        }
    }
    //#IRCDocument.java:131: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.trim(int)

    /** Clears all lines from the document. */
    protected void clear() {
        synchronized (lines) {
    //#IRCDocument.java:135: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.clear()
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.cleared()V
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.cleared()V
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void clear()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void clear()): this
    //#input(void clear()): this.lines
    //#input(void clear()): this.lines.__Lock
    //#input(void clear()): this.listeners
    //#pre[2] (void clear()): this.lines != null
    //#pre[3] (void clear()): this.listeners != null
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void clear()): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#unanalyzed(void clear()): Effects-of-calling:cleared
            lines.clear();
            fireCleared();
        }
    }
    //#IRCDocument.java:139: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.clear()

    /**
     * Adds a IRCDocumentListener to the listener list.
     *
     * @param listener Listener to add
     */
    public void addIRCDocumentListener(final IRCDocumentListener listener) {
        synchronized (listeners) {
    //#IRCDocument.java:147: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addIRCDocumentListener(IRCDocumentListener)
    //#input(void addIRCDocumentListener(IRCDocumentListener)): listener
    //#input(void addIRCDocumentListener(IRCDocumentListener)): this
    //#input(void addIRCDocumentListener(IRCDocumentListener)): this.listeners
    //#input(void addIRCDocumentListener(IRCDocumentListener)): this.listeners.__Lock
    //#pre[3] (void addIRCDocumentListener(IRCDocumentListener)): (soft) this.listeners != null
    //#test_vector(void addIRCDocumentListener(IRCDocumentListener)): listener: Inverse{null}, Addr_Set{null}
            if (listener == null) {
                return;
            }
            listeners.add(IRCDocumentListener.class, listener);
        }
    }
    //#IRCDocument.java:153: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.addIRCDocumentListener(IRCDocumentListener)

    /**
     * Removes a IRCDocumentListener from the listener list.
     *
     * @param listener Listener to remove
     */
    public void removeIRCDocumentListener(final IRCDocumentListener listener) {
        listeners.remove(IRCDocumentListener.class, listener);
    //#IRCDocument.java:161: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.removeIRCDocumentListener(IRCDocumentListener)
    //#input(void removeIRCDocumentListener(IRCDocumentListener)): listener
    //#input(void removeIRCDocumentListener(IRCDocumentListener)): this
    //#input(void removeIRCDocumentListener(IRCDocumentListener)): this.listeners
    //#pre[3] (void removeIRCDocumentListener(IRCDocumentListener)): this.listeners != null
    }
    //#IRCDocument.java:162: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.removeIRCDocumentListener(IRCDocumentListener)

    /**
     * Fires the line added method on all listeners.
     *
     * @param index Index of the added line
     */
    protected void fireLineAdded(final int index) {
        final Object[] listenerList = listeners.getListenerList();
    //#IRCDocument.java:170: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireLineAdded(int)
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.lineAdded(II)V
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.lineAdded(II)V
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void fireLineAdded(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void fireLineAdded(int)): index
    //#input(void fireLineAdded(int)): this
    //#input(void fireLineAdded(int)): this.lines
    //#input(void fireLineAdded(int)): this.listeners
    //#pre[4] (void fireLineAdded(int)): this.listeners != null
    //#pre[3] (void fireLineAdded(int)): (soft) this.lines != null
    //#presumption(void fireLineAdded(int)): javax.swing.event.EventListenerList:getListenerList(...)@170 != null
    //#presumption(void fireLineAdded(int)): listenerList.length@170 in {0, 2..4_294_967_295}
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].__Tag@170 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].__Tag@170 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].__Tag@170 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].canvas.__Tag@170 == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].canvas.textPane@170 != null
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].canvas@170 != null
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].document.lines@170 != null
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].document@170 != null
    //#presumption(void fireLineAdded(int)): listenerList[(i + 1)].scrollBar@170 != null
    //#presumption(void fireLineAdded(int)): listenerList[i + 1]@170 != null
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:setScrollBarMax
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:getNumLines
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void fireLineAdded(int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#test_vector(void fireLineAdded(int)): listenerList[i]@170: Inverse{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}, Addr_Set{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}
        for (int i = 0; i < listenerList.length; i += 2) {
    //#IRCDocument.java:171: ?overflow
    //#    i in {-2_147_483_650..4_294_967_293}
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireLineAdded(int)
    //#    basic block: bb_5
    //#    assertion: i in {-2_147_483_650..4_294_967_293}
    //#    VN: i + 2
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (listenerList[i] == IRCDocumentListener.class) {
                ((IRCDocumentListener) listenerList[i + 1]).lineAdded(index,
    //#IRCDocument.java:173: ?array index out of bounds
    //#    (i + 1) < listenerList.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireLineAdded(int)
    //#    basic block: bb_4
    //#    assertion: (i + 1) < listenerList.length
    //#    VN: -((i - listenerList.length@170) + 1)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
                        lines.size());
            }
        }
    }
    //#IRCDocument.java:177: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireLineAdded(int)

    /**
     * Fires the lines added method on all listeners.
     *
     * @param index Index of the added line
     * @param size Number of lines added
     */
    protected void fireLinesAdded(final int index, final int size) {
        final Object[] listenerList = listeners.getListenerList();
    //#IRCDocument.java:186: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireLinesAdded(int, int)
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.linesAdded(III)V
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.linesAdded(III)V
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void fireLinesAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void fireLinesAdded(int, int)): index
    //#input(void fireLinesAdded(int, int)): size
    //#input(void fireLinesAdded(int, int)): this
    //#input(void fireLinesAdded(int, int)): this.lines
    //#input(void fireLinesAdded(int, int)): this.listeners
    //#pre[5] (void fireLinesAdded(int, int)): this.listeners != null
    //#pre[4] (void fireLinesAdded(int, int)): (soft) this.lines != null
    //#presumption(void fireLinesAdded(int, int)): javax.swing.event.EventListenerList:getListenerList(...)@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList.length@186 in {0, 2..4_294_967_295}
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].__Tag@186 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].__Tag@186 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].__Tag@186 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].canvas.__Tag@186 == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].canvas.textPane@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].canvas@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].document.lines@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].document@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList[(i + 1)].scrollBar@186 != null
    //#presumption(void fireLinesAdded(int, int)): listenerList[i + 1]@186 != null
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:setScrollBarMax
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:getNumLines
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void fireLinesAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#test_vector(void fireLinesAdded(int, int)): listenerList[i]@186: Inverse{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}, Addr_Set{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}
        for (int i = 0; i < listenerList.length; i += 2) {
    //#IRCDocument.java:187: ?overflow
    //#    i in {-2_147_483_650..4_294_967_293}
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireLinesAdded(int, int)
    //#    basic block: bb_5
    //#    assertion: i in {-2_147_483_650..4_294_967_293}
    //#    VN: i + 2
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (listenerList[i] == IRCDocumentListener.class) {
                ((IRCDocumentListener) listenerList[i + 1]).linesAdded(index,
    //#IRCDocument.java:189: ?array index out of bounds
    //#    (i + 1) < listenerList.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireLinesAdded(int, int)
    //#    basic block: bb_4
    //#    assertion: (i + 1) < listenerList.length
    //#    VN: -((i - listenerList.length@186) + 1)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
                        size,
                        lines.size());
            }
        }
    }
    //#IRCDocument.java:194: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireLinesAdded(int, int)

    /**
     * Fires the trimmed method on all listeners.
     */
    protected void fireTrimmed() {
        final Object[] listenerList = listeners.getListenerList();
    //#IRCDocument.java:200: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireTrimmed()
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.trimmed(I)V
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.trimmed(I)V
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void fireTrimmed()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void fireTrimmed()): this
    //#input(void fireTrimmed()): this.lines
    //#input(void fireTrimmed()): this.listeners
    //#pre[3] (void fireTrimmed()): this.listeners != null
    //#pre[2] (void fireTrimmed()): (soft) this.lines != null
    //#presumption(void fireTrimmed()): javax.swing.event.EventListenerList:getListenerList(...)@200 != null
    //#presumption(void fireTrimmed()): listenerList.length@200 in {0, 2..4_294_967_295}
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].__Tag@200 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].__Tag@200 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].__Tag@200 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].canvas.__Tag@200 == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].canvas.textPane@200 != null
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].canvas@200 != null
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].document.lines@200 != null
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].document@200 != null
    //#presumption(void fireTrimmed()): listenerList[(i + 1)].scrollBar@200 != null
    //#presumption(void fireTrimmed()): listenerList[i + 1]@200 != null
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:getNumLines
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void fireTrimmed()): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#test_vector(void fireTrimmed()): listenerList[i]@200: Inverse{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}, Addr_Set{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}
        for (int i = 0; i < listenerList.length; i += 2) {
    //#IRCDocument.java:201: ?overflow
    //#    i in {-2_147_483_650..4_294_967_293}
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireTrimmed()
    //#    basic block: bb_5
    //#    assertion: i in {-2_147_483_650..4_294_967_293}
    //#    VN: i + 2
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (listenerList[i] == IRCDocumentListener.class) {
                ((IRCDocumentListener) listenerList[i + 1]).trimmed(lines.size());
    //#IRCDocument.java:203: ?array index out of bounds
    //#    (i + 1) < listenerList.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireTrimmed()
    //#    basic block: bb_4
    //#    assertion: (i + 1) < listenerList.length
    //#    VN: -((i - listenerList.length@200) + 1)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
            }
        }
    }
    //#IRCDocument.java:206: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireTrimmed()

    /**
     * fires the cleared method on all listeners.
     */
    protected void fireCleared() {
        final Object[] listenerList = listeners.getListenerList();
    //#IRCDocument.java:212: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireCleared()
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.cleared()V
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.cleared()V
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void fireCleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void fireCleared()): this
    //#input(void fireCleared()): this.listeners
    //#pre[2] (void fireCleared()): this.listeners != null
    //#presumption(void fireCleared()): javax.swing.event.EventListenerList:getListenerList(...)@212 != null
    //#presumption(void fireCleared()): listenerList.length@212 in {0, 2..4_294_967_295}
    //#presumption(void fireCleared()): listenerList[(i + 1)].__Tag@212 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireCleared()): listenerList[(i + 1)].__Tag@212 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireCleared()): listenerList[(i + 1)].__Tag@212 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireCleared()): listenerList[(i + 1)].canvas.__Tag@212 == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#presumption(void fireCleared()): listenerList[(i + 1)].canvas@212 != null
    //#presumption(void fireCleared()): listenerList[i + 1]@212 != null
    //#unanalyzed(void fireCleared()): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#test_vector(void fireCleared()): listenerList[i]@212: Inverse{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}, Addr_Set{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}
        for (int i = 0; i < listenerList.length; i += 2) {
    //#IRCDocument.java:213: ?overflow
    //#    i in {-2_147_483_650..4_294_967_293}
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireCleared()
    //#    basic block: bb_5
    //#    assertion: i in {-2_147_483_650..4_294_967_293}
    //#    VN: i + 2
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (listenerList[i] == IRCDocumentListener.class) {
                ((IRCDocumentListener) listenerList[i + 1]).cleared();
    //#IRCDocument.java:215: ?array index out of bounds
    //#    (i + 1) < listenerList.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireCleared()
    //#    basic block: bb_4
    //#    assertion: (i + 1) < listenerList.length
    //#    VN: -((i - listenerList.length@212) + 1)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
            }
        }
    }
    //#IRCDocument.java:218: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireCleared()
    
    /**
     * fires the need repaint method on all listeners.
     */
    protected void fireRepaintNeeded() {
        final Object[] listenerList = listeners.getListenerList();
    //#IRCDocument.java:224: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireRepaintNeeded()
    //#input(void fireRepaintNeeded()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void fireRepaintNeeded()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void fireRepaintNeeded()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void fireRepaintNeeded()): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.repaintNeeded()V
    //#input(void fireRepaintNeeded()): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.repaintNeeded()V
    //#input(void fireRepaintNeeded()): this
    //#input(void fireRepaintNeeded()): this.listeners
    //#pre[2] (void fireRepaintNeeded()): this.listeners != null
    //#presumption(void fireRepaintNeeded()): javax.swing.event.EventListenerList:getListenerList(...)@224 != null
    //#presumption(void fireRepaintNeeded()): listenerList.length@224 in {0, 2..4_294_967_295}
    //#presumption(void fireRepaintNeeded()): listenerList[(i + 1)].__Tag@224 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireRepaintNeeded()): listenerList[(i + 1)].__Tag@224 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireRepaintNeeded()): listenerList[(i + 1)].__Tag@224 in {com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener, com/dmdirc/addons/ui_swing/textpane/TextPane}
    //#presumption(void fireRepaintNeeded()): listenerList[(i + 1)].canvas@224 != null
    //#presumption(void fireRepaintNeeded()): listenerList[i + 1]@224 != null
    //#unanalyzed(void fireRepaintNeeded()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#test_vector(void fireRepaintNeeded()): listenerList[i]@224: Inverse{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}, Addr_Set{&com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Class_Obj}
        for (int i = 0; i < listenerList.length; i += 2) {
    //#IRCDocument.java:225: ?overflow
    //#    i in {-2_147_483_650..4_294_967_293}
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireRepaintNeeded()
    //#    basic block: bb_5
    //#    assertion: i in {-2_147_483_650..4_294_967_293}
    //#    VN: i + 2
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
            if (listenerList[i] == IRCDocumentListener.class) {
                ((IRCDocumentListener) listenerList[i + 1]).repaintNeeded();
    //#IRCDocument.java:227: ?array index out of bounds
    //#    (i + 1) < listenerList.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void fireRepaintNeeded()
    //#    basic block: bb_4
    //#    assertion: (i + 1) < listenerList.length
    //#    VN: -((i - listenerList.length@224) + 1)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
            }
        }
    }
    //#IRCDocument.java:230: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.fireRepaintNeeded()

    /**
     * Returns an attributed character iterator for a particular line,
     * utilising the document cache where possible.
     *
     * @param line Line to be styled
     *
     * @return Styled line
     */
    AttributedCharacterIterator getStyledLine(final Line line) {
        AttributedString styledLine = null;
    //#IRCDocument.java:241: method: AttributedCharacterIterator com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(Line)
    //#input(AttributedCharacterIterator getStyledLine(Line)): "."._tainted
    //#input(AttributedCharacterIterator getStyledLine(Line)): "Config option not found: "._tainted
    //#input(AttributedCharacterIterator getStyledLine(Line)): "Unable to insert styled string: "._tainted
    //#input(AttributedCharacterIterator getStyledLine(Line)): "textPaneFontName"._tainted
    //#input(AttributedCharacterIterator getStyledLine(Line)): "ui"._tainted
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getStyled()Ljava/text/AttributedString;
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.BACKGROUND
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FAMILY
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FOREGROUND
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE_OBLIQUE
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.SIZE
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE_ON
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT_BOLD
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$CharacterConstants.Underline
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Background
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Foreground
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Bold
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Family
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Italic
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigManager.stats
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/ConfigSource.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(Line)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(Line)): line
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.__Tag
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.config
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.config.__Tag
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.config.file
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.config.sources
    //#input(AttributedCharacterIterator getStyledLine(Line)): line.lineParts
    //#input(AttributedCharacterIterator getStyledLine(Line)): this
    //#input(AttributedCharacterIterator getStyledLine(Line)): this.cachedLines
    //#input(AttributedCharacterIterator getStyledLine(Line)): this.cachedStrings
    //#output(AttributedCharacterIterator getStyledLine(Line)): line.lineHeight
    //#output(AttributedCharacterIterator getStyledLine(Line)): return_value
    //#pre[12] (AttributedCharacterIterator getStyledLine(Line)): this.cachedLines != null
    //#pre[1] (AttributedCharacterIterator getStyledLine(Line)): (soft) line != null
    //#pre[2] (AttributedCharacterIterator getStyledLine(Line)): (soft) line.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#pre[3] (AttributedCharacterIterator getStyledLine(Line)): (soft) line.config != null
    //#pre[5] (AttributedCharacterIterator getStyledLine(Line)): (soft) line.config.__Tag == com/dmdirc/config/ConfigManager
    //#pre[7] (AttributedCharacterIterator getStyledLine(Line)): (soft) line.config.sources != null
    //#pre[13] (AttributedCharacterIterator getStyledLine(Line)): (soft) this.cachedStrings != null
    //#presumption(AttributedCharacterIterator getStyledLine(Line)): com.dmdirc.util.RollingList:getList(...)@243 != null
    //#post(AttributedCharacterIterator getStyledLine(Line)): possibly_updated(line.lineHeight)
    //#post(AttributedCharacterIterator getStyledLine(Line)): init'ed(return_value)
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.awt.Font:getSize
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:getStyledString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.StyledDocument:getParagraphElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getDocument
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Document:getLength
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Document:getText
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.text.AttributedString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.BadLocationException:getMessage
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:hasOption
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:getOption
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.awt.Font:getName
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.text.AttributedString:getIterator
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.text.AttributedCharacterIterator:getEndIndex
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.awt.Font
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.text.AttributedString:addAttribute
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.awt.Font:getFamily
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getElementCount
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getAttributes
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.AttributeSet:getAttributeNames
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Enumeration:hasMoreElements
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:java.util.Enumeration:nextElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.AttributeSet:getAttribute
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getStartOffset
    //#unanalyzed(AttributedCharacterIterator getStyledLine(Line)): Effects-of-calling:javax.swing.text.Element:getEndOffset
    //#test_vector(AttributedCharacterIterator getStyledLine(Line)): com.dmdirc.util.RollingList:contains(...)@242: {0}, {1}
        if (cachedLines.contains(line)) {
    //#IRCDocument.java:242: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:contains(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:contains(Object)
            final int index = cachedLines.getList().indexOf(line);
    //#IRCDocument.java:243: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.RollingList:getList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    unanalyzed callee: List com.dmdirc.util.RollingList:getList()
            styledLine = cachedStrings.get(index);
    //#IRCDocument.java:244: Warning: method not available - call not analyzed
    //#    call on Object com.dmdirc.util.RollingList:get(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    unanalyzed callee: Object com.dmdirc.util.RollingList:get(int)
        }

        if (styledLine == null) {
            styledLine = line.getStyled();
            cachedLines.add(line);
    //#IRCDocument.java:249: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)
            cachedStrings.add(styledLine);
    //#IRCDocument.java:250: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)
        }

        return styledLine.getIterator();
    //#IRCDocument.java:253: ?null dereference
    //#    styledLine != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: AttributedCharacterIterator getStyledLine(Line)
    //#    basic block: bb_5
    //#    assertion: styledLine != null
    //#    VN: styledLine
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCDocument.java:253: end of method: AttributedCharacterIterator com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(Line)
    }

    /**
     * Returns an attributed string for a particular line, utilising the
     * document cache where possible.
     *
     * @param line Line number to be styled
     *
     * @return Styled line
     */
    public AttributedCharacterIterator getStyledLine(final int line) {
        return getStyledLine(getLine(line));
    //#IRCDocument.java:265: method: AttributedCharacterIterator com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(int)
    //#input(AttributedCharacterIterator getStyledLine(int)): "."._tainted
    //#input(AttributedCharacterIterator getStyledLine(int)): "Config option not found: "._tainted
    //#input(AttributedCharacterIterator getStyledLine(int)): "Unable to insert styled string: "._tainted
    //#input(AttributedCharacterIterator getStyledLine(int)): "textPaneFontName"._tainted
    //#input(AttributedCharacterIterator getStyledLine(int)): "ui"._tainted
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getStyled()Ljava/text/AttributedString;
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.BACKGROUND
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FAMILY
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FOREGROUND
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE_OBLIQUE
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.SIZE
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE_ON
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT_BOLD
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$CharacterConstants.Underline
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Background
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Foreground
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Bold
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Family
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Italic
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigManager.stats
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/ConfigSource.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(AttributedCharacterIterator getStyledLine(int)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(AttributedCharacterIterator getStyledLine(int)): line
    //#input(AttributedCharacterIterator getStyledLine(int)): this
    //#input(AttributedCharacterIterator getStyledLine(int)): this.cachedLines
    //#input(AttributedCharacterIterator getStyledLine(int)): this.cachedStrings
    //#input(AttributedCharacterIterator getStyledLine(int)): this.lines
    //#output(AttributedCharacterIterator getStyledLine(int)): return_value
    //#pre[3] (AttributedCharacterIterator getStyledLine(int)): this.cachedLines != null
    //#pre[5] (AttributedCharacterIterator getStyledLine(int)): this.lines != null
    //#pre[4] (AttributedCharacterIterator getStyledLine(int)): (soft) this.cachedStrings != null
    //#presumption(AttributedCharacterIterator getStyledLine(int)): getLine(...).config != null
    //#presumption(AttributedCharacterIterator getStyledLine(int)): getLine(...).config.__Tag == com/dmdirc/config/ConfigManager
    //#presumption(AttributedCharacterIterator getStyledLine(int)): getLine(...).config.sources != null
    //#presumption(AttributedCharacterIterator getStyledLine(int)): java.util.List:get(...)@89 != null
    //#presumption(AttributedCharacterIterator getStyledLine(int)): java.util.List:get(...)@89.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#post(AttributedCharacterIterator getStyledLine(int)): init'ed(return_value)
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.List:get
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.awt.Font:getSize
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.RollingList:contains
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.List:indexOf
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.RollingList:get
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:getStyledString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.StyledDocument:getParagraphElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getDocument
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Document:getLength
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Document:getText
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.text.AttributedString
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.BadLocationException:getMessage
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:hasOption
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:getOption
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.awt.Font:getName
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.text.AttributedString:getIterator
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.text.AttributedCharacterIterator:getEndIndex
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.awt.Font
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.text.AttributedString:addAttribute
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.awt.Font:getFamily
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getElementCount
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getAttributes
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.AttributeSet:getAttributeNames
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Enumeration:hasMoreElements
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:java.util.Enumeration:nextElement
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.AttributeSet:getAttribute
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getStartOffset
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:javax.swing.text.Element:getEndOffset
    //#unanalyzed(AttributedCharacterIterator getStyledLine(int)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#IRCDocument.java:265: end of method: AttributedCharacterIterator com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(int)
    }
    
    /**
     * Returns the line height of the specified line
     * 
     * @param line Line
     * 
     * @return Line height
     */
    int getLineHeight(final Line line) {
        return line.getHeight();
    //#IRCDocument.java:276: method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLineHeight(Line)
    //#input(int getLineHeight(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(int getLineHeight(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(int getLineHeight(Line)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getHeight()I
    //#input(int getLineHeight(Line)): line
    //#input(int getLineHeight(Line)): line.__Tag
    //#input(int getLineHeight(Line)): line.lineHeight
    //#output(int getLineHeight(Line)): return_value
    //#pre[1] (int getLineHeight(Line)): line != null
    //#pre[2] (int getLineHeight(Line)): line.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#pre[3] (int getLineHeight(Line)): init'ed(line.lineHeight)
    //#post(int getLineHeight(Line)): return_value == line.lineHeight
    //#post(int getLineHeight(Line)): init'ed(return_value)
    //#IRCDocument.java:276: end of method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLineHeight(Line)
    }
    
    /**
     * Returns the line height of the specified line
     * 
     * @param line Line
     * 
     * @return Line height
     */
    public int getLineHeight(final int line) {
        return  getLineHeight(getLine(line));
    //#IRCDocument.java:287: method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLineHeight(int)
    //#input(int getLineHeight(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(int getLineHeight(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(int getLineHeight(int)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getHeight()I
    //#input(int getLineHeight(int)): line
    //#input(int getLineHeight(int)): this
    //#input(int getLineHeight(int)): this.lines
    //#output(int getLineHeight(int)): return_value
    //#pre[3] (int getLineHeight(int)): this.lines != null
    //#presumption(int getLineHeight(int)): java.util.List:get(...)@89 != null
    //#presumption(int getLineHeight(int)): java.util.List:get(...)@89.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#post(int getLineHeight(int)): init'ed(return_value)
    //#unanalyzed(int getLineHeight(int)): Effects-of-calling:java.util.List:get
    //#IRCDocument.java:287: end of method: int com.dmdirc.addons.ui_swing.textpane.IRCDocument.getLineHeight(int)
    }

    /** {@inheritDoc} */
    @Override
    public void configChanged(final String domain, final String key) {
        cachedLines.clear();
    //#IRCDocument.java:293: method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.configChanged(String, String)
    //#IRCDocument.java:293: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList:clear()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList:clear()
    //#input(void configChanged(String, String)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener]
    //#input(void configChanged(String, String)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#input(void configChanged(String, String)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[others]
    //#input(void configChanged(String, String)): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Dispatch_Table.repaintNeeded()V
    //#input(void configChanged(String, String)): com/dmdirc/addons/ui_swing/textpane/TextPane.__Dispatch_Table.repaintNeeded()V
    //#input(void configChanged(String, String)): this
    //#input(void configChanged(String, String)): this.cachedLines
    //#input(void configChanged(String, String)): this.cachedStrings
    //#input(void configChanged(String, String)): this.listeners
    //#pre[2] (void configChanged(String, String)): this.cachedLines != null
    //#pre[3] (void configChanged(String, String)): this.cachedStrings != null
    //#pre[4] (void configChanged(String, String)): this.listeners != null
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:repaintNeeded
        cachedStrings.clear();
    //#IRCDocument.java:294: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList:clear()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList:clear()
        fireRepaintNeeded();
    }
    //#IRCDocument.java:296: end of method: void com.dmdirc.addons.ui_swing.textpane.IRCDocument.configChanged(String, String)
}

    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocument]
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addIRCDocumentListener(Lcom/dmdirc/addons/ui_swing/textpane/IRCDocumentListener;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addText(Ljava/util/List;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addText([Ljava/lang/String;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.clear()V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireCleared()V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireLineAdded(I)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireLinesAdded(II)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireRepaintNeeded()V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireTrimmed()V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLine(I)Lcom/dmdirc/addons/ui_swing/textpane/Line;
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLineHeight(I)I
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLineHeight(Lcom/dmdirc/addons/ui_swing/textpane/Line;)I
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getNumLines()I
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getStyledLine(I)Ljava/text/AttributedCharacterIterator;
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getStyledLine(Lcom/dmdirc/addons/ui_swing/textpane/Line;)Ljava/text/AttributedCharacterIterator;
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.removeIRCDocumentListener(Lcom/dmdirc/addons/ui_swing/textpane/IRCDocumentListener;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.trim(I)V
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/IRCDocument] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addIRCDocumentListener(Lcom/dmdirc/addons/ui_swing/textpane/IRCDocumentListener;)V == &addIRCDocumentListener
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addText(Ljava/util/List;)V == &addText
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.addText([Ljava/lang/String;)V == &addText
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.clear()V == &clear
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireCleared()V == &fireCleared
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireLineAdded(I)V == &fireLineAdded
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireLinesAdded(II)V == &fireLinesAdded
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireRepaintNeeded()V == &fireRepaintNeeded
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.fireTrimmed()V == &fireTrimmed
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLine(I)Lcom/dmdirc/addons/ui_swing/textpane/Line; == &getLine
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLineHeight(I)I == &getLineHeight
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getLineHeight(Lcom/dmdirc/addons/ui_swing/textpane/Line;)I == &getLineHeight
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getNumLines()I == &getNumLines
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getStyledLine(I)Ljava/text/AttributedCharacterIterator; == &getStyledLine
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.getStyledLine(Lcom/dmdirc/addons/ui_swing/textpane/Line;)Ljava/text/AttributedCharacterIterator; == &getStyledLine
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.removeIRCDocumentListener(Lcom/dmdirc/addons/ui_swing/textpane/IRCDocumentListener;)V == &removeIRCDocumentListener
    //#post(com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init): __Dispatch_Table.trim(I)V == &trim
    //#IRCDocument.java:: end of method: com.dmdirc.addons.ui_swing.textpane.IRCDocument.com.dmdirc.addons.ui_swing.textpane.IRCDocument__static_init
    //#IRCDocument.java:: end of class: com.dmdirc.addons.ui_swing.textpane.IRCDocument
