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

package com.dmdirc.addons.ui_swing.dialogs.prefs;

import com.dmdirc.addons.ui_swing.components.renderers.URISchemeCellRenderer;
import com.dmdirc.addons.ui_swing.components.renderers.URIHandlerCellRenderer;
import com.dmdirc.config.IdentityManager;
import com.dmdirc.config.prefs.PreferencesInterface;
import com.dmdirc.config.prefs.validator.URLProtocolValidator;
import com.dmdirc.addons.ui_swing.components.PackingTable;
import com.dmdirc.addons.ui_swing.components.StandardInputDialog;
import com.dmdirc.addons.ui_swing.components.URLProtocolPanel;

import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellRenderer;

import net.miginfocom.swing.MigLayout;

/**
 * URL Config panel. List all known url protocols and allows them to be 
 * configured.
 */
public class URLConfigPanel extends JPanel implements
    //#URLConfigPanel.java:59: method: URLHandlerTableModel com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.access$000(URLConfigPanel)
    //#input(URLHandlerTableModel access$000(URLConfigPanel)): x0
    //#input(URLHandlerTableModel access$000(URLConfigPanel)): x0.model
    //#output(URLHandlerTableModel access$000(URLConfigPanel)): return_value
    //#pre[1] (URLHandlerTableModel access$000(URLConfigPanel)): x0 != null
    //#pre[2] (URLHandlerTableModel access$000(URLConfigPanel)): init'ed(x0.model)
    //#post(URLHandlerTableModel access$000(URLConfigPanel)): return_value == x0.model
    //#post(URLHandlerTableModel access$000(URLConfigPanel)): init'ed(return_value)
    //#URLConfigPanel.java:59: end of method: URLHandlerTableModel com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.access$000(URLConfigPanel)
    //#URLConfigPanel.java:59: method: Map com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.access$100(URLConfigPanel)
    //#input(Map access$100(URLConfigPanel)): x0
    //#input(Map access$100(URLConfigPanel)): x0.details
    //#output(Map access$100(URLConfigPanel)): return_value
    //#pre[1] (Map access$100(URLConfigPanel)): x0 != null
    //#pre[2] (Map access$100(URLConfigPanel)): init'ed(x0.details)
    //#post(Map access$100(URLConfigPanel)): return_value == x0.details
    //#post(Map access$100(URLConfigPanel)): init'ed(return_value)
    //#URLConfigPanel.java:59: end of method: Map com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.access$100(URLConfigPanel)
        ListSelectionListener, ActionListener, PreferencesInterface {

    /**
     * A version number for this class. It should be changed whenever the class
     * structure is changed (or anything else that would prevent serialized
     * objects being unserialized with the new class).
     */
    private static final long serialVersionUID = 1;
    /** Protocol list. */
    private PackingTable table;
    /** Table mode. */
    private URLHandlerTableModel model;
    /** Table scrollpane. */
    private JScrollPane tableScrollPane;
    /** Protocol config panel. */
    private Map<URI, URLProtocolPanel> details;
    /** Empty info panel. */
    private URLProtocolPanel empty;
    /** Current component. */
    private URLProtocolPanel activeComponent;
    /** Add button. */
    private JButton add;
    /** Removed button. */
    private JButton remove;
    /** Selected row. */
    private int selectedRow;
    /** Parent window. */
    private Window parentWindow;

    /**
     * Instantiates a new URL config panel.
     * 
     * @param parentWindow Parent window
     */
    public URLConfigPanel(final Window parentWindow) {
        super();
    //#URLConfigPanel.java:95: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): ":..example.test.com"._tainted
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): "ins 0, wrap 1, hmax "._tainted
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.addURI(Ljava/net/URI;)V
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): parentWindow
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#1) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new HashMap(initComponents#4) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#6) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#7) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JScrollPane(initComponents#1) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3).__Tag
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3).this$0
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).__Tag
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).handlers
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).uris
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLProtocolPanel(initComponents#5) num objects
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.activeComponent
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.add
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.details
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.empty
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.model
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.parentWindow
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.remove
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.selectedRow
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.table
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.tableScrollPane
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#1)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#2)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new HashMap(initComponents#4)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#6)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#7)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JScrollPane(initComponents#1)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2)
    //#new obj(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLProtocolPanel(initComponents#5)
    //#pre[1] (void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): init'ed(com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.activeComponent == &new URLProtocolPanel(initComponents#5)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.empty == &new URLProtocolPanel(initComponents#5)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.add == &new JButton(initComponents#6)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.details == &new HashMap(initComponents#4)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.model == &new URLHandlerTableModel(initComponents#2)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.parentWindow == parentWindow
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): init'ed(this.parentWindow)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.remove == &new JButton(initComponents#7)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.selectedRow == -1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.table == &new URLConfigPanel$1(initComponents#3)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): this.tableScrollPane == &new JScrollPane(initComponents#1)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#1) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new ArrayList(URLHandlerTableModel#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new HashMap(initComponents#4) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#6) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JButton(initComponents#7) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new JScrollPane(initComponents#1) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLProtocolPanel(initComponents#5) num objects == 1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3).__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3).this$0 == this
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLConfigPanel$1(initComponents#3).this$0 != null
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).handlers == &new ArrayList(URLHandlerTableModel#2)
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): new URLHandlerTableModel(initComponents#2).uris == &new ArrayList(URLHandlerTableModel#1)
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:removeAll
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:net.miginfocom.swing.MigLayout
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setLayout
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:getSelectionModel
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.ListSelectionModel:addListSelectionListener
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.JButton:addActionListener
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.net.URI
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.JScrollPane
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.table.AbstractTableModel
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateRowSorter
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateColumnsFromModel
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setColumnSelectionAllowed
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setCellSelectionEnabled
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setFillsViewportHeight
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setRowSelectionAllowed
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:setSelectionMode
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.RowSorter:toggleSortOrder
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.URLProtocolPanel
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.JButton
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:javax.swing.JScrollPane:setViewportView
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.net.URI:getScheme
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableRowsInserted
    //#unanalyzed(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)): Effects-of-calling:java.util.Map:put
        
        this.parentWindow = parentWindow;

        initComponents();
        addListeners();
        layoutComponents();
        selectedRow = -1;
    }
    //#URLConfigPanel.java:103: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel(Window)

    /**
     * Initialises the components.
     */
    private void initComponents() {
        tableScrollPane = new JScrollPane();
    //#URLConfigPanel.java:109: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.initComponents()
    //#input(void initComponents()): ":..example.test.com"._tainted
    //#input(void initComponents()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(void initComponents()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(void initComponents()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.addURI(Ljava/net/URI;)V
    //#input(void initComponents()): this
    //#input(void initComponents()): this.model.__Tag
    //#input(void initComponents()): this.model.handlers
    //#input(void initComponents()): this.model.uris
    //#output(void initComponents()): new ArrayList(URLHandlerTableModel#1) num objects
    //#output(void initComponents()): new ArrayList(URLHandlerTableModel#2) num objects
    //#output(void initComponents()): new HashMap(initComponents#4) num objects
    //#output(void initComponents()): new JButton(initComponents#6) num objects
    //#output(void initComponents()): new JButton(initComponents#7) num objects
    //#output(void initComponents()): new JScrollPane(initComponents#1) num objects
    //#output(void initComponents()): new URLConfigPanel$1(initComponents#3) num objects
    //#output(void initComponents()): this.table.__Tag
    //#output(void initComponents()): this.table.this$0
    //#output(void initComponents()): new URLHandlerTableModel(initComponents#2) num objects
    //#output(void initComponents()): this.model.__Tag
    //#output(void initComponents()): this.model.handlers
    //#output(void initComponents()): this.model.uris
    //#output(void initComponents()): new URLProtocolPanel(initComponents#5) num objects
    //#output(void initComponents()): this.activeComponent
    //#output(void initComponents()): this.add
    //#output(void initComponents()): this.details
    //#output(void initComponents()): this.empty
    //#output(void initComponents()): this.model
    //#output(void initComponents()): this.remove
    //#output(void initComponents()): this.table
    //#output(void initComponents()): this.tableScrollPane
    //#new obj(void initComponents()): new ArrayList(URLHandlerTableModel#1)
    //#new obj(void initComponents()): new ArrayList(URLHandlerTableModel#2)
    //#new obj(void initComponents()): new HashMap(initComponents#4)
    //#new obj(void initComponents()): new JButton(initComponents#6)
    //#new obj(void initComponents()): new JButton(initComponents#7)
    //#new obj(void initComponents()): new JScrollPane(initComponents#1)
    //#new obj(void initComponents()): new URLConfigPanel$1(initComponents#3)
    //#new obj(void initComponents()): new URLHandlerTableModel(initComponents#2)
    //#new obj(void initComponents()): new URLProtocolPanel(initComponents#5)
    //#presumption(void initComponents()): com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter(...)@136 != null
    //#presumption(void initComponents()): com.dmdirc.config.ConfigManager:getOptions(...)@146 != null
    //#presumption(void initComponents()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@146 != null
    //#presumption(void initComponents()): java.util.Map:keySet(...)@146 != null
    //#post(void initComponents()): this.activeComponent == &new URLProtocolPanel(initComponents#5)
    //#post(void initComponents()): this.empty == &new URLProtocolPanel(initComponents#5)
    //#post(void initComponents()): this.add == &new JButton(initComponents#6)
    //#post(void initComponents()): this.details == &new HashMap(initComponents#4)
    //#post(void initComponents()): this.model == &new URLHandlerTableModel(initComponents#2)
    //#post(void initComponents()): this.remove == &new JButton(initComponents#7)
    //#post(void initComponents()): this.table == &new URLConfigPanel$1(initComponents#3)
    //#post(void initComponents()): this.tableScrollPane == &new JScrollPane(initComponents#1)
    //#post(void initComponents()): new ArrayList(URLHandlerTableModel#1) num objects == 1
    //#post(void initComponents()): new ArrayList(URLHandlerTableModel#2) num objects == 1
    //#post(void initComponents()): new HashMap(initComponents#4) num objects == 1
    //#post(void initComponents()): new JButton(initComponents#6) num objects == 1
    //#post(void initComponents()): new JButton(initComponents#7) num objects == 1
    //#post(void initComponents()): new JScrollPane(initComponents#1) num objects == 1
    //#post(void initComponents()): new URLConfigPanel$1(initComponents#3) num objects == 1
    //#post(void initComponents()): new URLHandlerTableModel(initComponents#2) num objects == 1
    //#post(void initComponents()): new URLProtocolPanel(initComponents#5) num objects == 1
    //#post(void initComponents()): this.table.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$1
    //#post(void initComponents()): this.table.this$0 == this
    //#post(void initComponents()): this.table.this$0 != null
    //#post(void initComponents()): this.model.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#post(void initComponents()): this.model.handlers == &new ArrayList(URLHandlerTableModel#2)
    //#post(void initComponents()): this.model.uris == &new ArrayList(URLHandlerTableModel#1)
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void initComponents()): Effects-of-calling:javax.swing.table.AbstractTableModel
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void initComponents()): Effects-of-calling:java.net.URI:getScheme
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableRowsInserted
    //#test_vector(void initComponents()): java.util.Iterator:hasNext(...)@149: {0}, {1}
        model = new URLHandlerTableModel();
        table = new PackingTable(model, false, tableScrollPane) {
    //#URLConfigPanel.java:111: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)
    //#URLConfigPanel.java:111: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable(TableModel, bool, JScrollPane)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1
    //#    method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable(TableModel, bool, JScrollPane)
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): Param_1
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): this
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): x0
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): x1
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): x2
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): this.this$0
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)): init'ed(this.this$0)
    //#URLConfigPanel.java:111: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1(URLConfigPanel, TableModel, bool, JScrollPane)

            private static final long serialVersionUID = 1;

            /** {@inheritDoc} */
            @Override
            public TableCellRenderer getCellRenderer(final int row,
                    final int column) {
                switch (column) {
    //#URLConfigPanel.java:119: method: TableCellRenderer com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1.getCellRenderer(int, int)
    //#input(TableCellRenderer getCellRenderer(int, int)): column
    //#input(TableCellRenderer getCellRenderer(int, int)): row
    //#input(TableCellRenderer getCellRenderer(int, int)): this
    //#output(TableCellRenderer getCellRenderer(int, int)): new URIHandlerCellRenderer(getCellRenderer#2) num objects
    //#output(TableCellRenderer getCellRenderer(int, int)): new URIHandlerCellRenderer(getCellRenderer#2).__Tag
    //#output(TableCellRenderer getCellRenderer(int, int)): new URISchemeCellRenderer(getCellRenderer#1) num objects
    //#output(TableCellRenderer getCellRenderer(int, int)): new URISchemeCellRenderer(getCellRenderer#1).__Tag
    //#output(TableCellRenderer getCellRenderer(int, int)): return_value
    //#new obj(TableCellRenderer getCellRenderer(int, int)): new URIHandlerCellRenderer(getCellRenderer#2)
    //#new obj(TableCellRenderer getCellRenderer(int, int)): new URISchemeCellRenderer(getCellRenderer#1)
    //#post(TableCellRenderer getCellRenderer(int, int)): init'ed(return_value)
    //#post(TableCellRenderer getCellRenderer(int, int)): new URIHandlerCellRenderer(getCellRenderer#2) num objects <= 1
    //#post(TableCellRenderer getCellRenderer(int, int)): new URIHandlerCellRenderer(getCellRenderer#2).__Tag == com/dmdirc/addons/ui_swing/components/renderers/URIHandlerCellRenderer
    //#post(TableCellRenderer getCellRenderer(int, int)): new URISchemeCellRenderer(getCellRenderer#1) num objects <= 1
    //#post(TableCellRenderer getCellRenderer(int, int)): new URISchemeCellRenderer(getCellRenderer#1).__Tag == com/dmdirc/addons/ui_swing/components/renderers/URISchemeCellRenderer
    //#unanalyzed(TableCellRenderer getCellRenderer(int, int)): Effects-of-calling:javax.swing.table.DefaultTableCellRenderer
    //#test_vector(TableCellRenderer getCellRenderer(int, int)): column: {0}, {1}, {-2_147_483_648..-1, 2..4_294_967_295}
                    case 0:
                        return new URISchemeCellRenderer();
                    case 1:
                        return new URIHandlerCellRenderer();
                    default:
                        return super.getCellRenderer(row, column);
    //#URLConfigPanel.java:125: Warning: method not available - call not analyzed
    //#    call on TableCellRenderer com.dmdirc.addons.ui_swing.components.PackingTable:getCellRenderer(int, int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1
    //#    method: TableCellRenderer getCellRenderer(int, int)
    //#    unanalyzed callee: TableCellRenderer com.dmdirc.addons.ui_swing.components.PackingTable:getCellRenderer(int, int)
    //#URLConfigPanel.java:125: end of method: TableCellRenderer com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1.getCellRenderer(int, int)
                }
            }
        };
        table.setAutoCreateRowSorter(true);
    //#URLConfigPanel.java:129: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateRowSorter(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateRowSorter(bool)
        table.setAutoCreateColumnsFromModel(true);
    //#URLConfigPanel.java:130: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateColumnsFromModel(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setAutoCreateColumnsFromModel(bool)
        table.setColumnSelectionAllowed(false);
    //#URLConfigPanel.java:131: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setColumnSelectionAllowed(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setColumnSelectionAllowed(bool)
        table.setCellSelectionEnabled(false);
    //#URLConfigPanel.java:132: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setCellSelectionEnabled(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setCellSelectionEnabled(bool)
        table.setFillsViewportHeight(false);
    //#URLConfigPanel.java:133: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setFillsViewportHeight(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setFillsViewportHeight(bool)
        table.setRowSelectionAllowed(true);
    //#URLConfigPanel.java:134: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setRowSelectionAllowed(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setRowSelectionAllowed(bool)
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    //#URLConfigPanel.java:135: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.PackingTable:setSelectionMode(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.PackingTable:setSelectionMode(int)
        table.getRowSorter().toggleSortOrder(0);
    //#URLConfigPanel.java:136: Warning: method not available - call not analyzed
    //#    call on RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
        details = new HashMap<URI, URLProtocolPanel>();
        empty = new URLProtocolPanel(null, true);
    //#URLConfigPanel.java:138: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
        activeComponent = empty;
        add = new JButton("Add");
        remove = new JButton("Remove");
        remove.setEnabled(false);

        tableScrollPane.setViewportView(table);

        final Set<String> options = IdentityManager.getGlobalConfig().
    //#URLConfigPanel.java:146: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#URLConfigPanel.java:146: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: Map com.dmdirc.config.ConfigManager:getOptions(String)
                getOptions("protocol").keySet();

        for (String option : options) {
            try {
                final URI uri = new URI(option + "://example.test.com");
                model.addURI(uri);
                details.put(uri, new URLProtocolPanel(uri, true));
    //#URLConfigPanel.java:153: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
            } catch (URISyntaxException ex) {
                //Ignore wont happen
            }
        }
    }
    //#URLConfigPanel.java:158: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.initComponents()

    /**
     * Adds listeners.
     */
    private void addListeners() {
        table.getSelectionModel().addListSelectionListener(this);
    //#URLConfigPanel.java:164: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.addListeners()
    //#URLConfigPanel.java:164: Warning: method not available - call not analyzed
    //#    call on ListSelectionModel com.dmdirc.addons.ui_swing.components.PackingTable:getSelectionModel()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void addListeners()
    //#    unanalyzed callee: ListSelectionModel com.dmdirc.addons.ui_swing.components.PackingTable:getSelectionModel()
    //#input(void addListeners()): this
    //#input(void addListeners()): this.add
    //#input(void addListeners()): this.remove
    //#input(void addListeners()): this.table
    //#pre[2] (void addListeners()): this.add != null
    //#pre[3] (void addListeners()): this.remove != null
    //#pre[4] (void addListeners()): this.table != null
    //#presumption(void addListeners()): com.dmdirc.addons.ui_swing.components.PackingTable:getSelectionModel(...)@164 != null
        add.addActionListener(this);
        remove.addActionListener(this);
    }
    //#URLConfigPanel.java:167: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.addListeners()

    /**
     * Lays out the components.
     */
    private void layoutComponents() {
        removeAll();
    //#URLConfigPanel.java:173: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.layoutComponents()
    //#URLConfigPanel.java:173: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:removeAll()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:removeAll()
    //#input(void layoutComponents()): "ins 0, wrap 1, hmax "._tainted
    //#input(void layoutComponents()): com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT
    //#input(void layoutComponents()): this
    //#input(void layoutComponents()): this.activeComponent
    //#input(void layoutComponents()): this.add
    //#input(void layoutComponents()): this.remove
    //#input(void layoutComponents()): this.tableScrollPane
    //#pre[1] (void layoutComponents()): init'ed(com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT)
    //#pre[3] (void layoutComponents()): init'ed(this.activeComponent)
    //#pre[4] (void layoutComponents()): init'ed(this.add)
    //#pre[5] (void layoutComponents()): init'ed(this.remove)
    //#pre[6] (void layoutComponents()): init'ed(this.tableScrollPane)
        setLayout(new MigLayout("ins 0, wrap 1, hmax " +
    //#URLConfigPanel.java:174: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
    //#URLConfigPanel.java:174: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setLayout(LayoutManager)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setLayout(LayoutManager)
                SwingPreferencesDialog.CLIENT_HEIGHT));

        add(tableScrollPane, "growx, pushx");
    //#URLConfigPanel.java:177: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
        add(add, "split 2, growx, pushx");
    //#URLConfigPanel.java:178: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
        add(remove, "growx, pushx");
    //#URLConfigPanel.java:179: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
        add(activeComponent, "growx, pushx");
    //#URLConfigPanel.java:180: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void layoutComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add(Component, Object)
    }
    //#URLConfigPanel.java:181: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.layoutComponents()

    /** {@inheritDoc} */
    @Override
    public void save() {
        valueChanged(null);
    //#URLConfigPanel.java:186: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.save()
    //#input(void save()): " >= "._tainted
    //#input(void save()): ":..example.test.com"._tainted
    //#input(void save()): "Unknown column: "._tainted
    //#input(void save()): "ins 0, wrap 1, hmax "._tainted
    //#input(void save()): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel]
    //#input(void save()): __Descendant_Table[others]
    //#input(void save()): __Dispatch_Table.valueChanged(Ljavax/swing/event/ListSelectionEvent;)V
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.getRowCount()I
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.getURLHandlers()Ljava/util/Map;
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.getValueAt(II)Ljava/lang/Object;
    //#input(void save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.setValueAt(Ljava/lang/Object;II)V
    //#input(void save()): this
    //#input(void save()): this.__Tag
    //#input(void save()): this.add
    //#input(void save()): this.details
    //#input(void save()): this.empty
    //#input(void save()): this.model
    //#input(void save()): this.model.__Tag
    //#input(void save()): this.model.handlers
    //#input(void save()): this.model.uris
    //#input(void save()): this.remove
    //#input(void save()): this.selectedRow
    //#input(void save()): this.table
    //#input(void save()): this.tableScrollPane
    //#output(void save()): this.activeComponent
    //#output(void save()): this.selectedRow
    //#pre[5] (void save()): this.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel
    //#pre[1] (void save()): (soft) init'ed(com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT)
    //#pre[3] (void save()): (soft) this.selectedRow >= -1
    //#pre[6] (void save()): (soft) this.add != null
    //#pre[7] (void save()): (soft) this.details != null
    //#pre[8] (void save()): (soft) init'ed(this.empty)
    //#pre[9] (void save()): (soft) this.model != null
    //#pre[10] (void save()): (soft) this.model.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#pre[11] (void save()): (soft) this.model.handlers != null
    //#pre[12] (void save()): (soft) this.model.uris != null
    //#pre[13] (void save()): (soft) this.remove != null
    //#pre[14] (void save()): (soft) this.table != null
    //#pre[15] (void save()): (soft) init'ed(this.tableScrollPane)
    //#presumption(void save()): com.dmdirc.config.ConfigManager:getOptions(...)@188 != null
    //#presumption(void save()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@188 != null
    //#presumption(void save()): java.util.Iterator:next(...)@204 != null
    //#presumption(void save()): java.util.Map:entrySet(...)@204 != null
    //#presumption(void save()): java.util.Map:get(...)@198 != null
    //#presumption(void save()): java.util.Map:keySet(...)@188 != null
    //#presumption(void save()): java.util.Map_Entry:getKey(...)@205 != null
    //#presumption(void save()): java.util.Map_Entry:getValue(...)@205 != null
    //#post(void save()): possibly_updated(this.activeComponent)
    //#post(void save()): init'ed(this.selectedRow)
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.IdentityManager:getConfigIdentity
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.Identity:unsetOption
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.Identity:setOption
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:removeAll
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void save()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void save()): Effects-of-calling:net.miginfocom.swing.MigLayout
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setLayout
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add
    //#unanalyzed(void save()): Effects-of-calling:javax.swing.event.ListSelectionEvent:getValueIsAdjusting
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setVisible
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void save()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void save()): Effects-of-calling:java.lang.IndexOutOfBoundsException
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.URLProtocolPanel:getSelection
    //#unanalyzed(void save()): Effects-of-calling:java.net.URI:instanceof
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:set
    //#unanalyzed(void save()): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableCellUpdated
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow
    //#unanalyzed(void save()): Effects-of-calling:javax.swing.JButton:setEnabled
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter
    //#unanalyzed(void save()): Effects-of-calling:javax.swing.RowSorter:convertRowIndexToModel
    //#unanalyzed(void save()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void save()): Effects-of-calling:java.util.Map:put
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@190: {0}, {1}
    //#test_vector(void save()): java.util.Iterator:hasNext(...)@204: {0}, {1}
    //#test_vector(void save()): java.util.Map:containsKey(...)@197: {0}, {1}
        final Map<URI, String> handlers = model.getURLHandlers();
        final Set<String> protocols = IdentityManager.getGlobalConfig().
    //#URLConfigPanel.java:188: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void save()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#URLConfigPanel.java:188: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.config.ConfigManager:getOptions(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void save()
    //#    unanalyzed callee: Map com.dmdirc.config.ConfigManager:getOptions(String)
                getOptions("protocol").keySet();
        for (String protocol : protocols) {
            URI uri;
            try {
                uri = new URI(protocol + "://example.test.com");
            } catch (URISyntaxException ex) {
                uri = null;
            }
            if (uri != null && handlers.containsKey(uri)) {
                saveHandler(protocol, handlers.get(uri));
            } else {
                saveHandler(protocol, "");
            }
            handlers.remove(uri);
        }
        for (Entry<URI, String> entry : handlers.entrySet()) {
            saveHandler(entry.getKey().getScheme(), entry.getValue());
        }
    }
    //#URLConfigPanel.java:207: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.save()

    /**
     * Saves or updates a handler to the config.
     * 
     * @param protocol Protocol for the handler
     * @param handler Handler for the protocol
     */
    private void saveHandler(final String protocol, final String handler) {
        if (handler.isEmpty()) {
    //#URLConfigPanel.java:216: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.saveHandler(String, String)
    //#input(void saveHandler(String, String)): handler
    //#input(void saveHandler(String, String)): protocol
    //#pre[1] (void saveHandler(String, String)): handler != null
    //#presumption(void saveHandler(String, String)): com.dmdirc.config.IdentityManager:getConfigIdentity(...)@217 != null
    //#presumption(void saveHandler(String, String)): com.dmdirc.config.IdentityManager:getConfigIdentity(...)@220 != null
    //#test_vector(void saveHandler(String, String)): java.lang.String:isEmpty(...)@216: {0}, {1}
            IdentityManager.getConfigIdentity().unsetOption("protocol",
    //#URLConfigPanel.java:217: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void saveHandler(String, String)
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#URLConfigPanel.java:217: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:unsetOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void saveHandler(String, String)
    //#    unanalyzed callee: void com.dmdirc.config.Identity:unsetOption(String, String)
                    protocol);
        } else {
            IdentityManager.getConfigIdentity().setOption("protocol",
    //#URLConfigPanel.java:220: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void saveHandler(String, String)
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#URLConfigPanel.java:220: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:setOption(String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void saveHandler(String, String)
    //#    unanalyzed callee: void com.dmdirc.config.Identity:setOption(String, String, String)
                    protocol, handler);

        }

    }
    //#URLConfigPanel.java:225: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.saveHandler(String, String)

    /** {@inheritDoc} */
    @Override
    public void valueChanged(final ListSelectionEvent e) {
        if (e == null || !e.getValueIsAdjusting()) {
    //#URLConfigPanel.java:230: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.valueChanged(ListSelectionEvent)
    //#input(void valueChanged(ListSelectionEvent)): " >= "._tainted
    //#input(void valueChanged(ListSelectionEvent)): "Unknown column: "._tainted
    //#input(void valueChanged(ListSelectionEvent)): "ins 0, wrap 1, hmax "._tainted
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.getRowCount()I
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.getValueAt(II)Ljava/lang/Object;
    //#input(void valueChanged(ListSelectionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.setValueAt(Ljava/lang/Object;II)V
    //#input(void valueChanged(ListSelectionEvent)): e
    //#input(void valueChanged(ListSelectionEvent)): this
    //#input(void valueChanged(ListSelectionEvent)): this.add
    //#input(void valueChanged(ListSelectionEvent)): this.details
    //#input(void valueChanged(ListSelectionEvent)): this.empty
    //#input(void valueChanged(ListSelectionEvent)): this.model
    //#input(void valueChanged(ListSelectionEvent)): this.model.__Tag
    //#input(void valueChanged(ListSelectionEvent)): this.model.handlers
    //#input(void valueChanged(ListSelectionEvent)): this.model.uris
    //#input(void valueChanged(ListSelectionEvent)): this.remove
    //#input(void valueChanged(ListSelectionEvent)): this.selectedRow
    //#input(void valueChanged(ListSelectionEvent)): this.table
    //#input(void valueChanged(ListSelectionEvent)): this.tableScrollPane
    //#output(void valueChanged(ListSelectionEvent)): this.activeComponent
    //#output(void valueChanged(ListSelectionEvent)): this.selectedRow
    //#pre[1] (void valueChanged(ListSelectionEvent)): (soft) init'ed(com/dmdirc/addons/ui_swing/dialogs/prefs/SwingPreferencesDialog.CLIENT_HEIGHT)
    //#pre[4] (void valueChanged(ListSelectionEvent)): (soft) this.selectedRow >= -1
    //#pre[6] (void valueChanged(ListSelectionEvent)): (soft) this.add != null
    //#pre[7] (void valueChanged(ListSelectionEvent)): (soft) this.details != null
    //#pre[8] (void valueChanged(ListSelectionEvent)): (soft) init'ed(this.empty)
    //#pre[9] (void valueChanged(ListSelectionEvent)): (soft) this.model != null
    //#pre[10] (void valueChanged(ListSelectionEvent)): (soft) this.model.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#pre[11] (void valueChanged(ListSelectionEvent)): (soft) this.model.handlers != null
    //#pre[12] (void valueChanged(ListSelectionEvent)): (soft) this.model.uris != null
    //#pre[13] (void valueChanged(ListSelectionEvent)): (soft) this.remove != null
    //#pre[14] (void valueChanged(ListSelectionEvent)): (soft) this.table != null
    //#pre[15] (void valueChanged(ListSelectionEvent)): (soft) init'ed(this.tableScrollPane)
    //#presumption(void valueChanged(ListSelectionEvent)): com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter(...)@244 != null
    //#presumption(void valueChanged(ListSelectionEvent)): com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter(...)@250 != null
    //#presumption(void valueChanged(ListSelectionEvent)): java.util.Map:get(...)@233 != null
    //#presumption(void valueChanged(ListSelectionEvent)): javax.swing.RowSorter:convertRowIndexToModel(...)@244 in {0..4_294_967_294}
    //#post(void valueChanged(ListSelectionEvent)): possibly_updated(this.activeComponent)
    //#post(void valueChanged(ListSelectionEvent)): init'ed(this.selectedRow)
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:removeAll
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:net.miginfocom.swing.MigLayout
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setLayout
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:add
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.IndexOutOfBoundsException
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.net.URI:instanceof
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.util.List:set
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void valueChanged(ListSelectionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableCellUpdated
    //#test_vector(void valueChanged(ListSelectionEvent)): e: Addr_Set{null}, Inverse{null}
    //#test_vector(void valueChanged(ListSelectionEvent)): this.selectedRow: {-1}, {0..4_294_967_294}
    //#test_vector(void valueChanged(ListSelectionEvent)): com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow(...)@237: {-2_147_483_648..-2, 0..4_294_967_295}, {-1}
    //#test_vector(void valueChanged(ListSelectionEvent)): javax.swing.event.ListSelectionEvent:getValueIsAdjusting(...)@230: {1}, {0}
            setVisible(false);
    //#URLConfigPanel.java:231: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setVisible(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setVisible(bool)
            if (selectedRow != -1 && selectedRow < model.getRowCount()) {
                final URLProtocolPanel panel =
                        details.get(model.getValueAt(selectedRow, 0));
                model.setValueAt(panel.getSelection(), selectedRow, 1);
    //#URLConfigPanel.java:235: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.ui_swing.components.URLProtocolPanel:getSelection()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: String com.dmdirc.addons.ui_swing.components.URLProtocolPanel:getSelection()
            }
            if (table.getSelectedRow() == -1) {
    //#URLConfigPanel.java:237: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
                activeComponent = empty;
                layoutComponents();
                add.setEnabled(false);
                remove.setEnabled(false);
                selectedRow = -1;
            } else {
                activeComponent =
    //#URLConfigPanel.java:244: Warning: method not available - call not analyzed
    //#    call on RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#URLConfigPanel.java:244: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
                        details.get(model.getValueAt(table.getRowSorter().
                        convertRowIndexToModel(table.getSelectedRow()), 0));
                layoutComponents();
                add.setEnabled(true);
                remove.setEnabled(true);
                selectedRow = table.getRowSorter().convertRowIndexToModel(table.
    //#URLConfigPanel.java:250: Warning: method not available - call not analyzed
    //#    call on RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#URLConfigPanel.java:250: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
                        getSelectedRow());
            }
            setVisible(true);
    //#URLConfigPanel.java:253: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setVisible(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void valueChanged(ListSelectionEvent)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel:setVisible(bool)
        }
    }
    //#URLConfigPanel.java:255: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.valueChanged(ListSelectionEvent)

    /** 
     * {@inheritDoc}
     * 
     * @param e Action event
     */
    @Override
    public void actionPerformed(final ActionEvent e) {
        if (e.getSource() == add) {
    //#URLConfigPanel.java:264: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.actionPerformed(ActionEvent)
    //#input(void actionPerformed(ActionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(void actionPerformed(ActionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(void actionPerformed(ActionEvent)): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.removeURI(I)V
    //#input(void actionPerformed(ActionEvent)): e
    //#input(void actionPerformed(ActionEvent)): java.awt.Dialog$ModalityType.MODELESS
    //#input(void actionPerformed(ActionEvent)): this
    //#input(void actionPerformed(ActionEvent)): this.add
    //#input(void actionPerformed(ActionEvent)): this.model
    //#input(void actionPerformed(ActionEvent)): this.model.__Tag
    //#input(void actionPerformed(ActionEvent)): this.model.handlers
    //#input(void actionPerformed(ActionEvent)): this.model.uris
    //#input(void actionPerformed(ActionEvent)): this.parentWindow
    //#input(void actionPerformed(ActionEvent)): this.remove
    //#input(void actionPerformed(ActionEvent)): this.table
    //#pre[1] (void actionPerformed(ActionEvent)): e != null
    //#pre[3] (void actionPerformed(ActionEvent)): init'ed(this.add)
    //#pre[4] (void actionPerformed(ActionEvent)): (soft) this.model != null
    //#pre[5] (void actionPerformed(ActionEvent)): (soft) this.model.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#pre[6] (void actionPerformed(ActionEvent)): (soft) this.model.handlers != null
    //#pre[7] (void actionPerformed(ActionEvent)): (soft) this.model.uris != null
    //#pre[8] (void actionPerformed(ActionEvent)): (soft) init'ed(this.parentWindow)
    //#pre[9] (void actionPerformed(ActionEvent)): (soft) init'ed(this.remove)
    //#pre[10] (void actionPerformed(ActionEvent)): (soft) this.table != null
    //#presumption(void actionPerformed(ActionEvent)): com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter(...)@299 != null
    //#presumption(void actionPerformed(ActionEvent)): init'ed(java.awt.Dialog$ModalityType.MODELESS)
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.StandardInputDialog
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableRowsDeleted
            new StandardInputDialog(parentWindow, ModalityType.MODELESS, 
    //#URLConfigPanel.java:265: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.validator.URLProtocolValidator()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void actionPerformed(ActionEvent)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.validator.URLProtocolValidator()
    //#URLConfigPanel.java:265: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2:display()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void actionPerformed(ActionEvent)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2:display()
                    "DMDIRC: New URL handler", 
                    "Please enter the name of the new protocol.",
                    new URLProtocolValidator()) {
    //#URLConfigPanel.java:268: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)
    //#URLConfigPanel.java:268: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.StandardInputDialog(Window, Dialog$ModalityType, String, String, Validator)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2
    //#    method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.StandardInputDialog(Window, Dialog$ModalityType, String, String, Validator)
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): Param_1
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): this
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): x0
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): x1
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): x2
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): x3
    //#input(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): x4
    //#output(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): this.this$0
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)): init'ed(this.this$0)
    //#URLConfigPanel.java:268: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2(URLConfigPanel, Window, Dialog$ModalityType, String, String, Validator)

                /**
                 * A version number for this class. It should be changed whenever the
                 * class structure is changed (or anything else that would prevent
                 * serialized objects being unserialized with the new class).
                 */
                private static final long serialVersionUID = 1;

                /** {@inheritDoc} */
                @Override
                public boolean save() {
                    try {
                        final URI uri = new URI(getText() +
    //#URLConfigPanel.java:281: method: bool com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.save()
    //#URLConfigPanel.java:281: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2:getText()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2
    //#    method: bool save()
    //#    unanalyzed callee: String com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2:getText()
    //#input(bool save()): ":..example.test.com"._tainted
    //#input(bool save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel]
    //#input(bool save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel.__Dispatch_Table.addURI(Ljava/net/URI;)V
    //#input(bool save()): this
    //#input(bool save()): this.this$0
    //#input(bool save()): this.this$0.details
    //#input(bool save()): this.this$0.model
    //#input(bool save()): this.this$0.model.__Tag
    //#input(bool save()): this.this$0.model.handlers
    //#input(bool save()): this.this$0.model.uris
    //#output(bool save()): return_value
    //#pre[2] (bool save()): (soft) this.this$0 != null
    //#pre[3] (bool save()): (soft) this.details != null
    //#pre[4] (bool save()): (soft) this.model != null
    //#pre[5] (bool save()): (soft) this.model.__Tag == com/dmdirc/addons/ui_swing/dialogs/prefs/URLHandlerTableModel
    //#pre[6] (bool save()): (soft) this.model.handlers != null
    //#pre[7] (bool save()): (soft) this.model.uris != null
    //#post(bool save()): init'ed(return_value)
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:size
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(bool save()): Effects-of-calling:java.net.URI:getScheme
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:add
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.addons.ui_swing.dialogs.prefs.URLHandlerTableModel:fireTableRowsInserted
                                "://example.test.com");
                        model.addURI(uri);
                        details.put(uri, new URLProtocolPanel(uri, true));
    //#URLConfigPanel.java:284: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2
    //#    method: bool save()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.URLProtocolPanel(URI, bool)
                        return true;
                    } catch (URISyntaxException ex) {
                        return false;
    //#URLConfigPanel.java:287: end of method: bool com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.save()
                    }
                }

                /** {@inheritDoc} */
                @Override
                public void cancelled() {
                    //Ignore
                }
    //#URLConfigPanel.java:295: method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.cancelled()
    //#URLConfigPanel.java:295: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.cancelled()
            }.display();

        } else if (e.getSource() == remove) {
            model.removeURI(table.getRowSorter().convertRowIndexToModel(table.
    //#URLConfigPanel.java:299: Warning: method not available - call not analyzed
    //#    call on RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void actionPerformed(ActionEvent)
    //#    unanalyzed callee: RowSorter com.dmdirc.addons.ui_swing.components.PackingTable:getRowSorter()
    //#URLConfigPanel.java:299: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
    //#    method: void actionPerformed(ActionEvent)
    //#    unanalyzed callee: int com.dmdirc.addons.ui_swing.components.PackingTable:getSelectedRow()
                    getSelectedRow()));
        }
    }
    //#URLConfigPanel.java:302: end of method: void com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.actionPerformed(ActionEvent)
}
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$2]
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Dispatch_Table.cancelled()V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Dispatch_Table.save()Z
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$2] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Dispatch_Table.cancelled()V == &cancelled
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init): __Dispatch_Table.save()Z == &save
    //#URLConfigPanel.java:: end of method: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2__static_init
    //#URLConfigPanel.java:: end of class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$2
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$1]
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1__static_init): __Dispatch_Table.getCellRenderer(II)Ljavax/swing/table/TableCellRenderer;
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel$1] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1__static_init): __Dispatch_Table.getCellRenderer(II)Ljavax/swing/table/TableCellRenderer; == &getCellRenderer
    //#URLConfigPanel.java:: end of method: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1__static_init
    //#URLConfigPanel.java:: end of class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel$1
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel]
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.actionPerformed(Ljava/awt/event/ActionEvent;)V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.addListeners()V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.initComponents()V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.layoutComponents()V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.save()V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.saveHandler(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.valueChanged(Ljavax/swing/event/ListSelectionEvent;)V
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Descendant_Table[com/dmdirc/addons/ui_swing/dialogs/prefs/URLConfigPanel] == &__Dispatch_Table
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.actionPerformed(Ljava/awt/event/ActionEvent;)V == &actionPerformed
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.addListeners()V == &addListeners
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.initComponents()V == &initComponents
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.layoutComponents()V == &layoutComponents
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.save()V == &save
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.saveHandler(Ljava/lang/String;Ljava/lang/String;)V == &saveHandler
    //#post(com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init): __Dispatch_Table.valueChanged(Ljavax/swing/event/ListSelectionEvent;)V == &valueChanged
    //#URLConfigPanel.java:: end of method: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel.com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel__static_init
    //#URLConfigPanel.java:: end of class: com.dmdirc.addons.ui_swing.dialogs.prefs.URLConfigPanel
