/** * Warlock, the open-source cross-platform game client * * Copyright 2008, Warlock LLC, and individual contributors as indicated * by the @authors tag. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package cc.warlock.core.client.settings.macro.internal; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import org.dom4j.DocumentHelper; import org.dom4j.Element; import cc.warlock.core.client.settings.internal.ClientConfigurationProvider; import cc.warlock.core.client.settings.macro.CommandMacroHandler; import cc.warlock.core.client.settings.macro.IMacro; import cc.warlock.core.client.settings.macro.IMacroCommand; import cc.warlock.core.client.settings.macro.IMacroHandler; import cc.warlock.core.client.settings.macro.IMacroProvider; import cc.warlock.core.client.settings.macro.IMacroVariable; /** * Macros defined by this provider are command-based only. * Everything else will be a system macro, probably needing special configuration, or more foresight in this class. * * @author marshall */ public class MacroConfigurationProvider extends ClientConfigurationProvider implements IMacroProvider { protected ArrayList<IMacro> macros = new ArrayList<IMacro>(); protected HashMap<String, IMacroVariable> variables = new HashMap<String, IMacroVariable>(); protected HashMap<String, IMacroCommand> commands = new HashMap<String, IMacroCommand>(); public MacroConfigurationProvider () { super("macros"); setHandleChildren(false); } public void addMacro(IMacro macro) { if (!macros.contains(macro)) { macros.add(macro); } } public IMacro getMacro(int keycode, int modifiers) { for (IMacro macro : macros) { if (macro.getKeyCode() == keycode && macro.getModifiers() == modifiers) { return macro; } } return null; } public List<? extends IMacro> getMacros() { return macros; } public void removeMacro(IMacro macro) { if (macros.contains(macro)) { macros.remove(macro); } } public void replaceMacro(IMacro originalMacro, IMacro newMacro) { int index = macros.indexOf(originalMacro); if (index > -1) { macros.set(index, newMacro); } } public void addMacroVariable(IMacroVariable var) { setMacroVariable(var.getIdentifier(), var); } public IMacroVariable getMacroVariable(String id) { if (variables.containsKey(id)) { return variables.get(id); } return null; } public void removeMacroVariable(IMacroVariable variable) { if (variables.containsKey(variable.getIdentifier())) { variables.remove(variable.getIdentifier()); } } public Collection<IMacroVariable> getMacroVariables() { return variables.values(); } public void setMacroVariable(String id, IMacroVariable var) { variables.put(id, var); } @Override protected void parseData() {} @Override protected void parseChild(Element child) { if (child.getName().equals("macro")) { String command = child.attributeValue("command"); int keycode = intValue(child, "keycode"); int modifiers = intValue(child, "modifiers"); Macro macro = new Macro(this, keycode, modifiers); macro.addHandler(new CommandMacroHandler(command)); macros.add(macro); } } @Override protected void saveTo(List<Element> elements) { Element macrosElement = DocumentHelper.createElement("macros"); for (IMacro macro : macros) { if (macro.getHandlers().size() == 1) { IMacroHandler first = macro.getHandlers().iterator().next(); if (first instanceof CommandMacroHandler) { CommandMacroHandler handler = (CommandMacroHandler)first; Element mElement = macrosElement.addElement("macro"); mElement.addAttribute("command", handler.getCommand()); mElement.addAttribute("keycode", macro.getKeyCode()+""); mElement.addAttribute("modifiers", macro.getModifiers()+""); } } } elements.add(macrosElement); } public void addMacroCommand (IMacroCommand command) { setMacroCommand(command.getIdentifier(), command); } public Collection<IMacroCommand> getMacroCommands() { return commands.values(); } public void removeMacroCommand(IMacroCommand command) { if (commands.containsKey(command.getIdentifier())) { commands.remove(command.getIdentifier()); } } public IMacroCommand getMacroCommand(String id) { if (commands.containsKey(id)) { return commands.get(id); } return null; } public void setMacroCommand (String id, IMacroCommand command) { commands.put(id, command); } }