package me.desht.chesscraft.commands; import me.desht.chesscraft.Messages; import me.desht.chesscraft.chess.BoardStyle; import me.desht.chesscraft.chess.BoardView; import me.desht.chesscraft.chess.BoardViewManager; import me.desht.chesscraft.event.ChessBoardModifiedEvent; import me.desht.chesscraft.exceptions.ChessException; import me.desht.dhutils.AttributeCollection; import me.desht.dhutils.MiscUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class BoardStyleSetCommand extends ChessAbstractCommand { public BoardStyleSetCommand() { super("chess board set", 2); setPermissionNode("chesscraft.commands.board.set"); setUsage("/chess board set <attribute> <value> [<attribute> <value>...]"); setQuotedArgs(true); } @Override public boolean execute(Plugin plugin, CommandSender sender, String[] args) throws ChessException { notFromConsole(sender); if (args.length % 2 != 0) { showUsage(sender); return true; } BoardView bv = BoardViewManager.getManager().partOfChessBoard(((Player)sender).getLocation()); if (bv == null) { throw new ChessException(Messages.getString("Designer.notOnBoard")); } if (bv.isDesigning()) { throw new ChessException(Messages.getString("Game.boardInDesignMode")); } BoardStyle style = bv.getChessBoard().getBoardStyle(); AttributeCollection viewAttrs = bv.getAttributes(); AttributeCollection styleAttrs = style.getAttributes(); boolean styleHasChanged = false; Set<String> changedAttrs = new HashSet<String>(); for (int i = 0; i < args.length; i += 2) { String attr = args[i]; String val = args[i + 1]; if (styleAttrs.contains(attr)) { styleAttrs.set(attr, val); styleHasChanged = true; } else { attr = attr.replace("_", ""); if (viewAttrs.contains(attr)) { viewAttrs.set(attr, val); } else { throw new ChessException("Unknown attribute '" + attr + "'."); } } changedAttrs.add(attr); } MiscUtil.statusMessage(sender, Messages.getString("ChessCommandExecutor.boardStyleChanged", bv.getName())); if (styleHasChanged) { MiscUtil.statusMessage(sender, Messages.getString("ChessCommandExecutor.boardStyleSuggestSave")); bv.paintAll(); } else if (bv.getChessBoard().isRedrawNeeded()) { bv.paintAll(); } else { bv.getControlPanel().repaintAll(null); } bv.save(); Bukkit.getPluginManager().callEvent(new ChessBoardModifiedEvent(bv, changedAttrs)); return true; } @Override public List<String> onTabComplete(Plugin plugin, CommandSender sender, String[] args) { notFromConsole(sender); BoardView bv = BoardViewManager.getManager().partOfChessBoard(((Player)sender).getLocation()); if (bv == null) { return noCompletions(sender); } int l = args.length; AttributeCollection styleAttrs = bv.getChessBoard().getBoardStyle().getAttributes(); AttributeCollection viewAttrs = bv.getAttributes(); if (args.length % 2 == 1) { // provide attribute completions List<String> attrs = new ArrayList<String>(styleAttrs.listAttributeKeys(false)); attrs.addAll(new ArrayList<String>(viewAttrs.listAttributeKeys(false))); return filterPrefix(sender, attrs, args[l - 1]); } else { // provide value completions for last attribute String attr = args[l - 2]; String desc = styleAttrs.contains(attr) ? styleAttrs.getDescription(attr) : viewAttrs.getDescription(attr); Object o = styleAttrs.contains(attr) ? styleAttrs.get(attr) : viewAttrs.get(attr); if (!desc.isEmpty()) desc = ChatColor.GRAY.toString() + ChatColor.ITALIC + " [" + desc + "]"; return getConfigValueCompletions(sender, attr, o, desc, args[l - 1]); } } }