diff --git a/src/fr/pandacube/java/util/commands/AbstractCommand.java b/src/fr/pandacube/java/util/commands/AbstractCommand.java
new file mode 100644
index 0000000..1db6eaa
--- /dev/null
+++ b/src/fr/pandacube/java/util/commands/AbstractCommand.java
@@ -0,0 +1,141 @@
+package fr.pandacube.java.util.commands;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Logger;
+
+public class AbstractCommand {
+
+ public final String commandName;
+
+ public AbstractCommand(String cmdName) {
+ commandName = cmdName;
+ }
+
+
+ /**
+ *
+ * Concatène les chaines de caractères passés dans args
(avec
+ * " "
comme séparateur), en ommettant
+ * celles qui se trouvent avant index
.
+ * Par exemple :
+ *
+ *
+ * getLastParams(new String[] {"test", "bouya", "chaka", "bukkit"}, 1);
+ *
+ *
+ * retournera la chaine "bouya chaka bukkit"
+ *
+ * @param args liste des arguments d'une commandes.
+ * Le premier élément est l'argument qui suit le nom de la commande.
+ * Usuellement, ce paramètre correspond au paramètre
+ * args
de la méthode onCommand
+ * @param index
+ * @return
+ */
+ public static String getLastParams(String[] args, int index) {
+ if (index < 0 || index >= args.length) return null;
+ return String.join(" ", Arrays.copyOfRange(args, index, args.length));
+ }
+
+ /**
+ * Prends en charge les tokens avec des espaces, mais retourne les
+ * propositions complètes
+ *
+ * @param token
+ * @param allProposal
+ * @return
+ */
+ public static List getTabProposalFromToken(String token, Collection allProposal) {
+ List ret = new ArrayList();
+
+ for (String s : allProposal)
+ if (s.toLowerCase().startsWith(token.toLowerCase())) ret.add(s);
+
+ if (ret.isEmpty()) ret.addAll(allProposal);
+
+ ret.sort(null); // String implents Comparable
+
+ return ret;
+ }
+
+
+
+ public static final TabProposal TAB_NO_PROPOSAL = () -> Collections.emptyList();
+
+ public static TabProposal TAB_PROPOSAL(Collection proposals) {
+ return () -> proposals;
+ }
+
+ public static TabProposal TAB_INTEGERS(int startIncluded, int endIncluded) {
+ List proposals = new ArrayList<>(endIncluded - startIncluded + 1);
+ for (int i = startIncluded; i <= endIncluded; i++) {
+ proposals.add(Integer.toString(i));
+ }
+ return () -> proposals;
+ }
+
+ public static TabProposal TAB_PROPOSAL_LAST_PARAMS(String[] args, int index, Collection proposals) {
+ String lastParamToken = getLastParams(args, index);
+ String[] splittedToken = lastParamToken.split(" ", -1);
+ int currentTokenPosition = splittedToken.length - 1;
+ String[] previousTokens = Arrays.copyOf(splittedToken, currentTokenPosition);
+
+ List currentTokenProposal = new ArrayList<>();
+ for (String p : proposals) {
+ String[] splittedProposal = p.split(" ", -1);
+ if (splittedProposal.length <= currentTokenPosition)
+ continue;
+ if (!Arrays.equals(Arrays.copyOf(splittedToken, currentTokenPosition), previousTokens))
+ continue;
+ if (splittedProposal[currentTokenPosition].isEmpty())
+ continue;
+
+ currentTokenProposal.add(splittedProposal[currentTokenPosition]);
+ }
+
+ return () -> currentTokenProposal;
+ }
+
+ @FunctionalInterface
+ public interface TabProposal {
+ public abstract Collection getProposal();
+ }
+
+
+
+
+ /**
+ * Throw an instance of this exception to indicate to the plugin command handler
+ * that the user has missused the command. The message, if provided, must indicate
+ * the reason of the mussusage of the command. It will be displayed on the screen
+ * with eventually indication of how to use the command (help command for example).
+ * If a {@link Throwable} cause is provided, it will be relayed to the plugin {@link Logger}.
+ *
+ */
+ public static class BadCommandUsage extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public BadCommandUsage() {
+ super();
+ }
+
+ public BadCommandUsage(Throwable cause) {
+ super(cause);
+ }
+
+ public BadCommandUsage(String message) {
+ super(message);
+ }
+
+ public BadCommandUsage(String message, Throwable cause) {
+ super(message, cause);
+ }
+ }
+
+
+
+}