//# 0 errors, 955 messages
//#
/*
    //#FrameContainer.java:1:1: class: com.dmdirc.FrameContainer$1
    //#FrameContainer.java:1:1: method: com.dmdirc.FrameContainer$1.com.dmdirc.FrameContainer$1__static_init
    //#FrameContainer.java:1:1: class: com.dmdirc.FrameContainer$IconChanger
    //#FrameContainer.java:1:1: method: com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger__static_init
    //#FrameContainer.java:1:1: class: com.dmdirc.FrameContainer
 * 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;

import com.dmdirc.config.ConfigManager;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.interfaces.IconChangeListener;
import com.dmdirc.interfaces.NotificationListener;
import com.dmdirc.interfaces.SelectionListener;
import com.dmdirc.ui.IconManager;
import com.dmdirc.ui.interfaces.Window;
import com.dmdirc.util.ListenerList;

import java.awt.Color;

import javax.swing.Icon;

/**
 * The frame container implements basic methods that should be present in
 * all objects that handle a frame.
 *
 * @author chris
 */
public abstract class FrameContainer {
    //#FrameContainer.java:44: method: void com.dmdirc.FrameContainer.access$100(FrameContainer)
    //#FrameContainer.java:44: Warning: suspicious precondition
    //#    The precondition for x0.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void access$100(FrameContainer)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/Query]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/Raw]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/Server]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void access$100(FrameContainer)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void access$100(FrameContainer)): __Descendant_Table[others]
    //#input(void access$100(FrameContainer)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void access$100(FrameContainer)): x0
    //#input(void access$100(FrameContainer)): x0.__Tag
    //#input(void access$100(FrameContainer)): x0.icon
    //#input(void access$100(FrameContainer)): x0.listeners
    //#pre[1] (void access$100(FrameContainer)): x0 != null
    //#pre[3] (void access$100(FrameContainer)): init'ed(x0.icon)
    //#pre[4] (void access$100(FrameContainer)): x0.listeners != null
    //#pre[2] (void access$100(FrameContainer)): (soft) x0.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:getFrame
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void access$100(FrameContainer)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#FrameContainer.java:44: end of method: void com.dmdirc.FrameContainer.access$100(FrameContainer)

    /** Logger to use. */
    private static final java.util.logging.Logger LOGGER = java.util.logging
    //#FrameContainer.java:47: method: com.dmdirc.FrameContainer.com.dmdirc.FrameContainer__static_init
    //#output(com.dmdirc.FrameContainer__static_init): LOGGER
    //#output(com.dmdirc.FrameContainer__static_init): __Descendant_Table[com/dmdirc/FrameContainer]
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.activateFrame()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.clearNotification()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.close()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.iconUpdated()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowActivated()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowClosed()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowClosing()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowDeactivated()V
    //#output(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowOpened()V
    //#post(com.dmdirc.FrameContainer__static_init): init'ed(LOGGER)
    //#post(com.dmdirc.FrameContainer__static_init): __Descendant_Table[com/dmdirc/FrameContainer] == &__Dispatch_Table
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.activateFrame()V == &activateFrame
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &addIconChangeListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V == &addLine
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &addLine
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &addNotificationListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &addSelectionListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.clearNotification()V == &clearNotification
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.close()V == &close
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager; == &getConfigManager
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window; == &getFrame
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon; == &getIcon
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color; == &getNotification
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server; == &getServer
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.iconUpdated()V == &iconUpdated
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z == &ownsFrame
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &removeIconChangeListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &removeNotificationListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &removeSelectionListener
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V == &sendNotification
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V == &setIcon
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowActivated()V == &windowActivated
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowClosed()V == &windowClosed
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowClosing()V == &windowClosing
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowDeactivated()V == &windowDeactivated
    //#post(com.dmdirc.FrameContainer__static_init): __Dispatch_Table.windowOpened()V == &windowOpened
    //#FrameContainer.java:47: end of method: com.dmdirc.FrameContainer.com.dmdirc.FrameContainer__static_init
            .Logger.getLogger(FrameContainer.class.getName());

    /** The colour of our frame's notifications. */
    protected Color notification = Color.BLACK;

    /** A list of listeners for this containers's events. */
    protected final ListenerList listeners = new ListenerList();
    //#FrameContainer.java:54: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void com.dmdirc.FrameContainer(String, ConfigManager)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList()

    /** The name of the icon being used for this container's frame. */
    private String icon;
    
    /** The config manager for this container. */
    private final ConfigManager config;
    
    /** The IconChanger for this container. */
    private final IconChanger changer = new IconChanger();

    /**
     * Instantiate new frame container.
     * 
     * @param icon The icon to use for this container
     * @param config The config manager for this container
     */
    public FrameContainer(final String icon, final ConfigManager config) {
    //#FrameContainer.java:71: method: void com.dmdirc.FrameContainer.com.dmdirc.FrameContainer(String, ConfigManager)
    //#FrameContainer.java:71: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void com.dmdirc.FrameContainer(String, ConfigManager)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/Query]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/Raw]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/Server]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Descendant_Table[others]
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): config
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): icon
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): java.awt.Color.BLACK
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): this
    //#input(void com.dmdirc.FrameContainer(String, ConfigManager)): this.__Tag
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer.__Tag
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer.this$0
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1) num objects
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.listeners.__Lock
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.__Tag
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.config
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.icon
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.listeners
    //#output(void com.dmdirc.FrameContainer(String, ConfigManager)): this.notification
    //#new obj(void com.dmdirc.FrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2)
    //#new obj(void com.dmdirc.FrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1)
    //#pre[1] (void com.dmdirc.FrameContainer(String, ConfigManager)): config != null
    //#pre[3] (void com.dmdirc.FrameContainer(String, ConfigManager)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void com.dmdirc.FrameContainer(String, ConfigManager)): init'ed(java.awt.Color.BLACK)
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.__Tag == old this.__Tag
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer == &new FrameContainer$IconChanger(FrameContainer#2)
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.config == config
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.config != null
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.icon == icon
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): init'ed(this.icon)
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.listeners == &new ListenerList(FrameContainer#1)
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.notification == java.awt.Color.BLACK
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): init'ed(this.notification)
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2) num objects == 1
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1) num objects == 1
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer.__Tag == com/dmdirc/FrameContainer$IconChanger
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer.this$0 == this
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): this.changer.this$0 != null
    //#post(void com.dmdirc.FrameContainer(String, ConfigManager)): init'ed(this.listeners.__Lock)
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:getFrame
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void com.dmdirc.FrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
        this.config = config;
        
        setIcon(icon);
    }
    //#FrameContainer.java:75: end of method: void com.dmdirc.FrameContainer.com.dmdirc.FrameContainer(String, ConfigManager)

    /**
     * Returns the internal frame associated with this object.
     *
     * @return The internal frame associated with this object
     */
    public abstract Window getFrame();

    /**
     * Returns a string identifier for this object/its frame.
     *
     * @return String identifier
     */
    @Override
    public abstract String toString();

    /**
     * Closes this container (and it's associated frame).
     */
    public void close() {
        if (getFrame() == null) {
    //#FrameContainer.java:96: method: void com.dmdirc.FrameContainer.close()
    //#FrameContainer.java:96: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void close()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:96: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void close()
    //#    suspicious precondition index: [2]
    //#input(void close()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void close()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void close()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void close()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void close()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void close()): __Descendant_Table[com/dmdirc/Query]
    //#input(void close()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void close()): __Descendant_Table[com/dmdirc/Server]
    //#input(void close()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void close()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void close()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void close()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void close()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void close()): __Descendant_Table[others]
    //#input(void close()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void close()): this
    //#input(void close()): this.__Tag
    //#pre[2] (void close()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void close()): getFrame(...)@96 != null
    //#presumption(void close()): getFrame(...)@99 != null
            throw new IllegalStateException("No frame associated with this container!");
        } else {
            getFrame().close();
    //#FrameContainer.java:99: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void close()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:99: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.Window:close()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void close()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.Window:close()
        }
    }
    //#FrameContainer.java:101: end of method: void com.dmdirc.FrameContainer.close()

    /**
     * Returns the server instance associated with this container.
     *
     * @return the associated server connection
     */
    public abstract Server getServer();

    /**
     * Sets the icon to be used by this frame container.
     * 
     * @param icon The new icon to be used
     */
    public final void setIcon(final String icon) {
        this.icon = icon;
    //#FrameContainer.java:116: method: void com.dmdirc.FrameContainer.setIcon(String)
    //#FrameContainer.java:116: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void setIcon(String)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/Query]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/Raw]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/Server]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void setIcon(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void setIcon(String)): __Descendant_Table[others]
    //#input(void setIcon(String)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void setIcon(String)): icon
    //#input(void setIcon(String)): this
    //#input(void setIcon(String)): this.__Tag
    //#input(void setIcon(String)): this.changer
    //#input(void setIcon(String)): this.config
    //#input(void setIcon(String)): this.listeners
    //#output(void setIcon(String)): this.icon
    //#pre[5] (void setIcon(String)): this.config != null
    //#pre[6] (void setIcon(String)): this.listeners != null
    //#pre[3] (void setIcon(String)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#post(void setIcon(String)): this.icon == icon
    //#post(void setIcon(String)): init'ed(this.icon)
    //#unanalyzed(void setIcon(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void setIcon(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void setIcon(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setIcon(String)): Effects-of-calling:getFrame
    //#unanalyzed(void setIcon(String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void setIcon(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void setIcon(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void setIcon(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void setIcon(String)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
        
        iconUpdated();
        
        config.removeListener(changer);
    //#FrameContainer.java:120: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:removeListener(ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void setIcon(String)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:removeListener(ConfigChangeListener)
        config.addChangeListener("icon", icon, changer);
    //#FrameContainer.java:121: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void setIcon(String)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
    }
    //#FrameContainer.java:122: end of method: void com.dmdirc.FrameContainer.setIcon(String)
    
    /**
     * Called when this container's icon is updated.
     */
    private void iconUpdated() {
        final Icon newIcon = getIcon();
    //#FrameContainer.java:128: method: void com.dmdirc.FrameContainer.iconUpdated()
    //#FrameContainer.java:128: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void iconUpdated()
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/Query]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/Server]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void iconUpdated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void iconUpdated()): __Descendant_Table[others]
    //#input(void iconUpdated()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void iconUpdated()): this
    //#input(void iconUpdated()): this.__Tag
    //#input(void iconUpdated()): this.icon
    //#input(void iconUpdated()): this.listeners
    //#input(void iconUpdated()): this.listeners.__Lock
    //#pre[3] (void iconUpdated()): init'ed(this.icon)
    //#pre[4] (void iconUpdated()): this.listeners != null
    //#pre[2] (void iconUpdated()): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void iconUpdated()): com.dmdirc.util.ListenerList:get(...)@131 != null
    //#presumption(void iconUpdated()): java.util.Iterator:next(...)@131 != null
    //#unanalyzed(void iconUpdated()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void iconUpdated()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#test_vector(void iconUpdated()): java.util.Iterator:hasNext(...)@131: {1}, {0}
        
        synchronized (listeners) {
            for (IconChangeListener listener : listeners.get(IconChangeListener.class)) {
    //#FrameContainer.java:131: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void iconUpdated()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
                listener.iconChanged(getFrame(), newIcon);
    //#FrameContainer.java:132: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void iconUpdated()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:132: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.IconChangeListener:iconChanged(Window, Icon)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void iconUpdated()
    //#    unanalyzed callee: void com.dmdirc.interfaces.IconChangeListener:iconChanged(Window, Icon)
            }
        }
    }
    //#FrameContainer.java:135: end of method: void com.dmdirc.FrameContainer.iconUpdated()

    /**
     * Retrieves the icon used by this container's window.
     *
     * @return This container's icon
     */
    public final Icon getIcon() {
        return IconManager.getIconManager().getIcon(icon);
    //#FrameContainer.java:143: method: Icon com.dmdirc.FrameContainer.getIcon()
    //#FrameContainer.java:143: Warning: method not available - call not analyzed
    //#    call on IconManager com.dmdirc.ui.IconManager:getIconManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: Icon getIcon()
    //#    unanalyzed callee: IconManager com.dmdirc.ui.IconManager:getIconManager()
    //#FrameContainer.java:143: Warning: method not available - call not analyzed
    //#    call on Icon com.dmdirc.ui.IconManager:getIcon(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: Icon getIcon()
    //#    unanalyzed callee: Icon com.dmdirc.ui.IconManager:getIcon(String)
    //#input(Icon getIcon()): this
    //#input(Icon getIcon()): this.icon
    //#output(Icon getIcon()): return_value
    //#pre[2] (Icon getIcon()): init'ed(this.icon)
    //#presumption(Icon getIcon()): com.dmdirc.ui.IconManager:getIconManager(...)@143 != null
    //#post(Icon getIcon()): init'ed(return_value)
    //#FrameContainer.java:143: end of method: Icon com.dmdirc.FrameContainer.getIcon()
    }

    /**
     * Returns the config manager for this container.
     *
     * @return the associated config manager
     */
    public final ConfigManager getConfigManager() {
        return config;
    //#FrameContainer.java:152: method: ConfigManager com.dmdirc.FrameContainer.getConfigManager()
    //#input(ConfigManager getConfigManager()): this
    //#input(ConfigManager getConfigManager()): this.config
    //#output(ConfigManager getConfigManager()): return_value
    //#post(ConfigManager getConfigManager()): return_value == this.config
    //#post(ConfigManager getConfigManager()): init'ed(return_value)
    //#FrameContainer.java:152: end of method: ConfigManager com.dmdirc.FrameContainer.getConfigManager()
    }

    /**
     * Requests that this object's frame be activated.
     */
    public void activateFrame() {
        getFrame().activateFrame();
    //#FrameContainer.java:159: method: void com.dmdirc.FrameContainer.activateFrame()
    //#FrameContainer.java:159: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void activateFrame()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:159: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.Window:activateFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void activateFrame()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.Window:activateFrame()
    //#FrameContainer.java:159: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void activateFrame()
    //#    suspicious precondition index: [2]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/Query]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/Server]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void activateFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void activateFrame()): __Descendant_Table[others]
    //#input(void activateFrame()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void activateFrame()): this
    //#input(void activateFrame()): this.__Tag
    //#pre[2] (void activateFrame()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void activateFrame()): getFrame(...)@159 != null
    }
    //#FrameContainer.java:160: end of method: void com.dmdirc.FrameContainer.activateFrame()

    /**
     * Clears any outstanding notifications this frame has set.
     */
    protected void clearNotification() {
        LOGGER.finer(toString() + ": clearNotification(): frame = "
    //#FrameContainer.java:166: method: void com.dmdirc.FrameContainer.clearNotification()
    //#FrameContainer.java:166: Warning: call too complex - analysis skipped
    //#    call on String toString()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    unanalyzed callee: String toString()
    //#FrameContainer.java:166: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:166: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    suspicious precondition index: [2]
    //#input(void clearNotification()): ": clearNotification(): frame = "._tainted
    //#input(void clearNotification()): LOGGER
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/Query]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/Server]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void clearNotification()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void clearNotification()): __Descendant_Table[others]
    //#input(void clearNotification()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): __Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/Channel.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/CustomWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/GlobalWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/MessageTarget.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/Query.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/Raw.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/Server.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void clearNotification()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void clearNotification()): java.awt.Color.BLACK
    //#input(void clearNotification()): this
    //#input(void clearNotification()): this.__Tag
    //#input(void clearNotification()): this.listeners
    //#input(void clearNotification()): this.listeners.__Lock
    //#output(void clearNotification()): this.notification
    //#pre[2] (void clearNotification()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[3] (void clearNotification()): this.listeners != null
    //#presumption(void clearNotification()): com.dmdirc.util.ListenerList:get(...)@173 != null
    //#presumption(void clearNotification()): getFrame(...)@166 != null
    //#presumption(void clearNotification()): init'ed(java.awt.Color.BLACK)
    //#presumption(void clearNotification()): java.lang.Object:getClass(...)@166 != null
    //#presumption(void clearNotification()): java.util.Iterator:next(...)@173 != null
    //#presumption(void clearNotification()): java.util.logging.Logger:getLogger(...)@47 != null
    //#post(void clearNotification()): this.notification == java.awt.Color.BLACK
    //#post(void clearNotification()): init'ed(this.notification)
    //#test_vector(void clearNotification()): java.util.Iterator:hasNext(...)@173: {1}, {0}
                + (getFrame() == null ? null : getFrame().getClass().getName()));

        // TODO: This should default ot something colour independent
        notification = Color.BLACK;

        synchronized (listeners) {
            for (NotificationListener listener : listeners.get(NotificationListener.class)) {
    //#FrameContainer.java:173: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
                listener.notificationCleared(getFrame());
    //#FrameContainer.java:174: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:174: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.NotificationListener:notificationCleared(Window)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void clearNotification()
    //#    unanalyzed callee: void com.dmdirc.interfaces.NotificationListener:notificationCleared(Window)
            }
        }
    }
    //#FrameContainer.java:177: end of method: void com.dmdirc.FrameContainer.clearNotification()

    /**
     * Sends a notification to the frame manager if this fame isn't active.
     *
     * @param colour The colour to use for the notification
     */
    public void sendNotification(final Color colour) {
        final Window activeFrame = Main.getUI().getActiveWindow();
    //#FrameContainer.java:185: method: void com.dmdirc.FrameContainer.sendNotification(Color)
    //#FrameContainer.java:185: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    unanalyzed callee: Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#FrameContainer.java:185: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    suspicious precondition index: [5]
    //#    Attribs:  Soft
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/Query]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/Raw]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/Server]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void sendNotification(Color)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void sendNotification(Color)): __Descendant_Table[others]
    //#input(void sendNotification(Color)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): colour
    //#input(void sendNotification(Color)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/Main.controller
    //#input(void sendNotification(Color)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendNotification(Color)): this
    //#input(void sendNotification(Color)): this.__Tag
    //#input(void sendNotification(Color)): this.listeners
    //#input(void sendNotification(Color)): this.listeners.__Lock
    //#input(void sendNotification(Color)): this.notification
    //#output(void sendNotification(Color)): this.notification
    //#pre[2] (void sendNotification(Color)): com/dmdirc/Main.controller != null
    //#pre[1] (void sendNotification(Color)): (soft) colour != null
    //#pre[3] (void sendNotification(Color)): (soft) init'ed(this.notification)
    //#pre[5] (void sendNotification(Color)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[6] (void sendNotification(Color)): (soft) this.listeners != null
    //#presumption(void sendNotification(Color)): com.dmdirc.util.ListenerList:get(...)@192 != null
    //#presumption(void sendNotification(Color)): java.util.Iterator:next(...)@192 != null
    //#post(void sendNotification(Color)): this.notification == One-of{old this.notification, colour}
    //#post(void sendNotification(Color)): init'ed(this.notification)
    //#test_vector(void sendNotification(Color)): com.dmdirc.ui.interfaces.UIController:getActiveWindow(...)@185: Addr_Set{null}, Inverse{null}
    //#test_vector(void sendNotification(Color)): java.awt.Color:equals(...)@187: {1}, {0}
    //#test_vector(void sendNotification(Color)): java.lang.Object:equals(...)@187: {1}, {0}

        if (activeFrame != null && !activeFrame.equals(getFrame())
    //#FrameContainer.java:187: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    unanalyzed callee: Window getFrame()
                && !colour.equals(notification)) {
            notification = colour;

            synchronized (listeners) {
                for (NotificationListener listener : listeners.get(NotificationListener.class)) {
    //#FrameContainer.java:192: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
                    listener.notificationSet(getFrame(), colour);
    //#FrameContainer.java:193: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:193: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.NotificationListener:notificationSet(Window, Color)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void sendNotification(Color)
    //#    unanalyzed callee: void com.dmdirc.interfaces.NotificationListener:notificationSet(Window, Color)
                }
            }
        }
    }
    //#FrameContainer.java:197: end of method: void com.dmdirc.FrameContainer.sendNotification(Color)

    /**
     * Retrieves the current notification colour of this channel.
     *
     * @return This channel's notification colour
     */
    public Color getNotification() {
        return notification;
    //#FrameContainer.java:205: method: Color com.dmdirc.FrameContainer.getNotification()
    //#input(Color getNotification()): this
    //#input(Color getNotification()): this.notification
    //#output(Color getNotification()): return_value
    //#pre[2] (Color getNotification()): init'ed(this.notification)
    //#post(Color getNotification()): return_value == this.notification
    //#post(Color getNotification()): init'ed(return_value)
    //#FrameContainer.java:205: end of method: Color com.dmdirc.FrameContainer.getNotification()
    }

    /**
     * Determines if the specified frame is owned by this object.
     *
     * @param target Window to check ownership of
     * @return True iff frame is owned by this container, false otherwise
     */
    public boolean ownsFrame(final Window target) {
        return getFrame().equals(target);
    //#FrameContainer.java:215: method: bool com.dmdirc.FrameContainer.ownsFrame(Window)
    //#FrameContainer.java:215: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: bool ownsFrame(Window)
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:215: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: bool ownsFrame(Window)
    //#    suspicious precondition index: [3]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/Channel]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/Query]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/Raw]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/Server]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(bool ownsFrame(Window)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(bool ownsFrame(Window)): __Descendant_Table[others]
    //#input(bool ownsFrame(Window)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(bool ownsFrame(Window)): target
    //#input(bool ownsFrame(Window)): this
    //#input(bool ownsFrame(Window)): this.__Tag
    //#output(bool ownsFrame(Window)): return_value
    //#pre[3] (bool ownsFrame(Window)): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(bool ownsFrame(Window)): getFrame(...)@215 != null
    //#post(bool ownsFrame(Window)): init'ed(return_value)
    //#FrameContainer.java:215: end of method: bool com.dmdirc.FrameContainer.ownsFrame(Window)
    }

    /**
     * Invoked when our window has been opened.
     */
    public void windowOpened() {
        if (config == null || getFrame() == null) {
    //#FrameContainer.java:222: method: void com.dmdirc.FrameContainer.windowOpened()
    //#FrameContainer.java:222: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowOpened()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:222: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowOpened()
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/Query]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/Server]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void windowOpened()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void windowOpened()): __Descendant_Table[others]
    //#input(void windowOpened()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowOpened()): this
    //#input(void windowOpened()): this.__Tag
    //#input(void windowOpened()): this.config
    //#pre[2] (void windowOpened()): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#test_vector(void windowOpened()): this.config: Addr_Set{null}, Inverse{null}
    //#test_vector(void windowOpened()): getFrame(...)@222: Inverse{null}, Addr_Set{null}
            return;
        }
    }
    //#FrameContainer.java:225: end of method: void com.dmdirc.FrameContainer.windowOpened()

    /**
     * Invoked when our window is closing.
     */
    public abstract void windowClosing();

    /**
     * Invoked when our window has been closed.
     */
    public void windowClosed() {
        // Ignore.
    }
    //#FrameContainer.java:237: method: void com.dmdirc.FrameContainer.windowClosed()
    //#FrameContainer.java:237: end of method: void com.dmdirc.FrameContainer.windowClosed()

    /**
     * Invoked when our window is activated.
     */
    public void windowActivated() {
        LOGGER.finer(toString() + ": windowActivated(): frame = "
    //#FrameContainer.java:243: method: void com.dmdirc.FrameContainer.windowActivated()
    //#FrameContainer.java:243: Warning: call too complex - analysis skipped
    //#    call on String toString()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: String toString()
    //#FrameContainer.java:243: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:243: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    suspicious precondition index: [3]
    //#input(void windowActivated()): ": clearNotification(): frame = "._tainted
    //#input(void windowActivated()): ": windowActivated(): frame = "._tainted
    //#input(void windowActivated()): LOGGER
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/Query]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/Server]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void windowActivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void windowActivated()): __Descendant_Table[others]
    //#input(void windowActivated()): __Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): __Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/Channel.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/Channel.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/CustomWindow.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/CustomWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/CustomWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/MessageTarget.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/MessageTarget.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/Query.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/Query.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/Raw.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/Raw.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void windowActivated()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void windowActivated()): com/dmdirc/Server.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/Server.__Dispatch_Table.setActiveFrame(Lcom/dmdirc/FrameContainer;)V
    //#input(void windowActivated()): com/dmdirc/Server.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.clearNotification()V
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowActivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowActivated()): java.awt.Color.BLACK
    //#input(void windowActivated()): this
    //#input(void windowActivated()): this.__Tag
    //#input(void windowActivated()): this.listeners
    //#output(void windowActivated()): this.notification
    //#pre[3] (void windowActivated()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[4] (void windowActivated()): (soft) this.listeners != null
    //#presumption(void windowActivated()): com.dmdirc.util.ListenerList:get(...)@251 != null
    //#presumption(void windowActivated()): getFrame(...)@243 != null
    //#presumption(void windowActivated()): getServer(...).__Tag@259 == com/dmdirc/Server
    //#presumption(void windowActivated()): getServer(...)@259 != null
    //#presumption(void windowActivated()): java.lang.Object:getClass(...)@243 != null
    //#presumption(void windowActivated()): java.util.Iterator:next(...)@251 != null
    //#presumption(void windowActivated()): java.util.logging.Logger:getLogger(...)@47 != null
    //#post(void windowActivated()): this.notification == One-of{old this.notification, java.awt.Color.BLACK}
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void windowActivated()): Effects-of-calling:getFrame
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void windowActivated()): Effects-of-calling:toString
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.util.logging.Logger:finer
    //#unanalyzed(void windowActivated()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void windowActivated()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void windowActivated()): Effects-of-calling:com.dmdirc.interfaces.NotificationListener:notificationCleared
    //#test_vector(void windowActivated()): getFrame(...)@246: Inverse{null}, Addr_Set{null}
    //#test_vector(void windowActivated()): getServer(...)@258: Addr_Set{null}, Inverse{null}
    //#test_vector(void windowActivated()): java.util.Iterator:hasNext(...)@251: {1}, {0}
                + (getFrame() == null ? null : getFrame().getClass().getName()));

        if (getFrame() == null) {
    //#FrameContainer.java:246: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: Window getFrame()
            return;
        }

        synchronized (listeners) {
            for (SelectionListener listener : listeners.get(SelectionListener.class)) {
    //#FrameContainer.java:251: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.ListenerList:get(Class)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: List com.dmdirc.util.ListenerList:get(Class)
                listener.selectionChanged(getFrame());
    //#FrameContainer.java:252: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:252: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.interfaces.SelectionListener:selectionChanged(Window)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: void com.dmdirc.interfaces.SelectionListener:selectionChanged(Window)
            }
        }

        clearNotification();

        if (getServer() != null) {
    //#FrameContainer.java:258: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: Server getServer()
            getServer().setActiveFrame(this);
    //#FrameContainer.java:259: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowActivated()
    //#    unanalyzed callee: Server getServer()
        }
    }
    //#FrameContainer.java:261: end of method: void com.dmdirc.FrameContainer.windowActivated()

    /**
     * Invoked when our window is deactivated.
     */
    public void windowDeactivated() {
        LOGGER.finer(toString() + ": windowDeactivated(): frame = "
    //#FrameContainer.java:267: method: void com.dmdirc.FrameContainer.windowDeactivated()
    //#FrameContainer.java:267: Warning: call too complex - analysis skipped
    //#    call on String toString()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowDeactivated()
    //#    unanalyzed callee: String toString()
    //#FrameContainer.java:267: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowDeactivated()
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:267: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void windowDeactivated()
    //#    suspicious precondition index: [2]
    //#input(void windowDeactivated()): ": windowDeactivated(): frame = "._tainted
    //#input(void windowDeactivated()): LOGGER
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/Query]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/Raw]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/Server]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void windowDeactivated()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void windowDeactivated()): __Descendant_Table[others]
    //#input(void windowDeactivated()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): __Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/Channel.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/CustomWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/GlobalWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/MessageTarget.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/Query.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/Raw.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/Server.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowDeactivated()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.toString()Ljava/lang/String;
    //#input(void windowDeactivated()): this
    //#input(void windowDeactivated()): this.__Tag
    //#pre[2] (void windowDeactivated()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void windowDeactivated()): getFrame(...)@267 != null
    //#presumption(void windowDeactivated()): java.lang.Object:getClass(...)@267 != null
    //#presumption(void windowDeactivated()): java.util.logging.Logger:getLogger(...)@47 != null
                + (getFrame() == null ? null : getFrame().getClass().getName()));
    }
    //#FrameContainer.java:269: end of method: void com.dmdirc.FrameContainer.windowDeactivated()

    /**
     * Adds a line to this container's window. If the window is null for some
     * reason, the line is silently discarded.
     *
     * @param type The message type to use
     * @param args The message's arguments
     */
    protected void addLine(final String type, final Object ... args) {
        if (getFrame() != null) {
    //#FrameContainer.java:279: method: void com.dmdirc.FrameContainer.addLine(String, Object[])
    //#FrameContainer.java:279: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(String, Object[])
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:279: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(String, Object[])
    //#    suspicious precondition index: [3]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/Channel]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/Query]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/Raw]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/Server]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void addLine(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void addLine(String, Object[])): __Descendant_Table[others]
    //#input(void addLine(String, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): args
    //#input(void addLine(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(String, Object[])): this
    //#input(void addLine(String, Object[])): this.__Tag
    //#input(void addLine(String, Object[])): type
    //#pre[3] (void addLine(String, Object[])): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void addLine(String, Object[])): getFrame(...)@280 != null
    //#test_vector(void addLine(String, Object[])): getFrame(...)@279: Addr_Set{null}, Inverse{null}
            getFrame().addLine(type, args);
    //#FrameContainer.java:280: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(String, Object[])
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:280: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.Window:addLine(String, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(String, Object[])
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.Window:addLine(String, Object[])
        }
    }
    //#FrameContainer.java:282: end of method: void com.dmdirc.FrameContainer.addLine(String, Object[])

    /**
     * Adds a line to this container's window. If the window is null for some
     * reason, the line is silently discarded.
     *
     * @param type The message type to use
     * @param args The message's arguments
     */
    protected void addLine(final StringBuffer type, final Object ... args) {
        if (getFrame() != null) {
    //#FrameContainer.java:292: method: void com.dmdirc.FrameContainer.addLine(StringBuffer, Object[])
    //#FrameContainer.java:292: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(StringBuffer, Object[])
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:292: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(StringBuffer, Object[])
    //#    suspicious precondition index: [3]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/Channel]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/Query]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/Raw]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/Server]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void addLine(StringBuffer, Object[])): __Descendant_Table[others]
    //#input(void addLine(StringBuffer, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): args
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void addLine(StringBuffer, Object[])): this
    //#input(void addLine(StringBuffer, Object[])): this.__Tag
    //#input(void addLine(StringBuffer, Object[])): type
    //#pre[3] (void addLine(StringBuffer, Object[])): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void addLine(StringBuffer, Object[])): getFrame(...)@293 != null
    //#test_vector(void addLine(StringBuffer, Object[])): getFrame(...)@292: Addr_Set{null}, Inverse{null}
            getFrame().addLine(type, args);
    //#FrameContainer.java:293: Warning: call too complex - analysis skipped
    //#    call on Window getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(StringBuffer, Object[])
    //#    unanalyzed callee: Window getFrame()
    //#FrameContainer.java:293: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.Window:addLine(StringBuffer, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addLine(StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.Window:addLine(StringBuffer, Object[])
        }
    }
    //#FrameContainer.java:295: end of method: void com.dmdirc.FrameContainer.addLine(StringBuffer, Object[])

    /**
     * Adds a notification listener for this frame container.
     *
     * @param listener The listener to be added
     */
    public void addNotificationListener(final NotificationListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:303: method: void com.dmdirc.FrameContainer.addNotificationListener(NotificationListener)
    //#input(void addNotificationListener(NotificationListener)): listener
    //#input(void addNotificationListener(NotificationListener)): this
    //#input(void addNotificationListener(NotificationListener)): this.listeners
    //#input(void addNotificationListener(NotificationListener)): this.listeners.__Lock
    //#pre[3] (void addNotificationListener(NotificationListener)): this.listeners != null
            listeners.add(NotificationListener.class, listener);
    //#FrameContainer.java:304: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:add(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addNotificationListener(NotificationListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:add(Class, Object)
        }
    }
    //#FrameContainer.java:306: end of method: void com.dmdirc.FrameContainer.addNotificationListener(NotificationListener)

    /**
     * Removes a notification listener from this frame container.
     *
     * @param listener The listener to be removed
     */
    public void removeNotificationListener(final NotificationListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:314: method: void com.dmdirc.FrameContainer.removeNotificationListener(NotificationListener)
    //#input(void removeNotificationListener(NotificationListener)): listener
    //#input(void removeNotificationListener(NotificationListener)): this
    //#input(void removeNotificationListener(NotificationListener)): this.listeners
    //#input(void removeNotificationListener(NotificationListener)): this.listeners.__Lock
    //#pre[3] (void removeNotificationListener(NotificationListener)): this.listeners != null
            listeners.remove(NotificationListener.class, listener);
    //#FrameContainer.java:315: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:remove(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void removeNotificationListener(NotificationListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:remove(Class, Object)
        }
    }
    //#FrameContainer.java:317: end of method: void com.dmdirc.FrameContainer.removeNotificationListener(NotificationListener)

    /**
     * Adds a selection listener for this frame container.
     *
     * @param listener The listener to be added
     */
    public void addSelectionListener(final SelectionListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:325: method: void com.dmdirc.FrameContainer.addSelectionListener(SelectionListener)
    //#input(void addSelectionListener(SelectionListener)): listener
    //#input(void addSelectionListener(SelectionListener)): this
    //#input(void addSelectionListener(SelectionListener)): this.listeners
    //#input(void addSelectionListener(SelectionListener)): this.listeners.__Lock
    //#pre[3] (void addSelectionListener(SelectionListener)): this.listeners != null
            listeners.add(SelectionListener.class, listener);
    //#FrameContainer.java:326: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:add(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addSelectionListener(SelectionListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:add(Class, Object)
        }
    }
    //#FrameContainer.java:328: end of method: void com.dmdirc.FrameContainer.addSelectionListener(SelectionListener)

    /**
     * Removes a selection listener from this frame container.
     *
     * @param listener The listener to be removed
     */
    public void removeSelectionListener(final SelectionListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:336: method: void com.dmdirc.FrameContainer.removeSelectionListener(SelectionListener)
    //#input(void removeSelectionListener(SelectionListener)): listener
    //#input(void removeSelectionListener(SelectionListener)): this
    //#input(void removeSelectionListener(SelectionListener)): this.listeners
    //#input(void removeSelectionListener(SelectionListener)): this.listeners.__Lock
    //#pre[3] (void removeSelectionListener(SelectionListener)): this.listeners != null
            listeners.remove(SelectionListener.class, listener);
    //#FrameContainer.java:337: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:remove(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void removeSelectionListener(SelectionListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:remove(Class, Object)
        }
    }
    //#FrameContainer.java:339: end of method: void com.dmdirc.FrameContainer.removeSelectionListener(SelectionListener)

    /**
     * Adds an icon change listener for this frame container.
     *
     * @param listener The listener to be added
     */
    public void addIconChangeListener(final IconChangeListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:347: method: void com.dmdirc.FrameContainer.addIconChangeListener(IconChangeListener)
    //#input(void addIconChangeListener(IconChangeListener)): listener
    //#input(void addIconChangeListener(IconChangeListener)): this
    //#input(void addIconChangeListener(IconChangeListener)): this.listeners
    //#input(void addIconChangeListener(IconChangeListener)): this.listeners.__Lock
    //#pre[3] (void addIconChangeListener(IconChangeListener)): this.listeners != null
            listeners.add(IconChangeListener.class, listener);
    //#FrameContainer.java:348: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:add(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void addIconChangeListener(IconChangeListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:add(Class, Object)
        }
    }
    //#FrameContainer.java:350: end of method: void com.dmdirc.FrameContainer.addIconChangeListener(IconChangeListener)

    /**
     * Removes an icon change listener from this frame container.
     *
     * @param listener The listener to be removed
     */
    public void removeIconChangeListener(final IconChangeListener listener) {
        synchronized (listeners) {
    //#FrameContainer.java:358: method: void com.dmdirc.FrameContainer.removeIconChangeListener(IconChangeListener)
    //#input(void removeIconChangeListener(IconChangeListener)): listener
    //#input(void removeIconChangeListener(IconChangeListener)): this
    //#input(void removeIconChangeListener(IconChangeListener)): this.listeners
    //#input(void removeIconChangeListener(IconChangeListener)): this.listeners.__Lock
    //#pre[3] (void removeIconChangeListener(IconChangeListener)): this.listeners != null
            listeners.remove(IconChangeListener.class, listener);
    //#FrameContainer.java:359: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.ListenerList:remove(Class, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.FrameContainer
    //#    method: void removeIconChangeListener(IconChangeListener)
    //#    unanalyzed callee: void com.dmdirc.util.ListenerList:remove(Class, Object)
        }
    }
    //#FrameContainer.java:361: end of method: void com.dmdirc.FrameContainer.removeIconChangeListener(IconChangeListener)
    
    /**
     * Updates the icon of this frame if its config setting is changed.
     */
    private class IconChanger implements ConfigChangeListener {
    //#FrameContainer.java:366: method: void com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger(FrameContainer)
    //#input(void com.dmdirc.FrameContainer$IconChanger(FrameContainer)): Param_1
    //#input(void com.dmdirc.FrameContainer$IconChanger(FrameContainer)): this
    //#output(void com.dmdirc.FrameContainer$IconChanger(FrameContainer)): this.this$0
    //#post(void com.dmdirc.FrameContainer$IconChanger(FrameContainer)): this.this$0 == Param_1
    //#post(void com.dmdirc.FrameContainer$IconChanger(FrameContainer)): init'ed(this.this$0)
    //#FrameContainer.java:366: end of method: void com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger(FrameContainer)
    //#FrameContainer.java:366: method: void com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)
    //#input(void com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)): this
    //#input(void com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)): x0
    //#output(void com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)): this.this$0
    //#post(void com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)): this.this$0 == x0
    //#post(void com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)): init'ed(this.this$0)
    //#FrameContainer.java:366: end of method: void com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger(FrameContainer, FrameContainer$1)

        /** {@inheritDoc} */
        @Override
        public void configChanged(final String domain, final String key) {
            iconUpdated();
    //#FrameContainer.java:371: method: void com.dmdirc.FrameContainer$IconChanger.configChanged(String, String)
    //#FrameContainer.java:371: Warning: suspicious precondition
    //#    The precondition for this.this$0.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.FrameContainer$IconChanger
    //#    method: void configChanged(String, String)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(void configChanged(String, String)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void configChanged(String, String)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void configChanged(String, String)): this
    //#input(void configChanged(String, String)): this.this$0
    //#input(void configChanged(String, String)): this.this$0.__Tag
    //#input(void configChanged(String, String)): this.this$0.icon
    //#input(void configChanged(String, String)): this.this$0.listeners
    //#pre[2] (void configChanged(String, String)): this.this$0 != null
    //#pre[4] (void configChanged(String, String)): init'ed(this.icon)
    //#pre[5] (void configChanged(String, String)): this.listeners != null
    //#pre[3] (void configChanged(String, String)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:getFrame
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
        }
    //#FrameContainer.java:372: end of method: void com.dmdirc.FrameContainer$IconChanger.configChanged(String, String)
        
    }
}
    //#output(com.dmdirc.FrameContainer$1__static_init): __Descendant_Table[com/dmdirc/FrameContainer$1]
    //#post(com.dmdirc.FrameContainer$1__static_init): __Descendant_Table[com/dmdirc/FrameContainer$1] == &__Dispatch_Table
    //#FrameContainer.java:: end of method: com.dmdirc.FrameContainer$1.com.dmdirc.FrameContainer$1__static_init
    //#FrameContainer.java:: end of class: com.dmdirc.FrameContainer$1
    //#output(com.dmdirc.FrameContainer$IconChanger__static_init): __Descendant_Table[com/dmdirc/FrameContainer$IconChanger]
    //#output(com.dmdirc.FrameContainer$IconChanger__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#post(com.dmdirc.FrameContainer$IconChanger__static_init): __Descendant_Table[com/dmdirc/FrameContainer$IconChanger] == &__Dispatch_Table
    //#post(com.dmdirc.FrameContainer$IconChanger__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#FrameContainer.java:: end of method: com.dmdirc.FrameContainer$IconChanger.com.dmdirc.FrameContainer$IconChanger__static_init
    //#FrameContainer.java:: end of class: com.dmdirc.FrameContainer$IconChanger
    //#FrameContainer.java:: end of class: com.dmdirc.FrameContainer
