//# 2 errors, 855 messages
//#
/*
    //#InputHandler.java:1:1: class: com.dmdirc.ui.input.InputHandler
    //#InputHandler.java:1:1: method: com.dmdirc.ui.input.InputHandler.com.dmdirc.ui.input.InputHandler__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.ui.input;

import com.dmdirc.actions.ActionManager;
import com.dmdirc.actions.CoreActionType;
import com.dmdirc.commandparser.CommandArguments;
import com.dmdirc.commandparser.CommandInfo;
import com.dmdirc.commandparser.CommandManager;
import com.dmdirc.commandparser.commands.Command;
import com.dmdirc.commandparser.commands.ValidatingCommand;
import com.dmdirc.commandparser.commands.WrappableCommand;
import com.dmdirc.commandparser.parsers.CommandParser;
import com.dmdirc.config.prefs.validator.ValidationResponse;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.plugins.PluginManager;
import com.dmdirc.ui.input.tabstyles.TabCompletionResult;
import com.dmdirc.ui.input.tabstyles.TabCompletionStyle;
import com.dmdirc.ui.interfaces.InputField;
import com.dmdirc.ui.interfaces.InputValidationListener;
import com.dmdirc.ui.interfaces.InputWindow;
import com.dmdirc.ui.messages.Styliser;
import com.dmdirc.util.ListenerList;
import com.dmdirc.util.RollingList;

import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Handles events generated by a user typing into a textfield. Allows the user
 * to use shortcut keys for control characters (ctrl+b, etc), to tab complete
 * nicknames/channel names/etc, and to scroll through their previously issued
 * commands.
 *
 * @author chris
 */
public abstract class InputHandler implements ConfigChangeListener {

    /**
     * Indicates that the caret should be moved to the end of a selection when
     * a control code has been inserted.
     */
    private static final int POSITION_END = 1;
    /**
     * Indicates that the caret should be moved to the start of a selection when
     * a control code has been inserted.
     */
    protected static final int POSITION_START = 2;
    /** Flag to indicate that this input handler should handle tab completion. */
    protected static final int HANDLE_TABCOMPLETION = 1;
    /** Flag to indicate that this input handler should maintain a back buffer. */
    protected static final int HANDLE_BACKBUFFER = 2;
    /** Flag to indicate that this input handler should handle formatting. */
    protected static final int HANDLE_FORMATTING = 4;
    /** Flag to indicate that this input handler should handle returns. */
    protected static final int HANDLE_RETURN = 8;
    /** The flags for this particular input handler. */
    protected int flags = HANDLE_TABCOMPLETION | HANDLE_BACKBUFFER
            | HANDLE_FORMATTING | HANDLE_RETURN;
    /** The input buffer. */
    protected RollingList<String> buffer;
    /** The textfield that we're handling input for. */
    protected final InputField target;
    /** The TabCompleter to use for tab completion. */
    protected TabCompleter tabCompleter;
    /** The CommandParser to use for our input. */
    protected final CommandParser commandParser;
    /** The frame that we belong to. */
    protected final InputWindow parentWindow;
    /** The tab completion style. */
    protected TabCompletionStyle style;
    /** Our listener list. */
    private final ListenerList listeners = new ListenerList();
    //#InputHandler.java:96: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList()

