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

package com.dmdirc.addons.nowplaying;

import com.dmdirc.config.IdentityManager;
import com.dmdirc.config.prefs.PreferencesInterface;
import com.dmdirc.addons.ui_swing.components.text.TextLabel;
import com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

/**
 * Now playing plugin config panel.
 */
public class ConfigPanel extends JPanel implements PreferencesInterface, KeyListener {
    //#ConfigPanel.java:51: method: JPanel com.dmdirc.addons.nowplaying.ConfigPanel.access$100(ConfigPanel)
    //#input(JPanel access$100(ConfigPanel)): x0
    //#input(JPanel access$100(ConfigPanel)): x0.previewPanel
    //#output(JPanel access$100(ConfigPanel)): return_value
    //#pre[1] (JPanel access$100(ConfigPanel)): x0 != null
    //#pre[2] (JPanel access$100(ConfigPanel)): init'ed(x0.previewPanel)
    //#post(JPanel access$100(ConfigPanel)): return_value == x0.previewPanel
    //#post(JPanel access$100(ConfigPanel)): init'ed(return_value)
    //#ConfigPanel.java:51: end of method: JPanel com.dmdirc.addons.nowplaying.ConfigPanel.access$100(ConfigPanel)
    //#ConfigPanel.java:51: method: void com.dmdirc.addons.nowplaying.ConfigPanel.access$200(ConfigPanel)
    //#input(void access$200(ConfigPanel)): "Preview:&#10;"._tainted
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/AmarokSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/KaffeineSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/NoatunSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_windows/DllSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSource]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[others]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSourceManager]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[others]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceManager.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceState.CLOSED
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/MediaSourceState.PLAYING
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[com/dmdirc/addons/nowplaying/NowPlayingPlugin]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[others]
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.doSubstitution(Ljava/lang/String;Lcom/dmdirc/addons/nowplaying/MediaSource;)Ljava/lang/String;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getBestSource()Lcom/dmdirc/addons/nowplaying/MediaSource;
    //#input(void access$200(ConfigPanel)): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void access$200(ConfigPanel)): x0
    //#input(void access$200(ConfigPanel)): x0.plugin
    //#input(void access$200(ConfigPanel)): x0.plugin.__Tag
    //#input(void access$200(ConfigPanel)): x0.plugin.managers
    //#input(void access$200(ConfigPanel)): x0.plugin.order
    //#input(void access$200(ConfigPanel)): x0.plugin.sources
    //#input(void access$200(ConfigPanel)): x0.preview
    //#input(void access$200(ConfigPanel)): x0.textfield
    //#input(void access$200(ConfigPanel)): x0.updateTimer
    //#pre[1] (void access$200(ConfigPanel)): x0 != null
    //#pre[2] (void access$200(ConfigPanel)): x0.plugin != null
    //#pre[3] (void access$200(ConfigPanel)): x0.plugin.__Tag == com/dmdirc/addons/nowplaying/NowPlayingPlugin
    //#pre[4] (void access$200(ConfigPanel)): x0.plugin.managers != null
    //#pre[5] (void access$200(ConfigPanel)): init'ed(x0.plugin.order)
    //#pre[7] (void access$200(ConfigPanel)): x0.preview != null
    //#pre[8] (void access$200(ConfigPanel)): x0.textfield != null
    //#pre[9] (void access$200(ConfigPanel)): x0.updateTimer != null
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:javax.swing.JTextField:getText
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getSources
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getState
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getArtist
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getTitle
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getAlbum
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getAppName
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getBitrate
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getFormat
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getLength
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:getTime
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.lang.String:replaceAll
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.text.TextLabel:setText
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.text.TextLabel:repaint
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel$1
    //#unanalyzed(void access$200(ConfigPanel)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#ConfigPanel.java:51: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.access$200(ConfigPanel)

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

    /** Media source order list. */
    private ReorderableJList list;

    /** Media sources. */
    private final List<String> sources;

    /** The plugin that owns this panel. */
    private final NowPlayingPlugin plugin;

    /** Text field for our setting. */
    private JTextField textfield;

    /** Panel that the preview is in. */
    private JPanel previewPanel;

    /** Label for previews. */
    private TextLabel preview;
    
    /** Update timer. */
    private Timer updateTimer;

    /**
     * Creates a new instance of ConfigPanel.
     *
     * @param plugin The plugin that owns this panel
     * @param sources A list of sources to be used in the panel
     */
    public ConfigPanel(final NowPlayingPlugin plugin, final List<String> sources) {
        super();
    //#ConfigPanel.java:88: method: void com.dmdirc.addons.nowplaying.ConfigPanel.com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): com/dmdirc/addons/nowplaying/NowPlayingSubsitutionPanel.com.dmdirc.addons.ui_swing.components.substitutions.SubstitutionsPanel$Alignment.HORIZONTAL
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): plugin
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): sources
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#5) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#9) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JTextField(initComponents#2) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#1) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#2) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new ReorderableJList(initComponents#1) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new TextLabel(initComponents#3) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new Timer(schedulePreviewUpdate#1) num objects
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.list
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.plugin
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.preview
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.previewPanel
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.sources
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.textfield
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.updateTimer
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#5)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#9)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JTextField(initComponents#2)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#1)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#2)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new ReorderableJList(initComponents#1)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new TextLabel(initComponents#3)
    //#new obj(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new Timer(schedulePreviewUpdate#1)
    //#pre[1] (void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): plugin != null
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.list == &new ReorderableJList(initComponents#1)
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.plugin == plugin
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.plugin != null
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.preview == &new TextLabel(initComponents#3)
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.previewPanel == &new JPanel(initComponents#9)
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.sources in Addr_Set{&new LinkedList(ConfigPanel#2),&new LinkedList(ConfigPanel#1)}
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.textfield == &new JTextField(initComponents#2)
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): this.updateTimer == &new Timer(schedulePreviewUpdate#1)
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#5) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JPanel(initComponents#9) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new JTextField(initComponents#2) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new ReorderableJList(initComponents#1) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new TextLabel(initComponents#3) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new Timer(schedulePreviewUpdate#1) num objects == 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#1) num objects <= 1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): new LinkedList(ConfigPanel#2) num objects <= 1
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Timer
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.DefaultListModel:addElement
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JTextField
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JTextField:addKeyListener
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.text.TextLabel
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:net.miginfocom.swing.MigLayout
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel:setLayout
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JPanel
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.BorderFactory:createTitledBorder
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JPanel:setBorder
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JPanel:setLayout
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JLabel
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JPanel:add
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:javax.swing.JScrollPane
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel:add
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:java.util.Arrays:asList
    //#unanalyzed(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): Effects-of-calling:com.dmdirc.addons.ui_swing.components.substitutions.SubstitutionsPanel
    //#test_vector(void com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)): sources: Inverse{null}, Addr_Set{null}

        if (sources == null) {
            this.sources = new LinkedList<String>();
        } else {
            this.sources = new LinkedList<String>(sources);
        }
        this.plugin = plugin;

        initComponents();
    }
    //#ConfigPanel.java:98: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.com.dmdirc.addons.nowplaying.ConfigPanel(NowPlayingPlugin, List)

    /**
     * Initialises the components.
     */
    private void initComponents() {
        list = new ReorderableJList();
    //#ConfigPanel.java:104: method: void com.dmdirc.addons.nowplaying.ConfigPanel.initComponents()
    //#ConfigPanel.java:104: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList()
    //#input(void initComponents()): com/dmdirc/addons/nowplaying/NowPlayingSubsitutionPanel.com.dmdirc.addons.ui_swing.components.substitutions.SubstitutionsPanel$Alignment.HORIZONTAL
    //#input(void initComponents()): this
    //#input(void initComponents()): this.plugin
    //#input(void initComponents()): this.sources
    //#input(void initComponents()): this.updateTimer
    //#output(void initComponents()): new JPanel(initComponents#5) num objects
    //#output(void initComponents()): new JPanel(initComponents#9) num objects
    //#output(void initComponents()): new JTextField(initComponents#2) num objects
    //#output(void initComponents()): new ReorderableJList(initComponents#1) num objects
    //#output(void initComponents()): new TextLabel(initComponents#3) num objects
    //#output(void initComponents()): new Timer(schedulePreviewUpdate#1) num objects
    //#output(void initComponents()): this.list
    //#output(void initComponents()): this.preview
    //#output(void initComponents()): this.previewPanel
    //#output(void initComponents()): this.textfield
    //#output(void initComponents()): this.updateTimer
    //#new obj(void initComponents()): new JPanel(initComponents#5)
    //#new obj(void initComponents()): new JPanel(initComponents#9)
    //#new obj(void initComponents()): new JTextField(initComponents#2)
    //#new obj(void initComponents()): new ReorderableJList(initComponents#1)
    //#new obj(void initComponents()): new TextLabel(initComponents#3)
    //#new obj(void initComponents()): new Timer(schedulePreviewUpdate#1)
    //#pre[1] (void initComponents()): init'ed(this.updateTimer)
    //#pre[3] (void initComponents()): this.plugin != null
    //#pre[4] (void initComponents()): this.sources != null
    //#presumption(void initComponents()): com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel(...)@107 != null
    //#presumption(void initComponents()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@110 != null
    //#post(void initComponents()): this.list == &new ReorderableJList(initComponents#1)
    //#post(void initComponents()): this.preview == &new TextLabel(initComponents#3)
    //#post(void initComponents()): this.previewPanel == &new JPanel(initComponents#9)
    //#post(void initComponents()): this.textfield == &new JTextField(initComponents#2)
    //#post(void initComponents()): this.updateTimer == &new Timer(schedulePreviewUpdate#1)
    //#post(void initComponents()): new JPanel(initComponents#5) num objects == 1
    //#post(void initComponents()): new JPanel(initComponents#9) num objects == 1
    //#post(void initComponents()): new JTextField(initComponents#2) num objects == 1
    //#post(void initComponents()): new ReorderableJList(initComponents#1) num objects == 1
    //#post(void initComponents()): new TextLabel(initComponents#3) num objects == 1
    //#post(void initComponents()): new Timer(schedulePreviewUpdate#1) num objects == 1
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.Timer
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void initComponents()): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(void initComponents()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.substitutions.SubstitutionsPanel
    //#test_vector(void initComponents()): java.util.Iterator:hasNext(...)@106: {0}, {1}

        for (String source : sources) {
            list.getModel().addElement(source);
    //#ConfigPanel.java:107: Warning: method not available - call not analyzed
    //#    call on DefaultListModel com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: DefaultListModel com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel()
        }

        textfield = new JTextField(IdentityManager.getGlobalConfig()
    //#ConfigPanel.java:110: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#ConfigPanel.java:110: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: String com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain()
    //#ConfigPanel.java:110: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
                .getOption(plugin.getDomain(), "format"));
        textfield.addKeyListener(this);
        preview = new TextLabel("Preview:\n");
    //#ConfigPanel.java:113: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.text.TextLabel(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.text.TextLabel(String)

        setLayout(new MigLayout("fillx, ins 0"));
    //#ConfigPanel.java:115: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)
    //#ConfigPanel.java:115: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.nowplaying.ConfigPanel:setLayout(LayoutManager)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.nowplaying.ConfigPanel:setLayout(LayoutManager)

        JPanel panel = new JPanel();

        panel.setBorder(BorderFactory.createTitledBorder("Source order"));
        panel.setLayout(new MigLayout("fillx, ins 5"));
    //#ConfigPanel.java:120: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)

        panel.add(new JLabel("Drag and drop items to reorder"), "wrap");
        panel.add(new JScrollPane(list), "growx");

        add(panel, "growx, wrap");
    //#ConfigPanel.java:125: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)

        panel = new JPanel();

        panel.setBorder(BorderFactory.createTitledBorder("Output format"));
        panel.setLayout(new MigLayout("fillx, ins 5"));
    //#ConfigPanel.java:130: Warning: method not available - call not analyzed
    //#    call on void net.miginfocom.swing.MigLayout(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void net.miginfocom.swing.MigLayout(String)

        panel.add(textfield, "span, growx, wrap");
        panel.add(preview, "span, grow, wrap, gaptop 10");
        add(panel, "growx, wrap");
    //#ConfigPanel.java:134: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)

        previewPanel = panel;

        add(new NowPlayingSubsitutionPanel(Arrays.asList(new String[]{"app", 
    //#ConfigPanel.java:138: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void initComponents()
    //#    unanalyzed callee: void com.dmdirc.addons.nowplaying.ConfigPanel:add(Component, Object)
        "title", "artist", "album", "bitrate", "format", "length", "time", 
        "state"})), "growx");
        schedulePreviewUpdate();
    }
    //#ConfigPanel.java:142: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.initComponents()

    /**
     * Updates the preview text.
     */
    private void updatePreview() {
        updateTimer.cancel();
    //#ConfigPanel.java:148: method: void com.dmdirc.addons.nowplaying.ConfigPanel.updatePreview()
    //#input(void updatePreview()): "Preview:&#10;"._tainted
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/AmarokSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/KaffeineSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/NoatunSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_windows/DllSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSource]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[others]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSourceManager]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[others]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceState.CLOSED
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/MediaSourceState.PLAYING
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[com/dmdirc/addons/nowplaying/NowPlayingPlugin]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[others]
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.doSubstitution(Ljava/lang/String;Lcom/dmdirc/addons/nowplaying/MediaSource;)Ljava/lang/String;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getBestSource()Lcom/dmdirc/addons/nowplaying/MediaSource;
    //#input(void updatePreview()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void updatePreview()): this
    //#input(void updatePreview()): this.plugin
    //#input(void updatePreview()): this.plugin.__Tag
    //#input(void updatePreview()): this.plugin.managers
    //#input(void updatePreview()): this.plugin.order
    //#input(void updatePreview()): this.plugin.sources
    //#input(void updatePreview()): this.preview
    //#input(void updatePreview()): this.textfield
    //#input(void updatePreview()): this.updateTimer
    //#pre[2] (void updatePreview()): this.plugin != null
    //#pre[3] (void updatePreview()): this.plugin.__Tag == com/dmdirc/addons/nowplaying/NowPlayingPlugin
    //#pre[4] (void updatePreview()): this.plugin.managers != null
    //#pre[5] (void updatePreview()): init'ed(this.plugin.order)
    //#pre[7] (void updatePreview()): this.preview != null
    //#pre[8] (void updatePreview()): this.textfield != null
    //#pre[9] (void updatePreview()): this.updateTimer != null
    //#presumption(void updatePreview()): javax.swing.JTextField:getText(...)@156 != null
    //#presumption(void updatePreview()): source.__Tag@150 in {com/dmdirc/addons/mediasource_dcop/AmarokSource, com/dmdirc/addons/mediasource_dcop/KaffeineSource, com/dmdirc/addons/mediasource_dcop/NoatunSource, com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin, com/dmdirc/addons/mediasource_windows/DllSource, com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource, com/dmdirc/addons/nowplaying/MediaSource}
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void updatePreview()): Effects-of-calling:getSources
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void updatePreview()): Effects-of-calling:getState
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void updatePreview()): Effects-of-calling:getArtist
    //#unanalyzed(void updatePreview()): Effects-of-calling:getTitle
    //#unanalyzed(void updatePreview()): Effects-of-calling:getAlbum
    //#unanalyzed(void updatePreview()): Effects-of-calling:getAppName
    //#unanalyzed(void updatePreview()): Effects-of-calling:getBitrate
    //#unanalyzed(void updatePreview()): Effects-of-calling:getFormat
    //#unanalyzed(void updatePreview()): Effects-of-calling:getLength
    //#unanalyzed(void updatePreview()): Effects-of-calling:getTime
    //#unanalyzed(void updatePreview()): Effects-of-calling:java.lang.String:replaceAll
        
        MediaSource source = plugin.getBestSource();

        if (source == null) {
            source = new DummyMediaSource();
        }

        preview.setText("Preview:\n" + plugin.doSubstitution(textfield.getText(),
    //#ConfigPanel.java:156: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.text.TextLabel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void updatePreview()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.text.TextLabel:setText(String)
                source));
        preview.repaint();
    //#ConfigPanel.java:158: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.ui_swing.components.text.TextLabel:repaint()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void updatePreview()
    //#    unanalyzed callee: void com.dmdirc.addons.ui_swing.components.text.TextLabel:repaint()

        SwingUtilities.invokeLater(new Runnable() {
    //#ConfigPanel.java:160: method: void com.dmdirc.addons.nowplaying.ConfigPanel$1.com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)): Param_1
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)): this
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)): this.this$0
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)): init'ed(this.this$0)
    //#ConfigPanel.java:160: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$1.com.dmdirc.addons.nowplaying.ConfigPanel$1(ConfigPanel)
            @Override
            public void run() {
                previewPanel.revalidate();
    //#ConfigPanel.java:163: method: void com.dmdirc.addons.nowplaying.ConfigPanel$1.run()
    //#input(void run()): this
    //#input(void run()): this.this$0
    //#input(void run()): this.this$0.previewPanel
    //#pre[2] (void run()): this.this$0 != null
    //#pre[3] (void run()): this.previewPanel != null
                revalidate();
    //#ConfigPanel.java:164: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.nowplaying.ConfigPanel:revalidate()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel$1
    //#    method: void run()
    //#    unanalyzed callee: void com.dmdirc.addons.nowplaying.ConfigPanel:revalidate()
            }
    //#ConfigPanel.java:165: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$1.run()
        });
    }
    //#ConfigPanel.java:167: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.updatePreview()

    /**
     * Retrieves the (new) source order from this config panel.
     *
     * @return An ordered list of sources
     */
    public List<String> getSources() {
        final List<String> newSources = new LinkedList<String>();
    //#ConfigPanel.java:175: method: List com.dmdirc.addons.nowplaying.ConfigPanel.getSources()
    //#input(List getSources()): this
    //#input(List getSources()): this.list
    //#output(List getSources()): new LinkedList(getSources#1) num objects
    //#output(List getSources()): return_value
    //#new obj(List getSources()): new LinkedList(getSources#1)
    //#pre[2] (List getSources()): this.list != null
    //#presumption(List getSources()): com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel(...)@177 != null
    //#presumption(List getSources()): javax.swing.DefaultListModel:elements(...)@177 != null
    //#post(List getSources()): return_value == &new LinkedList(getSources#1)
    //#post(List getSources()): new LinkedList(getSources#1) num objects == 1
    //#test_vector(List getSources()): java.util.Enumeration:hasMoreElements(...)@179: {0}, {1}

        final Enumeration<?> values = list.getModel().elements();
    //#ConfigPanel.java:177: Warning: method not available - call not analyzed
    //#    call on DefaultListModel com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: List getSources()
    //#    unanalyzed callee: DefaultListModel com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel()

        while (values.hasMoreElements()) {
            newSources.add((String) values.nextElement());
        }

        return newSources;
    //#ConfigPanel.java:183: end of method: List com.dmdirc.addons.nowplaying.ConfigPanel.getSources()
    }

    /** {@inheritDoc} */
    @Override
    public void save() {
        plugin.saveSettings(getSources());
    //#ConfigPanel.java:189: method: void com.dmdirc.addons.nowplaying.ConfigPanel.save()
    //#input(void save()): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel]
    //#input(void save()): __Descendant_Table[others]
    //#input(void save()): __Dispatch_Table.getSources()Ljava/util/List;
    //#input(void save()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[com/dmdirc/addons/nowplaying/NowPlayingPlugin]
    //#input(void save()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[others]
    //#input(void save()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.saveSettings(Ljava/util/List;)V
    //#input(void save()): this
    //#input(void save()): this.__Tag
    //#input(void save()): this.list
    //#input(void save()): this.plugin
    //#input(void save()): this.plugin.__Tag
    //#input(void save()): this.textfield
    //#output(void save()): new LinkedList(getSources#1) num objects
    //#output(void save()): this.plugin.order
    //#new obj(void save()): new LinkedList(getSources#1)
    //#pre[2] (void save()): this.__Tag == com/dmdirc/addons/nowplaying/ConfigPanel
    //#pre[3] (void save()): this.list != null
    //#pre[4] (void save()): this.plugin != null
    //#pre[5] (void save()): this.plugin.__Tag == com/dmdirc/addons/nowplaying/NowPlayingPlugin
    //#pre[6] (void save()): this.textfield != null
    //#presumption(void save()): com.dmdirc.config.IdentityManager:getConfigIdentity(...)@190 != null
    //#post(void save()): this.plugin.order == &new LinkedList(getSources#1)
    //#post(void save()): new LinkedList(getSources#1) num objects == 1
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.reorderablelist.ReorderableJList:getModel
    //#unanalyzed(void save()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void save()): Effects-of-calling:javax.swing.DefaultListModel:elements
    //#unanalyzed(void save()): Effects-of-calling:java.util.Enumeration:hasMoreElements
    //#unanalyzed(void save()): Effects-of-calling:java.util.Enumeration:nextElement
    //#unanalyzed(void save()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.IdentityManager:getConfigIdentity
    //#unanalyzed(void save()): Effects-of-calling:com.dmdirc.config.Identity:setOption
        IdentityManager.getConfigIdentity().setOption(plugin.getDomain(),
    //#ConfigPanel.java:190: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void save()
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#ConfigPanel.java:190: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void save()
    //#    unanalyzed callee: String com.dmdirc.addons.nowplaying.NowPlayingPlugin:getDomain()
    //#ConfigPanel.java:190: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:setOption(String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#    method: void save()
    //#    unanalyzed callee: void com.dmdirc.config.Identity:setOption(String, String, String)
                "format", textfield.getText());
    }
    //#ConfigPanel.java:192: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.save()

    /** {@inheritDoc} */
    @Override
    public void keyTyped(final KeyEvent e) {
        // Do nothing
    }
    //#ConfigPanel.java:198: method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyTyped(KeyEvent)
    //#ConfigPanel.java:198: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyTyped(KeyEvent)

    /** {@inheritDoc} */
    @Override
    public void keyPressed(final KeyEvent e) {
        // Do nothing
    }
    //#ConfigPanel.java:204: method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyPressed(KeyEvent)
    //#ConfigPanel.java:204: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyPressed(KeyEvent)

    /** {@inheritDoc} */
    @Override
    public void keyReleased(final KeyEvent e) {
        schedulePreviewUpdate();
    //#ConfigPanel.java:209: method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyReleased(KeyEvent)
    //#input(void keyReleased(KeyEvent)): this
    //#input(void keyReleased(KeyEvent)): this.updateTimer
    //#output(void keyReleased(KeyEvent)): new Timer(schedulePreviewUpdate#1) num objects
    //#output(void keyReleased(KeyEvent)): this.updateTimer
    //#new obj(void keyReleased(KeyEvent)): new Timer(schedulePreviewUpdate#1)
    //#pre[1] (void keyReleased(KeyEvent)): init'ed(this.updateTimer)
    //#post(void keyReleased(KeyEvent)): this.updateTimer == &new Timer(schedulePreviewUpdate#1)
    //#post(void keyReleased(KeyEvent)): new Timer(schedulePreviewUpdate#1) num objects == 1
    //#unanalyzed(void keyReleased(KeyEvent)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void keyReleased(KeyEvent)): Effects-of-calling:java.util.Timer
    //#unanalyzed(void keyReleased(KeyEvent)): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void keyReleased(KeyEvent)): Effects-of-calling:java.util.Timer:schedule
    }
    //#ConfigPanel.java:210: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.keyReleased(KeyEvent)
    
    /**
     * Schedules an update to the preview text.
     */
    private void schedulePreviewUpdate() {
        if (updateTimer != null) {
    //#ConfigPanel.java:216: method: void com.dmdirc.addons.nowplaying.ConfigPanel.schedulePreviewUpdate()
    //#input(void schedulePreviewUpdate()): this
    //#input(void schedulePreviewUpdate()): this.updateTimer
    //#output(void schedulePreviewUpdate()): new Timer(schedulePreviewUpdate#1) num objects
    //#output(void schedulePreviewUpdate()): this.updateTimer
    //#new obj(void schedulePreviewUpdate()): new Timer(schedulePreviewUpdate#1)
    //#pre[1] (void schedulePreviewUpdate()): init'ed(this.updateTimer)
    //#post(void schedulePreviewUpdate()): this.updateTimer == &new Timer(schedulePreviewUpdate#1)
    //#post(void schedulePreviewUpdate()): new Timer(schedulePreviewUpdate#1) num objects == 1
    //#unanalyzed(void schedulePreviewUpdate()): Effects-of-calling:java.util.TimerTask
    //#test_vector(void schedulePreviewUpdate()): this.updateTimer: Addr_Set{null}, Inverse{null}
            updateTimer.cancel();
        }
        
        updateTimer = new Timer("Nowplaying config timer");
        updateTimer.schedule(new TimerTask() {
    //#ConfigPanel.java:221: method: void com.dmdirc.addons.nowplaying.ConfigPanel$2.com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)): Param_1
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)): this
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)): this.this$0
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)): init'ed(this.this$0)
    //#ConfigPanel.java:221: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$2.com.dmdirc.addons.nowplaying.ConfigPanel$2(ConfigPanel)
            /** {@inheritDoc} */
            @Override
            public void run() {
                updatePreview();
    //#ConfigPanel.java:225: method: void com.dmdirc.addons.nowplaying.ConfigPanel$2.run()
    //#input(void run()): "Preview:&#10;"._tainted
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/AmarokSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/KaffeineSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_dcop/NoatunSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/DllSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/AmarokSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/KaffeineSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/NoatunSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_vlc/VlcMediaSourcePlugin]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/mediasource_windows/DllSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSource]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAlbum()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getAppName()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getArtist()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getBitrate()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getFormat()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getLength()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTime()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSource.__Dispatch_Table.getTitle()Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_dcop/DcopMediaSourcePlugin]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/mediasource_windows/WindowsMediaSourcePlugin]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[com/dmdirc/addons/nowplaying/MediaSourceManager]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceManager.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceState.CLOSED
    //#input(void run()): com/dmdirc/addons/nowplaying/MediaSourceState.PLAYING
    //#input(void run()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[com/dmdirc/addons/nowplaying/NowPlayingPlugin]
    //#input(void run()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.doSubstitution(Ljava/lang/String;Lcom/dmdirc/addons/nowplaying/MediaSource;)Ljava/lang/String;
    //#input(void run()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getBestSource()Lcom/dmdirc/addons/nowplaying/MediaSource;
    //#input(void run()): com/dmdirc/addons/nowplaying/NowPlayingPlugin.__Dispatch_Table.getSources()Ljava/util/List;
    //#input(void run()): this
    //#input(void run()): this.this$0
    //#input(void run()): this.this$0.plugin
    //#input(void run()): this.this$0.plugin.__Tag
    //#input(void run()): this.this$0.plugin.managers
    //#input(void run()): this.this$0.plugin.order
    //#input(void run()): this.this$0.plugin.sources
    //#input(void run()): this.this$0.preview
    //#input(void run()): this.this$0.textfield
    //#input(void run()): this.this$0.updateTimer
    //#pre[2] (void run()): this.this$0 != null
    //#pre[3] (void run()): this.plugin != null
    //#pre[4] (void run()): this.plugin.__Tag == com/dmdirc/addons/nowplaying/NowPlayingPlugin
    //#pre[5] (void run()): this.plugin.managers != null
    //#pre[6] (void run()): init'ed(this.plugin.order)
    //#pre[8] (void run()): this.preview != null
    //#pre[9] (void run()): this.textfield != null
    //#pre[10] (void run()): this.updateTimer != null
    //#unanalyzed(void run()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void run()): Effects-of-calling:javax.swing.JTextField:getText
    //#unanalyzed(void run()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void run()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void run()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void run()): Effects-of-calling:getSources
    //#unanalyzed(void run()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void run()): Effects-of-calling:getState
    //#unanalyzed(void run()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void run()): Effects-of-calling:getArtist
    //#unanalyzed(void run()): Effects-of-calling:getTitle
    //#unanalyzed(void run()): Effects-of-calling:getAlbum
    //#unanalyzed(void run()): Effects-of-calling:getAppName
    //#unanalyzed(void run()): Effects-of-calling:getBitrate
    //#unanalyzed(void run()): Effects-of-calling:getFormat
    //#unanalyzed(void run()): Effects-of-calling:getLength
    //#unanalyzed(void run()): Effects-of-calling:getTime
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:replaceAll
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.text.TextLabel:setText
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.text.TextLabel:repaint
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.addons.nowplaying.ConfigPanel$1
    //#unanalyzed(void run()): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
            }
    //#ConfigPanel.java:226: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$2.run()
        }, 500);
    }
    //#ConfigPanel.java:228: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel.schedulePreviewUpdate()

    /**
     * A dummy media source for use in previews.
     */
    private class DummyMediaSource implements MediaSource {
    //#ConfigPanel.java:233: method: void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)): Param_1
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)): this
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)): this.this$0
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)): this.this$0 == Param_1
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)): init'ed(this.this$0)
    //#ConfigPanel.java:233: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel)
    //#ConfigPanel.java:233: method: void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)): this
    //#input(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)): x0
    //#output(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)): this.this$0
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)): this.this$0 == x0
    //#post(void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)): init'ed(this.this$0)
    //#ConfigPanel.java:233: end of method: void com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource(ConfigPanel, ConfigPanel$1)

        /** {@inheritDoc} */
        @Override
        public MediaSourceState getState() {
            return MediaSourceState.PLAYING;
    //#ConfigPanel.java:238: method: MediaSourceState com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getState()
    //#input(MediaSourceState getState()): com/dmdirc/addons/nowplaying/MediaSourceState.PLAYING
    //#output(MediaSourceState getState()): return_value
    //#post(MediaSourceState getState()): return_value == &com.dmdirc.addons.nowplaying.MediaSourceState__static_init.new MediaSourceState(MediaSourceState__static_init#4)
    //#ConfigPanel.java:238: end of method: MediaSourceState com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getState()
        }

        /** {@inheritDoc} */
        @Override
        public String getAppName() {
            return "MyProgram";
    //#ConfigPanel.java:244: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getAppName()
    //#output(String getAppName()): return_value
    //#post(String getAppName()): return_value == &"MyProgram"
    //#ConfigPanel.java:244: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getAppName()
        }

        /** {@inheritDoc} */
        @Override
        public String getArtist() {
            return "The Artist";
    //#ConfigPanel.java:250: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getArtist()
    //#output(String getArtist()): return_value
    //#post(String getArtist()): return_value == &"The Artist"
    //#ConfigPanel.java:250: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getArtist()
        }

        /** {@inheritDoc} */
        @Override
        public String getTitle() {
            return "Song about nothing";
    //#ConfigPanel.java:256: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getTitle()
    //#output(String getTitle()): return_value
    //#post(String getTitle()): return_value == &"Song about nothing"
    //#ConfigPanel.java:256: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getTitle()
        }

        /** {@inheritDoc} */
        @Override
        public String getAlbum() {
            return "Album 45";
    //#ConfigPanel.java:262: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getAlbum()
    //#output(String getAlbum()): return_value
    //#post(String getAlbum()): return_value == &"Album 45"
    //#ConfigPanel.java:262: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getAlbum()
        }

        /** {@inheritDoc} */
        @Override
        public String getLength() {
            return "3:45";
    //#ConfigPanel.java:268: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getLength()
    //#output(String getLength()): return_value
    //#post(String getLength()): return_value == &"3:45"
    //#ConfigPanel.java:268: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getLength()
        }

        /** {@inheritDoc} */
        @Override
        public String getTime() {
            return "1:20";
    //#ConfigPanel.java:274: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getTime()
    //#output(String getTime()): return_value
    //#post(String getTime()): return_value == &"1:20"
    //#ConfigPanel.java:274: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getTime()
        }

        /** {@inheritDoc} */
        @Override
        public String getFormat() {
            return "flac";
    //#ConfigPanel.java:280: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getFormat()
    //#output(String getFormat()): return_value
    //#post(String getFormat()): return_value == &"flac"
    //#ConfigPanel.java:280: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getFormat()
        }

        /** {@inheritDoc} */
        @Override
        public String getBitrate() {
            return "128";
    //#ConfigPanel.java:286: method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getBitrate()
    //#output(String getBitrate()): return_value
    //#post(String getBitrate()): return_value == &"128"
    //#ConfigPanel.java:286: end of method: String com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.getBitrate()
        }

    }

}
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$2__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$2]
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$2__static_init): __Dispatch_Table.run()V
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$2__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$2] == &__Dispatch_Table
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$2__static_init): __Dispatch_Table.run()V == &run
    //#ConfigPanel.java:: end of method: com.dmdirc.addons.nowplaying.ConfigPanel$2.com.dmdirc.addons.nowplaying.ConfigPanel$2__static_init
    //#ConfigPanel.java:: end of class: com.dmdirc.addons.nowplaying.ConfigPanel$2
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel]
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.getSources()Ljava/util/List;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.initComponents()V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyPressed(Ljava/awt/event/KeyEvent;)V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyReleased(Ljava/awt/event/KeyEvent;)V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyTyped(Ljava/awt/event/KeyEvent;)V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.save()V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.schedulePreviewUpdate()V
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.updatePreview()V
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel] == &__Dispatch_Table
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.getSources()Ljava/util/List; == &getSources
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.initComponents()V == &initComponents
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyPressed(Ljava/awt/event/KeyEvent;)V == &keyPressed
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyReleased(Ljava/awt/event/KeyEvent;)V == &keyReleased
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.keyTyped(Ljava/awt/event/KeyEvent;)V == &keyTyped
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.save()V == &save
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.schedulePreviewUpdate()V == &schedulePreviewUpdate
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel__static_init): __Dispatch_Table.updatePreview()V == &updatePreview
    //#ConfigPanel.java:: end of method: com.dmdirc.addons.nowplaying.ConfigPanel.com.dmdirc.addons.nowplaying.ConfigPanel__static_init
    //#ConfigPanel.java:: end of class: com.dmdirc.addons.nowplaying.ConfigPanel
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$1__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$1]
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$1__static_init): __Dispatch_Table.run()V
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$1__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$1] == &__Dispatch_Table
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$1__static_init): __Dispatch_Table.run()V == &run
    //#ConfigPanel.java:: end of method: com.dmdirc.addons.nowplaying.ConfigPanel$1.com.dmdirc.addons.nowplaying.ConfigPanel$1__static_init
    //#ConfigPanel.java:: end of class: com.dmdirc.addons.nowplaying.ConfigPanel$1
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource]
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getAlbum()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getAppName()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getArtist()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getBitrate()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getFormat()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getLength()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getTime()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getTitle()Ljava/lang/String;
    //#output(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource]
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource] == &__Dispatch_Table
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): com/dmdirc/addons/nowplaying/MediaSource.__Descendant_Table[com/dmdirc/addons/nowplaying/ConfigPanel$DummyMediaSource] == &__Dispatch_Table
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getAlbum()Ljava/lang/String; == &getAlbum
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getAppName()Ljava/lang/String; == &getAppName
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getArtist()Ljava/lang/String; == &getArtist
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getBitrate()Ljava/lang/String; == &getBitrate
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getFormat()Ljava/lang/String; == &getFormat
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getLength()Ljava/lang/String; == &getLength
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getState()Lcom/dmdirc/addons/nowplaying/MediaSourceState; == &getState
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getTime()Ljava/lang/String; == &getTime
    //#post(com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init): __Dispatch_Table.getTitle()Ljava/lang/String; == &getTitle
    //#ConfigPanel.java:: end of method: com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource.com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource__static_init
    //#ConfigPanel.java:: end of class: com.dmdirc.addons.nowplaying.ConfigPanel$DummyMediaSource
