From: <jde...@us...> - 2012-01-15 05:58:00
|
Revision: 15810 http://pcgen.svn.sourceforge.net/pcgen/?rev=15810&view=rev Author: jdempsey Date: 2012-01-15 05:57:53 +0000 (Sun, 15 Jan 2012) Log Message: ----------- Reduce rebuilds of ability lists. Modified Paths: -------------- sandbox/uisync/code/src/java/pcgen/cdom/facet/AbstractDataFacet.java sandbox/uisync/code/src/java/pcgen/cdom/facet/ActiveAbilityFacet.java sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterAbilities.java Added Paths: ----------- sandbox/uisync/code/src/java/pcgen/cdom/facet/CategorizedDataFacetChangeEvent.java Modified: sandbox/uisync/code/src/java/pcgen/cdom/facet/AbstractDataFacet.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/cdom/facet/AbstractDataFacet.java 2012-01-15 05:45:21 UTC (rev 15809) +++ sandbox/uisync/code/src/java/pcgen/cdom/facet/AbstractDataFacet.java 2012-01-15 05:57:53 UTC (rev 15810) @@ -20,7 +20,9 @@ import java.util.Map; import java.util.TreeMap; +import pcgen.cdom.base.Category; import pcgen.cdom.enumeration.CharID; +import pcgen.cdom.enumeration.Nature; /** * @author Thomas Parker (thpr [at] yahoo.com) @@ -128,6 +130,28 @@ */ protected void fireDataFacetChangeEvent(CharID id, T node, int type) { + fireDataFacetChangeEvent(id, node, type, null, null); + } + + /** + * Sends a NodeChangeEvent to the DataFacetChangeListeners that are + * receiving DataFacetChangeEvents from the source DataFacet. + * @param id + * + * @param node + * The Node that has beed added to or removed from the source + * DataFacet + * @param type + * An identifier indicating whether the given CDOMObject was + * added to or removed from the source DataFacet + * @param category + * The category *e.g. AbilityCategory in which the node has been changed. + * @param nature + * The optional nature in which the node has been changed. + */ + @SuppressWarnings("rawtypes") + protected void fireDataFacetChangeEvent(CharID id, T node, int type, Category category, Nature nature) + { for (DataFacetChangeListener<? super T>[] dfclArray : listeners .values()) { @@ -144,7 +168,14 @@ // Lazily create event if (ccEvent == null) { - ccEvent = new DataFacetChangeEvent<T>(id, node, this, type); + if (category == null) + { + ccEvent = new DataFacetChangeEvent<T>(id, node, this, type); + } + else + { + ccEvent = new CategorizedDataFacetChangeEvent<T>(id, node, this, type, category, nature); + } } DataFacetChangeListener dfcl = dfclArray[i]; switch (ccEvent.getEventType()) Modified: sandbox/uisync/code/src/java/pcgen/cdom/facet/ActiveAbilityFacet.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/cdom/facet/ActiveAbilityFacet.java 2012-01-15 05:45:21 UTC (rev 15809) +++ sandbox/uisync/code/src/java/pcgen/cdom/facet/ActiveAbilityFacet.java 2012-01-15 05:57:53 UTC (rev 15810) @@ -63,7 +63,7 @@ boolean isNew = ensureCachedSet(id, cat, nat); if (getCachedSet(id, cat, nat).add(obj) || isNew) { - fireDataFacetChangeEvent(id, obj, DataFacetChangeEvent.DATA_ADDED); + fireDataFacetChangeEvent(id, obj, DataFacetChangeEvent.DATA_ADDED, cat, nat); } } @@ -126,7 +126,7 @@ boolean removed = cached != null && cached.remove(obj); if (removed) { - fireDataFacetChangeEvent(id, obj, DataFacetChangeEvent.DATA_REMOVED); + fireDataFacetChangeEvent(id, obj, DataFacetChangeEvent.DATA_REMOVED, cat, nat); } return removed; } Added: sandbox/uisync/code/src/java/pcgen/cdom/facet/CategorizedDataFacetChangeEvent.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/cdom/facet/CategorizedDataFacetChangeEvent.java (rev 0) +++ sandbox/uisync/code/src/java/pcgen/cdom/facet/CategorizedDataFacetChangeEvent.java 2012-01-15 05:57:53 UTC (rev 15810) @@ -0,0 +1,91 @@ +/* + * CategorisedDataFacetChangeEvent.java + * Copyright James Dempsey, 2012 + * + * 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 14/01/2012 3:12:43 PM + * + * $Id$ + */ +package pcgen.cdom.facet; + +import pcgen.cdom.base.Category; +import pcgen.cdom.enumeration.CharID; +import pcgen.cdom.enumeration.Nature; + +/** + * The Class <code>CategorizedDataFacetChangeEvent</code> indicates that a facet + * with a category has changed. This is usually used for Ability add/remove events + * to allow the listener to determine the category and nature to which the ability + * is being applied. + * + * <br/> + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ + +public class CategorizedDataFacetChangeEvent<T> extends DataFacetChangeEvent<T> +{ + + private final Category category; + private final Nature nature; + + /** + * Constructs a new DataFacetChangeEvent for the given CharID. The + * CDOMObject which was added or removed and an indication of the action + * (Addition or Removal) is also provided. + * + * @param id + * The CharID identifying the PlayerCharacter in which the event + * took place + * @param cdo + * The CDOMObject which was added to or removed from the Graph + * @param source + * The object that the event originates from. + * @param type + * An integer identifying whether the given CDOMObject was added + * or removed from the PlayerCharacter + * @param cat + * The category in which cdo was added. + * @param nature The nature of the ability being manipulated. + */ + public CategorizedDataFacetChangeEvent(CharID id, T cdo, Object source, int type, Category cat, Nature nature) + { + super(id, cdo, source, type); + this.category = cat; + this.nature = nature; + } + + /** + * @return the category + */ + public Category getCategory() + { + return category; + } + + /** + * @return the nature + */ + public Nature getNature() + { + return nature; + } + +} Property changes on: sandbox/uisync/code/src/java/pcgen/cdom/facet/CategorizedDataFacetChangeEvent.java ___________________________________________________________________ Added: svn:keywords + Date Author Revision Id Added: svn:eol-style + native Modified: sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterAbilities.java =================================================================== --- sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterAbilities.java 2012-01-15 05:45:21 UTC (rev 15809) +++ sandbox/uisync/code/src/java/pcgen/gui2/facade/CharacterAbilities.java 2012-01-15 05:57:53 UTC (rev 15810) @@ -38,6 +38,7 @@ import pcgen.cdom.enumeration.Nature; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.facet.ActiveAbilityFacet; +import pcgen.cdom.facet.CategorizedDataFacetChangeEvent; import pcgen.cdom.facet.DataFacetChangeEvent; import pcgen.cdom.facet.DataFacetChangeListener; import pcgen.cdom.facet.DirectAbilityFacet; @@ -125,7 +126,15 @@ } Logging.debugPrint("Got active ability added of " + dfce.getCDOMObject()); Ability ability = dfce.getCDOMObject(); - rebuildAbilityLists(); + if (dfce instanceof CategorizedDataFacetChangeEvent<?>) + { + + CategorizedDataFacetChangeEvent categorizedEvent = + (CategorizedDataFacetChangeEvent) dfce; + AbilityCategory cat = (AbilityCategory) categorizedEvent.getCategory(); + Nature nature = categorizedEvent.getNature(); + addAbilityToLists(cat, ability, nature); + } } public void dataRemoved(DataFacetChangeEvent<Ability> dfce) @@ -141,7 +150,15 @@ } Logging.debugPrint("Got active ability removed of " + dfce.getCDOMObject()); Ability ability = dfce.getCDOMObject(); - rebuildAbilityLists(); + if (dfce instanceof CategorizedDataFacetChangeEvent<?>) + { + + CategorizedDataFacetChangeEvent categorizedEvent = + (CategorizedDataFacetChangeEvent) dfce; + AbilityCategory cat = (AbilityCategory) categorizedEvent.getCategory(); + Nature nature = categorizedEvent.getNature(); + removeAbilityFromLists(cat, ability, nature); + } } }); grantedAbilityFacet.addDataFacetChangeListener(new DataFacetChangeListener<Ability>() @@ -215,6 +232,32 @@ }); } + void addAbilityToLists(AbilityCategory cat, Ability ability, Nature nature) + { + addCategorisedAbility(cat, ability,nature); + if (!activeCategories.containsElement(cat)) + { + int index = getCatIndex(cat); + activeCategories.addElement(index, cat); + } + } + + void removeAbilityFromLists(AbilityCategory cat, + Ability ability, Nature nature) + { + removeCategorisedAbility(cat, ability, nature); + + boolean stillActive = + !theCharacter.getAutomaticAbilityList(cat).isEmpty() + || !theCharacter.getRealAbilitiesList(cat).isEmpty() + || !theCharacter.getVirtualAbilityList(cat).isEmpty() + || theCharacter.getAvailableAbilityPool(cat).intValue() > 0; + if (!stillActive && activeCategories.containsElement(cat)) + { + activeCategories.removeElement(cat); + } + } + /** * Rebuild the ability lists for the character to include the character's * current abilities. @@ -343,6 +386,22 @@ } } + private void removeCategorisedAbility(AbilityCategory cat, + Ability ability, Nature nature) + { + CategorizedAbilitySelection cas; + if (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED)) + { + cas = new CategorizedAbilitySelection( + null, cat, ability, nature, ""); + } + else + { + cas = new CategorizedAbilitySelection(null, cat, ability, nature); + } + removeElement(cas); + } + /** * Process a request by the user to add an ability. The user will be informed * if the request cannot be allowed. Updates to the displayed lists are This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |