Tab list with subcommands

Now when using tab it should suggest subcommands (if any available) instead of players/senders.

Conflicts:
	src/main/java/com/massivecraft/massivecore/cmd/MassiveCoreBukkitCommand.java
This commit is contained in:
Magnus Ulf 2014-12-31 10:00:29 +01:00 committed by Olof Larsson
parent 014815d227
commit 22cef1d9da

View File

@ -39,6 +39,16 @@ public class MassiveCoreBukkitCommand extends Command implements PluginIdentifia
this.massiveCommand = massiveCommand;
}
// -------------------------------------------- //
// OVERRIDE: PLUGIN IDENTIFIABLE COMMAND
// -------------------------------------------- //
@Override
public Plugin getPlugin()
{
return massiveCommand.getRegisteredPlugin();
}
// -------------------------------------------- //
// OVERRIDE: EXECUTE
// -------------------------------------------- //
@ -78,14 +88,37 @@ public class MassiveCoreBukkitCommand extends Command implements PluginIdentifia
@Override
public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException
{
Set<String> ret = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
String tokenlc = args[args.length - 1].toLowerCase();
// First we need a command to find the subcommands in.
MassiveCommand cmd = this.getSubCommand(args, massiveCommand);
// So if we found a command, and it has subcommands
// we will suggest the aliases instead of senders.
if (cmd != null && cmd.getSubCommands().size() > 0)
{
// If we compiled in Java 8, I could have used streams :(
for (MassiveCommand sub : cmd.getSubCommands())
{
if ( ! sub.isVisibleTo(sender)) continue;
for (String subAlias : sub.getAliases())
{
if ( ! subAlias.toLowerCase().startsWith(tokenlc)) continue;
ret.add(subAlias);
}
}
// return, so senders is not suggested.
return new ArrayList<String>(ret);
}
// If subcommands didn't work, we will try with senders.
List<String> superRet = super.tabComplete(sender, alias, args);
if (args.length == 0) return superRet;
Set<String> ret = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
ret.addAll(superRet);
String tokenlc = args[args.length - 1].toLowerCase();
// Add names of all online senders that match and isn't added yet.
for (String senderName : IdUtil.getOnlineNames())
{
@ -98,13 +131,43 @@ public class MassiveCoreBukkitCommand extends Command implements PluginIdentifia
}
// -------------------------------------------- //
// OVERRIDE: PLUGIN IDENTIFIABLE COMMAND
// PRIVATE: TAB COMPLETE
// -------------------------------------------- //
@Override
public Plugin getPlugin()
{
return massiveCommand.getRegisteredPlugin();
private MassiveCommand getSubCommand(String[] args, MassiveCommand cmd)
{
// First we look in the basecommand, then in its subcommands,
// and the next subcommand and so on.
// Until we run out of args or no subcommand is found.
for (int i = 0; i < args.length-1; i++)
{
String arg = args[i];
// If no subcommand is found we will not look further.
if (cmd == null) break;
// We have to loop through the subcommands to see if any match the arg.
// if none exists we will get null, thus we break in case of null.
cmd = this.getSubCommand(arg, cmd);
}
return cmd;
}
private MassiveCommand getSubCommand(String arg, MassiveCommand cmd)
{
if (cmd == null || arg == null) return null;
// We will look in all its subcommands
for (MassiveCommand sub : cmd.getSubCommands())
{
// and in all those look for an alias that matches
for (String subAlias : sub.getAliases())
{
// If it matched we had success
if (subAlias.equalsIgnoreCase(arg)) return sub;
}
}
return null;
}
}