Browse Source

Moved some files to more sensible locations/renamed a package.
Refactored ObservableListener and IndirectObservableListener to not depend on JTextComponents

Sam Jaffe 10 năm trước cách đây
mục cha
commit
56d5c2f419
33 tập tin đã thay đổi với 107 bổ sung và 113 xóa
  1. 1 1
      src/org/leumasjaffe/charsheet/model/DDCharacter.java
  2. 1 1
      src/org/leumasjaffe/charsheet/model/DDCharacterClass.java
  3. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/DDArmor.java
  4. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/DDInventory.java
  5. 1 2
      src/org/leumasjaffe/charsheet/model/inventory/DDItem.java
  6. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/DDWeapon.java
  7. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/EquipmentSlot.java
  8. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/Money.java
  9. 1 1
      src/org/leumasjaffe/charsheet/model/inventory/Range.java
  10. 1 1
      src/org/leumasjaffe/charsheet/model/magic/DDActionType.java
  11. 0 2
      src/org/leumasjaffe/charsheet/model/magic/DDSpell.java
  12. 1 1
      src/org/leumasjaffe/charsheet/model/magic/Range.java
  13. 8 6
      src/org/leumasjaffe/charsheet/observer/helper/AbilModStringify.java
  14. 8 6
      src/org/leumasjaffe/charsheet/observer/helper/IntValueStringify.java
  15. 1 1
      src/org/leumasjaffe/charsheet/util/StringHelper.java
  16. 1 0
      src/org/leumasjaffe/charsheet/view/ClassTab.java
  17. 3 3
      src/org/leumasjaffe/charsheet/view/inventory/ArmorPanel.java
  18. 1 1
      src/org/leumasjaffe/charsheet/view/inventory/EquipmentInfoMenu.java
  19. 3 3
      src/org/leumasjaffe/charsheet/view/inventory/EquipmentPanel.java
  20. 5 5
      src/org/leumasjaffe/charsheet/view/inventory/InventoryPanel.java
  21. 2 2
      src/org/leumasjaffe/charsheet/view/inventory/ItemInfoMenu.java
  22. 1 1
      src/org/leumasjaffe/charsheet/view/inventory/ItemPanel.java
  23. 3 3
      src/org/leumasjaffe/charsheet/view/inventory/ShieldPanel.java
  24. 3 3
      src/org/leumasjaffe/charsheet/view/inventory/WeaponPanel.java
  25. 5 5
      src/org/leumasjaffe/charsheet/view/summary/AbilityBox.java
  26. 8 12
      src/org/leumasjaffe/charsheet/view/summary/AttackLine.java
  27. 1 1
      src/org/leumasjaffe/charsheet/view/summary/DescriptionPanel.java
  28. 9 9
      src/org/leumasjaffe/charsheet/view/summary/HealthLine.java
  29. 6 6
      src/org/leumasjaffe/charsheet/view/summary/InitiativeLine.java
  30. 7 7
      src/org/leumasjaffe/charsheet/view/summary/ResistanceLine.java
  31. 5 7
      src/org/leumasjaffe/observer/IndirectObservableListener.java
  32. 11 11
      src/org/leumasjaffe/observer/ObservableController.java
  33. 5 7
      src/org/leumasjaffe/observer/ObservableListener.java

+ 1 - 1
src/org/leumasjaffe/charsheet/model/DDCharacter.java

@@ -5,7 +5,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import org.leumasjaffe.charsheet.model.equip.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDInventory;
 import org.leumasjaffe.charsheet.model.observable.ObjectValue;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

+ 1 - 1
src/org/leumasjaffe/charsheet/model/DDCharacterClass.java

