From: <jde...@us...> - 2011-11-14 21:27:17
|
Revision: 15532 http://pcgen.svn.sourceforge.net/pcgen/?rev=15532&view=rev Author: jdempsey Date: 2011-11-14 21:27:10 +0000 (Mon, 14 Nov 2011) Log Message: ----------- Spells tab backing work. * Add support for spell lists. * Add class info output (wip). Modified Paths: -------------- sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java Modified: sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java 2011-11-14 20:09:21 UTC (rev 15531) +++ sandbox/uisync/code/src/java/pcgen/gui2/facade/SpellSupportFacadeImpl.java 2011-11-14 21:27:10 UTC (rev 15532) @@ -26,17 +26,28 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import javax.swing.JOptionPane; + import org.apache.commons.lang.StringUtils; +import pcgen.base.lang.StringUtil; import pcgen.base.util.HashMapToList; import pcgen.cdom.base.CDOMList; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.SourceFormat; import pcgen.cdom.enumeration.StringKey; import pcgen.core.Ability; +import pcgen.core.Domain; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; +import pcgen.core.SpellProhibitor; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.core.analysis.SpellLevel; import pcgen.core.character.CharacterSpell; import pcgen.core.character.SpellBook; @@ -50,6 +61,9 @@ import pcgen.core.spell.Spell; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; +import pcgen.gui2.util.HtmlInfoBuilder; +import pcgen.system.LanguageBundle; +import pcgen.util.Logging; /** * The Class <code>SpellSupportFacadeImpl</code> marshals the spell data for a @@ -69,10 +83,11 @@ 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; + private List<SpellNode> preparedSpellLists; public SpellSupportFacadeImpl(PlayerCharacter pc, UIDelegate delegate) { @@ -81,10 +96,11 @@ availableSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); buildAvailableNodes(); - //allKnownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); + allKnownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); knownSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); preparedSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); bookSpellNodes = new DefaultListFacade<SpellSupportFacade.SpellNode>(); + preparedSpellLists = new ArrayList<SpellSupportFacade.SpellNode>(); buildKnownPreparedNodes(); } @@ -101,7 +117,7 @@ */ public ListFacade<SpellNode> getAllKnownSpellNodes() { - return knownSpellNodes; + return allKnownSpellNodes; } /* (non-Javadoc) @@ -137,6 +153,7 @@ addSpellToCharacter(spell, Globals.getDefaultSpellBook()); if (node != null) { + allKnownSpellNodes.addElement(node); knownSpellNodes.addElement(node); } } @@ -149,6 +166,7 @@ //TODO: This should also remove the spell from books and lists if (removeSpellFromCharacter(spell, Globals.getDefaultSpellBook())) { + allKnownSpellNodes.removeElement(spell); knownSpellNodes.removeElement(spell); } } @@ -163,6 +181,16 @@ if (node != null) { preparedSpellNodes.addElement(node); + // Remove dummy spelllist node from the list + for (Iterator<SpellNode> iterator = preparedSpellNodes.iterator(); iterator.hasNext();) + { + SpellNode sn = iterator.next(); + if (sn.getSpell() == null && spellList.equals(sn.getRootNode())) + { + iterator.remove(); + } + + } } } @@ -174,15 +202,80 @@ if (removeSpellFromCharacter(spell, spellList)) { preparedSpellNodes.removeElement(spell); + + addDummyNodeIfSpellListEmpty(spellList); } } + /** + * If there are no spells in the spell list, add in the spell list + * placeholder node so that the list shows ion the UI. + * + * @param spellList The list to be checked. + */ + private void addDummyNodeIfSpellListEmpty(String spellList) + { + boolean spellListEmpty = true; + for (SpellNode node : preparedSpellNodes) + { + if (spellList.equals(node.getRootNode())) + { + spellListEmpty = false; + break; + } + } + if (spellListEmpty) + { + for (SpellNode listNode : preparedSpellLists) + { + if (spellList.equals(listNode.getRootNode())) + { + preparedSpellNodes.addElement(listNode); + } + } + } + } + /* (non-Javadoc) * @see pcgen.core.facade.SpellSupportFacade#addSpellList(java.lang.String) */ public void addSpellList(String spellList) { - // TODO Auto-generated method stub + if (StringUtils.isEmpty(spellList)) + { + return; + } + + // Prevent spellbooks being given the same name as a class + for (PCClass current : Globals.getContext().ref.getConstructedCDOMObjects(PCClass.class)) + { + if ((spellList.equals(current.getKeyName()))) + { + JOptionPane.showMessageDialog(null, LanguageBundle + .getString("in_spellbook_name_error"), //$NON-NLS-1$ + Constants.s_APPNAME, JOptionPane.ERROR_MESSAGE); + + return; + } + } + + if (pc.addSpellBook(spellList)) + { + pc.setDirty(true); + SpellNodeImpl spellListNode = + new SpellNodeImpl(null, null, "", spellList); + preparedSpellNodes.addElement(spellListNode); + preparedSpellLists.add(spellListNode); + } + else + { + JOptionPane.showMessageDialog(null, LanguageBundle + .getFormattedString( + "InfoPreparedSpells.add.list.fail", new Object[]{spellList}), //$NON-NLS-1$ + Constants.s_APPNAME, JOptionPane.ERROR_MESSAGE); + + return; + } } /* (non-Javadoc) @@ -190,15 +283,41 @@ */ public void removeSpellList(String spellList) { - // TODO Need to remove spell book from character also - for (Iterator<SpellNode> iterator = preparedSpellNodes.iterator(); iterator.hasNext();) + if (spellList.equalsIgnoreCase(Globals.getDefaultSpellBook())) { - SpellNode spell = iterator.next(); - if (spellList.equals(spell.getRootNode())) + Logging.errorPrint(LanguageBundle + .getString("InfoSpells.can.not.delete.default.spellbook")); //$NON-NLS-1$ + + return; + } + + if (pc.delSpellBook(spellList)) + { + pc.setDirty(true); + for (Iterator<SpellNode> iterator = preparedSpellLists.iterator(); iterator.hasNext();) { - iterator.remove(); + SpellNode listNode = iterator.next(); + if (spellList.equals(listNode.getRootNode())) + { + iterator.remove(); + } } + + for (Iterator<SpellNode> iterator = preparedSpellNodes.iterator(); iterator.hasNext();) + { + SpellNode spell = iterator.next(); + if (spellList.equals(spell.getRootNode())) + { + iterator.remove(); + } + } } + else + { + Logging.errorPrint("delBookButton:failed "); //$NON-NLS-1$ + + return; + } } /* (non-Javadoc) @@ -230,8 +349,146 @@ */ public String getClassInfo(ClassFacade spellcaster) { - return "Not supported"; + if (!(spellcaster instanceof PCClass) || spellcaster == null) + { + return ""; + } + PCClass aClass = (PCClass) spellcaster; + int highestSpellLevel = pc.getSpellSupport(aClass).getHighestLevelSpell(pc); + + final HtmlInfoBuilder b = new HtmlInfoBuilder(); + b.append("<table border=1><tr><td><font size=-2><b>"); //$NON-NLS-1$ + b.append(OutputNameFormatting.piString(aClass, false)).append(" ["); //$NON-NLS-1$ + b.append(String.valueOf(pc.getLevel(aClass) + + (int) pc.getTotalBonusTo("PCLEVEL", aClass.getKeyName()))); //$NON-NLS-1$ + b.append("]</b></font></td>"); //$NON-NLS-1$ + + for (int i = 0; i <= highestSpellLevel; ++i) + { + b.append("<td><font size=-2><b><center> "); //$NON-NLS-1$ + b.append(String.valueOf(i)); + b.append(" </b></center></font></td>"); //$NON-NLS-1$ + } + + b.append("</tr>"); //$NON-NLS-1$ + b.append("<tr><td><font size=-1><b>Cast</b></font></td>"); //$NON-NLS-1$ + + for (int i = 0; i <= highestSpellLevel; ++i) + { + b.append("<td><font size=-1><center>"); //$NON-NLS-1$ + b.append(getNumCast(aClass, i, pc)); + b.append("</center></font></td>"); //$NON-NLS-1$ + } + // Making sure KnownList can be handled safely and produces the correct behaviour + if (pc.getSpellSupport(aClass).hasKnownList() || pc.getSpellSupport(aClass).hasKnownSpells(pc)) + { + b.append("<tr><td><font size=-1><b>Known</b></font></td>"); //$NON-NLS-1$ + + for (int i = 0; i <= highestSpellLevel; ++i) + { + final int a = pc.getSpellSupport(aClass).getKnownForLevel(i, "null", pc); + final int bonus = pc.getSpellSupport(aClass).getSpecialtyKnownForLevel(i, pc); + StringBuffer bString = new StringBuffer(); + + if (bonus > 0) + { + bString.append('+').append(bonus); + } + + b.append("<td><font size=-1><center>"); //$NON-NLS-1$ + b.append(String.valueOf(a)).append(bString.toString()); + b.append("</center></font></td>"); //$NON-NLS-1$ + } + } + + b.append("<tr><td><font size=-1><b>DC</b></font></td>"); //$NON-NLS-1$ + + for (int i = 0; i <= highestSpellLevel; ++i) + { + b.append("<td><font size=-1><center>"); //$NON-NLS-1$ + b.append(String.valueOf(getDC(aClass, i, pc))); + b.append("</center></font></td>"); //$NON-NLS-1$ + } + + b.append("</tr></table>"); //$NON-NLS-1$ + + b.appendI18nElement("InfoSpells.caster.type", aClass.getSpellType()); //$NON-NLS-1$ + b.appendLineBreak(); + b.appendI18nElement("InfoSpells.stat.bonus", aClass.getSpellBaseStat()); //$NON-NLS-1$ + + if (pc.hasAssocs(aClass, AssociationKey.SPECIALTY) || pc.hasDomains()) + { + boolean needComma = false; + StringBuffer schoolInfo = new StringBuffer(); + String spec = pc.getAssoc(aClass, AssociationKey.SPECIALTY); + if (spec != null) + { + schoolInfo.append(spec); + needComma = true; + } + + for (Domain d : pc.getSortedDomainSet()) + { + if (needComma) + { + schoolInfo.append(','); + } + needComma = true; + schoolInfo.append(d.getKeyName()); + } + b.appendLineBreak(); + b.appendI18nElement("InfoSpells.school", schoolInfo.toString()); //$NON-NLS-1$ + } + + Set<String> set = new TreeSet<String>(); + for (SpellProhibitor sp : aClass + .getSafeListFor(ListKey.PROHIBITED_SPELLS)) + { + set.addAll(sp.getValueList()); + } + + Collection<? extends SpellProhibitor> prohibList = pc + .getProhibitedSchools(aClass); + if (prohibList != null) + { + for (SpellProhibitor sp : prohibList) + { + set.addAll(sp.getValueList()); + } + } + if (!set.isEmpty()) + { + b.appendLineBreak(); + b.appendI18nElement("InfoSpells.prohibited.school", //$NON-NLS-1$ + StringUtil.join(set, ",")); //$NON-NLS-1$ + } + + String bString = SourceFormat.getFormattedString(aClass, + Globals.getSourceDisplay(), true); + if (bString.length() > 0) + { + b.appendLineBreak(); + b.appendI18nElement("in_source", bString); //$NON-NLS-1$ + } + + return b.toString(); } + + private static final String getNumCast(PCClass aClass, int level, + PlayerCharacter pc) + { + String sbook = Globals.getDefaultSpellBook(); + final String cast = + pc.getSpellSupport(aClass).getCastForLevel(level, sbook, true, false, pc) + + pc.getSpellSupport(aClass).getBonusCastForLevelString(level, sbook, pc); + + return cast; + } + + private static int getDC(PCClass aClass, int level, PlayerCharacter pc) + { + return pc.getDC(new Spell(), aClass, level, 0, aClass); + } /** * Construct the list of available spells for the character. @@ -284,6 +541,8 @@ // Scan character classes for spell classes List<PCClass> classList = getCharactersSpellcastingClasses(); + //TODO: Include spells from race etc + // Look at each spell on each spellcasting class for (PCClass pcClass : classList) { @@ -310,6 +569,7 @@ // Add to list if (isKnown) { + allKnownSpellNodes.addElement(node); knownSpellNodes.addElement(node); } else if (isSpellBook) @@ -324,6 +584,16 @@ } } + for (SpellBook spellBook : pc.getSpellBooks()) + { + if (spellBook.getType() == SpellBook.TYPE_PREPARED_LIST) + { + SpellNodeImpl spellListNode = + new SpellNodeImpl(null, null, "", spellBook.getName()); + preparedSpellLists.add(spellListNode); + addDummyNodeIfSpellListEmpty(spellBook.getName()); + } + } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |