package me.desht.scrollingmenusign.commands; import java.util.ArrayList; import java.util.List; import me.desht.dhutils.commands.AbstractCommand; import me.desht.scrollingmenusign.SMSException; import me.desht.scrollingmenusign.SMSHandler; import me.desht.scrollingmenusign.SMSMacro; import me.desht.scrollingmenusign.SMSMenu; import me.desht.scrollingmenusign.SMSMenuItem; import me.desht.scrollingmenusign.ScrollingMenuSign; import me.desht.scrollingmenusign.views.SMSView; import me.desht.scrollingmenusign.views.ViewManager; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public abstract class SMSAbstractCommand extends AbstractCommand { public SMSAbstractCommand(String label, int minArgs, int maxArgs) { super(label, minArgs, maxArgs); } public SMSAbstractCommand(String label, int minArgs) { super(label, minArgs); } public SMSAbstractCommand(String label) { super(label); } protected List<String> getMenuCompletions(Plugin plugin, CommandSender sender, String prefix) { List<String> res = new ArrayList<String>(); if (sender instanceof Player && prefix.isEmpty()) { if (((ScrollingMenuSign) plugin).getViewManager().getTargetedView((Player) sender) != null) { // player has a view targeted - add "." as the first item // "." is a convenience for "currently targeted menu" res.add("."); } } SMSHandler handler = ((ScrollingMenuSign) plugin).getHandler(); List<SMSMenu> menus = handler.listMenus(true); for (SMSMenu menu : menus) { if (prefix.isEmpty() || menu.getName().startsWith(prefix)) res.add(menu.getName()); } return getResult(res, sender, false); } protected List<String> getViewCompletions(CommandSender sender, String prefix) { List<String> res = new ArrayList<String>(); if (sender instanceof Player && prefix.isEmpty()) { if (ScrollingMenuSign.getInstance().getViewManager().getTargetedView((Player) sender) != null) { // player has a view targeted - add "." as the first item // "." is a convenience for "currently targeted view" res.add("."); } } List<SMSView> views = ScrollingMenuSign.getInstance().getViewManager().listViews(); for (SMSView view : views) { if (prefix.isEmpty() || view.getName().startsWith(prefix)) res.add(view.getName()); } return getResult(res, sender, true); } protected List<String> getMenuItemCompletions(CommandSender sender, SMSMenu menu, String prefix) { List<String> res = new ArrayList<String>(); for (SMSMenuItem item : menu.getItems()) { String label = item.getLabelStripped(); if (prefix.isEmpty() || label.startsWith(prefix)) { // This is a bit of a hack - whitespace in a completion breaks further // completion, so we'll use a pretend whitespace character. // This does need to be processed later, in any commands which refer to it - // handled in SMSMenu res.add(label.replace(" ", SMSMenu.FAKE_SPACE)); } } return getResult(res, sender, false); } protected List<String> getMacroCompletions(CommandSender sender, String prefix) { List<String> res = new ArrayList<String>(); for (SMSMacro macro : SMSMacro.listMacros()) { String label = macro.getName(); if (prefix.isEmpty() || label.startsWith(prefix)) { res.add(label); } } return getResult(res, sender, true); } protected SMSMenu getMenu(CommandSender sender, String menuName) { if (menuName.equals(".") && sender instanceof Player) { Player player = (Player) sender; return ScrollingMenuSign.getInstance().getViewManager().getTargetedView(player, true).getActiveMenu(player); } else { return ScrollingMenuSign.getInstance().getMenuManager().getMenu(menuName); } } protected SMSView getView(CommandSender sender, String viewName) { if (viewName.equals(".") && sender instanceof Player) { return ScrollingMenuSign.getInstance().getViewManager().getTargetedView((Player) sender, true); } else { return ScrollingMenuSign.getInstance().getViewManager().getView(viewName); } } protected int parseNumber(String s) throws SMSException { int count; try { count = Integer.parseInt(s); } catch (NumberFormatException e) { throw new SMSException("Invalid numeric argument: " + s); } return count; } protected ViewManager getViewManager(Plugin plugin) { return ((ScrollingMenuSign) plugin).getViewManager(); } }