/*
 * Copyright (c) 2006-2010 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.commandparser.commands.global;

import com.dmdirc.FrameContainer;
import com.dmdirc.commandparser.CommandArguments;
import com.dmdirc.commandparser.CommandInfo;
import com.dmdirc.commandparser.CommandType;
import com.dmdirc.commandparser.commands.Command;
import com.dmdirc.commandparser.commands.IntelligentCommand;
import com.dmdirc.commandparser.commands.context.CommandContext;
import com.dmdirc.plugins.PluginInfo;
import com.dmdirc.plugins.PluginManager;
import com.dmdirc.ui.input.AdditionalTabTargets;

/**
 * Allows the user to load a plugin.
 * @author chris
 */
public final class LoadPlugin extends Command implements IntelligentCommand,
        CommandInfo {

    /**
     * Creates a new instance of LoadPlugin.
     */
    public LoadPlugin() {
        super();
    }

    /** {@inheritDoc} */
    @Override
    public void execute(final FrameContainer<?> origin,
            final CommandArguments args, final CommandContext context) {
        if (args.getArguments().length == 0) {
            showUsage(origin, args.isSilent(), "loadplugin", "<plugin>");
            return;
        }

        // Add previously unknown plugin to plugin manager
        PluginManager.getPluginManager().addPlugin(args.getArguments()[0]);
        final PluginInfo plugin = PluginManager.getPluginManager()
                .getPluginInfo(args.getArguments()[0]);
        
        if (plugin == null) {
            sendLine(origin, args.isSilent(), FORMAT_ERROR, "Plugin loading failed");
        } else if (plugin.isLoaded()) {
            sendLine(origin, args.isSilent(), FORMAT_OUTPUT, "Plugin already loaded.");
        } else {
            plugin.loadPlugin();
            if (plugin.isLoaded()) {
                sendLine(origin, args.isSilent(), FORMAT_OUTPUT, "Plugin loaded.");
                PluginManager.getPluginManager().updateAutoLoad(plugin);
            } else {
                sendLine(origin, args.isSilent(), FORMAT_OUTPUT, "Loading plugin failed. ("
                        + plugin.getLastError() + ")");
            }
        }
    }


    /** {@inheritDoc} */
    @Override
    public String getName() {
        return "loadplugin";
    }

    /** {@inheritDoc} */
    @Override
    public boolean showInHelp() {
        return true;
    }

    /** {@inheritDoc} */
    @Override
    public CommandType getType() {
        return CommandType.TYPE_GLOBAL;
    }

    /** {@inheritDoc} */
    @Override
    public String getHelp() {
        return "loadplugin <plugin> - loads the specified class as a plugin";
    }

    /** {@inheritDoc} */
    @Override
    public AdditionalTabTargets getSuggestions(final int arg,
            final IntelligentCommandContext context) {
        final AdditionalTabTargets res = new AdditionalTabTargets();

        res.excludeAll();

        if (arg == 0) {
            for (PluginInfo possPlugin
                    : PluginManager.getPluginManager().getPossiblePluginInfos(false)) {
                res.add(possPlugin.getRelativeFilename());
            }
        }

        return res;
    }

}

@@ -1724,25 +1724,8 @@
 in.%0A
- * @author chris%0A
  */%0A
@@ -1828,119 +1828,8 @@
  %7B%0A%0A
-    /**%0A     * Creates a new instance of LoadPlugin.%0A     */%0A    public LoadPlugin() %7B%0A        super();%0A    %7D%0A%0A
     
@@ -2254,16 +2254,33 @@
 dPlugin(
+%0A                
 args.get
@@ -2280,37 +2280,42 @@
 rgs.getArguments
-()%5B0%5D
+AsString()
 );%0A        final
@@ -2420,24 +2420,21 @@
 ents
-()%5B0%5D);%0A        
+AsString());%0A
 %0A   
@@ -2519,16 +2519,36 @@
 T_ERROR,
+%0A                   
  %22Plugin
@@ -2658,32 +2658,52 @@
 , FORMAT_OUTPUT,
+%0A                   
  %22Plugin already
@@ -2865,16 +2865,40 @@
 _OUTPUT,
+%0A                       
  %22Plugin
@@ -3067,16 +3067,40 @@
 _OUTPUT,
+%0A                       
  %22Loadin
@@ -4058,16 +4058,45 @@
 anager()
+%0A                            
 .getPoss

Handle spaces in plugin names when loading.