    /**
     * Creates a new instance of InputHandler. Adds listeners to the target
     * that we need to operate.
     *
     * @param thisTarget The text field this input handler is dealing with.
     * @param thisCommandParser The command parser to use for this text field.
     * @param thisParentWindow The window that owns this input handler
     */
    public InputHandler(final InputField thisTarget,
            final CommandParser thisCommandParser,
            final InputWindow thisParentWindow) {
    //#InputHandler.java:108: method: void com.dmdirc.ui.input.InputHandler.com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Descendant_Table[others]
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Dispatch_Table.addDownHandler()V
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Dispatch_Table.addEnterHandler()V
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Dispatch_Table.addKeyHandler()V
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Dispatch_Table.addTabHandler()V
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): __Dispatch_Table.addUpHandler()V
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.__Tag
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): thisCommandParser
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): thisParentWindow
    //#input(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): thisTarget
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new ListenerList(InputHandler#1) num objects
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new RollingList(InputHandler#2) num objects
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.__Tag
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.buffer
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.commandParser
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.flags
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.listeners
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.parentWindow
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.style
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.tabCompleter
    //#output(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.target
    //#new obj(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new ListenerList(InputHandler#1)
    //#new obj(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new RollingList(InputHandler#2)
    //#pre[1] (void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[4] (void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): thisParentWindow != null
    //#presumption(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): com.dmdirc.ui.interfaces.InputWindow:getConfigManager(...)@110 != null
    //#presumption(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): com.dmdirc.ui.interfaces.InputWindow:getConfigManager(...)@119 != null
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.__Tag == com/dmdirc/ui/input/InputHandler
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.buffer == &new RollingList(InputHandler#2)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.commandParser == thisCommandParser
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): init'ed(this.commandParser)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.flags == 15
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.listeners == &new ListenerList(InputHandler#1)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.parentWindow == thisParentWindow
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.parentWindow != null
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): init'ed(this.style)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): init'ed(this.tabCompleter)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): this.target == thisTarget
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): init'ed(this.target)
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new ListenerList(InputHandler#1) num objects == 1
    //#post(void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)): new RollingList(InputHandler#2) num objects == 1

        buffer = new RollingList<String>(thisParentWindow.getConfigManager().
    //#InputHandler.java:110: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#InputHandler.java:110: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    //#InputHandler.java:110: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList(int, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList(int, Object)
                getOptionInt("ui", "inputbuffersize"), "");

        this.commandParser = thisCommandParser;
        this.parentWindow = thisParentWindow;
        this.target = thisTarget;

        setStyle();
    //#InputHandler.java:117: Warning: call too complex - analysis skipped
    //#    call on void setStyle()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void setStyle()

        parentWindow.getConfigManager().addChangeListener("tabcompletion",
    //#InputHandler.java:119: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#InputHandler.java:119: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
                "style", this);

        addUpHandler();
    //#InputHandler.java:122: Warning: method not available - call not analyzed
    //#    call on void addUpHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void addUpHandler()
        addDownHandler();
    //#InputHandler.java:123: Warning: method not available - call not analyzed
    //#    call on void addDownHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void addDownHandler()
        addTabHandler();
    //#InputHandler.java:124: Warning: method not available - call not analyzed
    //#    call on void addTabHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void addTabHandler()
        addKeyHandler();
    //#InputHandler.java:125: Warning: method not available - call not analyzed
    //#    call on void addKeyHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void addKeyHandler()
        addEnterHandler();
    //#InputHandler.java:126: Warning: method not available - call not analyzed
    //#    call on void addEnterHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)
    //#    unanalyzed callee: void addEnterHandler()
    }
    //#InputHandler.java:127: end of method: void com.dmdirc.ui.input.InputHandler.com.dmdirc.ui.input.InputHandler(InputField, CommandParser, InputWindow)

    /**
     * Adds an arrow up key handler.
     */
    protected abstract void addUpHandler();

    /**
     * Adds an arrow down key handler.
     */
    protected abstract void addDownHandler();

    /**
     * Adds an tab key handler.
     */
    protected abstract void addTabHandler();

    /**
     * Adds a key handler.
     */
    protected abstract void addKeyHandler();
    
    /** 
     * Adds an enter key handler.
     */
    protected abstract void addEnterHandler();

    /**
     * Indicates which types of input this handler should handle.
     * 
     * @param handleTabCompletion Whether or not to handle tab completion
     * @param handleBackBuffer Whether or not to maintain an input back buffer
     * @param handleFormatting Whether or not to handle formatting
     * @param handleReturn Whether or not to handle returns
     */
    public void setTypes(final boolean handleTabCompletion,
            final boolean handleBackBuffer,
            final boolean handleFormatting, final boolean handleReturn) {
        flags = (handleTabCompletion ? HANDLE_TABCOMPLETION : 0) 
    //#InputHandler.java:165: method: void com.dmdirc.ui.input.InputHandler.setTypes(bool, bool, bool, bool)
    //#input(void setTypes(bool, bool, bool, bool)): handleBackBuffer
    //#input(void setTypes(bool, bool, bool, bool)): handleFormatting
    //#input(void setTypes(bool, bool, bool, bool)): handleReturn
    //#input(void setTypes(bool, bool, bool, bool)): handleTabCompletion
    //#input(void setTypes(bool, bool, bool, bool)): this
    //#output(void setTypes(bool, bool, bool, bool)): this.flags
    //#post(void setTypes(bool, bool, bool, bool)): this.flags == One-of{8, 0} | One-of{4, 0} | One-of{1, 0} | One-of{2, 0}
    //#post(void setTypes(bool, bool, bool, bool)): this.flags in {0..15}
                | (handleBackBuffer ? HANDLE_BACKBUFFER : 0)
                | (handleFormatting ? HANDLE_FORMATTING : 0)
                | (handleReturn ? HANDLE_RETURN : 0);
    }
    //#InputHandler.java:169: end of method: void com.dmdirc.ui.input.InputHandler.setTypes(bool, bool, bool, bool)

    /**
     * Sets this inputhandler's tab completion style.
     */
    private void setStyle() {
        style = (TabCompletionStyle) PluginManager.getPluginManager()
    //#InputHandler.java:175: method: void com.dmdirc.ui.input.InputHandler.setStyle()
    //#InputHandler.java:175: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void setStyle()
    //#    unanalyzed callee: ConfigManager com.dmdirc.ui.interfaces.InputWindow:getConfigManager()
    //#InputHandler.java:175: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void setStyle()
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#InputHandler.java:175: ?use of default init
    //#    init'ed(getServiceProvider(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void setStyle()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getServiceProvider(...).__Tag)
    //#    VN: getServiceProvider(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#InputHandler.java:175: ?null dereference
    //#    com/dmdirc/plugins/ServiceProvider.__Descendant_Table[getServiceProvider(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void setStyle()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/plugins/ServiceProvider.__Descendant_Table[getServiceProvider(...).__Tag] != null
    //#    VN: com/dmdirc/plugins/ServiceProvider.__Descendant_Table[getServiceProvider(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#input(void setStyle()): ""._tainted
    //#input(void setStyle()): "' (wanted by "._tainted
    //#input(void setStyle()): ") -> "._tainted
    //#input(void setStyle()): ") does not exist."._tainted
    //#input(void setStyle()): "->"._tainted
    //#input(void setStyle()): "-resourcemanagerTimer"._tainted
    //#input(void setStyle()): ".class"._tainted
    //#input(void setStyle()): "Could not load "._tainted
    //#input(void setStyle()): "Error loading '"._tainted
    //#input(void setStyle()): "No provider found for: "._tainted
    //#input(void setStyle()): "Resource '"._tainted
    //#input(void setStyle()): "jar:.."._tainted
    //#input(void setStyle()): "plugins"._tainted
    //#input(void setStyle()): "tabcompletion"._tainted
    //#input(void setStyle()): com/dmdirc/plugins/ExportInfo.__Descendant_Table[com/dmdirc/plugins/ExportInfo]
    //#input(void setStyle()): com/dmdirc/plugins/ExportInfo.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/ExportInfo.__Dispatch_Table.getExportedService()Lcom/dmdirc/plugins/ExportedService;
    //#input(void setStyle()): com/dmdirc/plugins/ExportedService.__Descendant_Table[com/dmdirc/plugins/ExportedService]
    //#input(void setStyle()): com/dmdirc/plugins/ExportedService.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/ExportedService.__Dispatch_Table.execute([Ljava/lang/Object;)Ljava/lang/Object;
    //#input(void setStyle()): com/dmdirc/plugins/GlobalClassLoader.__Class_Obj.__Lock
    //#input(void setStyle()): com/dmdirc/plugins/GlobalClassLoader.me
    //#input(void setStyle()): com/dmdirc/plugins/PluginClassLoader.__Descendant_Table[com/dmdirc/plugins/PluginClassLoader]
    //#input(void setStyle()): com/dmdirc/plugins/PluginClassLoader.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/PluginClassLoader.__Dispatch_Table.isClassLoaded(Ljava/lang/String;Z)Z
    //#input(void setStyle()): com/dmdirc/plugins/PluginClassLoader.__Dispatch_Table.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Descendant_Table[com/dmdirc/plugins/PluginInfo]
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.activateServices()V
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getClassList()Ljava/util/List;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getExportedService(Ljava/lang/String;)Lcom/dmdirc/plugins/ExportedService;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getFullFilename()Ljava/lang/String;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getKeyValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getMainClass()Ljava/lang/String;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPersistentClasses()Ljava/util/List;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPluginClassLoader()Lcom/dmdirc/plugins/PluginClassLoader;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getPluginObject()Lcom/dmdirc/plugins/Plugin;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager()Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.getResourceManager(Z)Lcom/dmdirc/util/resourcemanager/ResourceManager;
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isActive()Z
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isLoaded()Z
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent()Z
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.isPersistent(Ljava/lang/String;)Z
    //#input(void setStyle()): com/dmdirc/plugins/PluginInfo.__Dispatch_Table.loadPlugin()V
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Class_Obj.__Lock
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Descendant_Table[com/dmdirc/plugins/PluginManager]
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getPluginInfos()Ljava/util/Collection;
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getPossiblePluginInfos(Z)Ljava/util/List;
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getService(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/plugins/Service;
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getService(Ljava/lang/String;Ljava/lang/String;Z)Lcom/dmdirc/plugins/Service;
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.__Dispatch_Table.getServiceProvider(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/plugins/ServiceProvider;
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.com.dmdirc.actions.CoreActionType.CLIENT_PREFS_CLOSED
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.com.dmdirc.actions.CoreActionType.CLIENT_PREFS_OPENED
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.me
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.me.__Tag
    //#input(void setStyle()): com/dmdirc/plugins/PluginManager.me.services
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Descendant_Table[com/dmdirc/plugins/Service]
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Dispatch_Table.activate()Z
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Dispatch_Table.getActiveProvider()Lcom/dmdirc/plugins/ServiceProvider;
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Dispatch_Table.getProviders()Ljava/util/List;
    //#input(void setStyle()): com/dmdirc/plugins/Service.__Dispatch_Table.isActive()Z
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Descendant_Table[com/dmdirc/plugins/PluginInfo]
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Descendant_Table[com/dmdirc/plugins/ServiceProvider]
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Descendant_Table[others]
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Dispatch_Table.activateServices()V
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Dispatch_Table.getExportedService(Ljava/lang/String;)Lcom/dmdirc/plugins/ExportedService;
    //#input(void setStyle()): com/dmdirc/plugins/ServiceProvider.__Dispatch_Table.isActive()Z
    //#input(void setStyle()): this
    //#input(void setStyle()): this.parentWindow
    //#input(void setStyle()): this.tabCompleter
    //#output(void setStyle()): com/dmdirc/plugins/GlobalClassLoader.me
    //#output(void setStyle()): com/dmdirc/plugins/PluginManager.me
    //#output(void setStyle()): java.lang.StringBuilder:toString(...)._tainted
    //#output(void setStyle()): new GlobalClassLoader(getGlobalClassLoader#1) num objects
    //#output(void setStyle()): new GlobalClassLoader(getGlobalClassLoader#1).__Tag
    //#output(void setStyle()): new GlobalClassLoader(getGlobalClassLoader#1).resourcesList
    //#output(void setStyle()): new HashMap(GlobalClassLoader#1) num objects
    //#output(void setStyle()): new HashMap(PluginManager#2) num objects
    //#output(void setStyle()): new Hashtable(PluginManager#1) num objects
    //#output(void setStyle()): new PluginClassLoader(getSubClassLoader#1) num objects
    //#output(void setStyle()): new PluginClassLoader(getSubClassLoader#1).__Tag
    //#output(void setStyle()): new PluginClassLoader(getSubClassLoader#1).pluginInfo
    //#output(void setStyle()): new PluginManager(getPluginManager#1) num objects
    //#output(void setStyle()): new PluginManager(getPluginManager#1).__Tag
    //#output(void setStyle()): new PluginManager(getPluginManager#1).knownPlugins
    //#output(void setStyle()): new PluginManager(getPluginManager#1).myDir
    //#output(void setStyle()): new PluginManager(getPluginManager#1).services
    //#output(void setStyle()): this.style
    //#new obj(void setStyle()): java.lang.StringBuilder:toString(...)
    //#new obj(void setStyle()): new GlobalClassLoader(getGlobalClassLoader#1)
    //#new obj(void setStyle()): new HashMap(GlobalClassLoader#1)
    //#new obj(void setStyle()): new HashMap(PluginManager#2)
    //#new obj(void setStyle()): new Hashtable(PluginManager#1)
    //#new obj(void setStyle()): new PluginClassLoader(getSubClassLoader#1)
    //#new obj(void setStyle()): new PluginManager(getPluginManager#1)
    //#pre[7] (void setStyle()): init'ed(com/dmdirc/plugins/PluginManager.me)
    //#pre[9] (void setStyle()): this.parentWindow != null
    //#pre[10] (void setStyle()): init'ed(this.tabCompleter)
    //#pre[6] (void setStyle()): (soft) com/dmdirc/plugins/GlobalClassLoader.me != null
    //#presumption(void setStyle()): com.dmdirc.ui.interfaces.InputWindow:getConfigManager(...)@175 != null
    //#presumption(void setStyle()): getExportedService(...).__Tag@175 == com/dmdirc/plugins/ExportedService
    //#presumption(void setStyle()): getPluginManager(...).__Tag == com/dmdirc/plugins/PluginManager
    //#presumption(void setStyle()): getPluginManager(...).services != null
    //#presumption(void setStyle()): getServiceProvider(...).exports@175 != null
    //#post(void setStyle()): init'ed(com/dmdirc/plugins/GlobalClassLoader.me)
    //#post(void setStyle()): com/dmdirc/plugins/PluginManager.me == One-of{old com/dmdirc/plugins/PluginManager.me, &new PluginManager(getPluginManager#1)}
    //#post(void setStyle()): com/dmdirc/plugins/PluginManager.me != null
    //#post(void setStyle()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void setStyle()): init'ed(this.style)
    //#post(void setStyle()): new GlobalClassLoader(getGlobalClassLoader#1) num objects == 0
    //#post(void setStyle()): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).__Tag)
    //#post(void setStyle()): init'ed(new GlobalClassLoader(getGlobalClassLoader#1).resourcesList)
    //#post(void setStyle()): new HashMap(GlobalClassLoader#1) num objects == 0
    //#post(void setStyle()): new HashMap(PluginManager#2) num objects <= 1
    //#post(void setStyle()): new Hashtable(PluginManager#1) num objects == new HashMap(PluginManager#2) num objects
    //#post(void setStyle()): new PluginManager(getPluginManager#1) num objects == new HashMap(PluginManager#2) num objects
    //#post(void setStyle()): new PluginClassLoader(getSubClassLoader#1) num objects == undefined
    //#post(void setStyle()): new PluginClassLoader(getSubClassLoader#1) num objects == 0, if init'ed
    //#post(void setStyle()): new PluginClassLoader(getSubClassLoader#1).__Tag == new PluginClassLoader(getSubClassLoader#1) num objects
    //#post(void setStyle()): new PluginClassLoader(getSubClassLoader#1).pluginInfo == undefined
    //#post(void setStyle()): new PluginClassLoader(getSubClassLoader#1).pluginInfo == null
    //#post(void setStyle()): new PluginManager(getPluginManager#1).__Tag == com/dmdirc/plugins/PluginManager
    //#post(void setStyle()): new PluginManager(getPluginManager#1).knownPlugins == &new Hashtable(PluginManager#1)
    //#post(void setStyle()): new PluginManager(getPluginManager#1).myDir == &java.lang.StringBuilder:toString(...)
    //#post(void setStyle()): new PluginManager(getPluginManager#1).services == &new HashMap(PluginManager#2)
    //#unanalyzed(void setStyle()): Effects-of-calling:getPluginManager
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.reflect.Method:invoke
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.Main:getConfigDir
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.actions.ActionManager:addListener
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void setStyle()): Effects-of-calling:getPluginInfos
    //#unanalyzed(void setStyle()): Effects-of-calling:getName
    //#unanalyzed(void setStyle()): Effects-of-calling:addError
    //#unanalyzed(void setStyle()): Effects-of-calling:unloadPlugin
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.actions.ActionManager:processEvent
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.ConfigFile:isFlatDomain
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.ConfigFile:getFlatDomain
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void setStyle()): Effects-of-calling:getPluginInfoByName
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.ClassLoader
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setStyle()): Effects-of-calling:delProvider
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.List:clear
    //#unanalyzed(void setStyle()): Effects-of-calling:isUnloadable
    //#unanalyzed(void setStyle()): Effects-of-calling:onUnload
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Exception:getMessage
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Exception:printStackTrace
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.LinkedList:add
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.LinkedList:isEmpty
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.LinkedList:pop
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:isDirectory
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:listFiles
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:isFile
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:getName
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:getPath
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void setStyle()): Effects-of-calling:addPlugin
    //#unanalyzed(void setStyle()): Effects-of-calling:java.net.URL
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginInfo
    //#unanalyzed(void setStyle()): Effects-of-calling:java.net.MalformedURLException:getMessage
    //#unanalyzed(void setStyle()): Effects-of-calling:java.net.URL:getPath
    //#unanalyzed(void setStyle()): Effects-of-calling:getFullFilename
    //#unanalyzed(void setStyle()): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void setStyle()): Effects-of-calling:delPlugin
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.updater.components.PluginComponent
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Exception
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginException:getMessage
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void setStyle()): Effects-of-calling:getPossiblePluginInfos
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void setStyle()): Effects-of-calling:updateProvides
    //#unanalyzed(void setStyle()): Effects-of-calling:checkRequirements
    //#unanalyzed(void setStyle()): Effects-of-calling:loadRequired
    //#unanalyzed(void setStyle()): Effects-of-calling:onLoad
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Throwable:getMessage
    //#unanalyzed(void setStyle()): Effects-of-calling:getMainClass
    //#unanalyzed(void setStyle()): Effects-of-calling:loadClass
    //#unanalyzed(void setStyle()): Effects-of-calling:loadPlugin
    //#unanalyzed(void setStyle()): Effects-of-calling:getService
    //#unanalyzed(void setStyle()): Effects-of-calling:isActive
    //#unanalyzed(void setStyle()): Effects-of-calling:activateServices
    //#unanalyzed(void setStyle()): Effects-of-calling:getPluginClassLoader
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setStyle()): Effects-of-calling:getPluginObject
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.Class:getDeclaredMethods
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.reflect.Method:getName
    //#unanalyzed(void setStyle()): Effects-of-calling:getResourceManager
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:findLoadedClass
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:findLoadedClass
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:getParent
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:replace
    //#unanalyzed(void setStyle()): Effects-of-calling:isPersistent
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:resourceExists
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceManager
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourceBytes
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.GlobalClassLoader:defineClass
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.ClassLoader:loadClass
    //#unanalyzed(void setStyle()): Effects-of-calling:getClassList
    //#unanalyzed(void setStyle()): Effects-of-calling:getPersistentClasses
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.NoClassDefFoundError:getMessage
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.ClassNotFoundException
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:defineClass
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.plugins.PluginClassLoader:resolveClass
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Timer
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void setStyle()): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(void setStyle()): Effects-of-calling:com.dmdirc.util.resourcemanager.ResourceManager:getResourcesStartingWith
    //#unanalyzed(void setStyle()): Effects-of-calling:java.lang.String:replaceAll
                .getServiceProvider("tabcompletion", parentWindow.getConfigManager()
                .getOption("tabcompletion", "style"))
                .getExportedService("getCompletionStyle").execute(tabCompleter, parentWindow);
    }
    //#InputHandler.java:179: end of method: void com.dmdirc.ui.input.InputHandler.setStyle()

    /**
     * Sets this input handler's tab completer.
     *
     * @param newTabCompleter The new tab completer
     */
    public void setTabCompleter(final TabCompleter newTabCompleter) {
        tabCompleter = newTabCompleter;
    //#InputHandler.java:187: method: void com.dmdirc.ui.input.InputHandler.setTabCompleter(TabCompleter)
    //#input(void setTabCompleter(TabCompleter)): newTabCompleter
    //#input(void setTabCompleter(TabCompleter)): this
    //#output(void setTabCompleter(TabCompleter)): this.style
    //#output(void setTabCompleter(TabCompleter)): this.tabCompleter
    //#post(void setTabCompleter(TabCompleter)): this.style == old this.style
    //#post(void setTabCompleter(TabCompleter)): this.tabCompleter == newTabCompleter
    //#post(void setTabCompleter(TabCompleter)): init'ed(this.tabCompleter)
        setStyle();
    //#InputHandler.java:188: Warning: call too complex - analysis skipped
    //#    call on void setStyle()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void setTabCompleter(TabCompleter)
    //#    unanalyzed callee: void setStyle()
    }
    //#InputHandler.java:189: end of method: void com.dmdirc.ui.input.InputHandler.setTabCompleter(TabCompleter)

    /**
     * Handles the pressing of a key. Inserts control chars as appropriate.
     *
     * @param line Text in the target
     * @param keyCode Keycode for the pressed key
     * @param shiftPressed Was shift pressed
     * @param ctrlPressed Was ctrl key pressed
     */
    protected void handleKeyPressed(final String line, final int keyCode,
            final boolean shiftPressed, final boolean ctrlPressed) {
        target.hideColourPicker();
    //#InputHandler.java:201: method: void com.dmdirc.ui.input.InputHandler.handleKeyPressed(String, int, bool, bool)
    //#InputHandler.java:201: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:hideColourPicker()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void handleKeyPressed(String, int, bool, bool)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:hideColourPicker()
    //#input(void handleKeyPressed(String, int, bool, bool)): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void handleKeyPressed(String, int, bool, bool)): __Descendant_Table[others]
    //#input(void handleKeyPressed(String, int, bool, bool)): __Dispatch_Table.addControlCode(II)V
    //#input(void handleKeyPressed(String, int, bool, bool)): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#input(void handleKeyPressed(String, int, bool, bool)): __Dispatch_Table.handleControlKey(Ljava/lang/String;IZ)V
    //#input(void handleKeyPressed(String, int, bool, bool)): __Dispatch_Table.validateText()V
    //#input(void handleKeyPressed(String, int, bool, bool)): ctrlPressed
    //#input(void handleKeyPressed(String, int, bool, bool)): keyCode
    //#input(void handleKeyPressed(String, int, bool, bool)): line
    //#input(void handleKeyPressed(String, int, bool, bool)): shiftPressed
    //#input(void handleKeyPressed(String, int, bool, bool)): this
    //#input(void handleKeyPressed(String, int, bool, bool)): this.__Tag
    //#input(void handleKeyPressed(String, int, bool, bool)): this.buffer
    //#input(void handleKeyPressed(String, int, bool, bool)): this.commandParser
    //#input(void handleKeyPressed(String, int, bool, bool)): this.flags
    //#input(void handleKeyPressed(String, int, bool, bool)): this.listeners
    //#input(void handleKeyPressed(String, int, bool, bool)): this.parentWindow
    //#input(void handleKeyPressed(String, int, bool, bool)): this.target
    //#pre[8] (void handleKeyPressed(String, int, bool, bool)): this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[16] (void handleKeyPressed(String, int, bool, bool)): this.target != null
    //#pre[5] (void handleKeyPressed(String, int, bool, bool)): (soft) line != null
    //#pre[9] (void handleKeyPressed(String, int, bool, bool)): (soft) this.buffer != null
    //#pre[10] (void handleKeyPressed(String, int, bool, bool)): (soft) this.commandParser != null
    //#pre[11] (void handleKeyPressed(String, int, bool, bool)): (soft) init'ed(this.flags)
    //#pre[14] (void handleKeyPressed(String, int, bool, bool)): (soft) this.listeners != null
    //#pre[15] (void handleKeyPressed(String, int, bool, bool)): (soft) this.parentWindow != null
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:wrappedText
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setText
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setCaretPosition
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectionEnd
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectionStart
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getText
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectedText
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getCaretPosition
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:legalCommand
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.CommandArguments
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:isCommand
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:getCommandName
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommand
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:instanceof
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:isFailure
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:getFailureReason
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:instanceof
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:getLineCount
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getContainer
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.WritableFrameContainer:getNumLines
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.util.RollingList:seekToEnd
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:showColourPicker
    //#unanalyzed(void handleKeyPressed(String, int, bool, bool)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommandCtrl
    //#test_vector(void handleKeyPressed(String, int, bool, bool)): ctrlPressed: {0}, {1}
    //#test_vector(void handleKeyPressed(String, int, bool, bool)): this.flags & 4: {0}, {1..4}
        
        if (ctrlPressed && (flags & HANDLE_FORMATTING) != 0) {
            handleControlKey(line, keyCode, shiftPressed);
        }
        
        validateText();
    }
    //#InputHandler.java:208: end of method: void com.dmdirc.ui.input.InputHandler.handleKeyPressed(String, int, bool, bool)
    
    /**
     * Validates the text currently entered in the text field.
     */
    protected void validateText() {
        final String text = target.getText();
    //#InputHandler.java:214: method: void com.dmdirc.ui.input.InputHandler.validateText()
    //#InputHandler.java:214: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
    //#input(void validateText()): this
    //#input(void validateText()): this.listeners
    //#input(void validateText()): this.parentWindow
    //#input(void validateText()): this.target
    //#pre[4] (void validateText()): this.target != null
    //#pre[2] (void validateText()): (soft) this.listeners != null
    //#pre[3] (void validateText()): (soft) this.parentWindow != null
    //#presumption(void validateText()): com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments(...)@223 != null
    //#presumption(void validateText()): com.dmdirc.ui.interfaces.InputWindow:getContainer(...)@239 != null
    //#presumption(void validateText()): java.util.Map_Entry:getValue(...)@223 != null
    //#presumption(void validateText()): java.util.Map_Entry:getValue(...)@234 != null
    //#unanalyzed(void validateText()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void validateText()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void validateText()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void validateText()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void validateText()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:wrappedText
    //#unanalyzed(void validateText()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:legalCommand
    //#unanalyzed(void validateText()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand
    //#test_vector(void validateText()): com.dmdirc.commandparser.CommandArguments:isCommand(...)@218: {0}, {1}
    //#test_vector(void validateText()): com.dmdirc.commandparser.CommandManager:getCommand(...)@219: Addr_Set{null}, Inverse{null}
    //#test_vector(void validateText()): com.dmdirc.config.prefs.validator.ValidationResponse:isFailure(...)@226: {0}, {1}

        final CommandArguments args = new CommandArguments(text);
    //#InputHandler.java:216: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandparser.CommandArguments(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: void com.dmdirc.commandparser.CommandArguments(String)

        if (args.isCommand()) {
    //#InputHandler.java:218: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.commandparser.CommandArguments:isCommand()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: bool com.dmdirc.commandparser.CommandArguments:isCommand()
            final Map.Entry<CommandInfo, Command> command
    //#InputHandler.java:219: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.commandparser.CommandArguments:getCommandName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: String com.dmdirc.commandparser.CommandArguments:getCommandName()
    //#InputHandler.java:219: Warning: method not available - call not analyzed
    //#    call on Map$Entry com.dmdirc.commandparser.CommandManager:getCommand(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: Map$Entry com.dmdirc.commandparser.CommandManager:getCommand(String)
                    = CommandManager.getCommand(args.getCommandName());
            
            if (command != null && command.getValue() instanceof ValidatingCommand) {
                final ValidationResponse vr = ((ValidatingCommand) command.getValue())
    //#InputHandler.java:223: Warning: method not available - call not analyzed
    //#    call on ValidationResponse com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments(InputWindow, CommandArguments)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: ValidationResponse com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments(InputWindow, CommandArguments)
                        .validateArguments(parentWindow, args);
                
                if (vr.isFailure()) {
    //#InputHandler.java:226: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.prefs.validator.ValidationResponse:isFailure()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: bool com.dmdirc.config.prefs.validator.ValidationResponse:isFailure()
                    fireCommandFailure(vr.getFailureReason());
    //#InputHandler.java:227: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.prefs.validator.ValidationResponse:getFailureReason()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: String com.dmdirc.config.prefs.validator.ValidationResponse:getFailureReason()
                } else {
                    fireCommandPassed();
                }
            }
            
            if (command != null && command.getValue() instanceof WrappableCommand) {
                final int count = ((WrappableCommand) command.getValue())
    //#InputHandler.java:234: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.commandparser.commands.WrappableCommand:getLineCount(InputWindow, CommandArguments)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: int com.dmdirc.commandparser.commands.WrappableCommand:getLineCount(InputWindow, CommandArguments)
                        .getLineCount(parentWindow, args);
                fireLineWrap(count);
            }
        } else {
            final int lines = parentWindow.getContainer().getNumLines(text);
    //#InputHandler.java:239: Warning: method not available - call not analyzed
    //#    call on WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#InputHandler.java:239: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.WritableFrameContainer:getNumLines(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void validateText()
    //#    unanalyzed callee: int com.dmdirc.WritableFrameContainer:getNumLines(String)
                fireLineWrap(lines);
        }
    }
    //#InputHandler.java:242: end of method: void com.dmdirc.ui.input.InputHandler.validateText()
    
    /**
     * Fires the "illegalCommand" method of all validation listeners.
     * 
     * @param reason The reason for the command failure
     */
    private void fireCommandFailure(final String reason) {
        for (InputValidationListener listener : listeners.get(InputValidationListener.class)) {
    //#InputHandler.java:250: method: void com.dmdirc.ui.input.InputHandler.fireCommandFailure(String)
    //#InputHandler.java:250: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireCommandFailure(String)
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
    //#input(void fireCommandFailure(String)): reason
    //#input(void fireCommandFailure(String)): this
    //#input(void fireCommandFailure(String)): this.listeners
    //#pre[3] (void fireCommandFailure(String)): this.listeners != null
    //#presumption(void fireCommandFailure(String)): com.dmdirc.util.ListenerList:get(...)@250 != null
    //#presumption(void fireCommandFailure(String)): java.util.Iterator:next(...)@250 != null
    //#test_vector(void fireCommandFailure(String)): java.util.Iterator:hasNext(...)@250: {0}, {1}
            listener.illegalCommand(reason);
    //#InputHandler.java:251: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireCommandFailure(String)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand(String)
        }
    }
    //#InputHandler.java:253: end of method: void com.dmdirc.ui.input.InputHandler.fireCommandFailure(String)
    
    /**
     * Fires the "legalCommand" method of all validation listeners.
     */
    private void fireCommandPassed() {
        for (InputValidationListener listener : listeners.get(InputValidationListener.class)) {
    //#InputHandler.java:259: method: void com.dmdirc.ui.input.InputHandler.fireCommandPassed()
    //#InputHandler.java:259: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireCommandPassed()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
    //#input(void fireCommandPassed()): this
    //#input(void fireCommandPassed()): this.listeners
    //#pre[2] (void fireCommandPassed()): this.listeners != null
    //#presumption(void fireCommandPassed()): com.dmdirc.util.ListenerList:get(...)@259 != null
    //#presumption(void fireCommandPassed()): java.util.Iterator:next(...)@259 != null
    //#test_vector(void fireCommandPassed()): java.util.Iterator:hasNext(...)@259: {0}, {1}
            listener.legalCommand();
    //#InputHandler.java:260: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputValidationListener:legalCommand()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireCommandPassed()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputValidationListener:legalCommand()
        }
    }
    //#InputHandler.java:262: end of method: void com.dmdirc.ui.input.InputHandler.fireCommandPassed()
    
    /**
     * Fires the "wrappedText" method of all validation listeners.
     * 
     * @param lines The number of lines that the text will wrap to
     */
    private void fireLineWrap(final int lines) {
        for (InputValidationListener listener : listeners.get(InputValidationListener.class)) {
    //#InputHandler.java:270: method: void com.dmdirc.ui.input.InputHandler.fireLineWrap(int)
    //#InputHandler.java:270: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireLineWrap(int)
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
    //#input(void fireLineWrap(int)): lines
    //#input(void fireLineWrap(int)): this
    //#input(void fireLineWrap(int)): this.listeners
    //#pre[3] (void fireLineWrap(int)): this.listeners != null
    //#presumption(void fireLineWrap(int)): com.dmdirc.util.ListenerList:get(...)@270 != null
    //#presumption(void fireLineWrap(int)): java.util.Iterator:next(...)@270 != null
    //#test_vector(void fireLineWrap(int)): java.util.Iterator:hasNext(...)@270: {0}, {1}
            listener.wrappedText(lines);
    //#InputHandler.java:271: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputValidationListener:wrappedText(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void fireLineWrap(int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputValidationListener:wrappedText(int)
        }        
    }
    //#InputHandler.java:273: end of method: void com.dmdirc.ui.input.InputHandler.fireLineWrap(int)
    
    /**
     * Adds an InputValidationListener to this input handler.
     * 
     * @param listener The listener to be added
     */
    public void addValidationListener(final InputValidationListener listener) {
        listeners.add(InputValidationListener.class, listener);
    //#InputHandler.java:281: method: void com.dmdirc.ui.input.InputHandler.addValidationListener(InputValidationListener)
    //#InputHandler.java:281: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:add(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addValidationListener(InputValidationListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:add(Class, Object)
    //#input(void addValidationListener(InputValidationListener)): listener
    //#input(void addValidationListener(InputValidationListener)): this
    //#input(void addValidationListener(InputValidationListener)): this.listeners
    //#pre[3] (void addValidationListener(InputValidationListener)): this.listeners != null
    }
    //#InputHandler.java:282: end of method: void com.dmdirc.ui.input.InputHandler.addValidationListener(InputValidationListener)

    /**
     * Handles the pressing of a key while the control key is pressed.
     * Inserts control chars as appropriate.
     *
     * @param line Text in the target
     * @param keyCode Keycode for the pressed key
     * @param shiftPressed Was shift pressed
     */
    protected void handleControlKey(final String line, final int keyCode,
            final boolean shiftPressed) {
        switch (keyCode) {
    //#InputHandler.java:294: method: void com.dmdirc.ui.input.InputHandler.handleControlKey(String, int, bool)
    //#input(void handleControlKey(String, int, bool)): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void handleControlKey(String, int, bool)): __Descendant_Table[others]
    //#input(void handleControlKey(String, int, bool)): __Dispatch_Table.addControlCode(II)V
    //#input(void handleControlKey(String, int, bool)): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#input(void handleControlKey(String, int, bool)): keyCode
    //#input(void handleControlKey(String, int, bool)): line
    //#input(void handleControlKey(String, int, bool)): shiftPressed
    //#input(void handleControlKey(String, int, bool)): this
    //#input(void handleControlKey(String, int, bool)): this.__Tag
    //#input(void handleControlKey(String, int, bool)): this.buffer
    //#input(void handleControlKey(String, int, bool)): this.commandParser
    //#input(void handleControlKey(String, int, bool)): this.flags
    //#input(void handleControlKey(String, int, bool)): this.parentWindow
    //#input(void handleControlKey(String, int, bool)): this.target
    //#pre[11] (void handleControlKey(String, int, bool)): (soft) line != null
    //#pre[14] (void handleControlKey(String, int, bool)): (soft) this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[15] (void handleControlKey(String, int, bool)): (soft) this.buffer != null
    //#pre[16] (void handleControlKey(String, int, bool)): (soft) this.commandParser != null
    //#pre[17] (void handleControlKey(String, int, bool)): (soft) init'ed(this.flags)
    //#pre[21] (void handleControlKey(String, int, bool)): (soft) this.target != null
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setText
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setCaretPosition
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectionEnd
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectionStart
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getText
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getSelectedText
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getCaretPosition
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void handleControlKey(String, int, bool)): Effects-of-calling:com.dmdirc.util.RollingList:seekToEnd
    //#test_vector(void handleControlKey(String, int, bool)): keyCode: {10}, {66}, {70}, {73}, {75}, {79}, {85}, {-2_147_483_648..9, 11..65, 67..69, 71,72, 74, 76..78, 80..84, 86..4_294_967_295}
    //#test_vector(void handleControlKey(String, int, bool)): shiftPressed: {0}, {1}
    //#test_vector(void handleControlKey(String, int, bool)): this.flags & 8: {0}, {1..8}
    //#test_vector(void handleControlKey(String, int, bool)): java.lang.String:isEmpty(...)@328: {1}, {0}
            case KeyEvent.VK_B:
                addControlCode(Styliser.CODE_BOLD, POSITION_END);
                break;

            case KeyEvent.VK_U:
                addControlCode(Styliser.CODE_UNDERLINE, POSITION_END);
                break;

            case KeyEvent.VK_O:
                addControlCode(Styliser.CODE_STOP, POSITION_END);
                break;

            case KeyEvent.VK_I:
                addControlCode(Styliser.CODE_ITALIC, POSITION_END);
                break;

            case KeyEvent.VK_F:
                if (shiftPressed) {
                    addControlCode(Styliser.CODE_FIXED, POSITION_END);
                }
                break;

            case KeyEvent.VK_K:
                if (shiftPressed) {
                    addControlCode(Styliser.CODE_HEXCOLOUR, POSITION_START);
                    target.showColourPicker(false, true);
    //#InputHandler.java:320: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:showColourPicker(bool, bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void handleControlKey(String, int, bool)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:showColourPicker(bool, bool)
                } else {
                    addControlCode(Styliser.CODE_COLOUR, POSITION_START);
                    target.showColourPicker(true, false);
    //#InputHandler.java:323: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:showColourPicker(bool, bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void handleControlKey(String, int, bool)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:showColourPicker(bool, bool)
                }
                break;

            case KeyEvent.VK_ENTER:
                if ((flags & HANDLE_RETURN) != 0 && !line.isEmpty()) {
                    commandParser.parseCommandCtrl(parentWindow, line);
    //#InputHandler.java:329: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandparser.parsers.CommandParser:parseCommandCtrl(InputWindow, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void handleControlKey(String, int, bool)
    //#    unanalyzed callee: void com.dmdirc.commandparser.parsers.CommandParser:parseCommandCtrl(InputWindow, String)
                    addToBuffer(line);
                }
                break;

            default:
                /* Do nothing. */
                break;
        }
    }
    //#InputHandler.java:338: end of method: void com.dmdirc.ui.input.InputHandler.handleControlKey(String, int, bool)

    /**
     * Calls when the user presses the up key.
     * Handles cycling through the input buffer.
     */
    protected void doBufferUp() {
        if ((flags & HANDLE_BACKBUFFER) != 0) {
    //#InputHandler.java:345: method: void com.dmdirc.ui.input.InputHandler.doBufferUp()
    //#input(void doBufferUp()): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void doBufferUp()): __Descendant_Table[others]
    //#input(void doBufferUp()): __Dispatch_Table.validateText()V
    //#input(void doBufferUp()): this
    //#input(void doBufferUp()): this.__Tag
    //#input(void doBufferUp()): this.buffer
    //#input(void doBufferUp()): this.flags
    //#input(void doBufferUp()): this.listeners
    //#input(void doBufferUp()): this.parentWindow
    //#input(void doBufferUp()): this.target
    //#pre[2] (void doBufferUp()): this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[4] (void doBufferUp()): init'ed(this.flags)
    //#pre[9] (void doBufferUp()): this.target != null
    //#pre[3] (void doBufferUp()): (soft) this.buffer != null
    //#pre[7] (void doBufferUp()): (soft) this.listeners != null
    //#pre[8] (void doBufferUp()): (soft) this.parentWindow != null
    //#presumption(void doBufferUp()): java.awt.Toolkit:getDefaultToolkit(...)@349 != null
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void doBufferUp()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void doBufferUp()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void doBufferUp()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:wrappedText
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getText
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:legalCommand
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:isCommand
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:getCommandName
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommand
    //#unanalyzed(void doBufferUp()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:instanceof
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:isFailure
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:getFailureReason
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:instanceof
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:getLineCount
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getContainer
    //#unanalyzed(void doBufferUp()): Effects-of-calling:com.dmdirc.WritableFrameContainer:getNumLines
    //#test_vector(void doBufferUp()): this.flags & 2: {0}, {1,2}
    //#test_vector(void doBufferUp()): com.dmdirc.util.RollingList:hasPrevious(...)@346: {0}, {1}
            if (buffer.hasPrevious()) {
    //#InputHandler.java:346: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:hasPrevious()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferUp()
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:hasPrevious()
                target.setText(buffer.getPrevious());
    //#InputHandler.java:347: Warning: method not available - call not analyzed
    //#    call on Object com.dmdirc.util.RollingList:getPrevious()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferUp()
    //#    unanalyzed callee: Object com.dmdirc.util.RollingList:getPrevious()
    //#InputHandler.java:347: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferUp()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            } else {
                Toolkit.getDefaultToolkit().beep();
            }
        }
        validateText();
    }
    //#InputHandler.java:353: end of method: void com.dmdirc.ui.input.InputHandler.doBufferUp()

    /**
     * Called when the user presses the down key.
     * Handles cycling through the input buffer, and storing incomplete lines.
     */
    protected void doBufferDown() {
        if ((flags & HANDLE_BACKBUFFER) != 0) {
    //#InputHandler.java:360: method: void com.dmdirc.ui.input.InputHandler.doBufferDown()
    //#input(void doBufferDown()): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void doBufferDown()): __Descendant_Table[others]
    //#input(void doBufferDown()): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#input(void doBufferDown()): __Dispatch_Table.validateText()V
    //#input(void doBufferDown()): this
    //#input(void doBufferDown()): this.__Tag
    //#input(void doBufferDown()): this.buffer
    //#input(void doBufferDown()): this.flags
    //#input(void doBufferDown()): this.listeners
    //#input(void doBufferDown()): this.parentWindow
    //#input(void doBufferDown()): this.target
    //#pre[2] (void doBufferDown()): this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[4] (void doBufferDown()): init'ed(this.flags)
    //#pre[9] (void doBufferDown()): this.target != null
    //#pre[3] (void doBufferDown()): (soft) this.buffer != null
    //#pre[7] (void doBufferDown()): (soft) this.listeners != null
    //#pre[8] (void doBufferDown()): (soft) this.parentWindow != null
    //#presumption(void doBufferDown()): com.dmdirc.ui.interfaces.InputField:getText(...)@363 != null
    //#presumption(void doBufferDown()): java.awt.Toolkit:getDefaultToolkit(...)@364 != null
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void doBufferDown()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void doBufferDown()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void doBufferDown()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:wrappedText
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:getText
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:legalCommand
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:illegalCommand
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:isCommand
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.CommandArguments:getCommandName
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommand
    //#unanalyzed(void doBufferDown()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:instanceof
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.commands.ValidatingCommand:validateArguments
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:isFailure
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.config.prefs.validator.ValidationResponse:getFailureReason
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:instanceof
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.commandparser.commands.WrappableCommand:getLineCount
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getContainer
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.WritableFrameContainer:getNumLines
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void doBufferDown()): Effects-of-calling:com.dmdirc.util.RollingList:seekToEnd
    //#test_vector(void doBufferDown()): this.flags & 2: {0}, {1,2}
    //#test_vector(void doBufferDown()): com.dmdirc.util.RollingList:hasNext(...)@361: {0}, {1}
    //#test_vector(void doBufferDown()): java.lang.String:isEmpty(...)@363: {0}, {1}
            if (buffer.hasNext()) {
    //#InputHandler.java:361: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:hasNext()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:hasNext()
                target.setText(buffer.getNext());
    //#InputHandler.java:362: Warning: method not available - call not analyzed
    //#    call on Object com.dmdirc.util.RollingList:getNext()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: Object com.dmdirc.util.RollingList:getNext()
    //#InputHandler.java:362: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            } else if (target.getText().isEmpty()) {
    //#InputHandler.java:363: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
                Toolkit.getDefaultToolkit().beep();
            } else {
                addToBuffer(target.getText());
    //#InputHandler.java:366: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
                target.setText("");
    //#InputHandler.java:367: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doBufferDown()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            }
        }
        validateText();
    }
    //#InputHandler.java:371: end of method: void com.dmdirc.ui.input.InputHandler.doBufferDown()
    
    /**
     * Retrieves a list of all known entries in the input backbuffer.
     * 
     * @since 0.6
     * @return A copy of the input backbuffer.
     */
    public List<String> getBackBuffer() {
        return new ArrayList<String>(buffer.getList());
    //#InputHandler.java:380: method: List com.dmdirc.ui.input.InputHandler.getBackBuffer()
    //#InputHandler.java:380: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.RollingList:getList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: List getBackBuffer()
    //#    unanalyzed callee: List com.dmdirc.util.RollingList:getList()
    //#input(List getBackBuffer()): this
    //#input(List getBackBuffer()): this.buffer
    //#output(List getBackBuffer()): new ArrayList(getBackBuffer#1) num objects
    //#output(List getBackBuffer()): return_value
    //#new obj(List getBackBuffer()): new ArrayList(getBackBuffer#1)
    //#pre[2] (List getBackBuffer()): this.buffer != null
    //#post(List getBackBuffer()): return_value == &new ArrayList(getBackBuffer#1)
    //#post(List getBackBuffer()): new ArrayList(getBackBuffer#1) num objects == 1
    //#InputHandler.java:380: end of method: List com.dmdirc.ui.input.InputHandler.getBackBuffer()
    }

    /**
     * Handles tab completion of a string. Called when the user presses tab.
     */
    protected void doTabCompletion() {
        if (tabCompleter == null || (flags & HANDLE_BACKBUFFER) == 0) {
    //#InputHandler.java:387: method: void com.dmdirc.ui.input.InputHandler.doTabCompletion()
    //#input(void doTabCompletion()): this
    //#input(void doTabCompletion()): this.flags
    //#input(void doTabCompletion()): this.style
    //#input(void doTabCompletion()): this.tabCompleter
    //#input(void doTabCompletion()): this.target
    //#pre[9] (void doTabCompletion()): init'ed(this.tabCompleter)
    //#pre[5] (void doTabCompletion()): (soft) init'ed(this.flags)
    //#pre[8] (void doTabCompletion()): (soft) this.style != null
    //#pre[10] (void doTabCompletion()): (soft) this.target != null
    //#presumption(void doTabCompletion()): com.dmdirc.ui.interfaces.InputField:getCaretPosition(...)@398 >= -2_147_483_647
    //#presumption(void doTabCompletion()): com.dmdirc.ui.interfaces.InputField:getText(...)@391 != null
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionStyle:getResult
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionResult:getText
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setText
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionResult:getPosition
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setCaretPosition
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.List:isEmpty
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommand
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.commandparser.commands.IntelligentCommand:instanceof
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.List:subList
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:com.dmdirc.commandparser.commands.IntelligentCommand:getSuggestions
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void doTabCompletion()): Effects-of-calling:java.util.Arrays:asList
    //#test_vector(void doTabCompletion()): this.flags & 2: {1,2}, {0}
    //#test_vector(void doTabCompletion()): this.tabCompleter: Addr_Set{null}, Inverse{null}
    //#test_vector(void doTabCompletion()): java.lang.String:charAt(...)@403: {32}, {0..31, 33..65_535}
    //#test_vector(void doTabCompletion()): java.lang.String:charAt(...)@406: {0..31, 33..65_535}, {32}
    //#test_vector(void doTabCompletion()): java.lang.String:charAt(...)@411: {32}, {0..31, 33..65_535}
    //#test_vector(void doTabCompletion()): java.lang.String:isEmpty(...)@393: {0}, {1}
            return;
        }
        
        final String text = target.getText();
    //#InputHandler.java:391: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doTabCompletion()
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()

        if (text.isEmpty()) {
            doNormalTabCompletion(text, 0, 0, null);
            return;
        }

        final int pos = target.getCaretPosition() - 1;
    //#InputHandler.java:398: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.interfaces.InputField:getCaretPosition()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doTabCompletion()
    //#    unanalyzed callee: int com.dmdirc.ui.interfaces.InputField:getCaretPosition()
        int start = (pos < 0) ? 0 : pos;
        int end = (pos < 0) ? 0 : pos;

        // Traverse backwards
        while (start > 0 && text.charAt(start) != ' ') {
            start--;
        }
        if (text.charAt(start) == ' ') {
            start++;
        }

        // And forwards
        while (end < text.length() && text.charAt(end) != ' ') {
            end++;
        }

        if (start > end) {
            end = start;
        }

        if (start > 0 && text.charAt(0) == CommandManager.getCommandChar()) {
    //#InputHandler.java:419: Warning: method not available - call not analyzed
    //#    call on char com.dmdirc.commandparser.CommandManager:getCommandChar()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doTabCompletion()
    //#    unanalyzed callee: char com.dmdirc.commandparser.CommandManager:getCommandChar()
            doCommandTabCompletion(text, start, end);
        } else {
            doNormalTabCompletion(text, start, end, null);
        }
    }
    //#InputHandler.java:424: end of method: void com.dmdirc.ui.input.InputHandler.doTabCompletion()

    /**
     * Handles potentially intelligent tab completion.
     *
     * @param text The text that is being completed
     * @param start The start index of the word we're completing
     * @param end The end index of the word we're completing
     */
    private void doCommandTabCompletion(final String text, final int start,
            final int end) {
        doNormalTabCompletion(text, start, end,
    //#InputHandler.java:435: method: void com.dmdirc.ui.input.InputHandler.doCommandTabCompletion(String, int, int)
    //#input(void doCommandTabCompletion(String, int, int)): end
    //#input(void doCommandTabCompletion(String, int, int)): start
    //#input(void doCommandTabCompletion(String, int, int)): text
    //#input(void doCommandTabCompletion(String, int, int)): text._tainted
    //#input(void doCommandTabCompletion(String, int, int)): this
    //#input(void doCommandTabCompletion(String, int, int)): this.style
    //#input(void doCommandTabCompletion(String, int, int)): this.target
    //#pre[3] (void doCommandTabCompletion(String, int, int)): text != null
    //#pre[6] (void doCommandTabCompletion(String, int, int)): this.style != null
    //#pre[7] (void doCommandTabCompletion(String, int, int)): (soft) this.target != null
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionStyle:getResult
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionResult:getText
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setText
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.ui.input.tabstyles.TabCompletionResult:getPosition
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.ui.interfaces.InputField:setCaretPosition
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.List:isEmpty
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommandChar
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.commandparser.CommandManager:getCommand
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.commandparser.commands.IntelligentCommand:instanceof
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.List:subList
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:com.dmdirc.commandparser.commands.IntelligentCommand:getSuggestions
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void doCommandTabCompletion(String, int, int)): Effects-of-calling:java.util.Arrays:asList
                TabCompleter.getIntelligentResults(text.substring(0, start)));
    }
    //#InputHandler.java:437: end of method: void com.dmdirc.ui.input.InputHandler.doCommandTabCompletion(String, int, int)

    /**
     * Handles normal (non-intelligent-command) tab completion.
     *
     * @param text The text that is being completed
     * @param start The start index of the word we're completing
     * @param end The end index of the word we're completing
     * @param additional A list of additional strings to use
     */
    private void doNormalTabCompletion(final String text, final int start,
            final int end, final AdditionalTabTargets additional) {
        final TabCompletionResult res = style.getResult(text, start, end,
    //#InputHandler.java:449: method: void com.dmdirc.ui.input.InputHandler.doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#InputHandler.java:449: Warning: method not available - call not analyzed
    //#    call on TabCompletionResult com.dmdirc.ui.input.tabstyles.TabCompletionStyle:getResult(String, int, int, AdditionalTabTargets)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: TabCompletionResult com.dmdirc.ui.input.tabstyles.TabCompletionStyle:getResult(String, int, int, AdditionalTabTargets)
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): additional
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): end
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): start
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): text
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): this
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): this.style
    //#input(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): this.target
    //#pre[6] (void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): this.style != null
    //#pre[7] (void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): (soft) this.target != null
    //#test_vector(void doNormalTabCompletion(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.input.tabstyles.TabCompletionStyle:getResult(...)@449: Addr_Set{null}, Inverse{null}
                additional);

        if (res != null) {
            target.setText(res.getText());
    //#InputHandler.java:453: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.input.tabstyles.TabCompletionResult:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: String com.dmdirc.ui.input.tabstyles.TabCompletionResult:getText()
    //#InputHandler.java:453: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            target.setCaretPosition(res.getPosition());
    //#InputHandler.java:454: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.input.tabstyles.TabCompletionResult:getPosition()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: int com.dmdirc.ui.input.tabstyles.TabCompletionResult:getPosition()
    //#InputHandler.java:454: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void doNormalTabCompletion(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
        }
    }
    //#InputHandler.java:456: end of method: void com.dmdirc.ui.input.InputHandler.doNormalTabCompletion(String, int, int, AdditionalTabTargets)

    /**
     * Called when the user presses return in the text area. The line they
     * typed is added to the buffer for future use.
     * @param line The event that was fired
     */
    public void enterPressed(final String line) {
        if (!line.isEmpty()) {
    //#InputHandler.java:464: method: void com.dmdirc.ui.input.InputHandler.enterPressed(String)
    //#input(void enterPressed(String)): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void enterPressed(String)): __Descendant_Table[others]
    //#input(void enterPressed(String)): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#input(void enterPressed(String)): com.dmdirc.actions.CoreActionType.CLIENT_USER_INPUT
    //#input(void enterPressed(String)): line
    //#input(void enterPressed(String)): line._tainted
    //#input(void enterPressed(String)): this
    //#input(void enterPressed(String)): this.__Tag
    //#input(void enterPressed(String)): this.buffer
    //#input(void enterPressed(String)): this.commandParser
    //#input(void enterPressed(String)): this.listeners
    //#input(void enterPressed(String)): this.parentWindow
    //#pre[1] (void enterPressed(String)): line != null
    //#pre[7] (void enterPressed(String)): this.listeners != null
    //#pre[4] (void enterPressed(String)): (soft) this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[5] (void enterPressed(String)): (soft) this.buffer != null
    //#pre[6] (void enterPressed(String)): (soft) this.commandParser != null
    //#pre[8] (void enterPressed(String)): (soft) this.parentWindow != null
    //#presumption(void enterPressed(String)): init'ed(com.dmdirc.actions.CoreActionType.CLIENT_USER_INPUT)
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:wrappedText
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputValidationListener:legalCommand
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void enterPressed(String)): Effects-of-calling:com.dmdirc.util.RollingList:seekToEnd
    //#test_vector(void enterPressed(String)): java.lang.String:isEmpty(...)@464: {1}, {0}
            final StringBuffer thisBuffer = new StringBuffer(line);

            ActionManager.processEvent(CoreActionType.CLIENT_USER_INPUT, null,
    //#InputHandler.java:467: Warning: method not available - call not analyzed
    //#    call on WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void enterPressed(String)
    //#    unanalyzed callee: WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#InputHandler.java:467: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.actions.ActionManager:processEvent(ActionType, StringBuffer, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void enterPressed(String)
    //#    unanalyzed callee: void com.dmdirc.actions.ActionManager:processEvent(ActionType, StringBuffer, Object[])
                    parentWindow.getContainer(), thisBuffer);

            addToBuffer(thisBuffer.toString());

            commandParser.parseCommand(parentWindow, thisBuffer.toString());
    //#InputHandler.java:472: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.commandparser.parsers.CommandParser:parseCommand(InputWindow, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void enterPressed(String)
    //#    unanalyzed callee: void com.dmdirc.commandparser.parsers.CommandParser:parseCommand(InputWindow, String)
        }
        fireLineWrap(0);
        fireCommandPassed();
    }
    //#InputHandler.java:476: end of method: void com.dmdirc.ui.input.InputHandler.enterPressed(String)

    /**
     * Adds the specified control code to the textarea. If the user has a range
     * of text selected, the characters are added before and after, and the
     * caret is positioned based on the position argument.
     * @param code The control code to add
     * @param position The position of the caret after a selection is altered
     */
    protected void addControlCode(final int code, final int position) {
        final String insert = String.valueOf((char) code);
    //#InputHandler.java:486: method: void com.dmdirc.ui.input.InputHandler.addControlCode(int, int)
    //#input(void addControlCode(int, int)): code
    //#input(void addControlCode(int, int)): position
    //#input(void addControlCode(int, int)): this
    //#input(void addControlCode(int, int)): this.target
    //#pre[1] (void addControlCode(int, int)): code in {0..65_535}
    //#pre[4] (void addControlCode(int, int)): this.target != null
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getCaretPosition(...)@502 <= 4_294_967_294
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getSelectionEnd(...)@487 <= 4_294_967_293
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getText(...)@490 != null
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getText(...)@503 != null
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getText(...)@504 != null
    //#presumption(void addControlCode(int, int)): com.dmdirc.ui.interfaces.InputField:getText(...)@505 != null
    //#test_vector(void addControlCode(int, int)): position: {-2_147_483_648..0, 3..4_294_967_295}, {2}, {1}
        final int selectionEnd = target.getSelectionEnd();
    //#InputHandler.java:487: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.interfaces.InputField:getSelectionEnd()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: int com.dmdirc.ui.interfaces.InputField:getSelectionEnd()
        final int selectionStart = target.getSelectionStart();
    //#InputHandler.java:488: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.interfaces.InputField:getSelectionStart()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: int com.dmdirc.ui.interfaces.InputField:getSelectionStart()
        if (selectionStart < selectionEnd) {
            final String source = target.getText();
    //#InputHandler.java:490: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
            final String before = source.substring(0, selectionStart);
            final String selected = target.getSelectedText();
    //#InputHandler.java:492: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getSelectedText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getSelectedText()
            final String after =
                    source.substring(selectionEnd, source.length());
            target.setText(before + insert + selected + insert + after);
    //#InputHandler.java:495: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            if (position == POSITION_START) {
                target.setCaretPosition(selectionStart + 1);
    //#InputHandler.java:497: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
            } else if (position == POSITION_END) {
                target.setCaretPosition(selectionEnd + 2);
    //#InputHandler.java:499: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
            }
        } else {
            final int offset = target.getCaretPosition();
    //#InputHandler.java:502: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.interfaces.InputField:getCaretPosition()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: int com.dmdirc.ui.interfaces.InputField:getCaretPosition()
            final String source = target.getText();
    //#InputHandler.java:503: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
            final String before = target.getText().substring(0, offset);
    //#InputHandler.java:504: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
            final String after = target.getText().substring(offset,
    //#InputHandler.java:505: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.interfaces.InputField:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: String com.dmdirc.ui.interfaces.InputField:getText()
                    source.length());
            target.setText(before + insert + after);
    //#InputHandler.java:507: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setText(String)
            target.setCaretPosition(offset + 1);
    //#InputHandler.java:508: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addControlCode(int, int)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.InputField:setCaretPosition(int)
        }
    }
    //#InputHandler.java:510: end of method: void com.dmdirc.ui.input.InputHandler.addControlCode(int, int)

    /**
     * Adds all items in the string array to the buffer.
     *
     * @param lines lines to add to the buffer
     */
    public void addToBuffer(final String[] lines) {
        for (String line : lines) {
    //#InputHandler.java:518: method: void com.dmdirc.ui.input.InputHandler.addToBuffer(String[])
    //#input(void addToBuffer(String[])): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#input(void addToBuffer(String[])): __Descendant_Table[others]
    //#input(void addToBuffer(String[])): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#input(void addToBuffer(String[])): lines
    //#input(void addToBuffer(String[])): lines.length
    //#input(void addToBuffer(String[])): lines[0..4_294_967_295]
    //#input(void addToBuffer(String[])): this
    //#input(void addToBuffer(String[])): this.__Tag
    //#input(void addToBuffer(String[])): this.buffer
    //#pre[1] (void addToBuffer(String[])): lines != null
    //#pre[2] (void addToBuffer(String[])): lines.length <= 4_294_967_295
    //#pre[3] (void addToBuffer(String[])): (soft) init'ed(lines[0..4_294_967_295])
    //#pre[5] (void addToBuffer(String[])): (soft) this.__Tag == com/dmdirc/ui/input/InputHandler
    //#pre[6] (void addToBuffer(String[])): (soft) this.buffer != null
    //#unanalyzed(void addToBuffer(String[])): Effects-of-calling:com.dmdirc.util.RollingList:add
    //#unanalyzed(void addToBuffer(String[])): Effects-of-calling:com.dmdirc.util.RollingList:seekToEnd
            addToBuffer(line);
        }
    }
    //#InputHandler.java:521: end of method: void com.dmdirc.ui.input.InputHandler.addToBuffer(String[])

    /**
     * Adds the specified string to the buffer.
     * 
     * @param line The line to be added to the buffer
     */
    public void addToBuffer(final String line) {
        buffer.add(line);
    //#InputHandler.java:529: method: void com.dmdirc.ui.input.InputHandler.addToBuffer(String)
    //#InputHandler.java:529: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addToBuffer(String)
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)
    //#input(void addToBuffer(String)): line
    //#input(void addToBuffer(String)): this
    //#input(void addToBuffer(String)): this.buffer
    //#pre[3] (void addToBuffer(String)): this.buffer != null
        buffer.seekToEnd();
    //#InputHandler.java:530: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList:seekToEnd()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void addToBuffer(String)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList:seekToEnd()
    }
    //#InputHandler.java:531: end of method: void com.dmdirc.ui.input.InputHandler.addToBuffer(String)

    /** {@inheritDoc} */
    @Override
    public void configChanged(final String domain, final String key) {
        setStyle();
    //#InputHandler.java:536: method: void com.dmdirc.ui.input.InputHandler.configChanged(String, String)
    //#InputHandler.java:536: Warning: call too complex - analysis skipped
    //#    call on void setStyle()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.ui.input.InputHandler
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: void setStyle()
    //#input(void configChanged(String, String)): this
    //#output(void configChanged(String, String)): this.style
    //#post(void configChanged(String, String)): this.style == old this.style
    }
    //#InputHandler.java:537: end of method: void com.dmdirc.ui.input.InputHandler.configChanged(String, String)
}
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addControlCode(II)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addDownHandler()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addEnterHandler()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addKeyHandler()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addTabHandler()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addToBuffer([Ljava/lang/String;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addUpHandler()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addValidationListener(Lcom/dmdirc/ui/interfaces/InputValidationListener;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doBufferDown()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doBufferUp()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doCommandTabCompletion(Ljava/lang/String;II)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doNormalTabCompletion(Ljava/lang/String;IILcom/dmdirc/ui/input/AdditionalTabTargets;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doTabCompletion()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.enterPressed(Ljava/lang/String;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireCommandFailure(Ljava/lang/String;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireCommandPassed()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireLineWrap(I)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.getBackBuffer()Ljava/util/List;
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.handleControlKey(Ljava/lang/String;IZ)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.handleKeyPressed(Ljava/lang/String;IZZ)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setStyle()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setTabCompleter(Lcom/dmdirc/ui/input/TabCompleter;)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setTypes(ZZZZ)V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.validateText()V
    //#output(com.dmdirc.ui.input.InputHandler__static_init): com/dmdirc/interfaces/ConfigChangeListener.__Descendant_Table[com/dmdirc/ui/input/InputHandler]
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Descendant_Table[com/dmdirc/ui/input/InputHandler] == &__Dispatch_Table
    //#post(com.dmdirc.ui.input.InputHandler__static_init): com/dmdirc/interfaces/ConfigChangeListener.__Descendant_Table[com/dmdirc/ui/input/InputHandler] == &__Dispatch_Table
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addControlCode(II)V == &addControlCode
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addDownHandler()V == &addDownHandler
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addEnterHandler()V == &addEnterHandler
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addKeyHandler()V == &addKeyHandler
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addTabHandler()V == &addTabHandler
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addToBuffer(Ljava/lang/String;)V == &addToBuffer
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addToBuffer([Ljava/lang/String;)V == &addToBuffer
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addUpHandler()V == &addUpHandler
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.addValidationListener(Lcom/dmdirc/ui/interfaces/InputValidationListener;)V == &addValidationListener
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doBufferDown()V == &doBufferDown
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doBufferUp()V == &doBufferUp
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doCommandTabCompletion(Ljava/lang/String;II)V == &doCommandTabCompletion
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doNormalTabCompletion(Ljava/lang/String;IILcom/dmdirc/ui/input/AdditionalTabTargets;)V == &doNormalTabCompletion
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.doTabCompletion()V == &doTabCompletion
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.enterPressed(Ljava/lang/String;)V == &enterPressed
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireCommandFailure(Ljava/lang/String;)V == &fireCommandFailure
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireCommandPassed()V == &fireCommandPassed
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.fireLineWrap(I)V == &fireLineWrap
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.getBackBuffer()Ljava/util/List; == &getBackBuffer
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.handleControlKey(Ljava/lang/String;IZ)V == &handleControlKey
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.handleKeyPressed(Ljava/lang/String;IZZ)V == &handleKeyPressed
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setStyle()V == &setStyle
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setTabCompleter(Lcom/dmdirc/ui/input/TabCompleter;)V == &setTabCompleter
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.setTypes(ZZZZ)V == &setTypes
    //#post(com.dmdirc.ui.input.InputHandler__static_init): __Dispatch_Table.validateText()V == &validateText
    //#InputHandler.java:: end of method: com.dmdirc.ui.input.InputHandler.com.dmdirc.ui.input.InputHandler__static_init
    //#InputHandler.java:: end of class: com.dmdirc.ui.input.InputHandler