@@ -18,7 +18,7 @@ public class DDCharacterClass {
 		DDClass base;
 		
 		public boolean equals(Object o) {
-			return base.equals(o);
+			return this == o || base.equals(o);
 		}
 
 		public String getName() {

+ 1 - 1
src/org/leumasjaffe/charsheet/model/equip/DDArmor.java → src/org/leumasjaffe/charsheet/model/inventory/DDArmor.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import lombok.AccessLevel;
 import lombok.Data;

+ 1 - 1
src/org/leumasjaffe/charsheet/model/equip/DDInventory.java → src/org/leumasjaffe/charsheet/model/inventory/DDInventory.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import java.util.ArrayList;
 import java.util.Collections;

+ 1 - 2
src/org/leumasjaffe/charsheet/model/equip/DDItem.java → src/org/leumasjaffe/charsheet/model/inventory/DDItem.java

@@ -1,10 +1,9 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.leumasjaffe.charsheet.model.Money;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.model.observable.StringValue;
 

+ 1 - 1
src/org/leumasjaffe/charsheet/model/equip/DDWeapon.java → src/org/leumasjaffe/charsheet/model/inventory/DDWeapon.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import lombok.AccessLevel;
 import lombok.Data;

+ 1 - 1
src/org/leumasjaffe/charsheet/model/equip/EquipmentSlot.java → src/org/leumasjaffe/charsheet/model/inventory/EquipmentSlot.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 public enum EquipmentSlot {
 	HEAD,

+ 1 - 1
src/org/leumasjaffe/charsheet/model/Money.java → src/org/leumasjaffe/charsheet/model/inventory/Money.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
src/org/leumasjaffe/charsheet/model/equip/Range.java → src/org/leumasjaffe/charsheet/model/inventory/Range.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model.equip;
+package org.leumasjaffe.charsheet.model.inventory;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 

+ 1 - 1
src/org/leumasjaffe/charsheet/model/DDActionType.java → src/org/leumasjaffe/charsheet/model/magic/DDActionType.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.model;
+package org.leumasjaffe.charsheet.model.magic;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;

+ 0 - 2
src/org/leumasjaffe/charsheet/model/magic/DDSpell.java

@@ -4,8 +4,6 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
 
-import org.leumasjaffe.charsheet.model.DDActionType;
-
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
 import lombok.AccessLevel;

+ 1 - 1
src/org/leumasjaffe/charsheet/model/magic/Range.java

@@ -60,7 +60,7 @@ public interface Range {
 		
 		public String toString() {
 			final StringBuilder str = new StringBuilder(name);
-			str.append(" (").append(range).append(" ft.").append(")");
+			str.append(" (").append(range).append(" ft.)");
 			return str.toString();
 		}
 	}

+ 8 - 6
src/org/leumasjaffe/charsheet/observer/helper/AbilModStringify.java

@@ -1,16 +1,18 @@
 package org.leumasjaffe.charsheet.observer.helper;
 
-import java.util.function.Function;
+import java.util.function.BiConsumer;
+
+import javax.swing.text.JTextComponent;
 
 import org.leumasjaffe.charsheet.model.AbilityScores;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
+
+public class AbilModStringify implements BiConsumer<JTextComponent, IntValue> {
 
-public class AbilModStringify implements Function<IntValue, String> {
-	
 	@Override
-	public String apply(IntValue t) {
-		return StringHelper.toString(AbilityScores.modifier(t.value()));
+	public void accept(JTextComponent c, IntValue v) {
+		c.setText(StringHelper.toString(AbilityScores.modifier(v.value())));
 	}
 
 }

+ 8 - 6
src/org/leumasjaffe/charsheet/observer/helper/IntValueStringify.java

@@ -1,21 +1,23 @@
 package org.leumasjaffe.charsheet.observer.helper;
 
-import java.util.function.Function;
+import java.util.function.BiConsumer;
+
+import javax.swing.text.JTextComponent;
 
 import org.leumasjaffe.charsheet.model.observable.IntValue;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import lombok.experimental.UtilityClass;
 
 @UtilityClass
 public class IntValueStringify {
 	
-	public Function<IntValue, String> instance() {
-		return (v) -> StringHelper.toString(v.value());
+	public BiConsumer<JTextComponent, IntValue> instance() {
+		return (c, v) -> c.setText(StringHelper.toString(v.value()));
 	}
 	
-	public Function<IntValue, String> withDefault(final int def) {
-		return (v) -> StringHelper.toString(v.value(), def);
+	public BiConsumer<JTextComponent, IntValue> withDefault(final int def) {
+		return (c, v) -> c.setText(StringHelper.toString(v.value(), def));
 	}
 
 }

+ 1 - 1
src/org/leumasjaffe/charsheet/view/StringHelper.java → src/org/leumasjaffe/charsheet/util/StringHelper.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.view;
+package org.leumasjaffe.charsheet.util;
 
 import lombok.experimental.UtilityClass;
 

+ 1 - 0
src/org/leumasjaffe/charsheet/view/ClassTab.java

@@ -8,6 +8,7 @@ import java.awt.GridBagLayout;
 import javax.swing.JTextField;
 
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import java.awt.GridBagConstraints;
 import java.awt.Insets;

+ 3 - 3
src/org/leumasjaffe/charsheet/view/inventory/ArmorPanel.java

@@ -12,9 +12,9 @@ import java.awt.Font;
 import java.awt.Color;
 import javax.swing.SwingConstants;
 
-import org.leumasjaffe.charsheet.model.equip.DDArmor;
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.model.inventory.DDArmor;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import java.awt.Component;
 import javax.swing.Box;

+ 1 - 1
src/org/leumasjaffe/charsheet/view/inventory/EquipmentInfoMenu.java

@@ -2,7 +2,7 @@ package org.leumasjaffe.charsheet.view.inventory;
 
 import javax.swing.JPopupMenu;
 
-import org.leumasjaffe.charsheet.model.equip.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
 import org.leumasjaffe.function.VoidVoidFunction;
 
 import java.util.function.Consumer;

+ 3 - 3
src/org/leumasjaffe/charsheet/view/inventory/EquipmentPanel.java

@@ -9,9 +9,9 @@ import javax.swing.border.MatteBorder;
 import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.charsheet.controller.inventory.PopClickListener;
 import org.leumasjaffe.charsheet.model.DDCharacter;
-import org.leumasjaffe.charsheet.model.equip.DDInventory;
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.model.equip.EquipmentSlot;
+import org.leumasjaffe.charsheet.model.inventory.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;

+ 5 - 5
src/org/leumasjaffe/charsheet/view/inventory/InventoryPanel.java

@@ -11,20 +11,20 @@ import javax.swing.border.MatteBorder;
 import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.charsheet.controller.inventory.PopClickListener;
 import org.leumasjaffe.charsheet.model.DDCharacter;
-import org.leumasjaffe.charsheet.model.equip.DDInventory;
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.model.equip.EquipmentSlot;
+import org.leumasjaffe.charsheet.model.inventory.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
 
+import static org.leumasjaffe.charsheet.model.inventory.EquipmentSlot.*;
+
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 
-import static org.leumasjaffe.charsheet.model.equip.EquipmentSlot.*;
-
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class InventoryPanel extends JPanel {
 	/**

+ 2 - 2
src/org/leumasjaffe/charsheet/view/inventory/ItemInfoMenu.java

@@ -2,8 +2,8 @@ package org.leumasjaffe.charsheet.view.inventory;
 
 import javax.swing.JPopupMenu;
 
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.model.equip.EquipmentSlot;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 
 import javax.swing.JMenuItem;
 

+ 1 - 1
src/org/leumasjaffe/charsheet/view/inventory/ItemPanel.java

@@ -12,7 +12,7 @@ import java.awt.Font;
 import java.awt.Color;
 import javax.swing.SwingConstants;
 
-import org.leumasjaffe.charsheet.model.equip.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
 
 import java.awt.Component;
 import javax.swing.Box;

+ 3 - 3
src/org/leumasjaffe/charsheet/view/inventory/ShieldPanel.java

@@ -12,9 +12,9 @@ import java.awt.Font;
 import java.awt.Color;
 import javax.swing.SwingConstants;
 
-import org.leumasjaffe.charsheet.model.equip.DDArmor;
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.model.inventory.DDArmor;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import java.awt.Component;
 import javax.swing.Box;

+ 3 - 3
src/org/leumasjaffe/charsheet/view/inventory/WeaponPanel.java

@@ -12,9 +12,9 @@ import java.awt.Font;
 import java.awt.Color;
 import javax.swing.SwingConstants;
 
-import org.leumasjaffe.charsheet.model.equip.DDItem;
-import org.leumasjaffe.charsheet.model.equip.DDWeapon;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.charsheet.model.inventory.DDWeapon;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import java.awt.Component;
 import javax.swing.Box;

+ 5 - 5
src/org/leumasjaffe/charsheet/view/summary/AbilityBox.java

@@ -17,7 +17,7 @@ import javax.swing.border.LineBorder;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.helper.IntValueHelper;
 import org.leumasjaffe.charsheet.observer.helper.IntValueStringify;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.graphics.NumberTextField;
 import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
@@ -33,8 +33,8 @@ public class AbilityBox extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	ObservableListener<IntValue> valueListener;
-	ObservableListener<IntValue> modListener;
+	ObservableListener<JTextField, IntValue> valueListener;
+	ObservableListener<JTextField, IntValue> modListener;
 	
 	public AbilityBox(final String name, final String heading) {
 
@@ -87,8 +87,8 @@ public class AbilityBox extends JPanel {
 					modifier.setText("");
 				});
 		modListener = new ObservableListener<>(modifier,
-				(v) -> v.value() <= 0 ? "" : 
-					StringHelper.toString(modifier(v.value())));
+				(c, v) -> c.setText(v.value() <= 0 ? "" : 
+					StringHelper.toString(modifier(v.value()))));
 	}
 
 	public void setModel(IntValue scores) {

+ 8 - 12
src/org/leumasjaffe/charsheet/view/summary/AttackLine.java

@@ -11,7 +11,7 @@ import org.leumasjaffe.charsheet.model.AbilityScores;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.observer.IndirectObservableListener;
 import org.leumasjaffe.observer.ObservableListener;
 
@@ -34,16 +34,12 @@ public class AttackLine extends JPanel {
 	 */
 	private static final long serialVersionUID = 1L;
 	@NonFinal DDCharacter model;
-	
-	JTextField grappleTtl;
-	JTextField grappleBab;
 	JTextField grappleMisc;
 	JTextField grappleSize;
 	JTextField baseAttack;
-	JTextField grappleStrength;
 	
-	IndirectObservableListener<DDCharacter> gTtlObserver;
-	ObservableListener<IntValue> gStrObserver;
+	IndirectObservableListener<JTextField, DDCharacter> gTtlObserver;
+	ObservableListener<JTextField, IntValue> gStrObserver;
 
 	public AttackLine() {
 		setPreferredSize(new Dimension(600, 25));
@@ -115,7 +111,7 @@ public class AttackLine extends JPanel {
 		gbc_lblGrapple.gridy = 0;
 		add(lblGrapple, gbc_lblGrapple);
 		
-		grappleTtl = new JTextField();
+		JTextField grappleTtl = new JTextField();
 		grappleTtl.setToolTipText("Total Grapple");
 		grappleTtl.setPreferredSize(new Dimension(30, 20));
 		grappleTtl.setMinimumSize(new Dimension(30, 20));
@@ -139,7 +135,7 @@ public class AttackLine extends JPanel {
 		gbc_label.gridy = 0;
 		add(label, gbc_label);
 		
-		grappleBab = new JTextField();
+		JTextField grappleBab = new JTextField();
 		grappleBab.setDocument(baseAttack.getDocument());
 		grappleBab.setToolTipText("Base Attack Bonus");
 		grappleBab.setPreferredSize(new Dimension(30, 20));
@@ -164,7 +160,7 @@ public class AttackLine extends JPanel {
 		gbc_label_1.gridy = 0;
 		add(label_1, gbc_label_1);
 		
-		grappleStrength = new JTextField();
+		JTextField grappleStrength = new JTextField();
 		grappleStrength.setToolTipText("Strength Modifier");
 		grappleStrength.setPreferredSize(new Dimension(30, 20));
 		grappleStrength.setMinimumSize(new Dimension(30, 20));
@@ -228,12 +224,12 @@ public class AttackLine extends JPanel {
 		add(grappleMisc, gbc_grappleMisc);
 		
 		gTtlObserver = new IndirectObservableListener<>(grappleTtl,
-				(v) -> {
+				(c, v) -> {
 					final int bab = v.getBaseAttack();
 					final int str = AbilityScores.modifier(this.model.getAbilities().getBase().getStr().value());
 					final int size = v.getSize().value().modifier;
 					final int misc = 0;
-					return StringHelper.toString(bab + str + size + misc);
+					c.setText(StringHelper.toString(bab + str + size + misc));
 				});
 		gStrObserver = new ObservableListener<>(grappleStrength, 
 				new AbilModStringify());

+ 1 - 1
src/org/leumasjaffe/charsheet/view/summary/DescriptionPanel.java

@@ -8,7 +8,7 @@ import javax.swing.JTextField;
 import javax.swing.border.TitledBorder;
 
 import org.leumasjaffe.charsheet.model.DDCharacter;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;

+ 9 - 9
src/org/leumasjaffe/charsheet/view/summary/HealthLine.java

@@ -16,7 +16,7 @@ import java.awt.Insets;
 import org.leumasjaffe.charsheet.model.HitPoints;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.helper.IntValueHelper;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.observer.helper.IntValueStringify;
 import org.leumasjaffe.graphics.NumberTextField;
 import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
@@ -33,10 +33,10 @@ public class HealthLine extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	ObservableListener<IntValue> ttlObserver;
-	ObservableListener<IntValue> currObserver;
-	ObservableListener<IntValue> nlObserver;
-	ObservableListener<IntValue> tempObserver;
+	ObservableListener<JTextField, IntValue> ttlObserver;
+	ObservableListener<JTextField, IntValue> currObserver;
+	ObservableListener<JTextField, IntValue> nlObserver;
+	ObservableListener<JTextField, IntValue> tempObserver;
 
 	public HealthLine() {
 		setOpaque(false);
@@ -150,16 +150,16 @@ public class HealthLine extends JPanel {
 		
 		ttlObserver = new ObservableController<>(maxHealth,
 				new IntValueHelper(),
-				(v) -> StringHelper.toString(v.value(), 0));
+				IntValueStringify.withDefault(0));
 		currObserver = new ObservableController<>(currentHealth,
 				new IntValueHelper(),
-				(v) -> StringHelper.toString(v.value()));
+				IntValueStringify.instance());
 		tempObserver = new ObservableController<>(temporary,
 				new IntValueHelper(),
-				(v) -> StringHelper.toString(v.value(), 0));
+				IntValueStringify.withDefault(0));
 		nlObserver = new ObservableController<>(nonlethal,
 				new IntValueHelper(),
-				(v) -> StringHelper.toString(v.value(), 0));
+				IntValueStringify.withDefault(0));
 	}
 
 	public void setModel(HitPoints health) {

+ 6 - 6
src/org/leumasjaffe/charsheet/view/summary/InitiativeLine.java

@@ -13,7 +13,7 @@ import javax.swing.border.LineBorder;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.observer.IndirectObservableListener;
 import org.leumasjaffe.observer.ObservableListener;
 
@@ -32,8 +32,8 @@ public class InitiativeLine extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	IndirectObservableListener<DDCharacter> ttlObserver;
-	ObservableListener<IntValue> dexObserver;
+	IndirectObservableListener<JTextField, DDCharacter> ttlObserver;
+	ObservableListener<JTextField, IntValue> dexObserver;
 
 	public InitiativeLine() {
 		setOpaque(false);
@@ -126,9 +126,9 @@ public class InitiativeLine extends JPanel {
 		add(misc, gbc_misc);
 		
 		ttlObserver = new IndirectObservableListener<>(total, 
-				(c) -> {
-					final int adex = c.getAbilities().getBase().getDex().value();
-					return StringHelper.toString( modifier(adex) );
+				(c, v) -> {
+					final int adex = v.getAbilities().getBase().getDex().value();
+					c.setText(StringHelper.toString( modifier(adex) ));
 				});
 		dexObserver = new ObservableListener<>(dex, 
 				new AbilModStringify());

+ 7 - 7
src/org/leumasjaffe/charsheet/view/summary/ResistanceLine.java

@@ -11,7 +11,7 @@ import org.leumasjaffe.charsheet.model.AbilityScores;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
-import org.leumasjaffe.charsheet.view.StringHelper;
+import org.leumasjaffe.charsheet.util.StringHelper;
 import org.leumasjaffe.graphics.NumberTextField;
 import org.leumasjaffe.observer.IndirectObservableListener;
 import org.leumasjaffe.observer.ObservableListener;
@@ -36,9 +36,9 @@ public class ResistanceLine extends JPanel {
 	private static final long serialVersionUID = 1L;
 	Function<AbilityScores.Scores, IntValue> access;
 	
-	IndirectObservableListener<DDCharacter> totalObserver;
-	IndirectObservableListener<DDCharacter> baseObserver;
-	ObservableListener<IntValue> abilObserver;
+	IndirectObservableListener<JTextField, DDCharacter> totalObserver;
+	IndirectObservableListener<JTextField, DDCharacter> baseObserver;
+	ObservableListener<JTextField, IntValue> abilObserver;
 	
 	public ResistanceLine(final String name, Function<DDCharacter, Integer> save, 
 			Function<AbilityScores.Scores, IntValue> func) {
@@ -220,16 +220,16 @@ public class ResistanceLine extends JPanel {
 		panel.add(tempField, gbc_temp);
 		
 		totalObserver = new IndirectObservableListener<>(totalField,
-				(v) -> {
+				(c, v) -> {
 					final int base = save.apply(v);
 					final int abil = AbilityScores.modifier(access.apply(v.getAbilities().getBase()).value());
 					final int magic = 0;
 					final int misc = 0;
 					final int temp = 0;
-					return StringHelper.toString(base + abil + magic + misc + temp);
+					c.setText(StringHelper.toString(base + abil + magic + misc + temp));
 				});
 		baseObserver = new IndirectObservableListener<>(baseSaveField,
-				(v) -> StringHelper.toString(save.apply(v)));
+				(c, v) -> c.setText(StringHelper.toString(save.apply(v))));
 		abilObserver = new ObservableListener<>(abilityField,
 				new AbilModStringify());
 	}

+ 5 - 7
src/org/leumasjaffe/observer/IndirectObservableListener.java

@@ -1,9 +1,7 @@
 package org.leumasjaffe.observer;
 
 import java.util.Objects;
-import java.util.function.Function;
-
-import javax.swing.text.JTextComponent;
+import java.util.function.BiConsumer;
 
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
@@ -14,9 +12,9 @@ import lombok.RequiredArgsConstructor;
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 @Getter(value=AccessLevel.PACKAGE)
 @RequiredArgsConstructor
-public class IndirectObservableListener<T> {
-	JTextComponent text;
-	Function<? super T, String> stringify;
+public class IndirectObservableListener<C, T> {
+	C component;
+	BiConsumer<? super C, ? super T> update;
 
 	@NonFinal T model = null;
 	
@@ -32,6 +30,6 @@ public class IndirectObservableListener<T> {
 	}
 
 	private void updateComponent() {
-		text.setText( stringify.apply( model ) );
+		update.accept(component, model);
 	}
 }

+ 11 - 11
src/org/leumasjaffe/observer/ObservableController.java

@@ -1,8 +1,8 @@
 package org.leumasjaffe.observer;
 
 import java.util.Objects;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
-import java.util.function.Function;
 
 import javax.swing.text.JTextComponent;
 
@@ -13,27 +13,27 @@ import lombok.experimental.FieldDefaults;
 import lombok.AccessLevel;
 
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
-public class ObservableController<T extends Observable> extends ObservableListener<T> {
+public class ObservableController<S extends JTextComponent, T extends Observable> extends ObservableListener<S, T> {
 	Helper<T> func;
 
-	public ObservableController(final JTextComponent text, final Helper<T> func,
-			final Function<? super T, String> stringify) {
-		super(text, stringify);
+	public ObservableController(final S comp, final Helper<T> func,
+			final BiConsumer<? super S, ? super T> update) {
+		super(comp, update);
 		this.func = func;
-		AnyActionDocumentListener.skipEmpty(text, evt -> accept( ) );
+		AnyActionDocumentListener.skipEmpty(comp, evt -> accept( ) );
 	}
 	
-	public ObservableController(final JTextComponent text, final Helper<T> func,
-			final Function<? super T, String> stringify, final Consumer<T> onEmpty) {
-		super(text, stringify);
+	public ObservableController(final S comp, final Helper<T> func,
+			final BiConsumer<? super S, ? super T> update, final Consumer<T> onEmpty) {
+		super(comp, update);
 		this.func = func;
-		AnyActionDocumentListener.emptyOrText( text, 
+		AnyActionDocumentListener.emptyOrText( comp, 
 				e -> onEmpty.accept( impl.getModel() ), 
 				evt -> accept( ) );
 	}
 
 	private boolean update() {
-		return func.apply( impl.getText().getText( ), impl.getModel() );
+		return func.apply( impl.getComponent().getText( ), impl.getModel() );
 	}
 
 	private void accept() {

+ 5 - 7
src/org/leumasjaffe/observer/ObservableListener.java

@@ -1,18 +1,16 @@
 package org.leumasjaffe.observer;
 
-import java.util.function.Function;
-
-import javax.swing.text.JTextComponent;
+import java.util.function.BiConsumer;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
 
 @FieldDefaults(level=AccessLevel.PROTECTED, makeFinal=true)
-public class ObservableListener<T extends Observable> {
-	IndirectObservableListener<T> impl;
+public class ObservableListener<C, T extends Observable> {
+	IndirectObservableListener<C, T> impl;
 	
-	public ObservableListener(final JTextComponent text, final Function<? super T, String> stringify) {
-		impl = new IndirectObservableListener<>(text, stringify);
+	public ObservableListener(final C comp, final BiConsumer<? super C, ? super T> func) {
+		impl = new IndirectObservableListener<>(comp, func);
 	}
 	
 	public void setObserved( T obs ) {