From: <jde...@us...> - 2007-09-09 05:54:36
|
Revision: 4052 http://pcgen.svn.sourceforge.net/pcgen/?rev=4052&view=rev Author: jdempsey Date: 2007-09-08 22:54:38 -0700 (Sat, 08 Sep 2007) Log Message: ----------- FREQ: Handling Fighter bonus feats and other feat pools - Enhance Ability tab to manage multiple categories in one tab Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbilities.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbility.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityPoolPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilitySelectionPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AvailableAbilityPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java Modified: Trunk/pcgen/code/src/java/pcgen/core/GameMode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -3196,6 +3196,34 @@ } return Collections.unmodifiableCollection(theAbilityCategories); } + + /** + * Returns a <tt>Collection</tt> of <tt>AbilityCategory</tt> objects + * defined by this game mode that match the display location. + * + * @param displayLoc The display location to filter for. + * @return A <tt>Collection</tt> of <tt>AbilityCategory</tt> objects. + */ + public Collection<AbilityCategory> getAllAbilityCatsForDisplayLoc(String displayLoc) + { + if (displayLoc == null) + { + return Collections.emptyList(); + } + List<AbilityCategory> catList = new ArrayList<AbilityCategory>(); + if ( !theAbilityCategories.contains(AbilityCategory.FEAT) ) + { + theAbilityCategories.add(0, AbilityCategory.FEAT); + } + for (AbilityCategory cat : theAbilityCategories) + { + if (displayLoc.equals(cat.getDisplayLocation())) + { + catList.add(cat); + } + } + return Collections.unmodifiableCollection(catList); + } public void setPreviewDir(final String aDir) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -16437,6 +16437,11 @@ public BigDecimal getTotalAbilityPool(final AbilityCategory aCategory) { + if (aCategory == AbilityCategory.FEAT) + { + BigDecimal spent = getAbilityPoolSpent(aCategory); + return spent.add(new BigDecimal(getFeats())); + } Float basePool = this.getVariableValue(aCategory.getPoolFormula(), getClass().toString()); if (!aCategory.allowFractionalPool()) Modified: Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties 2007-09-09 05:54:38 UTC (rev 4052) @@ -36,6 +36,11 @@ in_racetypeName=Race Type/Name +in_catTypeName=Category/Type/Name +in_catNameLabel=Category/Name +in_catPreReqTree=Category/Pre-Req Tree +in_catSourceName=Category/Source/Name + ## added 04/01/03 in_source=Source Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbilities.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbilities.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -24,10 +24,13 @@ package pcgen.gui.tabs; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.util.Logging; import pcgen.util.enumeration.Tab; /** @@ -51,13 +54,19 @@ { super(aPC); + Map<String, AbilityCategory> acTabs = new HashMap<String, AbilityCategory>(); + final Collection<AbilityCategory> cats = SettingsHandler.getGame().getAllAbilityCategories(); for (AbilityCategory cat : cats) { if (cat.isVisible()) { - addSubTab(new InfoAbility(aPC, cat)); + if (acTabs.get(cat.getDisplayLocation()) == null) + { + acTabs.put(cat.getDisplayLocation(), cat); + addSubTab(new InfoAbility(aPC, cat)); + } } } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbility.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoAbility.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -36,6 +36,7 @@ import java.beans.PropertyChangeListener; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.swing.JCheckBox; @@ -116,6 +117,9 @@ private String theOptionKey = "InfoAbility."; //$NON-NLS-1$ + private String theDisplayLocation; + private List<AbilityCategory> categoryList; + /** * Constructor * @@ -126,9 +130,10 @@ { super(pc); theCategory = aCategory; - theOptionKey += theCategory.getKeyName(); + theDisplayLocation = theCategory.getDisplayLocation(); + theOptionKey += theDisplayLocation; - setName(theCategory.getPluralName()); + setName(theDisplayLocation); SwingUtilities.invokeLater(new Runnable() { @@ -389,23 +394,36 @@ // FEAT_FULL_MESSAGE = "You do not have enough remaining " + Globals.getGameModePointPoolName() + " to select this " + getSingularTabName() + "."; } + Collection<AbilityCategory> categoryCol = + SettingsHandler.getGame().getAllAbilityCatsForDisplayLoc( + theDisplayLocation); + categoryList = new ArrayList<AbilityCategory>(categoryCol); + boolean editable = false; + for (AbilityCategory cat : categoryList) + { + if (cat.isEditable()) + { + editable = true; + break; + } + } final JPanel topPane = new JPanel(); topPane.setLayout(new BorderLayout()); //------------------------------------------------------------- // Top Pane - Left Available, Right Selected // - if (theCategory.isEditable()) + if (editable) { theAvailablePane = new AvailableAbilityPanel(getPc(), theCategory); theAvailablePane.addAbilitySelectionListener(this); theAvailablePane.addFilterer(this); } - theSelectedPane = new SelectedAbilityPanel(getPc(), theCategory); + theSelectedPane = new SelectedAbilityPanel(getPc(), categoryList); theSelectedPane.addAbilitySelectionListener(this); theSelectedPane.addFilterer(this); - if (theCategory.isEditable()) + if (editable) { splitTopLeftRight = new FlippingSplitPane(splitOrientation, theAvailablePane, @@ -443,37 +461,37 @@ new AbilityInfoPanel(getPc(), PropertyFactory .getFormattedString( "InfoAbility.Title", theCategory.getDisplayName())); //$NON-NLS-1$ - if (theCategory.isEditable()) - { - thePoolPanel = new AbilityPoolPanel(getPc(), theCategory); - splitBotLeftRight = - new FlippingSplitPane(splitOrientation, theInfoPanel, - thePoolPanel); + // Pool panel + thePoolPanel = new AbilityPoolPanel(getPc(), categoryList, this); - splitBotLeftRight.setOneTouchExpandable(true); + splitBotLeftRight = + new FlippingSplitPane(splitOrientation, theInfoPanel, + thePoolPanel); - splitBotLeftRight.setDividerSize(10); - // Register a listener so that we can save the location each time it - // changes. - splitBotLeftRight.addPropertyChangeListener( - JSplitPane.DIVIDER_LOCATION_PROPERTY, - new PropertyChangeListener() + splitBotLeftRight.setOneTouchExpandable(true); + + splitBotLeftRight.setDividerSize(10); + // Register a listener so that we can save the location each time it + // changes. + splitBotLeftRight.addPropertyChangeListener( + JSplitPane.DIVIDER_LOCATION_PROPERTY, + new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent anEvt) { - public void propertyChange(PropertyChangeEvent anEvt) - { - SettingsHandler.setPCGenOption(theOptionKey - + ".splitBotLeftRight", //$NON-NLS-1$ - anEvt.getNewValue().toString()); - } - }); + SettingsHandler.setPCGenOption(theOptionKey + + ".splitBotLeftRight", //$NON-NLS-1$ + anEvt.getNewValue().toString()); + } + }); - botPane.add(splitBotLeftRight, BorderLayout.CENTER); - } - else - { - botPane.add(theInfoPanel, BorderLayout.CENTER); - } + botPane.add(splitBotLeftRight, BorderLayout.CENTER); +// } +// else +// { +// botPane.add(theInfoPanel, BorderLayout.CENTER); +// } //---------------------------------------------------------------------- // Split Top and Bottom @@ -514,6 +532,7 @@ if (theAvailablePane != null) { theAvailablePane.setPC(getPc()); + theAvailablePane.setCategory(theCategory); theAvailablePane.update(); } } @@ -588,7 +607,7 @@ @Override public String getTabName() { - return theCategory.getPluralName(); + return theCategory.getDisplayLocation(); } /** @@ -737,4 +756,10 @@ // setRemoveEnabled(false); return true; } + + public void setCurrentActivityCategory(AbilityCategory cat) + { + theCategory = cat; + forceRefresh(); + } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -23,7 +23,9 @@ package pcgen.gui.tabs.ability; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; @@ -73,7 +75,9 @@ private PlayerCharacter thePC = null; private List<Ability> theAbilityList; - private AbilityCategory theCategory; + //private AbilityCategory theCategory; + private List<AbilityCategory> theCategoryList; + private boolean useCategoryRoot; private IAbilityListFilter theFilter = null; @@ -81,6 +85,7 @@ private PObjectNode typeRoot = null; private PObjectNode sourceRoot = null; + private PObjectNode categoryRoot = null; /** * Creates an AbilityModel. @@ -103,7 +108,9 @@ theViewMode = viewMode; - theCategory = aCategory; + theCategoryList = new ArrayList<AbilityCategory>(); + theCategoryList.add(aCategory); + useCategoryRoot = false; setPanelSpecificDefaults(); for (final Column column : Column.values()) @@ -115,11 +122,45 @@ } /** + * Creates an AbilityModel. + * + * @param aPC The PlayerCharacter this model is for. + * @param aList The list of <tt>Ability</tt> objects to manage + * @param aCategory The <tt>AbilityCategory</tt> this list comes from. + * @param viewMode + * @param anOptionRoot The key to store options under. + * @param splitByCategory Should the list be split by category + */ + public AbilityModel(final PlayerCharacter aPC, final List<Ability> aList, + final List<AbilityCategory> aCategoryList, + final AbilitySelectionPanel.ViewMode viewMode, final String anOptionRoot, + final boolean splitByCategory) + { + super(null); + thePC = aPC; + theAbilityList = aList; + + theOptionsRoot = anOptionRoot; + + theViewMode = viewMode; + + theCategoryList = aCategoryList; + useCategoryRoot = splitByCategory; + + setPanelSpecificDefaults(); + for (final Column column : Column.values()) + { + column.setVisible(SettingsHandler.getPCGenOption(theOptionsRoot + + ".viewcol." + column.toString(), column.isVisible())); //$NON-NLS-1$ + } + resetModel(thePC, viewMode, false); + } + + /** * Set any defaults for the specific panel the model is tied to. */ private void setPanelSpecificDefaults() { - Logging.debugPrint("setPanelSpecificDefaults for " + theOptionsRoot); if (theOptionsRoot.indexOf("selected") >= 0) { Column.CHOICES.setVisible(true); @@ -128,18 +169,34 @@ private void buildDefaultRoots() { + // Even if the category root already exists we need to refresh it + categoryRoot = buildCategoryRoot(); + if (typeRoot != null) { return; } - + typeRoot = new PObjectNode(); sourceRoot = new PObjectNode(); + // We will use the global lists for this + addTypeNodes(typeRoot, Globals.getAbilityList(theCategoryList.get(0))); + addSourceNodes(sourceRoot, Globals.getAbilityList(theCategoryList.get(0))); + } + + /** + * Add nodes for each type to the supplied node. The list of types + * is obtained from the abilities provided. + * + * @param root The node to add source nodes to. + * @param abilityList The list of abilities to obtain types from. + */ + private void addTypeNodes(final PObjectNode root, + final List<Ability> abilityList) + { final SortedSet<String> typeSet = new TreeSet<String>(); - final SortedSet<String> sourceSet = new TreeSet<String>(); - // We will use the global lists for this - for (final Ability ability : Globals.getAbilityList(theCategory)) + for (final Ability ability : abilityList) { if (!((ability.getVisibility() == Visibility.DEFAULT) || (ability .getVisibility() == Visibility.DISPLAY_ONLY))) @@ -148,12 +205,6 @@ } typeSet.addAll(ability.getTypeList(true)); - final String sourceString = - ability.getSourceEntry().getSourceBook().getLongName(); - if (sourceString != null) - { - sourceSet.add(sourceString); - } } final PObjectNode[] ccTypes = new PObjectNode[typeSet.size()]; int i = 0; @@ -161,22 +212,68 @@ { ccTypes[i] = new PObjectNode(); ccTypes[i].setItem(type); - ccTypes[i].setParent(typeRoot); + ccTypes[i].setParent(root); i++; } - typeRoot.setChildren(ccTypes); + root.setChildren(ccTypes); + } + /** + * Add nodes for each source to the supplied node. The list of sources + * is obtained from the abilities provided. + * + * @param root The node to add source nodes to. + * @param abilityList The list of abilities to obtain sources from. + */ + private void addSourceNodes(final PObjectNode root, + final List<Ability> abilityList) + { + final SortedSet<String> sourceSet = new TreeSet<String>(); + // We will use the global lists for this + for (final Ability ability : abilityList) + { + if (!((ability.getVisibility() == Visibility.DEFAULT) || (ability + .getVisibility() == Visibility.DISPLAY_ONLY))) + { + continue; + } + + final String sourceString = + ability.getSourceEntry().getSourceBook().getLongName(); + if (sourceString != null) + { + sourceSet.add(sourceString); + } + } final PObjectNode[] ccSources = new PObjectNode[sourceSet.size()]; - i = 0; + int i = 0; for (final String source : sourceSet) { ccSources[i] = new PObjectNode(); ccSources[i].setItem(source); - ccSources[i].setParent(sourceRoot); + ccSources[i].setParent(root); i++; } - sourceRoot.setChildren(ccSources); + root.setChildren(ccSources); + } + private PObjectNode buildCategoryRoot() + { + PObjectNode catRoot = new PObjectNode(); + final ArrayList<PObjectNode> ccAbilityCats = new ArrayList<PObjectNode>(); + for (final AbilityCategory cat : theCategoryList) + { + if (cat.isVisible(thePC)) + { + PCAbilityCategory pcac = new PCAbilityCategory(cat, thePC); + PObjectNode node = new PObjectNode(); + node.setItem(pcac); + node.setParent(catRoot); + ccAbilityCats.add(node); + } + } + catRoot.setChildren(ccAbilityCats); + return catRoot; } /** @@ -352,15 +449,21 @@ private void buildTreeNameOnly(final boolean showAll) { super.setRoot(new PObjectNode()); + buildSubTreeNameOnly(showAll, (PObjectNode) super.getRoot(), theAbilityList); + } + + private void buildSubTreeNameOnly(final boolean showAll, + final PObjectNode root, List<Ability> abilityList) + { String qFilter = this.getQFilter(); - for (final Ability ability : theAbilityList) + for (final Ability ability : abilityList) { if (showAll == true || theFilter == null || theFilter.accept(theViewMode, ability)) { PObjectNode aFN = new PObjectNode(); - aFN.setParent((PObjectNode) super.getRoot()); + aFN.setParent(root); switch (ability.getFeatType()) { @@ -380,7 +483,7 @@ || (ability.getDisplayName().toLowerCase().indexOf(qFilter) >= 0 || ability .getType().toLowerCase().indexOf(qFilter) >= 0)) { - ((PObjectNode) super.getRoot()).addChild(aFN); + (root).addChild(aFN); } } } @@ -399,9 +502,15 @@ { setRoot(new PObjectNode()); + buildSubTreePrereqTree(showAll, (PObjectNode) super.getRoot(), theAbilityList); + } + + private void buildSubTreePrereqTree(final boolean showAll, + final PObjectNode rootAsPObjectNode, final List<Ability> abilityList) + { // This list initially contains all abilities that pass the filter. final List<Ability> fList = new ArrayList<Ability>(); - for (final Ability ability : theAbilityList) + for (final Ability ability : abilityList) { if (showAll || theFilter == null || theFilter.accept(theViewMode, ability)) @@ -427,7 +536,6 @@ } // Add these abilities to the tree - final PObjectNode rootAsPObjectNode = (PObjectNode) super.getRoot(); if (rootAsPObjectNode == null) { return; @@ -559,7 +667,13 @@ return; } - for (final Ability ability : theAbilityList) + buildSubTreeTypeName(showAll, rootAsPObjectNode, theAbilityList); + } + + private void buildSubTreeTypeName(final boolean showAll, + final PObjectNode rootAsPObjectNode, final List<Ability> abilityList) + { + for (final Ability ability : abilityList) { if (showAll || theFilter == null || theFilter.accept(theViewMode, ability)) @@ -622,7 +736,13 @@ return; } - for (final Ability ability : theAbilityList) + buildSubTreeSourceName(showAll, rootAsPObjectNode, theAbilityList); + } + + private void buildSubTreeSourceName(final boolean showAll, + final PObjectNode rootAsPObjectNode, final List<Ability> abilityList) + { + for (final Ability ability : abilityList) { if (showAll || theFilter == null || theFilter.accept(theViewMode, ability)) @@ -737,10 +857,10 @@ * * @param aList A list of Abilities to manage. */ - public void setAbilityList(final List<Ability> aList) + public void setAbilityList(final List<Ability> aList, PlayerCharacter aPc) { theAbilityList = aList; - resetModel(thePC, theViewMode, false); + resetModel(aPc, theViewMode, false); } /** @@ -759,29 +879,36 @@ // We are going to build and cache the type and source tree roots. buildDefaultRoots(); - switch (mode) + if (useCategoryRoot) { - case TYPENAME: - buildTreeTypeName(showAll); + buildTreeCategory(showAll, mode); + } + else + { + switch (mode) + { + case TYPENAME: + buildTreeTypeName(showAll); - break; + break; - case NAMEONLY: - buildTreeNameOnly(showAll); + case NAMEONLY: + buildTreeNameOnly(showAll); - break; + break; - case PREREQTREE: - buildTreePrereqTree(showAll); + case PREREQTREE: + buildTreePrereqTree(showAll); - break; + break; - case SOURCENAME: - buildTreeSourceName(showAll); + case SOURCENAME: + buildTreeSourceName(showAll); - break; + break; + } } - + if (super.getRoot() != null) { fireTreeNodesChanged(super.getRoot(), new TreePath(super.getRoot())); @@ -789,6 +916,81 @@ } /** + * The plan: + * Allow the model to cope with either a list of ability categories + * or a single category. We do this by having a category root for + * the list and splitting the buildXXXTree methods into two, one to + * set the root, and one to populate a node based on a category. The + * single category can then call the set root and then call the + * populate method, while the multiple one can iterate through + * categories on the category root and call the appropriate populate + * method for the category with the appropriate root. + * + * @param showAll Force displaying of all abilities + * @param mode The display format for each category. + */ + private void buildTreeCategory(boolean showAll, final AbilitySelectionPanel.ViewMode mode) + { + if (categoryRoot == null) + { + return; + } + setRoot(categoryRoot); + + final PObjectNode rootAsPObjectNode = (PObjectNode) super.getRoot(); + + // Split the passed in abilities by category + Map<String, List<Ability>> abilityMap = new HashMap<String, List<Ability>>(); + for (Ability ability : theAbilityList) + { + List<Ability> aList = abilityMap.get(ability.getCategory()); + if (aList == null) + { + aList = new ArrayList<Ability>(); + abilityMap.put(ability.getCategory(), aList); + } + aList.add(ability); + } + + // Loop over the category nodes, adding content to each + for (final PObjectNode catNode : rootAsPObjectNode.getChildren()) + { + PCAbilityCategory pcCat = (PCAbilityCategory) catNode.getItem(); + List<Ability> abilities = + abilityMap.get(pcCat.getCategory().getAbilityCategory()); + if (abilities == null) + { + abilities = new ArrayList<Ability>(); + } + // Pass in specific abilityList + switch (mode) + { + case TYPENAME: + addTypeNodes(catNode, abilities); + buildSubTreeTypeName(showAll, catNode, abilities); + + break; + + case NAMEONLY: + buildSubTreeNameOnly(showAll, catNode, abilities); + + break; + + case PREREQTREE: + buildSubTreePrereqTree(showAll, catNode, abilities); + + break; + + case SOURCENAME: + addSourceNodes(catNode, abilities); + buildSubTreeSourceName(showAll, catNode, abilities); + + break; + } + } + } + + /** * @see pcgen.gui.TableColumnManagerModel#getMColumnList() */ public List<String> getMColumnList() Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityPoolPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityPoolPanel.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityPoolPanel.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -23,9 +23,13 @@ package pcgen.gui.tabs.ability; import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.math.BigDecimal; +import java.util.Collection; import javax.swing.InputVerifier; +import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; @@ -33,6 +37,7 @@ import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; +import pcgen.gui.tabs.InfoAbility; import pcgen.gui.utils.Utility; import pcgen.util.BigDecimalHelper; import pcgen.util.PropertyFactory; @@ -46,25 +51,36 @@ { private PlayerCharacter thePC; private AbilityCategory theCategory; + private InfoAbility theParent; + + private JComboBox theCategoryField = new JComboBox(); private JTextField theNumAbilitiesField = new JTextField(); /** * Construct the panel and add all the components. * * @param aPC The PC - * @param aCategory The <tt>AbilityCategory</tt> this panel represents. + * @param aCategoryList The <tt>AbilityCategory</tt> this panel represents. */ - public AbilityPoolPanel(final PlayerCharacter aPC, - final AbilityCategory aCategory) + public AbilityPoolPanel(final PlayerCharacter aPC, + final Collection<AbilityCategory> aCategoryList, + final InfoAbility parent) { super(); thePC = aPC; - theCategory = aCategory; + theParent = parent; setLayout(new FlowLayout()); + for (AbilityCategory abilityCategory : aCategoryList) + { + theCategoryField.addItem(abilityCategory); + } + add(theCategoryField); + theCategory = (AbilityCategory) theCategoryField.getSelectedItem(); + final JLabel abilitiesRemainingLabel = new JLabel(); abilitiesRemainingLabel.setText(PropertyFactory.getFormattedString( - "InfoAbility.Remaining.Label", theCategory)); //$NON-NLS-1$ + "InfoAbility.Remaining.Label", "")); //$NON-NLS-1$ add(abilitiesRemainingLabel); theNumAbilitiesField.setInputVerifier(new InputVerifier() @@ -120,10 +136,18 @@ return valueOk; } }); + + theCategoryField.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent evt) + { + categoryFieldActionPerformed(); + } + }); showRemainingAbilityPoints(); theNumAbilitiesField.setColumns(3); - theNumAbilitiesField.setEditable(aCategory.allowPoolMod()); + theNumAbilitiesField.setEditable(theCategory.allowPoolMod()); Utility.setDescription(theNumAbilitiesField, PropertyFactory .getFormattedString("InfoAbility.Pool.Description", //$NON-NLS-1$ theCategory.getDisplayName())); @@ -132,6 +156,26 @@ } /** + * Update the panel based on a change to the selected ability + * category. + */ + private void categoryFieldActionPerformed() + { + // Set the selected category + theCategory = (AbilityCategory) theCategoryField.getSelectedItem(); + + // Adjust the ability points display + showRemainingAbilityPoints(); + theNumAbilitiesField.setEditable(theCategory.allowPoolMod()); + Utility.setDescription(theNumAbilitiesField, PropertyFactory + .getFormattedString("InfoAbility.Pool.Description", //$NON-NLS-1$ + theCategory.getDisplayName())); + + // Tell our parent about the change + theParent.setCurrentActivityCategory(theCategory); + } + + /** * Sets the PlayerCharacter this panel is displaying information for. * * @param aPC The PlayerCharacter to set. @@ -146,7 +190,6 @@ */ public void showRemainingAbilityPoints() { - // theNumAbilitiesField.setText(BigDecimalHelper.trimBigDecimal(new BigDecimal(thePC.getFeats())).toString()); theNumAbilitiesField.setText(BigDecimalHelper.trimBigDecimal( thePC.getAvailableAbilityPool(theCategory)).toString()); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilitySelectionPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilitySelectionPanel.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilitySelectionPanel.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -69,7 +69,7 @@ IFilterableView, IAbilityListFilter { private PlayerCharacter thePC; - private AbilityCategory theCategory; + private List<AbilityCategory> theCategoryList; /** The model that represents the list of abilities to choose from */ protected AbilityModel theModel; @@ -99,9 +99,8 @@ /** * The manner in which to display the tree. - * TODO - Yuck. Why is this in GuiConstants? */ - private ViewMode theViewMode = ViewMode.PREREQTREE; + ViewMode theViewMode = ViewMode.PREREQTREE; /** * This is a temporary used to store the current value of the view mode @@ -124,7 +123,8 @@ final AbilityCategory aCategory) { thePC = aPC; - theCategory = aCategory; + theCategoryList = new ArrayList<AbilityCategory>(); + theCategoryList.add(aCategory); theOptionsRoot += aCategory.getKeyName(); @@ -143,6 +143,36 @@ } /** + * Construct and build a new panel to display a list of abilities. + * + * @param aPC + * @param aCategory + */ + public AbilitySelectionPanel(final PlayerCharacter aPC, + final List<AbilityCategory> aCategoryList) + { + thePC = aPC; + theCategoryList = aCategoryList; + + theOptionsRoot += aCategoryList.get(0).getDisplayLocation(); + + final int vm = + SettingsHandler + .getPCGenOption( + getFullOptionKey() + ".viewmode", getDefaultViewMode().ordinal()); //$NON-NLS-1$ + theViewMode = + (vm >= 0 && vm < ViewMode.values().length) + ? ViewMode.values()[vm] : getDefaultViewMode(); + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + initComponents(); + } + }); + } + + /** * Return the <tt>PlayerCharacter</tt> this panel is displaying info for. * * @return The PC @@ -164,12 +194,12 @@ /** * Return the <tt>AbilityCategory</tt> these abilities come from. - * + * @TODO Convert this to react to current category * @return The Ability category */ public AbilityCategory getCategory() { - return theCategory; + return theCategoryList.get(0); } /** @@ -191,6 +221,16 @@ protected abstract String getOptionKey(); /** + * Return an indicator of whether to split the ability list by + * category or not.. + * + * <p>This method is abstract and must be overridden by subclasses. + * + * @return true if a category split should be used. + */ + protected abstract boolean getSplitByCategory(); + + /** * Initializes the GUI components. * * <p>This method constructs the model from the ability list. It then @@ -202,8 +242,8 @@ protected void initComponents() { theModel = - new AbilityModel(thePC, getAbilityList(), theCategory, - theViewMode, getFullOptionKey()); + new AbilityModel(thePC, getAbilityList(), theCategoryList, + theViewMode, getFullOptionKey(), getSplitByCategory()); theModel.setAbilityFilter(this); @@ -503,12 +543,14 @@ { if (theTable != null) { - theModel.setAbilityList(getAbilityList()); + List<String> pathList = theTable.getExpandedPaths(); + theModel.setAbilityList(getAbilityList(), thePC); if (theSorter != null) { theSorter.sortNodeOnColumn(); } theTable.updateUI(); + theTable.expandPathList(pathList); } } @@ -543,8 +585,18 @@ return true; } - private String getFullOptionKey() + String getFullOptionKey() { return theOptionsRoot + "." + getOptionKey(); //$NON-NLS-1$ } + + /** + * Set a new category to be displayed. + * @param aCategory The ability category + */ + public void setCategory(final AbilityCategory aCategory) + { + theCategoryList = new ArrayList<AbilityCategory>(); + theCategoryList.add(aCategory); + } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AvailableAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AvailableAbilityPanel.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AvailableAbilityPanel.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -32,6 +32,7 @@ import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; +import javax.swing.table.TableColumn; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -313,6 +314,36 @@ } /** + * This method is overridden so that we can display the + * name of the ability category being displayed in the + * table header. + * + * @see pcgen.gui.tabs.ability.AbilitySelectionPanel#update() + */ + @Override + public void update() + { + if (theTable != null) + { + int nameColIndex = theTable.convertColumnIndexToView(0); + if (nameColIndex < 0) + { + nameColIndex = 0; + } + TableColumn nameCol = + theTable.getColumnModel().getColumn(nameColIndex); + //String curVal = nameCol.getHeaderValue().toString(); + String txt = getCategory().getDisplayName(); + if (txt.startsWith("in_")) + { + txt = PropertyFactory.getFormattedString(txt); + } + nameCol.setHeaderValue(txt); + } + super.update(); + } + + /** * @see pcgen.gui.tabs.ability.AbilitySelectionPanel#getAbilityList() */ @Override @@ -355,4 +386,13 @@ setAddEnabled(false); } } + + /* (non-Javadoc) + * @see pcgen.gui.tabs.ability.AbilitySelectionPanel#getSplitByCategory() + */ + @Override + protected boolean getSplitByCategory() + { + return false; + } } Added: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -0,0 +1,89 @@ +/* + * PCAbilityCategory.java + * Copyright 2007 (C) James Dempsey + * + * This library 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 library 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 11/08/2007 + * + * $Id$ + */ + +package pcgen.gui.tabs.ability; + +import pcgen.core.AbilityCategory; +import pcgen.core.PlayerCharacter; +import pcgen.util.BigDecimalHelper; + +/** + * <code>PCAbilityCategory</code> is a placeholder for a character's + * ability category for a PObjectNode. It's primary purpose is to + * provide custom output for displaying in a tree. + * + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public class PCAbilityCategory +{ + + private AbilityCategory category; + private PlayerCharacter pc; + + /** + * @param aCategory + * @param aPc + */ + PCAbilityCategory(AbilityCategory aCategory, PlayerCharacter aPc) + { + category = aCategory; + pc = aPc; + } + + @Override + public String toString() + { + StringBuffer result = new StringBuffer(); + result.append(category.getDisplayName()); + result.append(" ("); + result.append(BigDecimalHelper.trimBigDecimal( + pc.getAbilityPoolSpent(category)).toString()); + result.append('/'); + result.append(BigDecimalHelper.trimBigDecimal( + pc.getTotalAbilityPool(category)).toString()); + result.append(')'); + + return result.toString(); + } + + /** + * @return the category + */ + AbilityCategory getCategory() + { + return category; + } + + /** + * @return the pc + */ + PlayerCharacter getPc() + { + return pc; + } + +} Property changes on: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/PCAbilityCategory.java ___________________________________________________________________ Name: svn:keywords + Author Revision Date Id Name: svn:eol-style + native Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2007-09-09 05:07:51 UTC (rev 4051) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2007-09-09 05:54:38 UTC (rev 4052) @@ -29,6 +29,7 @@ import java.awt.event.ActionListener; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.swing.JMenuItem; @@ -40,6 +41,8 @@ import pcgen.core.AbilityCategory; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.gui.tabs.ability.AbilitySelectionPanel.ViewMode; import pcgen.gui.tabs.components.FilterPanel; import pcgen.gui.tabs.components.RemoveItemPanel; import pcgen.gui.utils.ClickHandler; @@ -79,9 +82,9 @@ * @see pcgen.gui.tabs.ability.AbilitySelectionPanel */ public SelectedAbilityPanel(final PlayerCharacter aPC, - final AbilityCategory aCategory) + final List<AbilityCategory> aCategoryList) { - super(aPC, aCategory); + super(aPC, aCategoryList); setLayout(new BorderLayout()); @@ -187,6 +190,19 @@ } /** + * @see pcgen.gui.tabs.IFilterableView#getViewChoices() + */ + public List<String> getViewChoices() + { + final List<String> viewChoices = new ArrayList<String>(4); + viewChoices.add(PropertyFactory.getString("in_catTypeName")); //$NON-NLS-1$ + viewChoices.add(PropertyFactory.getString("in_catNameLabel")); //$NON-NLS-1$ + viewChoices.add(PropertyFactory.getString("in_catPreReqTree")); //$NON-NLS-1$ + viewChoices.add(PropertyFactory.getString("in_catSourceName")); //$NON-NLS-1$ + return viewChoices; + } + + /** * Overridden to add a MouseListener and Popup menu. * * @see pcgen.gui.tabs.ability.AbilitySelectionPanel#initComponents() @@ -372,4 +388,14 @@ setRemoveEnabled(false); } } + + /* (non-Javadoc) + * @see pcgen.gui.tabs.ability.AbilitySelectionPanel#getSplitByCategory() + */ + @Override + protected boolean getSplitByCategory() + { + return true; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |