From: <jde...@us...> - 2011-11-13 11:59:16
|
Revision: 15514 http://pcgen.svn.sourceforge.net/pcgen/?rev=15514&view=rev Author: jdempsey Date: 2011-11-13 11:59:08 +0000 (Sun, 13 Nov 2011) Log Message: ----------- Link up adding and removing spells with character Modified Paths: -------------- sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java Modified: sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2011-11-13 05:56:23 UTC (rev 15513) +++ sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2011-11-13 11:59:08 UTC (rev 15514) @@ -251,7 +251,7 @@ infoFactory = new Gui2InfoFactory(pc); characterAbilities = new CharacterAbilities(pc, delegate, dataSet); descriptionFacade = new DescriptionFacadeImpl(pc); - spellSupportFacade = new SpellSupportFacadeImpl(pc); + spellSupportFacade = new SpellSupportFacadeImpl(pc, delegate); //TODO: Init appliedTempBonuses appliedTempBonuses = new DefaultListFacade<TempBonusFacade>(); Modified: sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java 2011-11-13 05:56:23 UTC (rev 15513) +++ sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java 2011-11-13 11:59:08 UTC (rev 15514) @@ -24,23 +24,32 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; +import org.apache.commons.lang.StringUtils; + import pcgen.base.util.HashMapToList; import pcgen.cdom.base.CDOMList; +import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.StringKey; +import pcgen.core.Ability; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.analysis.SpellLevel; import pcgen.core.character.CharacterSpell; +import pcgen.core.character.SpellBook; import pcgen.core.character.SpellInfo; import pcgen.core.facade.ClassFacade; import pcgen.core.facade.SpellFacade; import pcgen.core.facade.SpellSupportFacade; +import pcgen.core.facade.UIDelegate; import pcgen.core.facade.util.DefaultListFacade; import pcgen.core.facade.util.ListFacade; import pcgen.core.spell.Spell; +import pcgen.core.utils.MessageType; +import pcgen.core.utils.ShowMessageDelegate; /** * The Class <code>SpellSupportFacadeImpl</code> marshals the spell data for a @@ -57,23 +66,26 @@ public class SpellSupportFacadeImpl implements SpellSupportFacade { private final PlayerCharacter pc; + private UIDelegate delegate; + private DefaultListFacade<SpellNode> availableSpellNodes; - private DefaultListFacade<SpellNode> allKnownSpellNodes; + //private DefaultListFacade<SpellNode> allKnownSpellNodes; private DefaultListFacade<SpellNode> knownSpellNodes; private DefaultListFacade<SpellNode> preparedSpellNodes; private DefaultListFacade<SpellNode> bookSpellNodes; - public SpellSupportFacadeImpl(PlayerCharacter pc) + public SpellSupportFacadeImpl(PlayerCharacter pc, UIDelegate delegate) { this.pc = pc; + this.delegate = delegate; availableSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); buildAvailableNodes(); - allKnownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); + //allKnownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); knownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); - buildKnownNodes(); preparedSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); bookSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); + buildKnownPreparedNodes(); } /* (non-Javadoc) @@ -89,7 +101,7 @@ */ public ListFacade<SpellNode> getAllKnownSpellNodes() { - return allKnownSpellNodes; + return knownSpellNodes; } /* (non-Javadoc) @@ -121,16 +133,24 @@ */ public void addKnownSpell(SpellNode spell) { - knownSpellNodes.addElement(spell); - + SpellNode node = + addSpellToCharacter(spell, Globals.getDefaultSpellBook()); + if (node != null) + { + knownSpellNodes.addElement(node); + } } - + /* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade#removeKnownSpell(pcgen.core.facade.SpellSupportFacade.SpellNode) */ public void removeKnownSpell(SpellNode spell) { - knownSpellNodes.removeElement(spell); + //TODO: This should also remove the spell from books and lists + if (removeSpellFromCharacter(spell, Globals.getDefaultSpellBook())) + { + knownSpellNodes.removeElement(spell); + } } /* (non-Javadoc) @@ -138,8 +158,12 @@ */ public void addPreparedSpell(SpellNode spell, String spellList) { - // TODO Auto-generated method stub - preparedSpellNodes.addElement(spell); + SpellNode node = + addSpellToCharacter(spell, spellList); + if (node != null) + { + preparedSpellNodes.addElement(node); + } } /* (non-Javadoc) @@ -147,8 +171,10 @@ */ public void removePreparedSpell(SpellNode spell, String spellList) { - // TODO Auto-generated method stub - preparedSpellNodes.removeElement(spell); + if (removeSpellFromCharacter(spell, spellList)) + { + preparedSpellNodes.removeElement(spell); + } } /* (non-Javadoc) @@ -157,7 +183,6 @@ public void addSpellList(String spellList) { // TODO Auto-generated method stub - } /* (non-Javadoc) @@ -165,26 +190,39 @@ */ public void removeSpellList(String spellList) { - // TODO Auto-generated method stub - + // TODO Need to remove spell book from character also + for (Iterator<SpellNode> iterator = preparedSpellNodes.iterator(); iterator.hasNext();) + { + SpellNode spell = iterator.next(); + if (spellList.equals(spell.getRootNode())) + { + iterator.remove(); + } + } } /* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade#addToSpellBook(pcgen.core.facade.SpellSupportFacade.SpellNode, java.lang.String) */ - public void addToSpellBook(SpellNode node, String spellBook) + public void addToSpellBook(SpellNode spell, String spellBook) { - // TODO Auto-generated method stub - + SpellNode node = + addSpellToCharacter(spell, spellBook); + if (node != null) + { + bookSpellNodes.addElement(node); + } } /* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade#removeFromSpellBook(pcgen.core.facade.SpellSupportFacade.SpellNode, java.lang.String) */ - public void removeFromSpellBook(SpellNode node, String spellBook) + public void removeFromSpellBook(SpellNode spell, String spellBook) { - // TODO Auto-generated method stub - + if (removeSpellFromCharacter(spell, spellBook)) + { + bookSpellNodes.removeElement(spell); + } } /* (non-Javadoc) @@ -192,10 +230,12 @@ */ public String getClassInfo(ClassFacade spellcaster) { - // TODO Auto-generated method stub - return null; + return "Not supported"; } + /** + * Construct the list of available spells for the character. + */ private void buildAvailableNodes() { // Scan character classes for spell classes @@ -235,7 +275,11 @@ } } - private void buildKnownNodes() + /** + * Construct the list of spells the character knows, has prepared or has in + * a spell book. + */ + private void buildKnownPreparedNodes() { // Scan character classes for spell classes List<PCClass> classList = getCharactersSpellcastingClasses(); @@ -252,23 +296,118 @@ for (SpellInfo spellInfo : charSpell.getInfoList()) { // Create SpellNodeImpl for each spell + String book = spellInfo.getBook(); + boolean isKnown = Globals.getDefaultSpellBook().equals(book); SpellFacadeImplem spellImplem = new SpellFacadeImplem(pc, charSpell.getSpell(), charSpell, spellInfo); SpellNodeImpl node = new SpellNodeImpl(spellImplem, pcClass, String.valueOf(spellInfo.getActualLevel()), - null); + isKnown ? null : book); + boolean isSpellBook = + pc.getSpellBookByName(book).getType() == SpellBook.TYPE_SPELL_BOOK; // Add to list - knownSpellNodes.addElement(node); + if (isKnown) + { + knownSpellNodes.addElement(node); + } + else if (isSpellBook) + { + bookSpellNodes.addElement(node); + } + else + { + preparedSpellNodes.addElement(node); + } } } } } + /** + * Add a spell to the named book for the character. The request will be + * validated and any errors shown to the user by the UIDelegate. + * + * @param spell The spell to be added. + * @param bookName The book to add the spell to. + * @return The new SpellNode, or null if the selection was invalid. + */ + private SpellNode addSpellToCharacter(SpellNode spell, String bookName) + { + if (!(spell.getSpell() instanceof SpellFacadeImplem)) + { + return null; + } + CharacterSpell charSpell = + ((SpellFacadeImplem) spell.getSpell()).getCharSpell(); + if (charSpell == null) + { + return null; + } + List<Ability> featList = new ArrayList<Ability>(); + int level = Integer.parseInt(spell.getSpellLevel()); + + String errorMsg = + pc.addSpell(charSpell, featList, spell.getSpellcastingClass() + .getKeyName(), bookName, level, level); + if (!StringUtils.isEmpty(errorMsg)) + { + delegate.showErrorMessage(Constants.s_APPNAME, errorMsg); + return null; + } + + SpellInfo spellInfo = + charSpell.getSpellInfoFor(pc, bookName, level, -1, featList); + boolean isKnown = Globals.getDefaultSpellBook().equals(bookName); + SpellFacadeImplem spellImplem = + new SpellFacadeImplem(pc, charSpell.getSpell(), charSpell, + spellInfo); + SpellNodeImpl node = + new SpellNodeImpl(spellImplem, spell.getSpellcastingClass(), + String.valueOf(spellInfo.getActualLevel()), isKnown ? null + : bookName); + return node; + } + + /** + * Remove a spell from the named book for the character. The request will be + * validated and any errors shown to the user by the UIDelegate. + * + * @param spell The spell to be removed. + * @param bookName The book to remove the spell from. + * @return True if the removal worked, false if the selection was invalid. + */ + private boolean removeSpellFromCharacter(SpellNode spell, String bookName) + { + if (!(spell.getSpell() instanceof SpellFacadeImplem)) + { + return false; + } + SpellFacadeImplem sfi = (SpellFacadeImplem) spell.getSpell(); + CharacterSpell charSpell = sfi.getCharSpell(); + SpellInfo spellInfo = sfi.getSpellInfo(); + if (charSpell == null || spellInfo == null) + { + return false; + } + + final String errorMsg = + pc.delSpell(spellInfo, (PCClass) spell.getSpellcastingClass(), + bookName); + + if (errorMsg.length() > 0) + { + delegate.showErrorMessage(Constants.s_APPNAME, errorMsg); + ShowMessageDelegate.showMessageDialog(errorMsg, + Constants.s_APPNAME, MessageType.ERROR); + return false; + } + + return true; + } - private List<PCClass> getCharactersSpellcastingClasses() { List<PCClass> castingClasses = new ArrayList<PCClass>(); @@ -290,15 +429,15 @@ + /** + * The Class <code>SpellNodeImpl</code> holds the information required to + * display and process a spell. It covers spells that are available, known, + * memorised etc. + * + * @author James Dempsey <jde...@us...> + */ public class SpellNodeImpl implements SpellNode { - - @Override - public String toString() - { - return spell.toString(); - } - private final SpellFacade spell; private final ClassFacade cls; private final String rootNode; @@ -310,8 +449,8 @@ this.cls = cls; this.level = level; this.rootNode = rootNode; - } + /* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade.SpellNode#getSpellcastingClass() */ @@ -343,6 +482,12 @@ { return rootNode; } + + @Override + public String toString() + { + return spell.toString(); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |