//# 0 errors, 671 messages
//#
/*
    //#PreferencesCategory.java:1:1: class: com.dmdirc.config.prefs.PreferencesCategory
 * 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.config.prefs;

import com.dmdirc.util.ListenerList;

import java.util.ArrayList;
import java.util.List;

/**
 * Represents one category of preferences. Categories can contain 0 or more
 * subcategories, and either 0 or more PreferencesSettings or exactly 1
 * PreferencesInterface object.
 * 
 * @author chris
 */
public class PreferencesCategory {

    /** A logger for this class. */
    private static final java.util.logging.Logger LOGGER = java.util.logging
    //#PreferencesCategory.java:39: method: com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory__static_init
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): LOGGER
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addChangeListener(Lcom/dmdirc/config/prefs/CategoryChangeListener;)V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addSetting(Lcom/dmdirc/config/prefs/PreferencesSetting;)V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addSubCategory(Lcom/dmdirc/config/prefs/PreferencesCategory;)V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.dismiss()V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.fireCategoryDeselected()V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.fireCategorySelected()V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getDescription()Ljava/lang/String;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getIcon()Ljava/lang/String;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getObject()Lcom/dmdirc/config/prefs/PreferencesInterface;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getParent()Lcom/dmdirc/config/prefs/PreferencesCategory;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getPath()Ljava/lang/String;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getSettings()Ljava/util/List;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getSubcats()Ljava/util/List;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getTitle()Ljava/lang/String;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.hasObject()Z
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.isInline()Z
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.isInlineBefore()Z
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.removeChangeListener(Lcom/dmdirc/config/prefs/CategoryChangeListener;)V
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.save()Z
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setInline()Lcom/dmdirc/config/prefs/PreferencesCategory;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setInlineAfter()Lcom/dmdirc/config/prefs/PreferencesCategory;
    //#output(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setParent(Lcom/dmdirc/config/prefs/PreferencesCategory;)V
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): init'ed(LOGGER)
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory] == &__Dispatch_Table
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addChangeListener(Lcom/dmdirc/config/prefs/CategoryChangeListener;)V == &addChangeListener
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addSetting(Lcom/dmdirc/config/prefs/PreferencesSetting;)V == &addSetting
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.addSubCategory(Lcom/dmdirc/config/prefs/PreferencesCategory;)V == &addSubCategory
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.dismiss()V == &dismiss
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.fireCategoryDeselected()V == &fireCategoryDeselected
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.fireCategorySelected()V == &fireCategorySelected
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getDescription()Ljava/lang/String; == &getDescription
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getIcon()Ljava/lang/String; == &getIcon
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getObject()Lcom/dmdirc/config/prefs/PreferencesInterface; == &getObject
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getParent()Lcom/dmdirc/config/prefs/PreferencesCategory; == &getParent
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getPath()Ljava/lang/String; == &getPath
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getSettings()Ljava/util/List; == &getSettings
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getSubcats()Ljava/util/List; == &getSubcats
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.getTitle()Ljava/lang/String; == &getTitle
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.hasObject()Z == &hasObject
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.isInline()Z == &isInline
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.isInlineBefore()Z == &isInlineBefore
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.removeChangeListener(Lcom/dmdirc/config/prefs/CategoryChangeListener;)V == &removeChangeListener
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.save()Z == &save
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setInline()Lcom/dmdirc/config/prefs/PreferencesCategory; == &setInline
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setInlineAfter()Lcom/dmdirc/config/prefs/PreferencesCategory; == &setInlineAfter
    //#post(com.dmdirc.config.prefs.PreferencesCategory__static_init): __Dispatch_Table.setParent(Lcom/dmdirc/config/prefs/PreferencesCategory;)V == &setParent
    //#PreferencesCategory.java:39: end of method: com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory__static_init
            .Logger.getLogger(PreferencesCategory.class.getName());
        
    /** The title (name) of this category. */
    private final String title;
    
    /** A description of this category. */
    private final String description;

    /** The icon to use for this category. */
    private final String icon;
    
    /** Whether or not this category is inline. */
    private boolean isInline = false;
    
    /** Whether or not to show inline categories before settings. */
    private boolean inlineBefore = true;

    /** Our parent category, if known. */
    private PreferencesCategory parent;
    
    /** A list of settings in this category. */
    private final List<PreferencesSetting> settings = new ArrayList<PreferencesSetting>();
    
    /** A list of subcategories of this category. */
    private final List<PreferencesCategory> subcats = new ArrayList<PreferencesCategory>();
    
    /** The replacement object to use for this category. */
    private final PreferencesInterface object;
    
    /** A list of listeners who are interested in this category. */
    private final ListenerList listeners = new ListenerList();
    //#PreferencesCategory.java:70: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList()

    /**
     * Creates a new preferences category that contains settings.
     * 
     * @param title The title of this preferences category
     * @param description The description of this category
     */
    public PreferencesCategory(final String title, final String description) {
        this(title, description, null, null);
    //#PreferencesCategory.java:79: method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String)
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): description
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): title
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#1) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#2) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ListenerList(PreferencesCategory#3) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.description
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.icon
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.inlineBefore
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.isInline
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.listeners
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.object
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.settings
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.subcats
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.title
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#1)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#2)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.description == description
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): init'ed(this.description)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.icon == null
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.object == null
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.inlineBefore == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#1) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ArrayList(PreferencesCategory#2) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): new ListenerList(PreferencesCategory#3) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.isInline == 0
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.listeners == &new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.settings == &new ArrayList(PreferencesCategory#1)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.subcats == &new ArrayList(PreferencesCategory#2)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): this.title == title
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): init'ed(this.title)
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String)): Effects-of-calling:com.dmdirc.util.ListenerList
    }
    //#PreferencesCategory.java:80: end of method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String)

    /**
     * Creates a new preferences category that contains settings.
     *
     * @since 0.6.3m1
     * @param title The title of this preferences category
     * @param description The description of this category
     * @param icon The icon to use for this category
     */
    public PreferencesCategory(final String title, final String description,
            final String icon) {
        this(title, description, icon, null);
    //#PreferencesCategory.java:92: method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, String)
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): description
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): icon
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): title
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#1) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#2) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ListenerList(PreferencesCategory#3) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.description
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.icon
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.inlineBefore
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.isInline
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.listeners
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.object
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.settings
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.subcats
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.title
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#1)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#2)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.description == description
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): init'ed(this.description)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.icon == icon
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): init'ed(this.icon)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.inlineBefore == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#1) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ArrayList(PreferencesCategory#2) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): new ListenerList(PreferencesCategory#3) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.isInline == 0
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.listeners == &new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.object == null
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.settings == &new ArrayList(PreferencesCategory#1)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.subcats == &new ArrayList(PreferencesCategory#2)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): this.title == title
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): init'ed(this.title)
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String)): Effects-of-calling:com.dmdirc.util.ListenerList
    }
    //#PreferencesCategory.java:93: end of method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, String)

    /**
     * Creates a new preferences category that contains an object.
     *
     * @param title The title of this preferences category
     * @param description The description of this category
     * @param object The replacement object for this category
     */
    public PreferencesCategory(final String title, final String description,
            final PreferencesInterface object) {
        this(title, description, null, object);
    //#PreferencesCategory.java:104: method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): description
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): object
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): title
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.description
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.icon
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.inlineBefore
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.isInline
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.listeners
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.object
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.settings
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.subcats
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.title
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.description == description
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): init'ed(this.description)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.icon == null
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.inlineBefore == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.isInline == 0
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.listeners == &new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.object == object
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): init'ed(this.object)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.settings == &new ArrayList(PreferencesCategory#1)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.subcats == &new ArrayList(PreferencesCategory#2)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): this.title == title
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): init'ed(this.title)
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)): Effects-of-calling:com.dmdirc.util.ListenerList
    }
    //#PreferencesCategory.java:105: end of method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, PreferencesInterface)
    
    /**
     * Creates a new preferences category that contains an object.
     *
     * @since 0.6.3m1
     * @param title The title of this preferences category
     * @param description The description of this category
     * @param icon The icon to use for this category
     * @param object The replacement object for this category
     */
    public PreferencesCategory(final String title, final String description,
            final String icon, final PreferencesInterface object) {
    //#PreferencesCategory.java:117: method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): description
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): icon
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): object
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this
    //#input(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): title
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3) num objects
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.description
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.icon
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.inlineBefore
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.isInline
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.listeners
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.object
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.settings
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.subcats
    //#output(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.title
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2)
    //#new obj(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.description == description
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): init'ed(this.description)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.icon == icon
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): init'ed(this.icon)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.inlineBefore == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#1) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ArrayList(PreferencesCategory#2) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): new ListenerList(PreferencesCategory#3) num objects == 1
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.isInline == 0
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.listeners == &new ListenerList(PreferencesCategory#3)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.object == object
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): init'ed(this.object)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.settings == &new ArrayList(PreferencesCategory#1)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.subcats == &new ArrayList(PreferencesCategory#2)
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): this.title == title
    //#post(void com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)): init'ed(this.title)
        this.title = title;
        this.description = description;
        this.icon = icon;
        this.object = object;
    }
    //#PreferencesCategory.java:122: end of method: void com.dmdirc.config.prefs.PreferencesCategory.com.dmdirc.config.prefs.PreferencesCategory(String, String, String, PreferencesInterface)
    
    /**
     * Sets this as an inline category.
     * 
     * @return A reference to this category, for convenience
     */
    public PreferencesCategory setInline() {
        isInline = true;
    //#PreferencesCategory.java:130: method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.setInline()
    //#input(PreferencesCategory setInline()): this
    //#output(PreferencesCategory setInline()): return_value
    //#output(PreferencesCategory setInline()): this.isInline
    //#post(PreferencesCategory setInline()): return_value == this
    //#post(PreferencesCategory setInline()): return_value != null
    //#post(PreferencesCategory setInline()): this.isInline == 1
        return this;
    //#PreferencesCategory.java:131: end of method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.setInline()
    }
    
    /**
     * Sets this category to show inline categories after settings, rather than
     * before.
     * 
     * @return A reference to this category, for convenience
     */
    public PreferencesCategory setInlineAfter() {
        inlineBefore = false;
    //#PreferencesCategory.java:141: method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.setInlineAfter()
    //#input(PreferencesCategory setInlineAfter()): this
    //#output(PreferencesCategory setInlineAfter()): return_value
    //#output(PreferencesCategory setInlineAfter()): this.inlineBefore
    //#post(PreferencesCategory setInlineAfter()): return_value == this
    //#post(PreferencesCategory setInlineAfter()): return_value != null
    //#post(PreferencesCategory setInlineAfter()): this.inlineBefore == 0
        return this;
    //#PreferencesCategory.java:142: end of method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.setInlineAfter()
    }
    
    /**
     * Determines if this category is meant to be displayed inline or not.
     * 
     * @return True if this category should be shown inline, false otherwise
     */
    public boolean isInline() {
        return isInline;
    //#PreferencesCategory.java:151: method: bool com.dmdirc.config.prefs.PreferencesCategory.isInline()
    //#input(bool isInline()): this
    //#input(bool isInline()): this.isInline
    //#output(bool isInline()): return_value
    //#pre[2] (bool isInline()): init'ed(this.isInline)
    //#post(bool isInline()): return_value == this.isInline
    //#post(bool isInline()): init'ed(return_value)
    //#PreferencesCategory.java:151: end of method: bool com.dmdirc.config.prefs.PreferencesCategory.isInline()
    }
    
    /**
     * Determines whether this category wants inline subcats to be displayed
     * before the settings, or after.
     * 
     * @return True if subcats should be displayed first, false otherwise.
     */
    public boolean isInlineBefore() {
        return inlineBefore;
    //#PreferencesCategory.java:161: method: bool com.dmdirc.config.prefs.PreferencesCategory.isInlineBefore()
    //#input(bool isInlineBefore()): this
    //#input(bool isInlineBefore()): this.inlineBefore
    //#output(bool isInlineBefore()): return_value
    //#pre[2] (bool isInlineBefore()): init'ed(this.inlineBefore)
    //#post(bool isInlineBefore()): return_value == this.inlineBefore
    //#post(bool isInlineBefore()): init'ed(return_value)
    //#PreferencesCategory.java:161: end of method: bool com.dmdirc.config.prefs.PreferencesCategory.isInlineBefore()
    }
    
    /**
     * Adds the specified setting to this category.
     * 
     * @param setting The setting to be added
     */
    public void addSetting(final PreferencesSetting setting) {
        if (hasObject()) {
    //#PreferencesCategory.java:170: method: void com.dmdirc.config.prefs.PreferencesCategory.addSetting(PreferencesSetting)
    //#input(void addSetting(PreferencesSetting)): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#input(void addSetting(PreferencesSetting)): __Descendant_Table[others]
    //#input(void addSetting(PreferencesSetting)): __Dispatch_Table.hasObject()Z
    //#input(void addSetting(PreferencesSetting)): setting
    //#input(void addSetting(PreferencesSetting)): this
    //#input(void addSetting(PreferencesSetting)): this.__Tag
    //#input(void addSetting(PreferencesSetting)): this.object
    //#input(void addSetting(PreferencesSetting)): this.settings
    //#pre[3] (void addSetting(PreferencesSetting)): this.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[4] (void addSetting(PreferencesSetting)): this.object == null
    //#pre[5] (void addSetting(PreferencesSetting)): this.settings != null
            throw new IllegalArgumentException("Can't add settings to a " +
                    "category that uses a replacement object");
        }
        
        settings.add(setting);
    }
    //#PreferencesCategory.java:176: end of method: void com.dmdirc.config.prefs.PreferencesCategory.addSetting(PreferencesSetting)
    
    /**
     * Adds the specified subcategory to this category.
     * 
     * @param subcategory The category to be asdded
     */
    public void addSubCategory(final PreferencesCategory subcategory) {
        if (isInline() && !subcategory.isInline()) {
    //#PreferencesCategory.java:184: method: void com.dmdirc.config.prefs.PreferencesCategory.addSubCategory(PreferencesCategory)
    //#input(void addSubCategory(PreferencesCategory)): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#input(void addSubCategory(PreferencesCategory)): __Descendant_Table[others]
    //#input(void addSubCategory(PreferencesCategory)): __Dispatch_Table.isInline()Z
    //#input(void addSubCategory(PreferencesCategory)): __Dispatch_Table.setParent(Lcom/dmdirc/config/prefs/PreferencesCategory;)V
    //#input(void addSubCategory(PreferencesCategory)): subcategory
    //#input(void addSubCategory(PreferencesCategory)): subcategory.__Tag
    //#input(void addSubCategory(PreferencesCategory)): subcategory.isInline
    //#input(void addSubCategory(PreferencesCategory)): this
    //#input(void addSubCategory(PreferencesCategory)): this.__Tag
    //#input(void addSubCategory(PreferencesCategory)): this.isInline
    //#input(void addSubCategory(PreferencesCategory)): this.subcats
    //#output(void addSubCategory(PreferencesCategory)): subcategory.parent
    //#pre[1] (void addSubCategory(PreferencesCategory)): subcategory != null
    //#pre[2] (void addSubCategory(PreferencesCategory)): subcategory.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[5] (void addSubCategory(PreferencesCategory)): this.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[6] (void addSubCategory(PreferencesCategory)): init'ed(this.isInline)
    //#pre[7] (void addSubCategory(PreferencesCategory)): this.subcats != null
    //#pre[3] (void addSubCategory(PreferencesCategory)): (soft) subcategory.isInline == 1
    //#post(void addSubCategory(PreferencesCategory)): subcategory.parent == this
    //#post(void addSubCategory(PreferencesCategory)): subcategory.parent != null
    //#test_vector(void addSubCategory(PreferencesCategory)): this.isInline: {0}, {1}
            throw new IllegalArgumentException("Can't add non-inline " +
                    "subcategories to inline ones");
        }

        subcategory.setParent(this);
        subcats.add(subcategory);
    }
    //#PreferencesCategory.java:191: end of method: void com.dmdirc.config.prefs.PreferencesCategory.addSubCategory(PreferencesCategory)

    /**
     * Retrieves the description of this category.
     * 
     * @return This category's description
     */
    public String getDescription() {
        return description;
    //#PreferencesCategory.java:199: method: String com.dmdirc.config.prefs.PreferencesCategory.getDescription()
    //#input(String getDescription()): this
    //#input(String getDescription()): this.description
    //#output(String getDescription()): return_value
    //#post(String getDescription()): return_value == this.description
    //#post(String getDescription()): init'ed(return_value)
    //#PreferencesCategory.java:199: end of method: String com.dmdirc.config.prefs.PreferencesCategory.getDescription()
    }

    /**
     * Retrieves the settings in this category.
     * 
     * @return This category's settings
     */
    public List<PreferencesSetting> getSettings() {
        return settings;
    //#PreferencesCategory.java:208: method: List com.dmdirc.config.prefs.PreferencesCategory.getSettings()
    //#input(List getSettings()): this
    //#input(List getSettings()): this.settings
    //#output(List getSettings()): return_value
    //#post(List getSettings()): return_value == this.settings
    //#post(List getSettings()): init'ed(return_value)
    //#PreferencesCategory.java:208: end of method: List com.dmdirc.config.prefs.PreferencesCategory.getSettings()
    }

    /**
     * Retrieves the subcategories of this category.
     * 
     * @return This category's subcategories
     */
    public List<PreferencesCategory> getSubcats() {
        return subcats;
    //#PreferencesCategory.java:217: method: List com.dmdirc.config.prefs.PreferencesCategory.getSubcats()
    //#input(List getSubcats()): this
    //#input(List getSubcats()): this.subcats
    //#output(List getSubcats()): return_value
    //#post(List getSubcats()): return_value == this.subcats
    //#post(List getSubcats()): init'ed(return_value)
    //#PreferencesCategory.java:217: end of method: List com.dmdirc.config.prefs.PreferencesCategory.getSubcats()
    }

    /**
     * Retrieves the title of this category.
     * 
     * @return This category's title
     */
    public String getTitle() {
        return title;
    //#PreferencesCategory.java:226: method: String com.dmdirc.config.prefs.PreferencesCategory.getTitle()
    //#input(String getTitle()): this
    //#input(String getTitle()): this.title
    //#output(String getTitle()): return_value
    //#post(String getTitle()): return_value == this.title
    //#post(String getTitle()): init'ed(return_value)
    //#PreferencesCategory.java:226: end of method: String com.dmdirc.config.prefs.PreferencesCategory.getTitle()
    }

    /**
     * Retrieves the icon to use for this category.
     *
     * @return This category's icon
     * @since 0.6.3m1
     */
    public String getIcon() {
        return icon;
    //#PreferencesCategory.java:236: method: String com.dmdirc.config.prefs.PreferencesCategory.getIcon()
    //#input(String getIcon()): this
    //#input(String getIcon()): this.icon
    //#output(String getIcon()): return_value
    //#post(String getIcon()): return_value == this.icon
    //#post(String getIcon()): init'ed(return_value)
    //#PreferencesCategory.java:236: end of method: String com.dmdirc.config.prefs.PreferencesCategory.getIcon()
    }
    
    /**
     * Determines if this category has a replacement object.
     * 
     * @return True if the category has a replacement object, false otherwise
     * @see #getObject()
     */
    public boolean hasObject() {
        return object != null;
    //#PreferencesCategory.java:246: method: bool com.dmdirc.config.prefs.PreferencesCategory.hasObject()
    //#input(bool hasObject()): this
    //#input(bool hasObject()): this.object
    //#output(bool hasObject()): return_value
    //#post(bool hasObject()): init'ed(return_value)
    //#PreferencesCategory.java:246: end of method: bool com.dmdirc.config.prefs.PreferencesCategory.hasObject()
    }
    
    /**
     * Retrieves this category's replacement object.
     * 
     * @return This category's replacement object.
     * @see #hasObject()
     */
    public PreferencesInterface getObject() {
        return object;
    //#PreferencesCategory.java:256: method: PreferencesInterface com.dmdirc.config.prefs.PreferencesCategory.getObject()
    //#input(PreferencesInterface getObject()): this
    //#input(PreferencesInterface getObject()): this.object
    //#output(PreferencesInterface getObject()): return_value
    //#post(PreferencesInterface getObject()): return_value == this.object
    //#post(PreferencesInterface getObject()): init'ed(return_value)
    //#PreferencesCategory.java:256: end of method: PreferencesInterface com.dmdirc.config.prefs.PreferencesCategory.getObject()
    }

    /**
     * Retrieves the full path of this category. A category's path is the name
     * of each of its parent categories, starting with the furthest up the
     * hierarchy, separated by '→' characters.
     *
     * @return This category's path
     * @since 0.6.3m1
     */
    public String getPath() {
        return (parent == null ? "" : parent.getPath() + " → ") + getTitle();
    //#PreferencesCategory.java:268: method: String com.dmdirc.config.prefs.PreferencesCategory.getPath()
    //#input(String getPath()): " &#226;&#128;&#154;&#195;&#156;&#195;&#173; "._tainted
    //#input(String getPath()): ""._tainted
    //#input(String getPath()): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#input(String getPath()): __Descendant_Table[others]
    //#input(String getPath()): __Dispatch_Table.getPath()Ljava/lang/String;
    //#input(String getPath()): __Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(String getPath()): this
    //#input(String getPath()): this...__Tag
    //#input(String getPath()): this...parent
    //#input(String getPath()): this...title
    //#input(String getPath()): this...title._tainted
    //#input(String getPath()): this.__Tag
    //#input(String getPath()): this.parent
    //#input(String getPath()): this.title
    //#input(String getPath()): this.title._tainted
    //#output(String getPath()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String getPath()): return_value
    //#new obj(String getPath()): java.lang.StringBuilder:toString(...)
    //#pre[6] (String getPath()): this.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[7] (String getPath()): init'ed(this.parent)
    //#pre[2] (String getPath()): (soft) this...__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[3] (String getPath()): (soft) init'ed(this...parent)
    //#post(String getPath()): java.lang.StringBuilder:toString(...)._tainted == this.title._tainted | One-of{0, this...title._tainted | One-of{0, this...title._tainted | One-of{0, this...title._tainted | One-of{0, this...title._tainted}}}}
    //#post(String getPath()): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String getPath()): return_value == &java.lang.StringBuilder:toString(...)
    //#unanalyzed(String getPath()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getPath()): Effects-of-calling:getPath
    //#unanalyzed(String getPath()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getPath()): Effects-of-calling:java.lang.StringBuilder:toString
    //#PreferencesCategory.java:268: end of method: String com.dmdirc.config.prefs.PreferencesCategory.getPath()
    }

    /**
     * Sets this category's parent.
     *
     * @param parent The parent of this category
     * @since 0.6.3m1
     */
    public void setParent(final PreferencesCategory parent) {
        this.parent = parent;
    //#PreferencesCategory.java:278: method: void com.dmdirc.config.prefs.PreferencesCategory.setParent(PreferencesCategory)
    //#input(void setParent(PreferencesCategory)): parent
    //#input(void setParent(PreferencesCategory)): this
    //#output(void setParent(PreferencesCategory)): this.parent
    //#post(void setParent(PreferencesCategory)): this.parent == parent
    //#post(void setParent(PreferencesCategory)): init'ed(this.parent)
    }
    //#PreferencesCategory.java:279: end of method: void com.dmdirc.config.prefs.PreferencesCategory.setParent(PreferencesCategory)

    /**
     * Retrieves the parent of this category.
     *
     * @return This category's parent, or null if it's an orphan
     * @since 0.6.3m1
     */
    public PreferencesCategory getParent() {
        return parent;
    //#PreferencesCategory.java:288: method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.getParent()
    //#input(PreferencesCategory getParent()): this
    //#input(PreferencesCategory getParent()): this.parent
    //#output(PreferencesCategory getParent()): return_value
    //#pre[2] (PreferencesCategory getParent()): init'ed(this.parent)
    //#post(PreferencesCategory getParent()): return_value == this.parent
    //#post(PreferencesCategory getParent()): init'ed(return_value)
    //#PreferencesCategory.java:288: end of method: PreferencesCategory com.dmdirc.config.prefs.PreferencesCategory.getParent()
    }

    /**
     * Saves all the settings in this category.
     *
     * @return Is a restart needed after saving?
     */
    public boolean save() {
        LOGGER.fine(getTitle() + ": save method called");
    //#PreferencesCategory.java:297: method: bool com.dmdirc.config.prefs.PreferencesCategory.save()
    //#input(bool save()): " to "._tainted
    //#input(bool save()): ""._tainted
    //#input(bool save()): "'"._tainted
    //#input(bool save()): "."._tainted
    //#input(bool save()): ": save method called"._tainted
    //#input(bool save()): ": saving setting '"._tainted
    //#input(bool save()): ": setting "._tainted
    //#input(bool save()): "<Unknown>"._tainted
    //#input(bool save()): "@"._tainted
    //#input(bool save()): "Config option not found: "._tainted
    //#input(bool save()): "Unnamed"._tainted
    //#input(bool save()): LOGGER
    //#input(bool save()): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#input(bool save()): __Descendant_Table[others]
    //#input(bool save()): __Dispatch_Table.getSubcats()Ljava/util/List;
    //#input(bool save()): __Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(bool save()): __Dispatch_Table.save()Z
    //#input(bool save()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1).length
    //#input(bool save()): com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295]
    //#input(bool save()): com/dmdirc/config/ConfigManager$1.$SwitchMap$com$dmdirc$config$ConfigTarget$TYPE
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Descendant_Table[com/dmdirc/config/ConfigManager]
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.getScope(Ljava/lang/String;Ljava/lang/String;)Lcom/dmdirc/config/Identity;
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.identityApplies(Lcom/dmdirc/config/Identity;)Z
    //#input(bool save()): com/dmdirc/config/ConfigManager.__Dispatch_Table.removeIdentity(Lcom/dmdirc/config/Identity;)V
    //#input(bool save()): com/dmdirc/config/ConfigManager.stats
    //#input(bool save()): com/dmdirc/config/ConfigTarget$TYPE.GLOBAL
    //#input(bool save()): com/dmdirc/config/ConfigTarget.__Descendant_Table[com/dmdirc/config/ConfigTarget]
    //#input(bool save()): com/dmdirc/config/ConfigTarget.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getData()Ljava/lang/String;
    //#input(bool save()): com/dmdirc/config/ConfigTarget.__Dispatch_Table.getType()Lcom/dmdirc/config/ConfigTarget$TYPE;
    //#input(bool save()): com/dmdirc/config/Identity.DOMAIN
    //#input(bool save()): com/dmdirc/config/Identity.LOGGER
    //#input(bool save()): com/dmdirc/config/Identity.__Descendant_Table[com/dmdirc/config/Identity]
    //#input(bool save()): com/dmdirc/config/Identity.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.addListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.getDomains()Ljava/util/Set;
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.getOption(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.getOptions(Ljava/lang/String;)Ljava/util/Map;
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.getTarget()Lcom/dmdirc/config/ConfigTarget;
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.hasOption(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.removeListener(Lcom/dmdirc/interfaces/ConfigChangeListener;)V
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.setOption(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(bool save()): com/dmdirc/config/Identity.__Dispatch_Table.unsetOption(Ljava/lang/String;Ljava/lang/String;)V
    //#input(bool save()): com/dmdirc/config/IdentityManager.config
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.__Tag
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.file
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.globalConfig
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.globalConfig.__Tag
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.globalConfig.listeners
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.globalConfig.sources
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.listeners
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.myTarget
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.myTarget.__Tag
    //#input(bool save()): com/dmdirc/config/IdentityManager.config.myTarget.type
    //#input(bool save()): com/dmdirc/config/IdentityManager.identities
    //#input(bool save()): com/dmdirc/config/IdentityManager.managers
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Descendant_Table[com/dmdirc/config/prefs/PreferencesSetting]
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Dispatch_Table.isRestartNeeded()Z
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Dispatch_Table.needsSaving()Z
    //#input(bool save()): com/dmdirc/config/prefs/PreferencesSetting.__Dispatch_Table.save()Z
    //#input(bool save()): com/dmdirc/config/prefs/validator/ActionGroupValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/CommandNameValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/ConditionRuleValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/FileNameValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/IdentValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/NicknameValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/NotEmptyValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/NumericalValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/PermissiveValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/PortValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/RegexStringValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/RegexValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/StringLengthValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/URLProtocolValidator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/ValidationResponse.__Descendant_Table[com/dmdirc/config/prefs/validator/ValidationResponse]
    //#input(bool save()): com/dmdirc/config/prefs/validator/ValidationResponse.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/prefs/validator/ValidationResponse.__Dispatch_Table.isFailure()Z
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/ActionGroupValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/CommandNameValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/ConditionRuleValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/FileNameValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/IdentValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/NicknameValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/NotEmptyValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/NumericalValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/PermissiveValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/PortValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/RegexStringValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/RegexValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/StringLengthValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/URLProtocolValidator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/ValidatorChain]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[com/dmdirc/config/prefs/validator/Validator]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Descendant_Table[others]
    //#input(bool save()): com/dmdirc/config/prefs/validator/Validator.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): com/dmdirc/config/prefs/validator/ValidatorChain.__Dispatch_Table.validate(Ljava/lang/Object;)Lcom/dmdirc/config/prefs/validator/ValidationResponse;
    //#input(bool save()): this
    //#input(bool save()): this.__Tag
    //#input(bool save()): this.settings
    //#input(bool save()): this.subcats
    //#input(bool save()): this.title
    //#input(bool save()): this.title._tainted
    //#output(bool save()): com/dmdirc/config/IdentityManager.config.globalConfig
    //#output(bool save()): com/dmdirc/config/IdentityManager.config.needSave
    //#output(bool save()): java.lang.StringBuilder:toString(...)._tainted
    //#output(bool save()): new ArrayList(getSources#1) num objects
    //#output(bool save()): new ArrayList(getSources#1).__Lock
    //#output(bool save()): new ConfigManager(setOption#2) num objects
    //#output(bool save()): new ConfigManager(setOption#2).__Tag
    //#output(bool save()): new ConfigManager(setOption#2).channel
    //#output(bool save()): new ConfigManager(setOption#2).ircd
    //#output(bool save()): new ConfigManager(setOption#2).listeners
    //#output(bool save()): new ConfigManager(setOption#2).network
    //#output(bool save()): new ConfigManager(setOption#2).server
    //#output(bool save()): new ConfigManager(setOption#2).sources
    //#output(bool save()): new MapList(ConfigManager#1) num objects
    //#output(bool save()): return_value
    //#new obj(bool save()): java.lang.StringBuilder:toString(...)
    //#new obj(bool save()): new ArrayList(getSources#1)
    //#new obj(bool save()): new ConfigManager(setOption#2)
    //#new obj(bool save()): new MapList(ConfigManager#1)
    //#pre[19] (bool save()): this.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[20] (bool save()): this.settings != null
    //#pre[21] (bool save()): this.subcats != null
    //#pre[1] (bool save()): (soft) init'ed(com.dmdirc.config.ConfigManager$1__static_init.new int[](ConfigManager$1__static_init#1)[0..4_294_967_295])
    //#pre[4] (bool save()): (soft) com/dmdirc/config/IdentityManager.config != null
    //#pre[6] (bool save()): (soft) com/dmdirc/config/IdentityManager.config.__Tag == com/dmdirc/config/Identity
    //#pre[7] (bool save()): (soft) com/dmdirc/config/IdentityManager.config.file != null
    //#pre[12] (bool save()): (soft) com/dmdirc/config/IdentityManager.config.listeners != null
    //#pre[13] (bool save()): (soft) com/dmdirc/config/IdentityManager.config.myTarget != null
    //#pre[14] (bool save()): (soft) com/dmdirc/config/IdentityManager.config.myTarget.__Tag == com/dmdirc/config/ConfigTarget
    //#pre[15] (bool save()): (soft) init'ed(com/dmdirc/config/IdentityManager.config.myTarget.type)
    //#pre[16] (bool save()): (soft) init'ed(com/dmdirc/config/IdentityManager.config.globalConfig)
    //#presumption(bool save()): java.util.Iterator:next(...).__Tag@300 == com/dmdirc/config/prefs/PreferencesSetting
    //#presumption(bool save()): java.util.Iterator:next(...).__Tag@307 == com/dmdirc/config/prefs/PreferencesCategory
    //#presumption(bool save()): java.util.Iterator:next(...)@300 != null
    //#presumption(bool save()): java.util.Iterator:next(...)@307 != null
    //#presumption(bool save()): java.util.logging.Logger:getLogger(...)@39 != null
    //#presumption(bool save()): setting.validator.__Tag@300 in {com/dmdirc/config/prefs/validator/ActionGroupValidator, com/dmdirc/config/prefs/validator/CommandNameValidator, com/dmdirc/config/prefs/validator/ConditionRuleValidator, com/dmdirc/config/prefs/validator/FileNameValidator, com/dmdirc/config/prefs/validator/IdentValidator, com/dmdirc/config/prefs/validator/NicknameValidator, com/dmdirc/config/prefs/validator/NotEmptyValidator, com/dmdirc/config/prefs/validator/NumericalValidator, com/dmdirc/config/prefs/validator/PermissiveValidator, com/dmdirc/config/prefs/validator/PortValidator, com/dmdirc/config/prefs/validator/RegexStringValidator, com/dmdirc/config/prefs/validator/RegexValidator, com/dmdirc/config/prefs/validator/StringLengthValidator, com/dmdirc/config/prefs/validator/URLProtocolValidator, com/dmdirc/config/prefs/validator/Validator, com/dmdirc/config/prefs/validator/ValidatorChain}
    //#post(bool save()): init'ed(com/dmdirc/config/IdentityManager.config.globalConfig)
    //#post(bool save()): possibly_updated(com/dmdirc/config/IdentityManager.config.needSave)
    //#post(bool save()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(bool save()): init'ed(return_value)
    //#post(bool save()): init'ed(new ArrayList(getSources#1) num objects)
    //#post(bool save()): new ArrayList(getSources#1) num objects == undefined
    //#post(bool save()): new ArrayList(getSources#1) num objects == 0, if init'ed
    //#post(bool save()): new ArrayList(getSources#1).__Lock == new ArrayList(getSources#1) num objects
    //#post(bool save()): new ConfigManager(setOption#2) num objects == new ArrayList(getSources#1) num objects
    //#post(bool save()): new ConfigManager(setOption#2).__Tag == new ArrayList(getSources#1) num objects
    //#post(bool save()): new MapList(ConfigManager#1) num objects == new ArrayList(getSources#1) num objects
    //#post(bool save()): init'ed(new ArrayList(getSources#1).__Lock)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2) num objects)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).__Tag)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).channel)
    //#post(bool save()): new ConfigManager(setOption#2).channel == undefined
    //#post(bool save()): new ConfigManager(setOption#2).channel == null
    //#post(bool save()): new ConfigManager(setOption#2).ircd == new ConfigManager(setOption#2).channel
    //#post(bool save()): new ConfigManager(setOption#2).listeners == new ConfigManager(setOption#2).channel
    //#post(bool save()): new ConfigManager(setOption#2).network == new ConfigManager(setOption#2).channel
    //#post(bool save()): new ConfigManager(setOption#2).server == new ConfigManager(setOption#2).channel
    //#post(bool save()): new ConfigManager(setOption#2).sources == new ConfigManager(setOption#2).channel
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).ircd)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).listeners)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).network)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).server)
    //#post(bool save()): init'ed(new ConfigManager(setOption#2).sources)
    //#post(bool save()): init'ed(new MapList(ConfigManager#1) num objects)
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(bool save()): Effects-of-calling:validate
    //#unanalyzed(bool save()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(bool save()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.interfaces.ConfigChangeListener:configChanged
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomain
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.ConfigFile:getKeyDomains
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:add
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool save()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.ConfigFile:isKeyDomain
    //#unanalyzed(bool save()): Effects-of-calling:java.util.HashSet
    //#unanalyzed(bool save()): Effects-of-calling:hasOption
    //#unanalyzed(bool save()): Effects-of-calling:getOption
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool save()): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(bool save()): Effects-of-calling:getSources
    //#unanalyzed(bool save()): Effects-of-calling:addListener
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.config.ConfigSource
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.MapList
    //#unanalyzed(bool save()): Effects-of-calling:addConfigManager
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(bool save()): Effects-of-calling:getDomains
    //#unanalyzed(bool save()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(bool save()): Effects-of-calling:getOptions
    //#unanalyzed(bool save()): Effects-of-calling:equals
    //#unanalyzed(bool save()): Effects-of-calling:removeListener
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.Integer:intValue
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.IllegalArgumentException
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(bool save()): Effects-of-calling:getTarget
    //#unanalyzed(bool save()): Effects-of-calling:com.dmdirc.config.ConfigTarget$TYPE:ordinal
    //#unanalyzed(bool save()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(bool save()): Effects-of-calling:java.util.Collections:sort
    //#test_vector(bool save()): java.util.Iterator:hasNext(...)@300: {0}, {1}
    //#test_vector(bool save()): java.util.Iterator:hasNext(...)@307: {0}, {1}
    //#test_vector(bool save()): setting.restartNeeded@302: {0}, {1}

        boolean restart = false;
        for (PreferencesSetting setting : settings) {
            LOGGER.finest(getTitle() + ": saving setting '" + setting.getTitle() + "'");
            if (setting.save() && setting.isRestartNeeded()) {
                restart = true;
            }
        }

        for (PreferencesCategory child : getSubcats()) {
            restart |= child.save();
    //#PreferencesCategory.java:308: Warning: call too complex - analysis skipped
    //#    call on bool save()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: bool save()
    //#    unanalyzed callee: bool save()
        }

        return restart;
    //#PreferencesCategory.java:311: end of method: bool com.dmdirc.config.prefs.PreferencesCategory.save()
    }

    /**
     * Dismisses all the settings in this category.
     */
    public void dismiss() {
        for (PreferencesSetting setting : settings) {
    //#PreferencesCategory.java:318: method: void com.dmdirc.config.prefs.PreferencesCategory.dismiss()
    //#input(void dismiss()): __Descendant_Table[com/dmdirc/config/prefs/PreferencesCategory]
    //#input(void dismiss()): __Descendant_Table[others]
    //#input(void dismiss()): __Dispatch_Table.dismiss()V
    //#input(void dismiss()): __Dispatch_Table.getSubcats()Ljava/util/List;
    //#input(void dismiss()): com/dmdirc/config/prefs/PreferencesSetting.__Descendant_Table[com/dmdirc/config/prefs/PreferencesSetting]
    //#input(void dismiss()): com/dmdirc/config/prefs/PreferencesSetting.__Descendant_Table[others]
    //#input(void dismiss()): com/dmdirc/config/prefs/PreferencesSetting.__Dispatch_Table.dismiss()V
    //#input(void dismiss()): com/dmdirc/config/prefs/SettingChangeListener.__Descendant_Table[com/dmdirc/config/prefs/SettingChangeListener]
    //#input(void dismiss()): com/dmdirc/config/prefs/SettingChangeListener.__Descendant_Table[others]
    //#input(void dismiss()): com/dmdirc/config/prefs/SettingChangeListener.__Dispatch_Table.settingChanged(Lcom/dmdirc/config/prefs/PreferencesSetting;)V
    //#input(void dismiss()): this
    //#input(void dismiss()): this.__Tag
    //#input(void dismiss()): this.settings
    //#input(void dismiss()): this.subcats
    //#pre[2] (void dismiss()): this.__Tag == com/dmdirc/config/prefs/PreferencesCategory
    //#pre[3] (void dismiss()): this.settings != null
    //#pre[4] (void dismiss()): this.subcats != null
    //#presumption(void dismiss()): child.settings@322 != null
    //#presumption(void dismiss()): child.subcats@322 != null
    //#presumption(void dismiss()): java.util.Iterator:next(...).__Tag@318 == com/dmdirc/config/prefs/PreferencesSetting
    //#presumption(void dismiss()): java.util.Iterator:next(...).__Tag@322 == com/dmdirc/config/prefs/PreferencesCategory
    //#presumption(void dismiss()): java.util.Iterator:next(...)@318 != null
    //#presumption(void dismiss()): java.util.Iterator:next(...)@322 != null
    //#presumption(void dismiss()): setting.listeners@318 != null
    //#unanalyzed(void dismiss()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void dismiss()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void dismiss()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void dismiss()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void dismiss()): Effects-of-calling:settingChanged
    //#unanalyzed(void dismiss()): Effects-of-calling:dismiss
    //#test_vector(void dismiss()): java.util.Iterator:hasNext(...)@318: {0}, {1}
    //#test_vector(void dismiss()): java.util.Iterator:hasNext(...)@322: {0}, {1}
            setting.dismiss();
        }

        for (PreferencesCategory child : getSubcats()) {
            child.dismiss();
        }
    }
    //#PreferencesCategory.java:325: end of method: void com.dmdirc.config.prefs.PreferencesCategory.dismiss()
    
    /**
     * Registers a change listener for this category.
     * 
     * @param listener The listener to be added
     */
    public void addChangeListener(final CategoryChangeListener listener) {
        listeners.add(CategoryChangeListener.class, listener);
    //#PreferencesCategory.java:333: method: void com.dmdirc.config.prefs.PreferencesCategory.addChangeListener(CategoryChangeListener)
    //#PreferencesCategory.java:333: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:add(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void addChangeListener(CategoryChangeListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:add(Class, Object)
    //#input(void addChangeListener(CategoryChangeListener)): listener
    //#input(void addChangeListener(CategoryChangeListener)): this
    //#input(void addChangeListener(CategoryChangeListener)): this.listeners
    //#pre[3] (void addChangeListener(CategoryChangeListener)): this.listeners != null
    }
    //#PreferencesCategory.java:334: end of method: void com.dmdirc.config.prefs.PreferencesCategory.addChangeListener(CategoryChangeListener)
    
    /**
     * Removes a change listener from this category.
     * 
     * @param listener The listener to be added
     */
    public void removeChangeListener(final CategoryChangeListener listener) {
        listeners.remove(CategoryChangeListener.class, listener);
    //#PreferencesCategory.java:342: method: void com.dmdirc.config.prefs.PreferencesCategory.removeChangeListener(CategoryChangeListener)
    //#PreferencesCategory.java:342: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:remove(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void removeChangeListener(CategoryChangeListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:remove(Class, Object)
    //#input(void removeChangeListener(CategoryChangeListener)): listener
    //#input(void removeChangeListener(CategoryChangeListener)): this
    //#input(void removeChangeListener(CategoryChangeListener)): this.listeners
    //#pre[3] (void removeChangeListener(CategoryChangeListener)): this.listeners != null
    }
    //#PreferencesCategory.java:343: end of method: void com.dmdirc.config.prefs.PreferencesCategory.removeChangeListener(CategoryChangeListener)
    
    /**
     * Informs all registered listeners that this category has been selected.
     */
    public void fireCategorySelected() {
        for (CategoryChangeListener listener : listeners.get(CategoryChangeListener.class)) {
    //#PreferencesCategory.java:349: method: void com.dmdirc.config.prefs.PreferencesCategory.fireCategorySelected()
    //#PreferencesCategory.java:349: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void fireCategorySelected()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
    //#input(void fireCategorySelected()): com/dmdirc/config/prefs/CategoryChangeListener.__Descendant_Table[com/dmdirc/config/prefs/CategoryChangeListener]
    //#input(void fireCategorySelected()): com/dmdirc/config/prefs/CategoryChangeListener.__Descendant_Table[others]
    //#input(void fireCategorySelected()): com/dmdirc/config/prefs/CategoryChangeListener.__Dispatch_Table.categorySelected(Lcom/dmdirc/config/prefs/PreferencesCategory;)V
    //#input(void fireCategorySelected()): this
    //#input(void fireCategorySelected()): this.listeners
    //#pre[2] (void fireCategorySelected()): this.listeners != null
    //#presumption(void fireCategorySelected()): com.dmdirc.util.ListenerList:get(...)@349 != null
    //#presumption(void fireCategorySelected()): java.util.Iterator:next(...).__Tag@349 == com/dmdirc/config/prefs/CategoryChangeListener
    //#presumption(void fireCategorySelected()): java.util.Iterator:next(...)@349 != null
    //#test_vector(void fireCategorySelected()): java.util.Iterator:hasNext(...)@349: {0}, {1}
            listener.categorySelected(this);
    //#PreferencesCategory.java:350: Warning: method not available - call not analyzed
    //#    call on void categorySelected(PreferencesCategory)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void fireCategorySelected()
    //#    unanalyzed callee: void categorySelected(PreferencesCategory)
        }
    }
    //#PreferencesCategory.java:352: end of method: void com.dmdirc.config.prefs.PreferencesCategory.fireCategorySelected()
    
    /**
     * Informs all registered listeners that this category has been deselected.
     */
    public void fireCategoryDeselected() {
        for (CategoryChangeListener listener : listeners.get(CategoryChangeListener.class)) {
    //#PreferencesCategory.java:358: method: void com.dmdirc.config.prefs.PreferencesCategory.fireCategoryDeselected()
    //#PreferencesCategory.java:358: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void fireCategoryDeselected()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
    //#input(void fireCategoryDeselected()): com/dmdirc/config/prefs/CategoryChangeListener.__Descendant_Table[com/dmdirc/config/prefs/CategoryChangeListener]
    //#input(void fireCategoryDeselected()): com/dmdirc/config/prefs/CategoryChangeListener.__Descendant_Table[others]
    //#input(void fireCategoryDeselected()): com/dmdirc/config/prefs/CategoryChangeListener.__Dispatch_Table.categoryDeselected(Lcom/dmdirc/config/prefs/PreferencesCategory;)V
    //#input(void fireCategoryDeselected()): this
    //#input(void fireCategoryDeselected()): this.listeners
    //#pre[2] (void fireCategoryDeselected()): this.listeners != null
    //#presumption(void fireCategoryDeselected()): com.dmdirc.util.ListenerList:get(...)@358 != null
    //#presumption(void fireCategoryDeselected()): java.util.Iterator:next(...).__Tag@358 == com/dmdirc/config/prefs/CategoryChangeListener
    //#presumption(void fireCategoryDeselected()): java.util.Iterator:next(...)@358 != null
    //#test_vector(void fireCategoryDeselected()): java.util.Iterator:hasNext(...)@358: {0}, {1}
            listener.categoryDeselected(this);
    //#PreferencesCategory.java:359: Warning: method not available - call not analyzed
    //#    call on void categoryDeselected(PreferencesCategory)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.config.prefs.PreferencesCategory
    //#    method: void fireCategoryDeselected()
    //#    unanalyzed callee: void categoryDeselected(PreferencesCategory)
        }
    }    
    //#PreferencesCategory.java:361: end of method: void com.dmdirc.config.prefs.PreferencesCategory.fireCategoryDeselected()

}
    //#PreferencesCategory.java:: end of class: com.dmdirc.config.prefs.PreferencesCategory
