//# 19 errors, 1,382 messages
//#
/*
    //#TextPane.java:1:1: class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#TextPane.java:1:1: method: com.dmdirc.addons.ui_swing.textpane.TextPane$1.com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init
    //#TextPane.java:1:1: class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#TextPane.java:1:1: method: com.dmdirc.addons.ui_swing.textpane.TextPane.com.dmdirc.addons.ui_swing.textpane.TextPane__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.FrameContainer;

import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JComponent;
import javax.swing.JScrollBar;

import net.miginfocom.swing.MigLayout;

/**
 * Styled, scrollable text pane.
 */
public final class TextPane extends JComponent implements AdjustmentListener,
    //#TextPane.java:46: method: JScrollBar com.dmdirc.addons.ui_swing.textpane.TextPane.access$000(TextPane)
    //#input(JScrollBar access$000(TextPane)): x0
    //#input(JScrollBar access$000(TextPane)): x0.scrollBar
    //#output(JScrollBar access$000(TextPane)): return_value
    //#pre[1] (JScrollBar access$000(TextPane)): x0 != null
    //#post(JScrollBar access$000(TextPane)): return_value == x0.scrollBar
    //#post(JScrollBar access$000(TextPane)): init'ed(return_value)
    //#TextPane.java:46: end of method: JScrollBar com.dmdirc.addons.ui_swing.textpane.TextPane.access$000(TextPane)
    //#TextPane.java:46: method: TextPaneCanvas com.dmdirc.addons.ui_swing.textpane.TextPane.access$100(TextPane)
    //#input(TextPaneCanvas access$100(TextPane)): x0
    //#input(TextPaneCanvas access$100(TextPane)): x0.canvas
    //#output(TextPaneCanvas access$100(TextPane)): return_value
    //#pre[1] (TextPaneCanvas access$100(TextPane)): x0 != null
    //#post(TextPaneCanvas access$100(TextPane)): return_value == x0.canvas
    //#post(TextPaneCanvas access$100(TextPane)): init'ed(return_value)
    //#TextPane.java:46: end of method: TextPaneCanvas com.dmdirc.addons.ui_swing.textpane.TextPane.access$100(TextPane)
        MouseWheelListener, IRCDocumentListener {

    /**
     * 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 = 5;
    /** Scrollbar for the component. */
    private final JScrollBar scrollBar;
    /** Canvas object, used to draw text. */
    private final TextPaneCanvas canvas;
    /** IRCDocument. */
    private final IRCDocument document;
    /** Parent Frame. */
    private final FrameContainer frame;

    /** 
     * Creates a new instance of TextPane. 
     *
     * @param frame Parent Frame
     */
    public TextPane(final FrameContainer frame) {
        super();
    //#TextPane.java:70: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): "."._tainted
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): "textPaneFontName"._tainted
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): "ui"._tainted
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com/dmdirc/config/ConfigManager.__Dispatch_Table.addChangeListener(Ljava/lang/String;Ljava/lang/String;Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): frame
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new ArrayList(IRCDocument#1) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new EventListenerList(IRCDocument#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.listeners.__Lock
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#1) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#3) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new IRCDocument(TextPane#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.__Tag
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.cachedLines
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.cachedStrings
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.config
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.lines
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.listeners
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new JScrollBar(TextPane#5) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).__Tag
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).endLine
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).endPos
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).startLine
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).startPos
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#3) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#4) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new TextPaneCanvas(TextPane#4) num objects
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.__Tag
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.document
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.lineWrap
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.positions
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.scrollBarPosition
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.selection
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.textLayouts
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.textPane
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.frame
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.scrollBar
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new ArrayList(IRCDocument#1)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new EventListenerList(IRCDocument#2)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#1)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#2)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#3)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new IRCDocument(TextPane#2)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new JScrollBar(TextPane#5)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#3)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#4)
    //#new obj(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new TextPaneCanvas(TextPane#4)
    //#pre[1] (void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): frame != null
    //#presumption(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com.dmdirc.FrameContainer:getConfigManager(...).__Tag@75 == com/dmdirc/config/ConfigManager
    //#presumption(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com.dmdirc.FrameContainer:getConfigManager(...).listeners@75 != null
    //#presumption(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): com.dmdirc.FrameContainer:getConfigManager(...)@75 != null
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas == &new TextPaneCanvas(TextPane#4)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document == &new IRCDocument(TextPane#2)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.document == &new IRCDocument(TextPane#2)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.frame == frame
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.frame != null
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.scrollBar == &new JScrollBar(TextPane#5)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new ArrayList(IRCDocument#1) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new EventListenerList(IRCDocument#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#1) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new HashMap(TextPaneCanvas#3) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new IRCDocument(TextPane#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new JScrollBar(TextPane#5) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#3) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new RollingList(IRCDocument#4) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new TextPaneCanvas(TextPane#4) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(this.document.listeners.__Lock)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.__Tag == com/dmdirc/addons/ui_swing/textpane/IRCDocument
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.cachedLines == &new RollingList(IRCDocument#3)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.cachedStrings == &new RollingList(IRCDocument#4)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(this.document.config)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.lines == &new ArrayList(IRCDocument#1)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.document.listeners == &new EventListenerList(IRCDocument#2)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): new LinePosition(TextPaneCanvas#4).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(new LinePosition(TextPaneCanvas#4).endLine)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(new LinePosition(TextPaneCanvas#4).endPos)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(new LinePosition(TextPaneCanvas#4).startLine)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(new LinePosition(TextPaneCanvas#4).startPos)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.lineWrap == &new HashMap(TextPaneCanvas#3)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.positions == &new HashMap(TextPaneCanvas#2)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): init'ed(this.canvas.scrollBarPosition)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.selection == &new LinePosition(TextPaneCanvas#4)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.textLayouts == &new HashMap(TextPaneCanvas#1)
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.textPane == this
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): this.canvas.textPane != null
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:javax.swing.plaf.ComponentUI
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.util.MapList:add
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:javax.swing.JPanel
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:setDoubleBuffered
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:setOpaque
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:addMouseListener
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:addMouseMotionListener
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:addComponentListener
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.awt.event.MouseMotionAdapter
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:javax.swing.event.EventListenerList
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:com.dmdirc.util.RollingList
    //#unanalyzed(void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)): Effects-of-calling:javax.swing.event.EventListenerList:add
        setUI(new TextPaneUI());
    //#TextPane.java:71: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:setUI(ComponentUI)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:setUI(ComponentUI)

        this.frame = frame;
        document = new IRCDocument(frame.getConfigManager());
    //#TextPane.java:74: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.FrameContainer:getConfigManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: ConfigManager com.dmdirc.FrameContainer:getConfigManager()
        frame.getConfigManager().addChangeListener("ui", "textPaneFontName", document);
    //#TextPane.java:75: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.FrameContainer:getConfigManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: ConfigManager com.dmdirc.FrameContainer:getConfigManager()
        //TODO issue 2251
        //frame.getConfigManager().addChangeListener("ui", "textPaneFontSize", document);

        setLayout(new MigLayout("fill"));
    //#TextPane.java:79: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
    //#TextPane.java:79: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:setLayout(LayoutManager)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:setLayout(LayoutManager)
        canvas = new TextPaneCanvas(this, document);
        add(canvas, "dock center");
    //#TextPane.java:81: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:add(Component, Object)
        scrollBar = new JScrollBar(JScrollBar.VERTICAL);
        add(scrollBar, "dock east");
    //#TextPane.java:83: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:add(Component, Object)
        scrollBar.setMaximum(document.getNumLines());
        scrollBar.setBlockIncrement(10);
        scrollBar.setUnitIncrement(1);
        scrollBar.addAdjustmentListener(this);

        addMouseWheelListener(this);
    //#TextPane.java:89: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:addMouseWheelListener(MouseWheelListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:addMouseWheelListener(MouseWheelListener)
        document.addIRCDocumentListener(this);
        setAutoscrolls(true);
    //#TextPane.java:91: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:setAutoscrolls(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:setAutoscrolls(bool)

        MouseMotionListener doScrollRectToVisible = new MouseMotionAdapter() {
    //#TextPane.java:93: method: void com.dmdirc.addons.ui_swing.textpane.TextPane$1.com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)): Param_1
    //#input(void com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)): this
    //#output(void com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)): this.this$0
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)): init'ed(this.this$0)
    //#TextPane.java:93: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane$1.com.dmdirc.addons.ui_swing.textpane.TextPane$1(TextPane)

            /** {@inheritDoc} */
            @Override
            public void mouseDragged(MouseEvent e) {
                if (e.getXOnScreen() > getLocationOnScreen().getX() && e.
    //#TextPane.java:98: method: void com.dmdirc.addons.ui_swing.textpane.TextPane$1.mouseDragged(MouseEvent)
    //#TextPane.java:98: Warning: method not available - call not analyzed
    //#    call on Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#    method: void mouseDragged(MouseEvent)
    //#    unanalyzed callee: Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
    //#TextPane.java:98: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.textpane.TextPane:getWidth()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#    method: void mouseDragged(MouseEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.textpane.TextPane:getWidth()
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LineInfo.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LineInfo]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LineInfo.__Descendant_Table[others]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setEndLine(I)V
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setEndPos(I)V
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setStartLine(I)V
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setStartPos(I)V
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/MouseEventType.CLICK
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/MouseEventType.DRAG
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getClickPosition(Ljava/awt/Point;)Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.highlightEvent(Lcom/dmdirc/addons/ui_swing/textpane/MouseEventType;Ljava/awt/event/MouseEvent;)V
    //#input(void mouseDragged(MouseEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void mouseDragged(MouseEvent)): e
    //#input(void mouseDragged(MouseEvent)): this
    //#input(void mouseDragged(MouseEvent)): this.this$0
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.__Tag
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.positions
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.scrollBarPosition
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.selection
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.selection.__Tag
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.textLayouts
    //#input(void mouseDragged(MouseEvent)): this.this$0.canvas.textPane
    //#input(void mouseDragged(MouseEvent)): this.this$0.scrollBar
    //#output(void mouseDragged(MouseEvent)): this.this$0.canvas.scrollBarPosition
    //#output(void mouseDragged(MouseEvent)): this.this$0.canvas.selection.endLine
    //#output(void mouseDragged(MouseEvent)): this.this$0.canvas.selection.endPos
    //#output(void mouseDragged(MouseEvent)): this.this$0.canvas.selection.startLine
    //#output(void mouseDragged(MouseEvent)): this.this$0.canvas.selection.startPos
    //#pre[1] (void mouseDragged(MouseEvent)): e != null
    //#pre[8] (void mouseDragged(MouseEvent)): this.this$0 != null
    //#pre[2] (void mouseDragged(MouseEvent)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[9] (void mouseDragged(MouseEvent)): (soft) this.canvas != null
    //#pre[10] (void mouseDragged(MouseEvent)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[11] (void mouseDragged(MouseEvent)): (soft) this.canvas.positions != null
    //#pre[12] (void mouseDragged(MouseEvent)): (soft) this.canvas.selection != null
    //#pre[13] (void mouseDragged(MouseEvent)): (soft) this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[14] (void mouseDragged(MouseEvent)): (soft) this.canvas.textLayouts != null
    //#pre[15] (void mouseDragged(MouseEvent)): (soft) this.canvas.textPane != null
    //#pre[16] (void mouseDragged(MouseEvent)): (soft) this.scrollBar != null
    //#presumption(void mouseDragged(MouseEvent)): com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen(...)@102 != null
    //#presumption(void mouseDragged(MouseEvent)): com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen(...)@104 != null
    //#presumption(void mouseDragged(MouseEvent)): com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen(...)@98 != null
    //#presumption(void mouseDragged(MouseEvent)): com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen(...)@98 != null
    //#presumption(void mouseDragged(MouseEvent)): javax.swing.JScrollBar:getValue(...)@103 >= -2_147_483_647
    //#presumption(void mouseDragged(MouseEvent)): javax.swing.JScrollBar:getValue(...)@106 <= 4_294_967_294
    //#post(void mouseDragged(MouseEvent)): init'ed(this.canvas.scrollBarPosition)
    //#post(void mouseDragged(MouseEvent)): possibly_updated(this.this$0.canvas.selection.endLine)
    //#post(void mouseDragged(MouseEvent)): possibly_updated(this.this$0.canvas.selection.endPos)
    //#post(void mouseDragged(MouseEvent)): possibly_updated(this.this$0.canvas.selection.startLine)
    //#post(void mouseDragged(MouseEvent)): possibly_updated(this.this$0.canvas.selection.startPos)
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.font.TextLayout:getCharacterCount
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.font.TextLayout:hitTestChar
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.font.TextHitInfo:getInsertionIndex
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Rectangle:contains
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Point:getX
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Point:getY
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:isVisible
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.event.MouseEvent:getLocationOnScreen
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:javax.swing.SwingUtilities:convertPointFromScreen
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:contains
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:getBounds
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.event.MouseEvent:getPoint
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Rectangle:getX
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Point:setLocation
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Rectangle:getWidth
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Rectangle:getY
    //#unanalyzed(void mouseDragged(MouseEvent)): Effects-of-calling:java.awt.Rectangle:getHeight
    //#test_vector(void mouseDragged(MouseEvent)): java.awt.event.MouseEvent:getModifiersEx(...)@98: {-2_147_483_648..1_023, 1_025..4_294_967_295}, {1_024}
                        getXOnScreen() < (getLocationOnScreen().
                        getX() + getWidth()) && e.getModifiersEx() ==
                        MouseEvent.BUTTON1_DOWN_MASK) {
                    if (getLocationOnScreen().getY() > e.getYOnScreen()) {
    //#TextPane.java:102: Warning: method not available - call not analyzed
    //#    call on Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#    method: void mouseDragged(MouseEvent)
    //#    unanalyzed callee: Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
                        setScrollBarPosition(scrollBar.getValue() - 1);
                    } else if (getLocationOnScreen().getY() + getHeight() <
    //#TextPane.java:104: Warning: method not available - call not analyzed
    //#    call on Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#    method: void mouseDragged(MouseEvent)
    //#    unanalyzed callee: Point com.dmdirc.addons.ui_swing.textpane.TextPane:getLocationOnScreen()
    //#TextPane.java:104: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.textpane.TextPane:getHeight()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#    method: void mouseDragged(MouseEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.textpane.TextPane:getHeight()
                            e.getYOnScreen()) {
                        setScrollBarPosition(scrollBar.getValue() + 1);
                    }
                    canvas.highlightEvent(MouseEventType.DRAG, e);
                }
            }
    //#TextPane.java:110: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane$1.mouseDragged(MouseEvent)
        };
        addMouseMotionListener(doScrollRectToVisible);
    //#TextPane.java:112: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:addMouseMotionListener(MouseMotionListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:addMouseMotionListener(MouseMotionListener)
    }
    //#TextPane.java:113: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.com.dmdirc.addons.ui_swing.textpane.TextPane(FrameContainer)

    /** {@inheritDoc} */
    @Override
    public void updateUI() {
        setUI(new TextPaneUI());
    //#TextPane.java:118: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.updateUI()
    //#TextPane.java:118: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPane:setUI(ComponentUI)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void updateUI()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPane:setUI(ComponentUI)
    //#input(void updateUI()): this
    //#unanalyzed(void updateUI()): Effects-of-calling:javax.swing.plaf.ComponentUI
    }
    //#TextPane.java:119: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.updateUI()

    /**
     * Sets the new position for the scrollbar and the associated position
     * to render the text from.
     * @param position new position of the scrollbar
     */
    public void setScrollBarPosition(final int position) {
        scrollBar.setValue(position);
    //#TextPane.java:127: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setScrollBarPosition(int)
    //#input(void setScrollBarPosition(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void setScrollBarPosition(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void setScrollBarPosition(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void setScrollBarPosition(int)): position
    //#input(void setScrollBarPosition(int)): this
    //#input(void setScrollBarPosition(int)): this.canvas
    //#input(void setScrollBarPosition(int)): this.canvas.__Tag
    //#input(void setScrollBarPosition(int)): this.canvas.scrollBarPosition
    //#input(void setScrollBarPosition(int)): this.canvas.textPane
    //#input(void setScrollBarPosition(int)): this.scrollBar
    //#output(void setScrollBarPosition(int)): this.canvas.scrollBarPosition
    //#pre[1] (void setScrollBarPosition(int)): init'ed(this.canvas.scrollBarPosition)
    //#pre[5] (void setScrollBarPosition(int)): this.canvas != null
    //#pre[6] (void setScrollBarPosition(int)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[8] (void setScrollBarPosition(int)): this.scrollBar != null
    //#pre[7] (void setScrollBarPosition(int)): (soft) this.canvas.textPane != null
    //#post(void setScrollBarPosition(int)): this.canvas.scrollBarPosition == One-of{old this.canvas.scrollBarPosition, position}
    //#post(void setScrollBarPosition(int)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void setScrollBarPosition(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void setScrollBarPosition(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
        canvas.setScrollBarPosition(position);
    }
    //#TextPane.java:129: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setScrollBarPosition(int)

    /**
     * Returns the last visible line in the textpane.
     *
     * @return Last visible line index
     */
    public int getLastVisibleLine() {
        return scrollBar.getValue();
    //#TextPane.java:137: method: int com.dmdirc.addons.ui_swing.textpane.TextPane.getLastVisibleLine()
    //#input(int getLastVisibleLine()): this
    //#input(int getLastVisibleLine()): this.scrollBar
    //#output(int getLastVisibleLine()): return_value
    //#pre[2] (int getLastVisibleLine()): this.scrollBar != null
    //#post(int getLastVisibleLine()): init'ed(return_value)
    //#TextPane.java:137: end of method: int com.dmdirc.addons.ui_swing.textpane.TextPane.getLastVisibleLine()
    }

    /**
     * Sets the scrollbar's maximum position. If the current position is
     * within <code>linesAllowed</code> of the end of the document, the
     * scrollbar's current position is set to the end of the document.
     * 
     * @param linesAllowed The number of lines allowed below the current position
     * @since 0.6
     */
    protected void setScrollBarMax(final int linesAllowed) {
        final int lines = document.getNumLines() - 1;
    //#TextPane.java:149: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setScrollBarMax(int)
    //#input(void setScrollBarMax(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void setScrollBarMax(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void setScrollBarMax(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void setScrollBarMax(int)): linesAllowed
    //#input(void setScrollBarMax(int)): this
    //#input(void setScrollBarMax(int)): this.canvas
    //#input(void setScrollBarMax(int)): this.canvas.__Tag
    //#input(void setScrollBarMax(int)): this.canvas.scrollBarPosition
    //#input(void setScrollBarMax(int)): this.canvas.textPane
    //#input(void setScrollBarMax(int)): this.document
    //#input(void setScrollBarMax(int)): this.document.lines
    //#input(void setScrollBarMax(int)): this.scrollBar
    //#output(void setScrollBarMax(int)): this.canvas.scrollBarPosition
    //#pre[7] (void setScrollBarMax(int)): this.document != null
    //#pre[8] (void setScrollBarMax(int)): this.document.lines != null
    //#pre[9] (void setScrollBarMax(int)): this.scrollBar != null
    //#pre[2] (void setScrollBarMax(int)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[4] (void setScrollBarMax(int)): (soft) this.canvas != null
    //#pre[5] (void setScrollBarMax(int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void setScrollBarMax(int)): (soft) this.canvas.textPane != null
    //#presumption(void setScrollBarMax(int)): getNumLines(...)@149 in range
    //#presumption(void setScrollBarMax(int)): getNumLines(...)@149 - linesAllowed in range
    //#presumption(void setScrollBarMax(int)): java.util.List:size(...)@78 >= -2_147_483_647
    //#presumption(void setScrollBarMax(int)): java.util.List:size(...)@78 - linesAllowed in {-2_147_483_647..4_294_967_296}
    //#post(void setScrollBarMax(int)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void setScrollBarMax(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void setScrollBarMax(int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void setScrollBarMax(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void setScrollBarMax(int)): Effects-of-calling:java.util.List:size
    //#test_vector(void setScrollBarMax(int)): java.util.List:size(...)@78: {-2_147_483_647..0, 2..4_294_967_295}, {1}
    //#test_vector(void setScrollBarMax(int)): java.util.List:size(...)@78 - linesAllowed: {0}, {-2_147_483_647..-1, 1..4_294_967_296}
    //#test_vector(void setScrollBarMax(int)): javax.swing.JScrollBar:getValueIsAdjusting(...)@164: {1}, {0}
        final int currentLine = scrollBar.getValue();
        final int allowedDeviation = lines - linesAllowed;

        if (lines == 0) {
            canvas.repaint();
    //#TextPane.java:154: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void setScrollBarMax(int)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
        }

        scrollBar.setMaximum(lines);

        boolean setToMax = currentLine == allowedDeviation;
        if (allowedDeviation == -1) {
            setToMax = true;
        }

        if (!scrollBar.getValueIsAdjusting() && setToMax) {
            setScrollBarPosition(lines);
        }
    }
    //#TextPane.java:167: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setScrollBarMax(int)

    /** 
     * {@inheritDoc}
     * 
     * @param e Mouse wheel event
     */
    @Override
    public void adjustmentValueChanged(final AdjustmentEvent e) {
        setScrollBarPosition(e.getValue());
    //#TextPane.java:176: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.adjustmentValueChanged(AdjustmentEvent)
    //#input(void adjustmentValueChanged(AdjustmentEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void adjustmentValueChanged(AdjustmentEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void adjustmentValueChanged(AdjustmentEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void adjustmentValueChanged(AdjustmentEvent)): e
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this.canvas
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this.canvas.__Tag
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this.canvas.scrollBarPosition
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this.canvas.textPane
    //#input(void adjustmentValueChanged(AdjustmentEvent)): this.scrollBar
    //#output(void adjustmentValueChanged(AdjustmentEvent)): this.canvas.scrollBarPosition
    //#pre[1] (void adjustmentValueChanged(AdjustmentEvent)): e != null
    //#pre[2] (void adjustmentValueChanged(AdjustmentEvent)): init'ed(this.canvas.scrollBarPosition)
    //#pre[4] (void adjustmentValueChanged(AdjustmentEvent)): this.canvas != null
    //#pre[5] (void adjustmentValueChanged(AdjustmentEvent)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[7] (void adjustmentValueChanged(AdjustmentEvent)): this.scrollBar != null
    //#pre[6] (void adjustmentValueChanged(AdjustmentEvent)): (soft) this.canvas.textPane != null
    //#post(void adjustmentValueChanged(AdjustmentEvent)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void adjustmentValueChanged(AdjustmentEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void adjustmentValueChanged(AdjustmentEvent)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void adjustmentValueChanged(AdjustmentEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    }
    //#TextPane.java:177: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.adjustmentValueChanged(AdjustmentEvent)

    /** 
     * {@inheritDoc}
     * 
     * @param e Mouse wheel event
     */
    @Override
    public void mouseWheelMoved(final MouseWheelEvent e) {
        if (scrollBar.isEnabled()) {
    //#TextPane.java:186: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.mouseWheelMoved(MouseWheelEvent)
    //#input(void mouseWheelMoved(MouseWheelEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void mouseWheelMoved(MouseWheelEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void mouseWheelMoved(MouseWheelEvent)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void mouseWheelMoved(MouseWheelEvent)): e
    //#input(void mouseWheelMoved(MouseWheelEvent)): this
    //#input(void mouseWheelMoved(MouseWheelEvent)): this.canvas
    //#input(void mouseWheelMoved(MouseWheelEvent)): this.canvas.__Tag
    //#input(void mouseWheelMoved(MouseWheelEvent)): this.canvas.scrollBarPosition
    //#input(void mouseWheelMoved(MouseWheelEvent)): this.canvas.textPane
    //#input(void mouseWheelMoved(MouseWheelEvent)): this.scrollBar
    //#output(void mouseWheelMoved(MouseWheelEvent)): this.canvas.scrollBarPosition
    //#pre[7] (void mouseWheelMoved(MouseWheelEvent)): this.scrollBar != null
    //#pre[1] (void mouseWheelMoved(MouseWheelEvent)): (soft) e != null
    //#pre[2] (void mouseWheelMoved(MouseWheelEvent)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[4] (void mouseWheelMoved(MouseWheelEvent)): (soft) this.canvas != null
    //#pre[5] (void mouseWheelMoved(MouseWheelEvent)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void mouseWheelMoved(MouseWheelEvent)): (soft) this.canvas.textPane != null
    //#presumption(void mouseWheelMoved(MouseWheelEvent)): java.awt.event.MouseWheelEvent:getScrollAmount(...)@190 - javax.swing.JScrollBar:getValue(...)@190 in {-4_294_967_295..2_147_483_648}
    //#presumption(void mouseWheelMoved(MouseWheelEvent)): javax.swing.JScrollBar:getValue(...)@188 + java.awt.event.MouseWheelEvent:getScrollAmount(...)@188 in {-2_147_483_648..4_294_967_295}
    //#post(void mouseWheelMoved(MouseWheelEvent)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void mouseWheelMoved(MouseWheelEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void mouseWheelMoved(MouseWheelEvent)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void mouseWheelMoved(MouseWheelEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#test_vector(void mouseWheelMoved(MouseWheelEvent)): java.awt.event.MouseWheelEvent:getWheelRotation(...)@187: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void mouseWheelMoved(MouseWheelEvent)): javax.swing.JScrollBar:isEnabled(...)@186: {0}, {1}
            if (e.getWheelRotation() > 0) {
                setScrollBarPosition(scrollBar.getValue() + e.getScrollAmount());
            } else {
                setScrollBarPosition(scrollBar.getValue() - e.getScrollAmount());
            }
        }
    }
    //#TextPane.java:193: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.mouseWheelMoved(MouseWheelEvent)

    /**
     *
     * Returns the line information from a mouse click inside the textpane.
     *
     * @param point mouse position
     *
     * @return line number, line part, position in whole line
     */
    public LineInfo getClickPosition(final Point point) {
        return canvas.getClickPosition(point);
    //#TextPane.java:204: method: LineInfo com.dmdirc.addons.ui_swing.textpane.TextPane.getClickPosition(Point)
    //#input(LineInfo getClickPosition(Point)): com/dmdirc/addons/ui_swing/textpane/LineInfo.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LineInfo]
    //#input(LineInfo getClickPosition(Point)): com/dmdirc/addons/ui_swing/textpane/LineInfo.__Descendant_Table[others]
    //#input(LineInfo getClickPosition(Point)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(LineInfo getClickPosition(Point)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(LineInfo getClickPosition(Point)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getClickPosition(Ljava/awt/Point;)Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;
    //#input(LineInfo getClickPosition(Point)): point
    //#input(LineInfo getClickPosition(Point)): this
    //#input(LineInfo getClickPosition(Point)): this.canvas
    //#input(LineInfo getClickPosition(Point)): this.canvas.__Tag
    //#input(LineInfo getClickPosition(Point)): this.canvas.positions
    //#input(LineInfo getClickPosition(Point)): this.canvas.textLayouts
    //#output(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*) num objects
    //#output(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*).__Tag
    //#output(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*).index
    //#output(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*).line
    //#output(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*).part
    //#output(LineInfo getClickPosition(Point)): return_value
    //#new obj(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*)
    //#pre[3] (LineInfo getClickPosition(Point)): this.canvas != null
    //#pre[4] (LineInfo getClickPosition(Point)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[5] (LineInfo getClickPosition(Point)): (soft) this.canvas.positions != null
    //#pre[6] (LineInfo getClickPosition(Point)): (soft) this.canvas.textLayouts != null
    //#post(LineInfo getClickPosition(Point)): return_value == &new LineInfo(getClickPosition#1*)
    //#post(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*) num objects == 1
    //#post(LineInfo getClickPosition(Point)): new LineInfo(getClickPosition#1*).__Tag == com/dmdirc/addons/ui_swing/textpane/LineInfo
    //#post(LineInfo getClickPosition(Point)): init'ed(new LineInfo(getClickPosition#1*).index)
    //#post(LineInfo getClickPosition(Point)): init'ed(new LineInfo(getClickPosition#1*).line)
    //#post(LineInfo getClickPosition(Point)): init'ed(new LineInfo(getClickPosition#1*).part)
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.font.TextLayout:getCharacterCount
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.font.TextLayout:hitTestChar
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.font.TextHitInfo:getInsertionIndex
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.Rectangle:contains
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.Point:getX
    //#unanalyzed(LineInfo getClickPosition(Point)): Effects-of-calling:java.awt.Point:getY
    //#TextPane.java:204: end of method: LineInfo com.dmdirc.addons.ui_swing.textpane.TextPane.getClickPosition(Point)
    }

    /**
     * Returns the selected text.
     * 
     *    <li>0 = start line</li>
     *    <li>1 = start char</li>
     *    <li>2 = end line</li>
     *    <li>3 = end char</li>
     *
     * @return Selected text
     */
    public String getSelectedText() {
        final StringBuffer selectedText = new StringBuffer();
    //#TextPane.java:218: method: String com.dmdirc.addons.ui_swing.textpane.TextPane.getSelectedText()
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(String getSelectedText()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#input(String getSelectedText()): this
    //#input(String getSelectedText()): this.canvas
    //#input(String getSelectedText()): this.canvas.__Tag
    //#input(String getSelectedText()): this.canvas.selection
    //#input(String getSelectedText()): this.canvas.selection.__Tag
    //#input(String getSelectedText()): this.canvas.selection.endLine
    //#input(String getSelectedText()): this.canvas.selection.endPos
    //#input(String getSelectedText()): this.canvas.selection.startLine
    //#input(String getSelectedText()): this.canvas.selection.startPos
    //#input(String getSelectedText()): this.document
    //#input(String getSelectedText()): this.document.lines
    //#output(String getSelectedText()): java.lang.StringBuffer:toString(...)._tainted
    //#output(String getSelectedText()): return_value
    //#new obj(String getSelectedText()): java.lang.StringBuffer:toString(...)
    //#pre[5] (String getSelectedText()): this.canvas != null
    //#pre[6] (String getSelectedText()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[7] (String getSelectedText()): this.canvas.selection != null
    //#pre[8] (String getSelectedText()): this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[9] (String getSelectedText()): init'ed(this.canvas.selection.endLine)
    //#pre[13] (String getSelectedText()): init'ed(this.canvas.selection.endPos)
    //#pre[14] (String getSelectedText()): init'ed(this.canvas.selection.startLine)
    //#pre[15] (String getSelectedText()): init'ed(this.canvas.selection.startPos)
    //#pre[17] (String getSelectedText()): (soft) this.document != null
    //#pre[18] (String getSelectedText()): (soft) this.document.lines != null
    //#presumption(String getSelectedText()): com.dmdirc.ui.messages.Styliser:stipControlCodes(...)@107 != null
    //#presumption(String getSelectedText()): getLine(...).lineParts != null
    //#presumption(String getSelectedText()): getLine(...).lineParts.length <= 4_294_967_295
    //#presumption(String getSelectedText()): java.util.List:get(...)@89 != null
    //#presumption(String getSelectedText()): java.util.List:get(...)@89.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#post(String getSelectedText()): java.lang.StringBuffer:toString(...)._tainted == 0
    //#post(String getSelectedText()): return_value in Addr_Set{null,&java.lang.StringBuffer:toString(...),&java.lang.StringBuffer:toString(...)}
    //#unanalyzed(String getSelectedText()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getSelectedText()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getSelectedText()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String getSelectedText()): Effects-of-calling:com.dmdirc.ui.messages.Styliser:stipControlCodes
    //#unanalyzed(String getSelectedText()): Effects-of-calling:java.util.List:get
    //#unanalyzed(String getSelectedText()): Effects-of-calling:java.util.List:size
    //#test_vector(String getSelectedText()): java.lang.String:isEmpty(...)@235: {1}, {0}
        final LinePosition selectedRange = canvas.getSelectedRange();

        if (selectedRange.getStartLine() == -1) {
    //#TextPane.java:221: ?use of default init
    //#    init'ed(selectedRange.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(selectedRange.__Tag)
    //#    VN: selectedRange.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:221: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine: init'ed(this.startLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(selectedRange.startLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine()
    //#    callee assertion: init'ed(this.startLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 91
    //#    VN: selectedRange.startLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
            return null;
        }

        for (int i = selectedRange.getStartLine(); i <=
    //#TextPane.java:225: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine: init'ed(this.endLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: bb_4
    //#    assertion: init'ed(selectedRange.endLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine()
    //#    callee assertion: init'ed(this.endLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 73
    //#    VN: selectedRange.endLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
                selectedRange.getEndLine();
                i++) {
            if (i != selectedRange.getStartLine()) {
                selectedText.append('\n');
            }
            if (document.getNumLines() <= i) {
                return selectedText.toString();
            }
            final String line = document.getLine(i).getText();
            if (!line.isEmpty()) {
                if (selectedRange.getEndLine() == selectedRange.getStartLine()) {
                    //loop through range
                    if (selectedRange.getStartPos() != -1
    //#TextPane.java:238: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos: init'ed(this.startPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: bb_11
    //#    assertion: init'ed(selectedRange.startPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos()
    //#    callee assertion: init'ed(this.startPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 100
    //#    VN: selectedRange.startPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:238: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos: init'ed(this.endPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: bb_12
    //#    assertion: init'ed(selectedRange.endPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos()
    //#    callee assertion: init'ed(this.endPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 82
    //#    VN: selectedRange.endPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
                            && selectedRange.getEndPos() != -1) {
                        selectedText.append(line.substring(
                                selectedRange.getStartPos(),
                                selectedRange.getEndPos()));
                    }
                } else if (i == selectedRange.getStartLine()) {
                    //loop from start of range to the end
                    if (selectedRange.getStartPos() != -1) {
    //#TextPane.java:246: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos: init'ed(this.startPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: bb_15
    //#    assertion: init'ed(selectedRange.startPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos()
    //#    callee assertion: init'ed(this.startPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 100
    //#    VN: selectedRange.startPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
                        selectedText.append(line.substring(
                                selectedRange.getStartPos(), line.length()));
                    }
                } else if (i == selectedRange.getEndLine()) {
                    //loop from start to end of range
                    if (selectedRange.getEndPos() != -1) {
    //#TextPane.java:252: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos: init'ed(this.endPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: String getSelectedText()
    //#    basic block: bb_18
    //#    assertion: init'ed(selectedRange.endPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos()
    //#    callee assertion: init'ed(this.endPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 82
    //#    VN: selectedRange.endPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
                        selectedText.append(line.substring(0, selectedRange.
                                getEndPos()));
                    }
                } else {
                    //loop the whole line
                    selectedText.append(line);
                }
            }
        }

        return selectedText.toString();
    //#TextPane.java:263: end of method: String com.dmdirc.addons.ui_swing.textpane.TextPane.getSelectedText()
    }

    /**
     * Returns the selected range.
     *
     * @return selected range
     */
    public LinePosition getSelectedRange() {
        return canvas.getSelectedRange();
    //#TextPane.java:272: method: LinePosition com.dmdirc.addons.ui_swing.textpane.TextPane.getSelectedRange()
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(LinePosition getSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#input(LinePosition getSelectedRange()): this
    //#input(LinePosition getSelectedRange()): this.canvas
    //#input(LinePosition getSelectedRange()): this.canvas.__Tag
    //#input(LinePosition getSelectedRange()): this.canvas.selection
    //#input(LinePosition getSelectedRange()): this.canvas.selection.__Tag
    //#input(LinePosition getSelectedRange()): this.canvas.selection.endLine
    //#input(LinePosition getSelectedRange()): this.canvas.selection.endPos
    //#input(LinePosition getSelectedRange()): this.canvas.selection.startLine
    //#input(LinePosition getSelectedRange()): this.canvas.selection.startPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*) num objects
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).__Tag
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).endLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).endPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).startLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).startPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*) num objects
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).__Tag
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).endLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).endPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).startLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).startPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*) num objects
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).__Tag
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).endLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).endPos
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).startLine
    //#output(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).startPos
    //#output(LinePosition getSelectedRange()): return_value
    //#new obj(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*)
    //#new obj(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*)
    //#new obj(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*)
    //#pre[5] (LinePosition getSelectedRange()): this.canvas != null
    //#pre[6] (LinePosition getSelectedRange()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[7] (LinePosition getSelectedRange()): this.canvas.selection != null
    //#pre[8] (LinePosition getSelectedRange()): this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[9] (LinePosition getSelectedRange()): init'ed(this.canvas.selection.endLine)
    //#pre[13] (LinePosition getSelectedRange()): init'ed(this.canvas.selection.endPos)
    //#pre[14] (LinePosition getSelectedRange()): init'ed(this.canvas.selection.startLine)
    //#pre[15] (LinePosition getSelectedRange()): init'ed(this.canvas.selection.startPos)
    //#post(LinePosition getSelectedRange()): return_value == One-of{&new LinePosition(getSelectedRange#1*), &new LinePosition(getSelectedRange#2*), &new LinePosition(getSelectedRange#3*)}
    //#post(LinePosition getSelectedRange()): return_value in Addr_Set{&new LinePosition(getSelectedRange#1*),&new LinePosition(getSelectedRange#2*),&new LinePosition(getSelectedRange#3*)}
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*) num objects <= 1
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).endLine == this.canvas.selection.startLine
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).endLine >= -2_147_483_647
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).endPos == this.canvas.selection.startPos
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#1*).endPos)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).startLine == this.canvas.selection.endLine
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).startLine <= 4_294_967_294
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#1*).startPos == this.canvas.selection.endPos
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#1*).startPos)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*) num objects <= 1
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).endLine == this.canvas.selection.endLine
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#2*).endLine)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).endPos == this.canvas.selection.startPos
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).endPos >= -2_147_483_647
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).startLine == this.canvas.selection.startLine
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#2*).startLine)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).startPos == this.canvas.selection.endPos
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#2*).startPos <= 4_294_967_294
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*) num objects <= 1
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).endLine == this.canvas.selection.endLine
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#3*).endLine)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).endPos == this.canvas.selection.endPos
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#3*).endPos)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).startLine == this.canvas.selection.startLine
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#3*).startLine)
    //#post(LinePosition getSelectedRange()): new LinePosition(getSelectedRange#3*).startPos == this.canvas.selection.startPos
    //#post(LinePosition getSelectedRange()): init'ed(new LinePosition(getSelectedRange#3*).startPos)
    //#TextPane.java:272: end of method: LinePosition com.dmdirc.addons.ui_swing.textpane.TextPane.getSelectedRange()
    }

    /**
     * Returns whether there is a selected range.
     * 
     * @return true iif there is a selected range
     */
    public boolean hasSelectedRange() {
        final LinePosition selectedRange = canvas.getSelectedRange();
    //#TextPane.java:281: method: bool com.dmdirc.addons.ui_swing.textpane.TextPane.hasSelectedRange()
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(bool hasSelectedRange()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#input(bool hasSelectedRange()): this
    //#input(bool hasSelectedRange()): this.canvas
    //#input(bool hasSelectedRange()): this.canvas.__Tag
    //#input(bool hasSelectedRange()): this.canvas.selection
    //#input(bool hasSelectedRange()): this.canvas.selection.__Tag
    //#input(bool hasSelectedRange()): this.canvas.selection.endLine
    //#input(bool hasSelectedRange()): this.canvas.selection.endPos
    //#input(bool hasSelectedRange()): this.canvas.selection.startLine
    //#input(bool hasSelectedRange()): this.canvas.selection.startPos
    //#output(bool hasSelectedRange()): return_value
    //#pre[5] (bool hasSelectedRange()): this.canvas != null
    //#pre[6] (bool hasSelectedRange()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[7] (bool hasSelectedRange()): this.canvas.selection != null
    //#pre[8] (bool hasSelectedRange()): this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[9] (bool hasSelectedRange()): init'ed(this.canvas.selection.endLine)
    //#pre[13] (bool hasSelectedRange()): init'ed(this.canvas.selection.endPos)
    //#pre[14] (bool hasSelectedRange()): init'ed(this.canvas.selection.startLine)
    //#pre[15] (bool hasSelectedRange()): init'ed(this.canvas.selection.startPos)
    //#post(bool hasSelectedRange()): init'ed(return_value)
        return !(selectedRange.getStartLine() == selectedRange.getEndLine() &&
    //#TextPane.java:282: ?use of default init
    //#    init'ed(selectedRange.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: bool hasSelectedRange()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(selectedRange.__Tag)
    //#    VN: selectedRange.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:282: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine: init'ed(this.startLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: bool hasSelectedRange()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(selectedRange.startLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine()
    //#    callee assertion: init'ed(this.startLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 91
    //#    VN: selectedRange.startLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:282: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine: init'ed(this.endLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: bool hasSelectedRange()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(selectedRange.endLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine()
    //#    callee assertion: init'ed(this.endLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 73
    //#    VN: selectedRange.endLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:282: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos: init'ed(this.startPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: bool hasSelectedRange()
    //#    basic block: bb_2
    //#    assertion: init'ed(selectedRange.startPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartPos()
    //#    callee assertion: init'ed(this.startPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 100
    //#    VN: selectedRange.startPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:282: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos: init'ed(this.endPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: bool hasSelectedRange()
    //#    basic block: bb_2
    //#    assertion: init'ed(selectedRange.endPos)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndPos()
    //#    callee assertion: init'ed(this.endPos)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 82
    //#    VN: selectedRange.endPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:282: end of method: bool com.dmdirc.addons.ui_swing.textpane.TextPane.hasSelectedRange()
                selectedRange.getStartPos() == selectedRange.getEndPos());
    }

    /**
     * Selects the specified region of text.
     *
     * @param position Line position
     */
    public void setSelectedTexT(final LinePosition position) {
        canvas.setSelectedRange(position);
    //#TextPane.java:292: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setSelectedTexT(LinePosition)
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void setSelectedTexT(LinePosition)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setSelectedRange(Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;)V
    //#input(void setSelectedTexT(LinePosition)): position
    //#input(void setSelectedTexT(LinePosition)): position.__Tag
    //#input(void setSelectedTexT(LinePosition)): position.endLine
    //#input(void setSelectedTexT(LinePosition)): position.endPos
    //#input(void setSelectedTexT(LinePosition)): position.startLine
    //#input(void setSelectedTexT(LinePosition)): position.startPos
    //#input(void setSelectedTexT(LinePosition)): this
    //#input(void setSelectedTexT(LinePosition)): this.canvas
    //#input(void setSelectedTexT(LinePosition)): this.canvas.__Tag
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1) num objects
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).__Tag
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).endLine
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).endPos
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).startLine
    //#output(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).startPos
    //#output(void setSelectedTexT(LinePosition)): this.canvas.selection
    //#new obj(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1)
    //#pre[1] (void setSelectedTexT(LinePosition)): position != null
    //#pre[2] (void setSelectedTexT(LinePosition)): position.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[3] (void setSelectedTexT(LinePosition)): init'ed(position.endLine)
    //#pre[4] (void setSelectedTexT(LinePosition)): init'ed(position.endPos)
    //#pre[5] (void setSelectedTexT(LinePosition)): init'ed(position.startLine)
    //#pre[6] (void setSelectedTexT(LinePosition)): init'ed(position.startPos)
    //#pre[8] (void setSelectedTexT(LinePosition)): this.canvas != null
    //#pre[9] (void setSelectedTexT(LinePosition)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#post(void setSelectedTexT(LinePosition)): this.canvas.selection == &new LinePosition(setSelectedRange#1)
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1) num objects == 1
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).endLine == position.endLine
    //#post(void setSelectedTexT(LinePosition)): init'ed(new LinePosition(setSelectedRange#1).endLine)
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).endPos == position.endPos
    //#post(void setSelectedTexT(LinePosition)): init'ed(new LinePosition(setSelectedRange#1).endPos)
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).startLine == position.startLine
    //#post(void setSelectedTexT(LinePosition)): init'ed(new LinePosition(setSelectedRange#1).startLine)
    //#post(void setSelectedTexT(LinePosition)): new LinePosition(setSelectedRange#1).startPos == position.startPos
    //#post(void setSelectedTexT(LinePosition)): init'ed(new LinePosition(setSelectedRange#1).startPos)
    //#unanalyzed(void setSelectedTexT(LinePosition)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void setSelectedTexT(LinePosition)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:isVisible
    }
    //#TextPane.java:293: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.setSelectedTexT(LinePosition)

    /**
     * Returns the type of text this click represents.
     * 
     * @param lineInfo Line info of click.
     * 
     * @return Click type for specified position
     */
    public ClickType getClickType(final LineInfo lineInfo) {
        return canvas.getClickType(lineInfo);
    //#TextPane.java:303: method: ClickType com.dmdirc.addons.ui_swing.textpane.TextPane.getClickType(LineInfo)
    //#input(ClickType getClickType(LineInfo)): "."._tainted
    //#input(ClickType getClickType(LineInfo)): "Config option not found: "._tainted
    //#input(ClickType getClickType(LineInfo)): "Unable to insert styled string: "._tainted
    //#input(ClickType getClickType(LineInfo)): "textPaneFontName"._tainted
    //#input(ClickType getClickType(LineInfo)): "ui"._tainted
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/ClickType.CHANNEL
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/ClickType.HYPERLINK
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/ClickType.NICKNAME
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/ClickType.NORMAL
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getStyled()Ljava/text/AttributedString;
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.BACKGROUND
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FAMILY
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FOREGROUND
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE_OBLIQUE
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.SIZE
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE_ON
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT_BOLD
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$CharacterConstants.Underline
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Background
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Foreground
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Bold
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Family
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Italic
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getClickType(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Lcom/dmdirc/addons/ui_swing/textpane/ClickType;
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigManager.stats
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/ConfigSource.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(ClickType getClickType(LineInfo)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(ClickType getClickType(LineInfo)): lineInfo
    //#input(ClickType getClickType(LineInfo)): lineInfo.index
    //#input(ClickType getClickType(LineInfo)): lineInfo.line
    //#input(ClickType getClickType(LineInfo)): this
    //#input(ClickType getClickType(LineInfo)): this.canvas
    //#input(ClickType getClickType(LineInfo)): this.canvas.__Tag
    //#input(ClickType getClickType(LineInfo)): this.canvas.document
    //#input(ClickType getClickType(LineInfo)): this.canvas.document.cachedLines
    //#input(ClickType getClickType(LineInfo)): this.canvas.document.cachedStrings
    //#input(ClickType getClickType(LineInfo)): this.canvas.document.lines
    //#output(ClickType getClickType(LineInfo)): return_value
    //#pre[1] (ClickType getClickType(LineInfo)): lineInfo != null
    //#pre[3] (ClickType getClickType(LineInfo)): init'ed(lineInfo.line)
    //#pre[5] (ClickType getClickType(LineInfo)): this.canvas != null
    //#pre[6] (ClickType getClickType(LineInfo)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[2] (ClickType getClickType(LineInfo)): (soft) init'ed(lineInfo.index)
    //#pre[7] (ClickType getClickType(LineInfo)): (soft) this.canvas.document != null
    //#pre[8] (ClickType getClickType(LineInfo)): (soft) this.canvas.document.cachedLines != null
    //#pre[9] (ClickType getClickType(LineInfo)): (soft) this.canvas.document.cachedStrings != null
    //#pre[10] (ClickType getClickType(LineInfo)): (soft) this.canvas.document.lines != null
    //#post(ClickType getClickType(LineInfo)): return_value == One-of{&com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#1), &com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#2), &com.dmdirc.addons.ui_swing.textpane.ClickType_...
    //#post(ClickType getClickType(LineInfo)): return_value in Addr_Set{&com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#1),&com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#2),&com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#3),&com.dmdirc.addons.ui_swing.textpane.ClickType__static_init.new ClickType(ClickType__static_init#4)}
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:getStyledLine
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:setIndex
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:getAttributes
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:getBeginIndex
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:getEndIndex
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.List:get
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.awt.Font:getSize
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:contains
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.List:indexOf
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:get
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:getStyledString
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.StyledDocument:getParagraphElement
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getDocument
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Document:getLength
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Document:getText
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedString
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.BadLocationException:getMessage
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:hasOption
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:getOption
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.awt.Font:getName
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedString:getIterator
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.awt.Font
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.text.AttributedString:addAttribute
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.awt.Font:getFamily
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getElementCount
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getElement
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getAttributes
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.AttributeSet:getAttributeNames
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Enumeration:hasMoreElements
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:java.util.Enumeration:nextElement
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.AttributeSet:getAttribute
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getStartOffset
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:javax.swing.text.Element:getEndOffset
    //#unanalyzed(ClickType getClickType(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#TextPane.java:303: end of method: ClickType com.dmdirc.addons.ui_swing.textpane.TextPane.getClickType(LineInfo)
    }

    /**
     * Returns the surrouding word at the specified position.
     * 
     * @param lineNumber Line number to get word from
     * @param index Position to get surrounding word
     * 
     * @return Surrounding word
     */
    public String getWordAtIndex(final int lineNumber, final int index) {
        if (lineNumber == -1) {
    //#TextPane.java:315: method: String com.dmdirc.addons.ui_swing.textpane.TextPane.getWordAtIndex(int, int)
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(String getWordAtIndex(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getSurroundingWordIndexes(Ljava/lang/String;I)[I
    //#input(String getWordAtIndex(int, int)): index
    //#input(String getWordAtIndex(int, int)): lineNumber
    //#input(String getWordAtIndex(int, int)): this
    //#input(String getWordAtIndex(int, int)): this.canvas
    //#input(String getWordAtIndex(int, int)): this.canvas.__Tag
    //#input(String getWordAtIndex(int, int)): this.document
    //#input(String getWordAtIndex(int, int)): this.document.lines
    //#output(String getWordAtIndex(int, int)): java.lang.String:substring(...)._tainted
    //#output(String getWordAtIndex(int, int)): return_value
    //#new obj(String getWordAtIndex(int, int)): java.lang.String:substring(...)
    //#pre[4] (String getWordAtIndex(int, int)): (soft) this.canvas != null
    //#pre[5] (String getWordAtIndex(int, int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (String getWordAtIndex(int, int)): (soft) this.document != null
    //#pre[7] (String getWordAtIndex(int, int)): (soft) this.document.lines != null
    //#presumption(String getWordAtIndex(int, int)): com.dmdirc.ui.messages.Styliser:stipControlCodes(...)@107 != null
    //#presumption(String getWordAtIndex(int, int)): com.dmdirc.ui.messages.Styliser:stipControlCodes(...)@107 != null
    //#presumption(String getWordAtIndex(int, int)): getLine(...).lineParts != null
    //#presumption(String getWordAtIndex(int, int)): getLine(...).lineParts != null
    //#presumption(String getWordAtIndex(int, int)): getLine(...).lineParts.length <= 4_294_967_295
    //#presumption(String getWordAtIndex(int, int)): getLine(...).lineParts.length <= 4_294_967_295
    //#presumption(String getWordAtIndex(int, int)): getLine(...)@318 init'ed
    //#presumption(String getWordAtIndex(int, int)): indexes.length@318 >= 2
    //#presumption(String getWordAtIndex(int, int)): java.util.List:get(...)@89 != null
    //#presumption(String getWordAtIndex(int, int)): java.util.List:get(...)@89 != null
    //#presumption(String getWordAtIndex(int, int)): java.util.List:get(...)@89.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#presumption(String getWordAtIndex(int, int)): java.util.List:get(...)@89.__Tag == com/dmdirc/addons/ui_swing/textpane/Line
    //#post(String getWordAtIndex(int, int)): java.lang.String:substring(...)._tainted == 0
    //#post(String getWordAtIndex(int, int)): return_value in Addr_Set{&java.lang.String:substring(...),&""}
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:stipControlCodes
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(String getWordAtIndex(int, int)): Effects-of-calling:java.util.List:get
    //#test_vector(String getWordAtIndex(int, int)): lineNumber: {-2_147_483_648..-2, 0..4_294_967_295}, {-1}
            return "";
        }
        final int[] indexes =
                canvas.getSurroundingWordIndexes(document.getLine(lineNumber).
                getText(),
                index);
        return document.getLine(lineNumber).getText().substring(indexes[0],
    //#TextPane.java:322: end of method: String com.dmdirc.addons.ui_swing.textpane.TextPane.getWordAtIndex(int, int)
                indexes[1]);
    }

    /**
     * Returns the atrriute value for the specified location.
     * 
     * @param lineInfo Specified location
     * 
     * @return Specified value
     */
    public Object getAttributeValueAtPoint(LineInfo lineInfo) {
        return canvas.getAttributeValueAtPoint(lineInfo);
    //#TextPane.java:334: method: Object com.dmdirc.addons.ui_swing.textpane.TextPane.getAttributeValueAtPoint(LineInfo)
    //#input(Object getAttributeValueAtPoint(LineInfo)): "."._tainted
    //#input(Object getAttributeValueAtPoint(LineInfo)): "Config option not found: "._tainted
    //#input(Object getAttributeValueAtPoint(LineInfo)): "Unable to insert styled string: "._tainted
    //#input(Object getAttributeValueAtPoint(LineInfo)): "textPaneFontName"._tainted
    //#input(Object getAttributeValueAtPoint(LineInfo)): "ui"._tainted
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getStyled()Ljava/text/AttributedString;
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.BACKGROUND
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FAMILY
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.FOREGROUND
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.POSTURE_OBLIQUE
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.SIZE
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.UNDERLINE_ON
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.java.awt.font.TextAttribute.WEIGHT_BOLD
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$CharacterConstants.Underline
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Background
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$ColorConstants.Foreground
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Bold
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Family
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/Line.javax.swing.text.StyleConstants$FontConstants.Italic
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getAttributeValueAtPoint(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Ljava/lang/Object;
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.CHANNEL
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.HYPERLINK
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.com.dmdirc.ui.messages.IRCTextAttribute.NICKNAME
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOptionString(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigManager.stats
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/ConfigSource]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Descendant_Table[others]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/ConfigSource.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(Object getAttributeValueAtPoint(LineInfo)): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(Object getAttributeValueAtPoint(LineInfo)): lineInfo
    //#input(Object getAttributeValueAtPoint(LineInfo)): lineInfo.index
    //#input(Object getAttributeValueAtPoint(LineInfo)): lineInfo.line
    //#input(Object getAttributeValueAtPoint(LineInfo)): this
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas.__Tag
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas.document
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas.document.cachedLines
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas.document.cachedStrings
    //#input(Object getAttributeValueAtPoint(LineInfo)): this.canvas.document.lines
    //#output(Object getAttributeValueAtPoint(LineInfo)): return_value
    //#pre[1] (Object getAttributeValueAtPoint(LineInfo)): lineInfo != null
    //#pre[3] (Object getAttributeValueAtPoint(LineInfo)): init'ed(lineInfo.line)
    //#pre[5] (Object getAttributeValueAtPoint(LineInfo)): this.canvas != null
    //#pre[6] (Object getAttributeValueAtPoint(LineInfo)): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[2] (Object getAttributeValueAtPoint(LineInfo)): (soft) init'ed(lineInfo.index)
    //#pre[7] (Object getAttributeValueAtPoint(LineInfo)): (soft) this.canvas.document != null
    //#pre[8] (Object getAttributeValueAtPoint(LineInfo)): (soft) this.canvas.document.cachedLines != null
    //#pre[9] (Object getAttributeValueAtPoint(LineInfo)): (soft) this.canvas.document.cachedStrings != null
    //#pre[10] (Object getAttributeValueAtPoint(LineInfo)): (soft) this.canvas.document.lines != null
    //#post(Object getAttributeValueAtPoint(LineInfo)): init'ed(return_value)
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:getStyledLine
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:setIndex
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:getAttributes
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.List:get
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.UIManager:getFont
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.awt.Font:getSize
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:contains
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:getList
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.List:indexOf
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:get
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:getStyledString
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.StyledDocument:getParagraphElement
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getDocument
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Document:getLength
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Document:getText
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedString
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.BadLocationException:getMessage
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:hasOption
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:getOption
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.awt.Font:getName
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedString:getIterator
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedCharacterIterator:getEndIndex
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.awt.Font
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.text.AttributedString:addAttribute
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.awt.Font:getFamily
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getElementCount
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getElement
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getAttributes
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.AttributeSet:getAttributeNames
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Enumeration:hasMoreElements
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:java.util.Enumeration:nextElement
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.AttributeSet:getAttribute
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getStartOffset
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:javax.swing.text.Element:getEndOffset
    //#unanalyzed(Object getAttributeValueAtPoint(LineInfo)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#TextPane.java:334: end of method: Object com.dmdirc.addons.ui_swing.textpane.TextPane.getAttributeValueAtPoint(LineInfo)
    }

    /** Adds the selected text to the clipboard. */
    public void copy() {
        if (getSelectedText() != null && !getSelectedText().isEmpty()) {
    //#TextPane.java:339: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.copy()
    //#TextPane.java:339: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.StringBuffer:toString(...)._tainted, java.lang.StringBuffer:toString(...)._tainted) in getSelectedText
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void copy()
    //#TextPane.java:339: ?null dereference
    //#    getSelectedText(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void copy()
    //#    basic block: bb_2
    //#    assertion: getSelectedText(...) != null
    //#    VN: getSelectedText(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/Line]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/Line.__Descendant_Table[others]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/Line.__Dispatch_Table.getText()Ljava/lang/String;
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void copy()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#input(void copy()): this
    //#input(void copy()): this.canvas
    //#input(void copy()): this.canvas.__Tag
    //#input(void copy()): this.canvas.selection
    //#input(void copy()): this.canvas.selection.__Tag
    //#input(void copy()): this.canvas.selection.endLine
    //#input(void copy()): this.canvas.selection.endPos
    //#input(void copy()): this.canvas.selection.startLine
    //#input(void copy()): this.canvas.selection.startPos
    //#input(void copy()): this.document
    //#input(void copy()): this.document.lines
    //#pre[2] (void copy()): this.canvas != null
    //#pre[3] (void copy()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[4] (void copy()): this.canvas.selection != null
    //#pre[5] (void copy()): this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[6] (void copy()): init'ed(this.canvas.selection.endLine)
    //#pre[7] (void copy()): init'ed(this.canvas.selection.endPos)
    //#pre[8] (void copy()): init'ed(this.canvas.selection.startLine)
    //#pre[9] (void copy()): init'ed(this.canvas.selection.startPos)
    //#pre[10] (void copy()): (soft) this.document != null
    //#pre[11] (void copy()): (soft) this.document.lines != null
    //#presumption(void copy()): java.awt.Toolkit:getDefaultToolkit(...)@340 != null
    //#presumption(void copy()): java.awt.Toolkit:getSystemClipboard(...)@340 != null
    //#unanalyzed(void copy()): Effects-of-calling:getLine
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void copy()): Effects-of-calling:com.dmdirc.ui.messages.Styliser:stipControlCodes
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void copy()): Effects-of-calling:getNumLines
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void copy()): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void copy()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void copy()): Effects-of-calling:java.util.List:size
    //#test_vector(void copy()): java.lang.String:isEmpty(...)@339: {1}, {0}
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
    //#TextPane.java:340: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.StringBuffer:toString(...)._tainted, java.lang.StringBuffer:toString(...)._tainted) in getSelectedText
    //#    severity: LOW
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void copy()
                    new StringSelection(getSelectedText()), null);
        }
    }
    //#TextPane.java:343: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.copy()

    /** Clears the textpane. */
    public void clear() {
        document.clear();
    //#TextPane.java:347: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.clear()
    //#input(void clear()): __Dispatch_Table.cleared()V
    //#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/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()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void clear()): this
    //#input(void clear()): this.canvas
    //#input(void clear()): this.canvas.__Tag
    //#input(void clear()): this.canvas.scrollBarPosition
    //#input(void clear()): this.canvas.textPane
    //#input(void clear()): this.document
    //#input(void clear()): this.document.lines
    //#input(void clear()): this.document.listeners
    //#input(void clear()): this.scrollBar
    //#output(void clear()): this.canvas.scrollBarPosition
    //#pre[1] (void clear()): init'ed(this.canvas.scrollBarPosition)
    //#pre[3] (void clear()): this.canvas != null
    //#pre[4] (void clear()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void clear()): this.document != null
    //#pre[7] (void clear()): this.document.lines != null
    //#pre[9] (void clear()): this.document.listeners != null
    //#pre[10] (void clear()): this.scrollBar != null
    //#pre[5] (void clear()): (soft) this.canvas.textPane != null
    //#post(void clear()): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void clear()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void clear()): Effects-of-calling:getNumLines
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void clear()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void clear()): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:clear
    //#unanalyzed(void clear()): Effects-of-calling:fireCleared
    //#unanalyzed(void clear()): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void clear()): Effects-of-calling:cleared
        setScrollBarPosition(0);
        setScrollBarMax(1);
        canvas.repaint();
    //#TextPane.java:350: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void clear()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
    }
    //#TextPane.java:351: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.clear()

    /** Clears the selection. */
    public void clearSelection() {
        canvas.clearSelection();
    //#TextPane.java:355: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.clearSelection()
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setEndLine(I)V
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setEndPos(I)V
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void clearSelection()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearSelection()V
    //#input(void clearSelection()): this
    //#input(void clearSelection()): this.canvas
    //#input(void clearSelection()): this.canvas.__Tag
    //#input(void clearSelection()): this.canvas.selection
    //#input(void clearSelection()): this.canvas.selection.__Tag
    //#input(void clearSelection()): this.canvas.selection.startLine
    //#input(void clearSelection()): this.canvas.selection.startPos
    //#output(void clearSelection()): this.canvas.selection.endLine
    //#output(void clearSelection()): this.canvas.selection.endPos
    //#pre[2] (void clearSelection()): this.canvas != null
    //#pre[3] (void clearSelection()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[4] (void clearSelection()): this.canvas.selection != null
    //#pre[5] (void clearSelection()): this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[6] (void clearSelection()): init'ed(this.canvas.selection.startLine)
    //#pre[7] (void clearSelection()): init'ed(this.canvas.selection.startPos)
    //#post(void clearSelection()): this.canvas.selection.endLine == this.canvas.selection.startLine
    //#post(void clearSelection()): init'ed(this.canvas.selection.endLine)
    //#post(void clearSelection()): this.canvas.selection.endPos == this.canvas.selection.startPos
    //#post(void clearSelection()): init'ed(this.canvas.selection.endPos)
    //#unanalyzed(void clearSelection()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void clearSelection()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:isVisible
    }
    //#TextPane.java:356: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.clearSelection()

    /**
     * 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) {
        if (document.getNumLines() < numLines) {
    //#TextPane.java:364: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.trim(int)
    //#input(void trim(int)): __Dispatch_Table.trimmed(I)V
    //#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/LinePosition.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/LinePosition]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Descendant_Table[others]
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndLine()I
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getEndPos()I
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartLine()I
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.getStartPos()I
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setEndLine(I)V
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/LinePosition.__Dispatch_Table.setStartLine(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.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void trim(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setSelectedRange(Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;)V
    //#input(void trim(int)): numLines
    //#input(void trim(int)): this
    //#input(void trim(int)): this.canvas
    //#input(void trim(int)): this.canvas.__Tag
    //#input(void trim(int)): this.canvas.selection
    //#input(void trim(int)): this.canvas.selection.__Tag
    //#input(void trim(int)): this.canvas.selection.endLine
    //#input(void trim(int)): this.canvas.selection.endPos
    //#input(void trim(int)): this.canvas.selection.startLine
    //#input(void trim(int)): this.canvas.selection.startPos
    //#input(void trim(int)): this.document
    //#input(void trim(int)): this.document.lines
    //#input(void trim(int)): this.document.listeners
    //#output(void trim(int)): new LinePosition(setSelectedRange#1) num objects
    //#output(void trim(int)): new LinePosition(setSelectedRange#1).__Tag
    //#output(void trim(int)): new LinePosition(setSelectedRange#1).endLine
    //#output(void trim(int)): new LinePosition(setSelectedRange#1).endPos
    //#output(void trim(int)): new LinePosition(setSelectedRange#1).startLine
    //#output(void trim(int)): new LinePosition(setSelectedRange#1).startPos
    //#output(void trim(int)): this.canvas.selection
    //#new obj(void trim(int)): new LinePosition(setSelectedRange#1)
    //#pre[16] (void trim(int)): this.document != null
    //#pre[17] (void trim(int)): this.document.lines != null
    //#pre[3] (void trim(int)): (soft) this.canvas.selection != null
    //#pre[5] (void trim(int)): (soft) this.canvas != null
    //#pre[6] (void trim(int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[7] (void trim(int)): (soft) this.canvas.selection.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#pre[8] (void trim(int)): (soft) init'ed(this.canvas.selection.endLine)
    //#pre[12] (void trim(int)): (soft) init'ed(this.canvas.selection.endPos)
    //#pre[13] (void trim(int)): (soft) init'ed(this.canvas.selection.startLine)
    //#pre[14] (void trim(int)): (soft) init'ed(this.canvas.selection.startPos)
    //#pre[19] (void trim(int)): (soft) this.document.listeners != null
    //#presumption(void trim(int)): selectedRange.endLine - (java.util.List:size(...)@78 - numLines) in {-2_147_483_648..4_294_967_295}
    //#presumption(void trim(int)): selectedRange.startLine - (java.util.List:size(...)@78 - numLines) in {-2_147_483_648..4_294_967_295}
    //#presumption(void trim(int)): java.util.List:size(...)@78 - numLines in {-2_147_483_648..4_294_967_295}
    //#post(void trim(int)): this.canvas.selection == One-of{old this.canvas.selection, &new LinePosition(setSelectedRange#1)}
    //#post(void trim(int)): this.canvas.selection != null
    //#post(void trim(int)): new LinePosition(setSelectedRange#1) num objects <= 1
    //#post(void trim(int)): new LinePosition(setSelectedRange#1).__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#post(void trim(int)): new LinePosition(setSelectedRange#1).endLine >= 0
    //#post(void trim(int)): init'ed(new LinePosition(setSelectedRange#1).endPos)
    //#post(void trim(int)): new LinePosition(setSelectedRange#1).startLine >= 0
    //#post(void trim(int)): init'ed(new LinePosition(setSelectedRange#1).startPos)
    //#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:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:isVisible
    //#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:java.util.List:size
    //#unanalyzed(void trim(int)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void trim(int)): Effects-of-calling:javax.swing.event.EventListenerList:getListenerList
    //#unanalyzed(void trim(int)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void trim(int)): Effects-of-calling:fireTrimmed
    //#unanalyzed(void trim(int)): Effects-of-calling:trimmed
            return;
        }
        final int trimmedLines = document.getNumLines() - numLines;
        final LinePosition selectedRange = getSelectedRange();

        selectedRange.setStartLine(selectedRange.getStartLine() - trimmedLines);
    //#TextPane.java:370: ?use of default init
    //#    init'ed(selectedRange.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_3
    //#    assertion: init'ed(selectedRange.__Tag)
    //#    VN: selectedRange.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:370: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine: init'ed(this.startLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_3
    //#    assertion: init'ed(selectedRange.startLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getStartLine()
    //#    callee assertion: init'ed(this.startLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 91
    //#    VN: selectedRange.startLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
        selectedRange.setEndLine(selectedRange.getEndLine() - trimmedLines);
    //#TextPane.java:371: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine: init'ed(this.endLine)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_3
    //#    assertion: init'ed(selectedRange.endLine)
    //#    callee: int com/dmdirc/addons/ui_swing/textpane/LinePosition.getEndLine()
    //#    callee assertion: init'ed(this.endLine)
    //#    callee file: LinePosition.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 73
    //#    VN: selectedRange.endLine
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid

        if (selectedRange.getStartLine() < 0) {
            selectedRange.setStartLine(0);
        }
        if (selectedRange.getEndLine() < 0) {
            selectedRange.setEndLine(0);
        }

        setSelectedTexT(selectedRange);
    //#TextPane.java:380: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT: position.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_7
    //#    assertion: selectedRange.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#    callee: void com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT(LinePosition)
    //#    callee assertion: position.__Tag == com/dmdirc/addons/ui_swing/textpane/LinePosition
    //#    callee file: TextPane.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 292
    //#    VN: selectedRange.__Tag
    //#    Expected: {412_416}
    //#    Bad: {0}
    //#    Attribs:  Int  Exp singleton  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#TextPane.java:380: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT: init'ed(position.endPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_7
    //#    assertion: init'ed(selectedRange.endPos)
    //#    callee: void com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT(LinePosition)
    //#    callee assertion: init'ed(position.endPos)
    //#    callee file: TextPane.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 292
    //#    VN: selectedRange.endPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#TextPane.java:380: ?precondition failure
    //#    com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT: init'ed(position.startPos)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void trim(int)
    //#    basic block: bb_7
    //#    assertion: init'ed(selectedRange.startPos)
    //#    callee: void com/dmdirc/addons/ui_swing/textpane/TextPane.setSelectedTexT(LinePosition)
    //#    callee assertion: init'ed(position.startPos)
    //#    callee file: TextPane.java
    //#    callee precondition index: [6]
    //#    callee srcpos: 292
    //#    VN: selectedRange.startPos
    //#    Expected: {-2_147_483_648..4_294_967_295}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
        document.trim(numLines);
    }
    //#TextPane.java:382: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.trim(int)

    /** Scrolls one page up in the textpane. */
    public void pageDown() {
        //setScrollBarPosition(scrollBar.getValue() + canvas.getLastVisibleLine() 
        // - canvas.getFirstVisibleLine() + 1);
        //use this method for now, its consistent with the block unit for the scrollbar
        setScrollBarPosition(scrollBar.getValue() + 10);
    //#TextPane.java:389: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.pageDown()
    //#input(void pageDown()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void pageDown()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void pageDown()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void pageDown()): this
    //#input(void pageDown()): this.canvas
    //#input(void pageDown()): this.canvas.__Tag
    //#input(void pageDown()): this.canvas.scrollBarPosition
    //#input(void pageDown()): this.canvas.textPane
    //#input(void pageDown()): this.scrollBar
    //#output(void pageDown()): this.canvas.scrollBarPosition
    //#pre[1] (void pageDown()): init'ed(this.canvas.scrollBarPosition)
    //#pre[3] (void pageDown()): this.canvas != null
    //#pre[4] (void pageDown()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void pageDown()): this.scrollBar != null
    //#pre[5] (void pageDown()): (soft) this.canvas.textPane != null
    //#presumption(void pageDown()): javax.swing.JScrollBar:getValue(...)@389 <= 4_294_967_285
    //#post(void pageDown()): this.canvas.scrollBarPosition >= -2_147_483_638
    //#unanalyzed(void pageDown()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void pageDown()): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void pageDown()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    }
    //#TextPane.java:390: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.pageDown()

    /** Scrolls one page down in the textpane. */
    public void pageUp() {
        //setScrollBarPosition(canvas.getFirstVisibleLine());
        //use this method for now, its consistent with the block unit for the scrollbar
        setScrollBarPosition(scrollBar.getValue() - 10);
    //#TextPane.java:396: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.pageUp()
    //#input(void pageUp()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void pageUp()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void pageUp()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void pageUp()): this
    //#input(void pageUp()): this.canvas
    //#input(void pageUp()): this.canvas.__Tag
    //#input(void pageUp()): this.canvas.scrollBarPosition
    //#input(void pageUp()): this.canvas.textPane
    //#input(void pageUp()): this.scrollBar
    //#output(void pageUp()): this.canvas.scrollBarPosition
    //#pre[1] (void pageUp()): init'ed(this.canvas.scrollBarPosition)
    //#pre[3] (void pageUp()): this.canvas != null
    //#pre[4] (void pageUp()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void pageUp()): this.scrollBar != null
    //#pre[5] (void pageUp()): (soft) this.canvas.textPane != null
    //#presumption(void pageUp()): javax.swing.JScrollBar:getValue(...)@396 >= -2_147_483_638
    //#post(void pageUp()): this.canvas.scrollBarPosition <= 4_294_967_285
    //#unanalyzed(void pageUp()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void pageUp()): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void pageUp()): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    }
    //#TextPane.java:397: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.pageUp()

    /** {@inheritDoc}. */
    @Override
    public void lineAdded(final int line, final int size) {
        setScrollBarMax(1);
    //#TextPane.java:402: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.lineAdded(int, int)
    //#input(void lineAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void lineAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void lineAdded(int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void lineAdded(int, int)): this
    //#input(void lineAdded(int, int)): this.canvas
    //#input(void lineAdded(int, int)): this.canvas.__Tag
    //#input(void lineAdded(int, int)): this.canvas.scrollBarPosition
    //#input(void lineAdded(int, int)): this.canvas.textPane
    //#input(void lineAdded(int, int)): this.document
    //#input(void lineAdded(int, int)): this.document.lines
    //#input(void lineAdded(int, int)): this.scrollBar
    //#output(void lineAdded(int, int)): this.canvas.scrollBarPosition
    //#pre[6] (void lineAdded(int, int)): this.document != null
    //#pre[7] (void lineAdded(int, int)): this.document.lines != null
    //#pre[8] (void lineAdded(int, int)): this.scrollBar != null
    //#pre[1] (void lineAdded(int, int)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[3] (void lineAdded(int, int)): (soft) this.canvas != null
    //#pre[4] (void lineAdded(int, int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[5] (void lineAdded(int, int)): (soft) this.canvas.textPane != null
    //#post(void lineAdded(int, int)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:getNumLines
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void lineAdded(int, int)): Effects-of-calling:java.util.List:size
    }
    //#TextPane.java:403: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.lineAdded(int, int)

    /** {@inheritDoc}. */
    @Override
    public void trimmed(final int numLines) {
        canvas.clearWrapCache();
    //#TextPane.java:408: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.trimmed(int)
    //#input(void trimmed(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void trimmed(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void trimmed(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void trimmed(int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void trimmed(int)): this
    //#input(void trimmed(int)): this.canvas
    //#input(void trimmed(int)): this.canvas.__Tag
    //#input(void trimmed(int)): this.canvas.scrollBarPosition
    //#input(void trimmed(int)): this.canvas.textPane
    //#input(void trimmed(int)): this.document
    //#input(void trimmed(int)): this.document.lines
    //#input(void trimmed(int)): this.scrollBar
    //#output(void trimmed(int)): this.canvas.scrollBarPosition
    //#pre[3] (void trimmed(int)): this.canvas != null
    //#pre[6] (void trimmed(int)): this.document != null
    //#pre[7] (void trimmed(int)): this.document.lines != null
    //#pre[8] (void trimmed(int)): this.scrollBar != null
    //#pre[1] (void trimmed(int)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[4] (void trimmed(int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[5] (void trimmed(int)): (soft) this.canvas.textPane != null
    //#post(void trimmed(int)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void trimmed(int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void trimmed(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void trimmed(int)): Effects-of-calling:getNumLines
    //#unanalyzed(void trimmed(int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void trimmed(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void trimmed(int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void trimmed(int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void trimmed(int)): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    //#unanalyzed(void trimmed(int)): Effects-of-calling:java.util.List:size
        setScrollBarMax(1);
    }
    //#TextPane.java:410: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.trimmed(int)

    /** {@inheritDoc}. */
    @Override
    public void cleared() {
        canvas.clearWrapCache();
    //#TextPane.java:415: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.cleared()
    //#input(void cleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void cleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void cleared()): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.clearWrapCache()V
    //#input(void cleared()): this
    //#input(void cleared()): this.canvas
    //#input(void cleared()): this.canvas.__Tag
    //#pre[2] (void cleared()): this.canvas != null
    //#pre[3] (void cleared()): this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#unanalyzed(void cleared()): Effects-of-calling:com.dmdirc.addons.ui_swing.UIUtilities:invokeLater
    }
    //#TextPane.java:416: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.cleared()

    /** {@inheritDoc}. */
    @Override
    public void linesAdded(int line, int length, int size) {
        setScrollBarMax(length);
    //#TextPane.java:421: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.linesAdded(int, int, int)
    //#input(void linesAdded(int, int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas]
    //#input(void linesAdded(int, int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Descendant_Table[others]
    //#input(void linesAdded(int, int, int)): com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas.__Dispatch_Table.setScrollBarPosition(I)V
    //#input(void linesAdded(int, int, int)): length
    //#input(void linesAdded(int, int, int)): this
    //#input(void linesAdded(int, int, int)): this.canvas
    //#input(void linesAdded(int, int, int)): this.canvas.__Tag
    //#input(void linesAdded(int, int, int)): this.canvas.scrollBarPosition
    //#input(void linesAdded(int, int, int)): this.canvas.textPane
    //#input(void linesAdded(int, int, int)): this.document
    //#input(void linesAdded(int, int, int)): this.document.lines
    //#input(void linesAdded(int, int, int)): this.scrollBar
    //#output(void linesAdded(int, int, int)): this.canvas.scrollBarPosition
    //#pre[7] (void linesAdded(int, int, int)): this.document != null
    //#pre[8] (void linesAdded(int, int, int)): this.document.lines != null
    //#pre[9] (void linesAdded(int, int, int)): this.scrollBar != null
    //#pre[2] (void linesAdded(int, int, int)): (soft) init'ed(this.canvas.scrollBarPosition)
    //#pre[4] (void linesAdded(int, int, int)): (soft) this.canvas != null
    //#pre[5] (void linesAdded(int, int, int)): (soft) this.canvas.__Tag == com/dmdirc/addons/ui_swing/textpane/TextPaneCanvas
    //#pre[6] (void linesAdded(int, int, int)): (soft) this.canvas.textPane != null
    //#post(void linesAdded(int, int, int)): init'ed(this.canvas.scrollBarPosition)
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:javax.swing.JScrollBar:getValue
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:getNumLines
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:javax.swing.JScrollBar:setValue
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:com.dmdirc.addons.ui_swing.textpane.TextPane:isVisible
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:javax.swing.JScrollBar:setMaximum
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:javax.swing.JScrollBar:getValueIsAdjusting
    //#unanalyzed(void linesAdded(int, int, int)): Effects-of-calling:java.util.List:size
    }
    //#TextPane.java:422: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.linesAdded(int, int, int)
    
    /** {@inheritDoc}. */
    @Override
    public void repaintNeeded() {
        canvas.repaint();
    //#TextPane.java:427: method: void com.dmdirc.addons.ui_swing.textpane.TextPane.repaintNeeded()
    //#TextPane.java:427: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.textpane.TextPane
    //#    method: void repaintNeeded()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas:repaint()
    //#input(void repaintNeeded()): this
    //#input(void repaintNeeded()): this.canvas
    //#pre[2] (void repaintNeeded()): this.canvas != null
    }
    //#TextPane.java:428: end of method: void com.dmdirc.addons.ui_swing.textpane.TextPane.repaintNeeded()

    /**
     * Retrieves this textpane's IRCDocument.
     * 
     * @return This textpane's IRC document
     */
    public IRCDocument getDocument() {
        return document;
    //#TextPane.java:436: method: IRCDocument com.dmdirc.addons.ui_swing.textpane.TextPane.getDocument()
    //#input(IRCDocument getDocument()): this
    //#input(IRCDocument getDocument()): this.document
    //#output(IRCDocument getDocument()): return_value
    //#post(IRCDocument getDocument()): return_value == this.document
    //#post(IRCDocument getDocument()): init'ed(return_value)
    //#TextPane.java:436: end of method: IRCDocument com.dmdirc.addons.ui_swing.textpane.TextPane.getDocument()
    }
    
    /**
     * Retrives the parent framecontainer for this textpane.
     * 
     * @return Parent frame container
     */
    public FrameContainer getFrameContainer() {
        return frame;
    //#TextPane.java:445: method: FrameContainer com.dmdirc.addons.ui_swing.textpane.TextPane.getFrameContainer()
    //#input(FrameContainer getFrameContainer()): this
    //#input(FrameContainer getFrameContainer()): this.frame
    //#output(FrameContainer getFrameContainer()): return_value
    //#post(FrameContainer getFrameContainer()): return_value == this.frame
    //#post(FrameContainer getFrameContainer()): init'ed(return_value)
    //#TextPane.java:445: end of method: FrameContainer com.dmdirc.addons.ui_swing.textpane.TextPane.getFrameContainer()
    }
}
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane$1]
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init): __Dispatch_Table.mouseDragged(Ljava/awt/event/MouseEvent;)V
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane$1] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init): __Dispatch_Table.mouseDragged(Ljava/awt/event/MouseEvent;)V == &mouseDragged
    //#TextPane.java:: end of method: com.dmdirc.addons.ui_swing.textpane.TextPane$1.com.dmdirc.addons.ui_swing.textpane.TextPane$1__static_init
    //#TextPane.java:: end of class: com.dmdirc.addons.ui_swing.textpane.TextPane$1
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.adjustmentValueChanged(Ljava/awt/event/AdjustmentEvent;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.clear()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.clearSelection()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.cleared()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.copy()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getAttributeValueAtPoint(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Ljava/lang/Object;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getClickPosition(Ljava/awt/Point;)Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getClickType(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Lcom/dmdirc/addons/ui_swing/textpane/ClickType;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getDocument()Lcom/dmdirc/addons/ui_swing/textpane/IRCDocument;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getFrameContainer()Lcom/dmdirc/FrameContainer;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getLastVisibleLine()I
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getSelectedText()Ljava/lang/String;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getWordAtIndex(II)Ljava/lang/String;
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.hasSelectedRange()Z
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.lineAdded(II)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.linesAdded(III)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.mouseWheelMoved(Ljava/awt/event/MouseWheelEvent;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.pageDown()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.pageUp()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.repaintNeeded()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setScrollBarMax(I)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setScrollBarPosition(I)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setSelectedTexT(Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.trim(I)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.trimmed(I)V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.updateUI()V
    //#output(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane]
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): com/dmdirc/addons/ui_swing/textpane/IRCDocumentListener.__Descendant_Table[com/dmdirc/addons/ui_swing/textpane/TextPane] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.adjustmentValueChanged(Ljava/awt/event/AdjustmentEvent;)V == &adjustmentValueChanged
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.clear()V == &clear
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.clearSelection()V == &clearSelection
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.cleared()V == &cleared
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.copy()V == &copy
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getAttributeValueAtPoint(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Ljava/lang/Object; == &getAttributeValueAtPoint
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getClickPosition(Ljava/awt/Point;)Lcom/dmdirc/addons/ui_swing/textpane/LineInfo; == &getClickPosition
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getClickType(Lcom/dmdirc/addons/ui_swing/textpane/LineInfo;)Lcom/dmdirc/addons/ui_swing/textpane/ClickType; == &getClickType
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getDocument()Lcom/dmdirc/addons/ui_swing/textpane/IRCDocument; == &getDocument
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getFrameContainer()Lcom/dmdirc/FrameContainer; == &getFrameContainer
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getLastVisibleLine()I == &getLastVisibleLine
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getSelectedRange()Lcom/dmdirc/addons/ui_swing/textpane/LinePosition; == &getSelectedRange
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getSelectedText()Ljava/lang/String; == &getSelectedText
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.getWordAtIndex(II)Ljava/lang/String; == &getWordAtIndex
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.hasSelectedRange()Z == &hasSelectedRange
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.lineAdded(II)V == &lineAdded
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.linesAdded(III)V == &linesAdded
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.mouseWheelMoved(Ljava/awt/event/MouseWheelEvent;)V == &mouseWheelMoved
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.pageDown()V == &pageDown
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.pageUp()V == &pageUp
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.repaintNeeded()V == &repaintNeeded
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setScrollBarMax(I)V == &setScrollBarMax
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setScrollBarPosition(I)V == &setScrollBarPosition
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.setSelectedTexT(Lcom/dmdirc/addons/ui_swing/textpane/LinePosition;)V == &setSelectedTexT
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.trim(I)V == &trim
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.trimmed(I)V == &trimmed
    //#post(com.dmdirc.addons.ui_swing.textpane.TextPane__static_init): __Dispatch_Table.updateUI()V == &updateUI
    //#TextPane.java:: end of method: com.dmdirc.addons.ui_swing.textpane.TextPane.com.dmdirc.addons.ui_swing.textpane.TextPane__static_init
    //#TextPane.java:: end of class: com.dmdirc.addons.ui_swing.textpane.TextPane
