//# 0 errors, 584 messages
//#
/*
    //#BrowserWindow.java:1:1: class: com.dmdirc.addons.addonbrowser.BrowserWindow$1$1
    //#BrowserWindow.java:1:1: method: com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init
    //#BrowserWindow.java:1:1: class: com.dmdirc.addons.addonbrowser.BrowserWindow$1
    //#BrowserWindow.java:1:1: method: com.dmdirc.addons.addonbrowser.BrowserWindow$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init
    //#BrowserWindow.java:1:1: class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#BrowserWindow.java:1:1: method: com.dmdirc.addons.addonbrowser.BrowserWindow.com.dmdirc.addons.addonbrowser.BrowserWindow__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.addonbrowser;

import com.dmdirc.Main;
import com.dmdirc.addons.addonbrowser.AddonInfo.AddonType;
import com.dmdirc.addons.ui_swing.MainFrame;
import com.dmdirc.addons.ui_swing.SwingController;
import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
import com.dmdirc.util.ConfigFile;
import com.dmdirc.util.InvalidConfigFileException;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

/**
 * The main window that allows users to browse addons.
 * 
 * @author chris
 */
public class BrowserWindow extends JDialog implements ActionListener,
    //#BrowserWindow.java:62: method: int com.dmdirc.addons.addonbrowser.BrowserWindow.compare(Object, Object)
    //#input(int compare(Object, Object)): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow]
    //#input(int compare(Object, Object)): __Descendant_Table[others]
    //#input(int compare(Object, Object)): __Dispatch_Table.compare(Lcom/dmdirc/addons/addonbrowser/AddonInfo;Lcom/dmdirc/addons/addonbrowser/AddonInfo;)I
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[com/dmdirc/addons/addonbrowser/AddonInfo]
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[others]
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getId()I
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getRating()I
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(int compare(Object, Object)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.isVerified()Z
    //#input(int compare(Object, Object)): this
    //#input(int compare(Object, Object)): this.__Tag
    //#input(int compare(Object, Object)): this.dateButton
    //#input(int compare(Object, Object)): this.nameButton
    //#input(int compare(Object, Object)): this.ratingButton
    //#input(int compare(Object, Object)): this.statusButton
    //#input(int compare(Object, Object)): x0
    //#input(int compare(Object, Object)): x0.__Tag
    //#input(int compare(Object, Object)): x0.id
    //#input(int compare(Object, Object)): x0.rating
    //#input(int compare(Object, Object)): x0.title
    //#input(int compare(Object, Object)): x0.verified
    //#input(int compare(Object, Object)): x1
    //#input(int compare(Object, Object)): x1.__Tag
    //#input(int compare(Object, Object)): x1.id
    //#input(int compare(Object, Object)): x1.rating
    //#input(int compare(Object, Object)): x1.title
    //#input(int compare(Object, Object)): x1.verified
    //#output(int compare(Object, Object)): return_value
    //#pre[2] (int compare(Object, Object)): this.__Tag == com/dmdirc/addons/addonbrowser/BrowserWindow
    //#pre[3] (int compare(Object, Object)): this.dateButton != null
    //#pre[4] (int compare(Object, Object)): (soft) this.nameButton != null
    //#pre[5] (int compare(Object, Object)): (soft) this.ratingButton != null
    //#pre[6] (int compare(Object, Object)): (soft) this.statusButton != null
    //#pre[7] (int compare(Object, Object)): (soft) x0 != null
    //#pre[8] (int compare(Object, Object)): (soft) x0.__Tag == com/dmdirc/addons/addonbrowser/AddonInfo
    //#pre[11] (int compare(Object, Object)): (soft) x0.title != null
    //#pre[13] (int compare(Object, Object)): (soft) x1 != null
    //#pre[14] (int compare(Object, Object)): (soft) x1.__Tag == com/dmdirc/addons/addonbrowser/AddonInfo
    //#pre[16] (int compare(Object, Object)): (soft) x1.id - x0.id in {-4_294_967_295..2_147_483_648}
    //#pre[18] (int compare(Object, Object)): (soft) x1.rating - x0.rating in {-4_294_967_295..2_147_483_648}
    //#post(int compare(Object, Object)): init'ed(return_value)
    //#unanalyzed(int compare(Object, Object)): Effects-of-calling:javax.swing.JRadioButton:isSelected
    //#unanalyzed(int compare(Object, Object)): Effects-of-calling:java.lang.String:compareTo
    //#BrowserWindow.java:62: end of method: int com.dmdirc.addons.addonbrowser.BrowserWindow.compare(Object, Object)
    //#BrowserWindow.java:62: method: List com.dmdirc.addons.addonbrowser.BrowserWindow.access$000(BrowserWindow)
    //#input(List access$000(BrowserWindow)): x0
    //#input(List access$000(BrowserWindow)): x0.infos
    //#output(List access$000(BrowserWindow)): return_value
    //#pre[1] (List access$000(BrowserWindow)): x0 != null
    //#post(List access$000(BrowserWindow)): return_value == x0.infos
    //#post(List access$000(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: List com.dmdirc.addons.addonbrowser.BrowserWindow.access$000(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$100(BrowserWindow)
    //#input(JCheckBox access$100(BrowserWindow)): x0
    //#input(JCheckBox access$100(BrowserWindow)): x0.verifiedBox
    //#output(JCheckBox access$100(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$100(BrowserWindow)): x0 != null
    //#post(JCheckBox access$100(BrowserWindow)): return_value == x0.verifiedBox
    //#post(JCheckBox access$100(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$100(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$200(BrowserWindow)
    //#input(JCheckBox access$200(BrowserWindow)): x0
    //#input(JCheckBox access$200(BrowserWindow)): x0.unverifiedBox
    //#output(JCheckBox access$200(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$200(BrowserWindow)): x0 != null
    //#post(JCheckBox access$200(BrowserWindow)): return_value == x0.unverifiedBox
    //#post(JCheckBox access$200(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$200(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$300(BrowserWindow)
    //#input(JCheckBox access$300(BrowserWindow)): x0
    //#input(JCheckBox access$300(BrowserWindow)): x0.installedBox
    //#output(JCheckBox access$300(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$300(BrowserWindow)): x0 != null
    //#post(JCheckBox access$300(BrowserWindow)): return_value == x0.installedBox
    //#post(JCheckBox access$300(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$300(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$400(BrowserWindow)
    //#input(JCheckBox access$400(BrowserWindow)): x0
    //#input(JCheckBox access$400(BrowserWindow)): x0.notinstalledBox
    //#output(JCheckBox access$400(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$400(BrowserWindow)): x0 != null
    //#post(JCheckBox access$400(BrowserWindow)): return_value == x0.notinstalledBox
    //#post(JCheckBox access$400(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$400(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$500(BrowserWindow)
    //#input(JCheckBox access$500(BrowserWindow)): x0
    //#input(JCheckBox access$500(BrowserWindow)): x0.pluginsBox
    //#output(JCheckBox access$500(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$500(BrowserWindow)): x0 != null
    //#post(JCheckBox access$500(BrowserWindow)): return_value == x0.pluginsBox
    //#post(JCheckBox access$500(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$500(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$600(BrowserWindow)
    //#input(JCheckBox access$600(BrowserWindow)): x0
    //#input(JCheckBox access$600(BrowserWindow)): x0.themesBox
    //#output(JCheckBox access$600(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$600(BrowserWindow)): x0 != null
    //#post(JCheckBox access$600(BrowserWindow)): return_value == x0.themesBox
    //#post(JCheckBox access$600(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$600(BrowserWindow)
    //#BrowserWindow.java:62: method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$700(BrowserWindow)
    //#input(JCheckBox access$700(BrowserWindow)): x0
    //#input(JCheckBox access$700(BrowserWindow)): x0.actionsBox
    //#output(JCheckBox access$700(BrowserWindow)): return_value
    //#pre[1] (JCheckBox access$700(BrowserWindow)): x0 != null
    //#post(JCheckBox access$700(BrowserWindow)): return_value == x0.actionsBox
    //#post(JCheckBox access$700(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JCheckBox com.dmdirc.addons.addonbrowser.BrowserWindow.access$700(BrowserWindow)
    //#BrowserWindow.java:62: method: JTextField com.dmdirc.addons.addonbrowser.BrowserWindow.access$800(BrowserWindow)
    //#input(JTextField access$800(BrowserWindow)): x0
    //#input(JTextField access$800(BrowserWindow)): x0.searchBox
    //#output(JTextField access$800(BrowserWindow)): return_value
    //#pre[1] (JTextField access$800(BrowserWindow)): x0 != null
    //#post(JTextField access$800(BrowserWindow)): return_value == x0.searchBox
    //#post(JTextField access$800(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JTextField com.dmdirc.addons.addonbrowser.BrowserWindow.access$800(BrowserWindow)
    //#BrowserWindow.java:62: method: JList com.dmdirc.addons.addonbrowser.BrowserWindow.access$900(BrowserWindow)
    //#input(JList access$900(BrowserWindow)): x0
    //#input(JList access$900(BrowserWindow)): x0.list
    //#output(JList access$900(BrowserWindow)): return_value
    //#pre[1] (JList access$900(BrowserWindow)): x0 != null
    //#post(JList access$900(BrowserWindow)): return_value == x0.list
    //#post(JList access$900(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JList com.dmdirc.addons.addonbrowser.BrowserWindow.access$900(BrowserWindow)
    //#BrowserWindow.java:62: method: JScrollPane com.dmdirc.addons.addonbrowser.BrowserWindow.access$1000(BrowserWindow)
    //#input(JScrollPane access$1000(BrowserWindow)): x0
    //#input(JScrollPane access$1000(BrowserWindow)): x0.scrollPane
    //#output(JScrollPane access$1000(BrowserWindow)): return_value
    //#pre[1] (JScrollPane access$1000(BrowserWindow)): x0 != null
    //#post(JScrollPane access$1000(BrowserWindow)): return_value == x0.scrollPane
    //#post(JScrollPane access$1000(BrowserWindow)): init'ed(return_value)
    //#BrowserWindow.java:62: end of method: JScrollPane com.dmdirc.addons.addonbrowser.BrowserWindow.access$1000(BrowserWindow)
        Comparator<AddonInfo> {

    /**
     * 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;
    /** The search box. */
    private final JTextField searchBox = new JTextField();
    /** The plugins check box. */
    private final JCheckBox pluginsBox = new JCheckBox("Plugins", true);
    /** The themes check box. */
    private final JCheckBox themesBox = new JCheckBox("Themes", true);
    /** The actions check box. */
    private final JCheckBox actionsBox = new JCheckBox("Action Packs", true);
    /** The verified check box. */
    private final JCheckBox verifiedBox = new JCheckBox("Verified", true);
    /** The unverified check box. */
    private final JCheckBox unverifiedBox = new JCheckBox("Unverified", false);
    /** The installed checkbox. */
    private final JCheckBox installedBox = new JCheckBox("Installed", true);
    /** The not installed checkbox. */
    private final JCheckBox notinstalledBox = new JCheckBox("Not installed", true);
    /** The panel used to list addons. */
    private final JList list = new JList(new DefaultListModel());
    /** The scrollpane for the list panel. */
    private final JScrollPane scrollPane = new JScrollPane(list,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    /** The sort by name button. */
    private final JRadioButton nameButton = new JRadioButton("Name", true);
    /** The sort by rating button. */
    private final JRadioButton ratingButton = new JRadioButton("Rating", false);
    /** The sort by date button. */
    private final JRadioButton dateButton = new JRadioButton("Date", false);
    /** The sort by status button. */
    private final JRadioButton statusButton = new JRadioButton("Status", false);
    /** All known addon infos. */
    private final List<AddonInfo> infos = new ArrayList<AddonInfo>();

    /**
     * Creates and displays a new browser window.
     */
    public BrowserWindow() {
        super((MainFrame) Main.getUI().getMainWindow(), "DMDirc Addon Browser", false);
    //#BrowserWindow.java:107: method: void com.dmdirc.addons.addonbrowser.BrowserWindow.com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#BrowserWindow.java:107: Warning: method not available - call not analyzed
    //#    call on MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): ".DMDirc"._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): "DMDirc"._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): "Library"._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): "Preferences"._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): "addons.feed"._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): "http:..addons.dmdirc.com.addonimg."._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.configdir
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.configdir._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.controller
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_ACTION_PACK
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_PLUGIN
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_THEME
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): java.io.File.separator
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): java.io.File.separator._tainted
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.configdir
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new ArrayList(BrowserWindow#16) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#2) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#3) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#4) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#5) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#6) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#7) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#8) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JList(BrowserWindow#9) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#12) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#13) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#14) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#15) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JScrollPane(BrowserWindow#11) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JTextField(BrowserWindow#1) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.actionsBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.dateButton
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.infos
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.installedBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.list
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.nameButton
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.notinstalledBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.pluginsBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.ratingButton
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.scrollPane
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.searchBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.statusButton
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.themesBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.unverifiedBox
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.verifiedBox
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new ArrayList(BrowserWindow#16)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#2)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#3)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#4)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#5)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#6)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#7)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#8)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JList(BrowserWindow#9)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#12)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#13)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#14)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#15)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JScrollPane(BrowserWindow#11)
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JTextField(BrowserWindow#1)
    //#pre[2] (void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.controller != null
    //#pre[3] (void com.dmdirc.addons.addonbrowser.BrowserWindow()): (soft) init'ed(com/dmdirc/Main.configdir)
    //#presumption(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com.dmdirc.addons.ui_swing.MainFrame:getIcon(...)@108 != null
    //#presumption(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com.dmdirc.ui.interfaces.UIController:getMainWindow(...)@108 != null
    //#presumption(void com.dmdirc.addons.addonbrowser.BrowserWindow()): javax.swing.JScrollPane:getVerticalScrollBar(...)@111 != null
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): init'ed(com/dmdirc/Main.configdir)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.actionsBox == &new JCheckBox(BrowserWindow#4)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.dateButton == &new JRadioButton(BrowserWindow#14)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.infos == &new ArrayList(BrowserWindow#16)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.installedBox == &new JCheckBox(BrowserWindow#7)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.list == &new JList(BrowserWindow#9)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.nameButton == &new JRadioButton(BrowserWindow#12)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.notinstalledBox == &new JCheckBox(BrowserWindow#8)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.pluginsBox == &new JCheckBox(BrowserWindow#2)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.ratingButton == &new JRadioButton(BrowserWindow#13)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.scrollPane == &new JScrollPane(BrowserWindow#11)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.searchBox == &new JTextField(BrowserWindow#1)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.statusButton == &new JRadioButton(BrowserWindow#15)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.themesBox == &new JCheckBox(BrowserWindow#3)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.unverifiedBox == &new JCheckBox(BrowserWindow#6)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): this.verifiedBox == &new JCheckBox(BrowserWindow#5)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new ArrayList(BrowserWindow#16) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#2) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#3) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#4) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#5) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#6) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#7) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JCheckBox(BrowserWindow#8) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JList(BrowserWindow#9) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#12) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#13) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#14) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JRadioButton(BrowserWindow#15) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JScrollPane(BrowserWindow#11) num objects == 1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow()): new JTextField(BrowserWindow#1) num objects == 1
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.ButtonGroup
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.ButtonGroup:add
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JCheckBox:addActionListener
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JRadioButton:addActionListener
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JTextField:addActionListener
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JList:getModel
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.DefaultListModel:clear
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JLabel
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JList:add
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.LoggingSwingWorker
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.addons.addonbrowser.BrowserWindow$1:execute
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.util.ConfigFile
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.util.ConfigFile:read
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:com.dmdirc.util.URLBuilder:buildURL
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.ImageIcon
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.ImageIcon:getImage
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.awt.Image:getScaledInstance
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.ImageIcon:setImage
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void com.dmdirc.addons.addonbrowser.BrowserWindow()): Effects-of-calling:javax.swing.JPanel
        setIconImage(((MainFrame) Main.getUI().getMainWindow()).getIcon().getImage());
    //#BrowserWindow.java:108: Warning: method not available - call not analyzed
    //#    call on MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#BrowserWindow.java:108: Warning: method not available - call not analyzed
    //#    call on ImageIcon com.dmdirc.addons.ui_swing.MainFrame:getIcon()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: ImageIcon com.dmdirc.addons.ui_swing.MainFrame:getIcon()
    //#BrowserWindow.java:108: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setIconImage(Image)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setIconImage(Image)
        setResizable(false);
    //#BrowserWindow.java:109: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setResizable(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setResizable(bool)
        setLayout(new MigLayout("fill, wmin 650, hmin 600"));
    //#BrowserWindow.java:110: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
    //#BrowserWindow.java:110: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setLayout(LayoutManager)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setLayout(LayoutManager)
        scrollPane.getVerticalScrollBar().setUnitIncrement(15);
        list.setCellRenderer(new AddonInfoListCellRenderer());

        JPanel panel = new JPanel(new MigLayout("fill"));
    //#BrowserWindow.java:114: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
        panel.setBorder(BorderFactory.createTitledBorder("Search"));
        panel.add(searchBox, "growx");
        add(panel, "width 150!");
    //#BrowserWindow.java:117: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)

        panel = new JPanel(new MigLayout("fill"));
    //#BrowserWindow.java:119: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
        panel.setBorder(BorderFactory.createTitledBorder("Results"));
        panel.add(scrollPane, "grow");
        add(panel, "wrap, spany 4, grow");
    //#BrowserWindow.java:122: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)

        panel = new JPanel(new MigLayout("fill, wrap"));
    //#BrowserWindow.java:124: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
        panel.setBorder(BorderFactory.createTitledBorder("Types"));
        panel.add(pluginsBox, "grow");
        panel.add(themesBox, "grow");
        panel.add(actionsBox, "grow");
        add(panel, "wrap, pushy, growy, width 150!");
    //#BrowserWindow.java:129: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)

        panel = new JPanel(new MigLayout("fill, wrap"));
    //#BrowserWindow.java:131: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
        panel.setBorder(BorderFactory.createTitledBorder("Status"));
        panel.add(verifiedBox, "grow");
        panel.add(unverifiedBox, "grow");
        panel.add(installedBox, "grow");
        panel.add(notinstalledBox, "grow");
        add(panel, "wrap, pushy, growy, width 150!");
    //#BrowserWindow.java:137: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)

        panel = new JPanel(new MigLayout("fill, wrap"));
    //#BrowserWindow.java:139: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
        panel.setBorder(BorderFactory.createTitledBorder("Sort by"));
        panel.add(nameButton, "grow");
        panel.add(ratingButton, "grow");
        panel.add(dateButton, "grow");
        panel.add(statusButton, "grow");
        add(panel, "wrap, pushy, growy, width 150!");
    //#BrowserWindow.java:145: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:add(Component, Object)

        initListeners();

        try {
            loadData();
        } catch (IOException ex) {
        } catch (InvalidConfigFileException ex) {
        }

        pack();
    //#BrowserWindow.java:155: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:pack()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:pack()
        setLocationRelativeTo((MainFrame) Main.getUI().getMainWindow());
    //#BrowserWindow.java:156: Warning: method not available - call not analyzed
    //#    call on MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#BrowserWindow.java:156: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setLocationRelativeTo(Component)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setLocationRelativeTo(Component)
        setVisible(true);
    //#BrowserWindow.java:157: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setVisible(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setVisible(bool)
        setLocationRelativeTo((MainFrame) Main.getUI().getMainWindow());
    //#BrowserWindow.java:158: Warning: method not available - call not analyzed
    //#    call on MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: MainWindow com.dmdirc.ui.interfaces.UIController:getMainWindow()
    //#BrowserWindow.java:158: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow:setLocationRelativeTo(Component)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow:setLocationRelativeTo(Component)
    }
    //#BrowserWindow.java:159: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow.com.dmdirc.addons.addonbrowser.BrowserWindow()

    /**
     * Registers listeners and sets up button groups.
     */
    private void initListeners() {
        final ButtonGroup group = new ButtonGroup();
    //#BrowserWindow.java:165: method: void com.dmdirc.addons.addonbrowser.BrowserWindow.initListeners()
    //#input(void initListeners()): this
    //#input(void initListeners()): this.actionsBox
    //#input(void initListeners()): this.dateButton
    //#input(void initListeners()): this.installedBox
    //#input(void initListeners()): this.nameButton
    //#input(void initListeners()): this.notinstalledBox
    //#input(void initListeners()): this.pluginsBox
    //#input(void initListeners()): this.ratingButton
    //#input(void initListeners()): this.searchBox
    //#input(void initListeners()): this.statusButton
    //#input(void initListeners()): this.themesBox
    //#input(void initListeners()): this.unverifiedBox
    //#input(void initListeners()): this.verifiedBox
    //#pre[2] (void initListeners()): this.actionsBox != null
    //#pre[3] (void initListeners()): this.dateButton != null
    //#pre[4] (void initListeners()): this.installedBox != null
    //#pre[5] (void initListeners()): this.nameButton != null
    //#pre[6] (void initListeners()): this.notinstalledBox != null
    //#pre[7] (void initListeners()): this.pluginsBox != null
    //#pre[8] (void initListeners()): this.ratingButton != null
    //#pre[9] (void initListeners()): this.searchBox != null
    //#pre[10] (void initListeners()): this.statusButton != null
    //#pre[11] (void initListeners()): this.themesBox != null
    //#pre[12] (void initListeners()): this.unverifiedBox != null
    //#pre[13] (void initListeners()): this.verifiedBox != null
        group.add(nameButton);
        group.add(ratingButton);
        group.add(dateButton);
        group.add(statusButton);

        pluginsBox.addActionListener(this);
        themesBox.addActionListener(this);
        actionsBox.addActionListener(this);

        nameButton.addActionListener(this);
        ratingButton.addActionListener(this);
        dateButton.addActionListener(this);
        statusButton.addActionListener(this);

        verifiedBox.addActionListener(this);
        unverifiedBox.addActionListener(this);
        installedBox.addActionListener(this);
        notinstalledBox.addActionListener(this);

        searchBox.addActionListener(this);
    }
    //#BrowserWindow.java:186: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow.initListeners()

    /**
     * Loads addon data from the locally cached feed file.
     * 
     * @throws IOException If the file can't be read
     * @throws InvalidConfigFileException If the file is corrupt somehow
     */
    private void loadData() throws IOException, InvalidConfigFileException {
        ConfigFile data = new ConfigFile(Main.getConfigDir() + File.separator + "addons.feed");
    //#BrowserWindow.java:195: method: void com.dmdirc.addons.addonbrowser.BrowserWindow.loadData()
    //#BrowserWindow.java:195: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void loadData()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile(String)
    //#input(void loadData()): ".DMDirc"._tainted
    //#input(void loadData()): "DMDirc"._tainted
    //#input(void loadData()): "Library"._tainted
    //#input(void loadData()): "Preferences"._tainted
    //#input(void loadData()): "addons.feed"._tainted
    //#input(void loadData()): "http:..addons.dmdirc.com.addonimg."._tainted
    //#input(void loadData()): com/dmdirc/Main.configdir
    //#input(void loadData()): com/dmdirc/Main.configdir._tainted
    //#input(void loadData()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_ACTION_PACK
    //#input(void loadData()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_PLUGIN
    //#input(void loadData()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_THEME
    //#input(void loadData()): java.io.File.separator
    //#input(void loadData()): java.io.File.separator._tainted
    //#input(void loadData()): this
    //#input(void loadData()): this.infos
    //#input(void loadData()): this.list
    //#output(void loadData()): com/dmdirc/Main.configdir
    //#output(void loadData()): java.lang.StringBuilder:toString(...)._tainted
    //#new obj(void loadData()): java.lang.StringBuilder:toString(...)
    //#pre[2] (void loadData()): init'ed(com/dmdirc/Main.configdir)
    //#pre[5] (void loadData()): this.list != null
    //#pre[4] (void loadData()): (soft) this.infos != null
    //#presumption(void loadData()): com.dmdirc.util.ConfigFile:getKeyDomains(...)@199 != null
    //#presumption(void loadData()): init'ed(java.io.File.separator)
    //#presumption(void loadData()): java.util.Iterator:next(...)@199 != null
    //#presumption(void loadData()): java.util.Map:values(...)@199 != null
    //#post(void loadData()): com/dmdirc/Main.configdir == One-of{old com/dmdirc/Main.configdir, &java.lang.StringBuilder:toString(...)}
    //#post(void loadData()): com/dmdirc/Main.configdir != null
    //#post(void loadData()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.JList:getModel
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.DefaultListModel:clear
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.JLabel
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.JList:add
    //#unanalyzed(void loadData()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.LoggingSwingWorker
    //#unanalyzed(void loadData()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void loadData()): Effects-of-calling:com.dmdirc.addons.addonbrowser.BrowserWindow$1:execute
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.System:getenv
    //#unanalyzed(void loadData()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void loadData()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void loadData()): Effects-of-calling:com.dmdirc.util.URLBuilder:buildURL
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.ImageIcon
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.ImageIcon:getImage
    //#unanalyzed(void loadData()): Effects-of-calling:java.awt.Image:getScaledInstance
    //#unanalyzed(void loadData()): Effects-of-calling:javax.swing.ImageIcon:setImage
    //#test_vector(void loadData()): java.util.Iterator:hasNext(...)@199: {0}, {1}
        data.read();
    //#BrowserWindow.java:196: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ConfigFile:read()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void loadData()
    //#    unanalyzed callee: void com.dmdirc.util.ConfigFile:read()
        int i = 0;
    //#BrowserWindow.java:197: Warning: unused assignment
    //#    Unused assignment into i
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void loadData()
    //#    Attribs:  Uncertain

        for (Map<String, String> entry : data.getKeyDomains().values()) {
    //#BrowserWindow.java:199: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.util.ConfigFile:getKeyDomains()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void loadData()
    //#    unanalyzed callee: Map com.dmdirc.util.ConfigFile:getKeyDomains()
            final AddonInfo info = new AddonInfo(entry);
            infos.add(info);
        }

        sortAndFilter();
    }
    //#BrowserWindow.java:205: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow.loadData()

    /**
     * Sorts and filters the list of addons according to the currently selected
     * options.
     */
    private void sortAndFilter() {
        ((DefaultListModel) list.getModel()).clear();
    //#BrowserWindow.java:212: method: void com.dmdirc.addons.addonbrowser.BrowserWindow.sortAndFilter()
    //#input(void sortAndFilter()): this
    //#input(void sortAndFilter()): this.list
    //#pre[2] (void sortAndFilter()): this.list != null
    //#presumption(void sortAndFilter()): javax.swing.JList:getModel(...)@212 != null
    //#unanalyzed(void sortAndFilter()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.LoggingSwingWorker
    //#unanalyzed(void sortAndFilter()): Effects-of-calling:java.util.ArrayList
        list.add(new JLabel("Sorting list.", JLabel.CENTER), "grow, pushy");

        new LoggingSwingWorker() {
    //#BrowserWindow.java:215: method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)
    //#BrowserWindow.java:215: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.LoggingSwingWorker()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow$1
    //#    method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.LoggingSwingWorker()
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): Param_1
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): this
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): new ArrayList(BrowserWindow$1#1) num objects
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): this.newInfos
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): this.this$0
    //#new obj(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): new ArrayList(BrowserWindow$1#1)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): this.newInfos == &new ArrayList(BrowserWindow$1#1)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): init'ed(this.this$0)
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)): new ArrayList(BrowserWindow$1#1) num objects == 1
    //#BrowserWindow.java:215: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.addonbrowser.BrowserWindow$1:execute()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow
    //#    method: void sortAndFilter()
    //#    unanalyzed callee: void com.dmdirc.addons.addonbrowser.BrowserWindow$1:execute()

            final List<AddonInfo> newInfos = new ArrayList<AddonInfo>();
    //#BrowserWindow.java:217: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1(BrowserWindow)

            /* {@inheritDoc} */
            @Override
            protected Object doInBackground() {
                for (AddonInfo info : infos) {
    //#BrowserWindow.java:222: method: Object com.dmdirc.addons.addonbrowser.BrowserWindow$1.doInBackground()
    //#input(Object doInBackground()): "addon-"._tainted
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_ACTION_PACK
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_PLUGIN
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo$AddonType.TYPE_THEME
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[com/dmdirc/addons/addonbrowser/AddonInfo]
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[others]
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getId()I
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getType()Lcom/dmdirc/addons/addonbrowser/AddonInfo$AddonType;
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.isInstalled()Z
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.isVerified()Z
    //#input(Object doInBackground()): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.matches(Ljava/lang/String;)Z
    //#input(Object doInBackground()): this
    //#input(Object doInBackground()): this.newInfos
    //#input(Object doInBackground()): this.this$0
    //#input(Object doInBackground()): this.this$0.actionsBox
    //#input(Object doInBackground()): this.this$0.infos
    //#input(Object doInBackground()): this.this$0.installedBox
    //#input(Object doInBackground()): this.this$0.notinstalledBox
    //#input(Object doInBackground()): this.this$0.pluginsBox
    //#input(Object doInBackground()): this.this$0.searchBox
    //#input(Object doInBackground()): this.this$0.themesBox
    //#input(Object doInBackground()): this.this$0.unverifiedBox
    //#input(Object doInBackground()): this.this$0.verifiedBox
    //#output(Object doInBackground()): return_value
    //#pre[3] (Object doInBackground()): this.this$0 != null
    //#pre[5] (Object doInBackground()): this.infos != null
    //#pre[2] (Object doInBackground()): (soft) this.newInfos != null
    //#pre[4] (Object doInBackground()): (soft) this.actionsBox != null
    //#pre[6] (Object doInBackground()): (soft) this.installedBox != null
    //#pre[7] (Object doInBackground()): (soft) this.notinstalledBox != null
    //#pre[8] (Object doInBackground()): (soft) this.pluginsBox != null
    //#pre[9] (Object doInBackground()): (soft) this.searchBox != null
    //#pre[10] (Object doInBackground()): (soft) this.themesBox != null
    //#pre[11] (Object doInBackground()): (soft) this.unverifiedBox != null
    //#pre[12] (Object doInBackground()): (soft) this.verifiedBox != null
    //#presumption(Object doInBackground()): info.description@222 != null
    //#presumption(Object doInBackground()): info.title@222 != null
    //#presumption(Object doInBackground()): java.util.Iterator:next(...).__Tag@222 == com/dmdirc/addons/addonbrowser/AddonInfo
    //#presumption(Object doInBackground()): java.util.Iterator:next(...)@222 != null
    //#presumption(Object doInBackground()): javax.swing.JTextField:getText(...)@223 != null
    //#presumption(Object doInBackground()): javax.swing.JTextField:getText(...)@223 != null
    //#post(Object doInBackground()): return_value == this.newInfos
    //#post(Object doInBackground()): return_value != null
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Object doInBackground()): Effects-of-calling:com.dmdirc.updater.UpdateChecker:getComponents
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(Object doInBackground()): Effects-of-calling:com.dmdirc.updater.UpdateComponent:getName
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(Object doInBackground()): Effects-of-calling:java.lang.String:indexOf
    //#test_vector(Object doInBackground()): info.type@222: Addr_Set{&com.dmdirc.addons.addonbrowser.AddonInfo$AddonType__static_init.new AddonInfo$AddonType(AddonInfo$AddonType__static_init#1)}, Addr_Set{&com.dmdirc.addons.addonbrowser.AddonInfo$AddonType__static_init.new AddonInfo$AddonType(AddonInfo$AddonType__static_init#2)}, Addr_Set{&com.dmdirc.addons.addonbrowser.AddonInfo$AddonType__static_init.new AddonInfo$AddonType(AddonInfo$AddonType__static_init#3)}
    //#test_vector(Object doInBackground()): info.verified@222: {1}, {0}
    //#test_vector(Object doInBackground()): java.lang.String:isEmpty(...)@223: {1}, {0}
    //#test_vector(Object doInBackground()): java.util.Iterator:hasNext(...)@222: {0}, {1}
    //#test_vector(Object doInBackground()): javax.swing.JCheckBox:isSelected(...)@223: {1}, {0}
                    if ((!verifiedBox.isSelected() && info.isVerified()) ||
                            (!unverifiedBox.isSelected() && !info.isVerified()) ||
                            (!installedBox.isSelected() && info.isInstalled()) ||
                            (!notinstalledBox.isSelected() &&
                            !info.isInstalled()) || (!pluginsBox.isSelected() &&
                            info.getType() == AddonType.TYPE_PLUGIN) ||
                            (!themesBox.isSelected() && info.getType() ==
                            AddonType.TYPE_THEME) ||
                            (!actionsBox.isSelected() && info.getType() ==
                            AddonType.TYPE_ACTION_PACK) || (!searchBox.getText().
                            isEmpty() && !info.matches(searchBox.getText()))) {
                        continue;
                    }

                    newInfos.add(info);
                }

                Collections.sort(newInfos, BrowserWindow.this);
                return newInfos;
    //#BrowserWindow.java:241: end of method: Object com.dmdirc.addons.addonbrowser.BrowserWindow$1.doInBackground()
            }

            /* {@inheritDoc} */
            @Override
            protected void done() {
                super.done();
    //#BrowserWindow.java:247: method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1.done()
    //#BrowserWindow.java:247: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.LoggingSwingWorker:done()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.addonbrowser.BrowserWindow$1
    //#    method: void done()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.LoggingSwingWorker:done()
    //#input(void done()): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[com/dmdirc/addons/addonbrowser/AddonInfo]
    //#input(void done()): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[others]
    //#input(void done()): this
    //#input(void done()): this.newInfos
    //#input(void done()): this.this$0
    //#input(void done()): this.this$0.list
    //#pre[2] (void done()): this.newInfos != null
    //#pre[3] (void done()): this.this$0 != null
    //#pre[4] (void done()): this.list != null
    //#presumption(void done()): java.util.Iterator:next(...).__Tag@250 == com/dmdirc/addons/addonbrowser/AddonInfo
    //#presumption(void done()): javax.swing.JList:getModel(...)@249 != null
    //#presumption(void done()): javax.swing.JList:getModel(...)@251 != null
    //#test_vector(void done()): java.util.Iterator:hasNext(...)@250: {0}, {1}

                ((DefaultListModel) list.getModel()).clear();
                for (AddonInfo info : newInfos) {
                    ((DefaultListModel) list.getModel()).addElement(info);
                }
                SwingUtilities.invokeLater(new Runnable() {
    //#BrowserWindow.java:253: method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)): Param_1
    //#input(void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)): this
    //#output(void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)): this.this$1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)): this.this$1 == Param_1
    //#post(void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)): init'ed(this.this$1)
    //#BrowserWindow.java:253: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1$1(BrowserWindow$1)

                    @Override
                    public void run() {
                        scrollPane.getVerticalScrollBar().setValue(0);
    //#BrowserWindow.java:257: method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.run()
    //#input(void run()): this
    //#input(void run()): this.this$1
    //#input(void run()): this.this$1.this$0
    //#input(void run()): this.this$1.this$0.scrollPane
    //#pre[2] (void run()): this.this$1 != null
    //#pre[3] (void run()): this.this$0 != null
    //#pre[4] (void run()): this.scrollPane != null
    //#presumption(void run()): javax.swing.JScrollPane:getVerticalScrollBar(...)@257 != null
                    }
    //#BrowserWindow.java:258: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.run()
                });
            }
    //#BrowserWindow.java:260: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow$1.done()
        }.execute();
    }
    //#BrowserWindow.java:262: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow.sortAndFilter()

    /** 
     * {@inheritDoc}
     * 
     * @param e Action event
     */
    @Override
    public void actionPerformed(final ActionEvent e) {
        sortAndFilter();
    //#BrowserWindow.java:271: method: void com.dmdirc.addons.addonbrowser.BrowserWindow.actionPerformed(ActionEvent)
    //#input(void actionPerformed(ActionEvent)): this
    //#input(void actionPerformed(ActionEvent)): this.list
    //#pre[2] (void actionPerformed(ActionEvent)): this.list != null
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:javax.swing.JList:getModel
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:javax.swing.DefaultListModel:clear
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:javax.swing.JLabel
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:javax.swing.JList:add
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.LoggingSwingWorker
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void actionPerformed(ActionEvent)): Effects-of-calling:com.dmdirc.addons.addonbrowser.BrowserWindow$1:execute
    }
    //#BrowserWindow.java:272: end of method: void com.dmdirc.addons.addonbrowser.BrowserWindow.actionPerformed(ActionEvent)

    /** {@inheritDoc} */
    @Override
    public int compare(final AddonInfo o1, final AddonInfo o2) {
        if (dateButton.isSelected()) {
    //#BrowserWindow.java:277: method: int com.dmdirc.addons.addonbrowser.BrowserWindow.compare(AddonInfo, AddonInfo)
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[com/dmdirc/addons/addonbrowser/AddonInfo]
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Descendant_Table[others]
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getId()I
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getRating()I
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(int compare(AddonInfo, AddonInfo)): com/dmdirc/addons/addonbrowser/AddonInfo.__Dispatch_Table.isVerified()Z
    //#input(int compare(AddonInfo, AddonInfo)): o1
    //#input(int compare(AddonInfo, AddonInfo)): o1.__Tag
    //#input(int compare(AddonInfo, AddonInfo)): o1.id
    //#input(int compare(AddonInfo, AddonInfo)): o1.rating
    //#input(int compare(AddonInfo, AddonInfo)): o1.title
    //#input(int compare(AddonInfo, AddonInfo)): o1.verified
    //#input(int compare(AddonInfo, AddonInfo)): o2
    //#input(int compare(AddonInfo, AddonInfo)): o2.__Tag
    //#input(int compare(AddonInfo, AddonInfo)): o2.id
    //#input(int compare(AddonInfo, AddonInfo)): o2.rating
    //#input(int compare(AddonInfo, AddonInfo)): o2.title
    //#input(int compare(AddonInfo, AddonInfo)): o2.verified
    //#input(int compare(AddonInfo, AddonInfo)): this
    //#input(int compare(AddonInfo, AddonInfo)): this.dateButton
    //#input(int compare(AddonInfo, AddonInfo)): this.nameButton
    //#input(int compare(AddonInfo, AddonInfo)): this.ratingButton
    //#input(int compare(AddonInfo, AddonInfo)): this.statusButton
    //#output(int compare(AddonInfo, AddonInfo)): return_value
    //#pre[16] (int compare(AddonInfo, AddonInfo)): this.dateButton != null
    //#pre[1] (int compare(AddonInfo, AddonInfo)): (soft) o1 != null
    //#pre[2] (int compare(AddonInfo, AddonInfo)): (soft) o1.__Tag == com/dmdirc/addons/addonbrowser/AddonInfo
    //#pre[5] (int compare(AddonInfo, AddonInfo)): (soft) o1.title != null
    //#pre[7] (int compare(AddonInfo, AddonInfo)): (soft) o2 != null
    //#pre[8] (int compare(AddonInfo, AddonInfo)): (soft) o2.__Tag == com/dmdirc/addons/addonbrowser/AddonInfo
    //#pre[10] (int compare(AddonInfo, AddonInfo)): (soft) o2.id - o1.id in {-4_294_967_295..2_147_483_648}
    //#pre[12] (int compare(AddonInfo, AddonInfo)): (soft) o2.rating - o1.rating in {-4_294_967_295..2_147_483_648}
    //#pre[17] (int compare(AddonInfo, AddonInfo)): (soft) this.nameButton != null
    //#pre[18] (int compare(AddonInfo, AddonInfo)): (soft) this.ratingButton != null
    //#pre[19] (int compare(AddonInfo, AddonInfo)): (soft) this.statusButton != null
    //#post(int compare(AddonInfo, AddonInfo)): init'ed(return_value)
    //#test_vector(int compare(AddonInfo, AddonInfo)): javax.swing.JRadioButton:isSelected(...)@277: {0}, {1}
    //#test_vector(int compare(AddonInfo, AddonInfo)): javax.swing.JRadioButton:isSelected(...)@279: {0}, {1}
    //#test_vector(int compare(AddonInfo, AddonInfo)): javax.swing.JRadioButton:isSelected(...)@281: {0}, {1}
    //#test_vector(int compare(AddonInfo, AddonInfo)): javax.swing.JRadioButton:isSelected(...)@283: {0}, {1}
            return o1.getId() - o2.getId();
        } else if (nameButton.isSelected()) {
            return o1.getTitle().compareTo(o2.getTitle());
        } else if (ratingButton.isSelected()) {
            return o1.getRating() - o2.getRating();
        } else if (statusButton.isSelected()) {
            return (o1.isVerified() ? 1 : 0) - (o2.isVerified() ? 1 : 0);
        } else {
            return 0;
    //#BrowserWindow.java:286: end of method: int com.dmdirc.addons.addonbrowser.BrowserWindow.compare(AddonInfo, AddonInfo)
        }
    }
}
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow$1$1]
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init): __Dispatch_Table.run()V
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow$1$1] == &__Dispatch_Table
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init): __Dispatch_Table.run()V == &run
    //#BrowserWindow.java:: end of method: com.dmdirc.addons.addonbrowser.BrowserWindow$1$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1$1__static_init
    //#BrowserWindow.java:: end of class: com.dmdirc.addons.addonbrowser.BrowserWindow$1$1
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow$1]
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Dispatch_Table.doInBackground()Ljava/lang/Object;
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Dispatch_Table.done()V
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow$1] == &__Dispatch_Table
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Dispatch_Table.doInBackground()Ljava/lang/Object; == &doInBackground
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init): __Dispatch_Table.done()V == &done
    //#BrowserWindow.java:: end of method: com.dmdirc.addons.addonbrowser.BrowserWindow$1.com.dmdirc.addons.addonbrowser.BrowserWindow$1__static_init
    //#BrowserWindow.java:: end of class: com.dmdirc.addons.addonbrowser.BrowserWindow$1
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow]
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.actionPerformed(Ljava/awt/event/ActionEvent;)V
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.compare(Lcom/dmdirc/addons/addonbrowser/AddonInfo;Lcom/dmdirc/addons/addonbrowser/AddonInfo;)I
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.compare(Ljava/lang/Object;Ljava/lang/Object;)I
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.initListeners()V
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.loadData()V
    //#output(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.sortAndFilter()V
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Descendant_Table[com/dmdirc/addons/addonbrowser/BrowserWindow] == &__Dispatch_Table
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.actionPerformed(Ljava/awt/event/ActionEvent;)V == &actionPerformed
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.compare(Lcom/dmdirc/addons/addonbrowser/AddonInfo;Lcom/dmdirc/addons/addonbrowser/AddonInfo;)I == &compare
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.compare(Ljava/lang/Object;Ljava/lang/Object;)I == &compare
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.initListeners()V == &initListeners
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.loadData()V == &loadData
    //#post(com.dmdirc.addons.addonbrowser.BrowserWindow__static_init): __Dispatch_Table.sortAndFilter()V == &sortAndFilter
    //#BrowserWindow.java:: end of method: com.dmdirc.addons.addonbrowser.BrowserWindow.com.dmdirc.addons.addonbrowser.BrowserWindow__static_init
    //#BrowserWindow.java:: end of class: com.dmdirc.addons.addonbrowser.BrowserWindow
