Jelajahi Sumber

Removing the controller package, as PopClickListener did not belong in it.
Refactor SpellPanel a little to make it cleaner.

Sam Jaffe 8 tahun lalu
induk
melakukan
4d370764d2

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/inventory/EquipmentPanel.java

@@ -7,11 +7,11 @@ import javax.swing.SwingConstants;
 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.inventory.DDInventory;
 import org.leumasjaffe.charsheet.model.inventory.DDItem;
 import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
+import org.leumasjaffe.graphics.PopClickListener;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/inventory/InventoryPanel.java

@@ -8,10 +8,10 @@ import javax.swing.SwingConstants;
 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.inventory.DDInventory;
 import org.leumasjaffe.charsheet.model.inventory.DDItem;
+import org.leumasjaffe.graphics.PopClickListener;
 import org.leumasjaffe.observer.ObservableListener;
 
 import lombok.AccessLevel;

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/magic/SpellLine.java

@@ -2,9 +2,9 @@ package org.leumasjaffe.charsheet.view.magic;
 
 import javax.swing.JPanel;
 
-import org.leumasjaffe.charsheet.controller.inventory.PopClickListener;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
+import org.leumasjaffe.graphics.PopClickListener;
 
 import java.awt.GridBagLayout;
 import javax.swing.JLabel;

+ 27 - 34
src/main/lombok/org/leumasjaffe/charsheet/view/magic/SpellPanel.java

@@ -4,7 +4,7 @@ import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 
 import java.awt.GridBagLayout;
-import java.util.function.Function;
+import java.util.function.BiConsumer;
 
 import javax.swing.JTabbedPane;
 
@@ -13,10 +13,11 @@ import org.leumasjaffe.charsheet.model.Ability;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
+import org.leumasjaffe.function.TriFunction;
 import org.leumasjaffe.observer.IndirectObservableListener;
 
 import lombok.AccessLevel;
-import lombok.Value;
+import lombok.RequiredArgsConstructor;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
 
@@ -28,24 +29,9 @@ public class SpellPanel extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	DDCharacterClass dclass;
-	@NonFinal int previousHighestSpellLevel = 0;
-	IndirectObservableListener<Fields, Packet> listener;
+	IndirectObservableListener<JPanel, DDCharacterClass> listenerPerDay, listenerKnown;
 	
-	@Value
-	private static final class Fields {
-		JPanel prepared, known;
-	}
-	
-	@Value
-	private static final class Packet {
-		DDCharacterClass dclass;
-		IntValue ability;
-	}
-
-	public SpellPanel(DDCharacter chara, final DDCharacterClass cclass) {
-		dclass = cclass;
-		
+	public SpellPanel(DDCharacter chara, final DDCharacterClass dclass) {		
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0};
 		gridBagLayout.rowHeights = new int[]{0, 0};
@@ -71,22 +57,29 @@ public class SpellPanel extends JPanel {
 		preparedPane.setViewportView(prepared);
 		final JPanel known = new JPanel(new VerticalLayout());
 		knownPane.setViewportView(known);
-		
-		listener = new IndirectObservableListener<>(
-				new Fields(prepared, known), 
-				(c, p) -> {
-					generateSpellTree(c.prepared, (l) -> new SpellLevelPerDayPanel(p.dclass, l, p.ability));
-					generateSpellTree(c.known, (l) -> new SpellLevelPanel(p.dclass, l, p.ability));
-					previousHighestSpellLevel = dclass.getHighestSpellLevel();
-				});
-		listener.setObserved(new Packet(dclass, ability), ability, dclass.getLevel(), dclass.getSpellBook().get());
+				
+		listenerPerDay = new IndirectObservableListener<>(prepared, 
+				new AppendSpellLevelOperation(ability, SpellLevelPerDayPanel::new));
+		listenerPerDay.setObserved(dclass, ability, dclass.getLevel(), dclass.getSpellBook().get());
+		listenerKnown = new IndirectObservableListener<>(known, 
+				new AppendSpellLevelOperation(ability, SpellLevelPanel::new));
+		listenerKnown.setObserved(dclass, ability, dclass.getLevel(), dclass.getSpellBook().get());
 	}
-	
-	private void generateSpellTree(final JPanel root, final Function<Integer, JPanel> getPanel) {		
-		for (int i = previousHighestSpellLevel; i < dclass.getHighestSpellLevel(); ++i) {
-			if (dclass.getSpellBook().get().numSpellsKnownAtLevel(i) == 0) break;
-			root.add(getPanel.apply(i));
+
+	@RequiredArgsConstructor
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	private static final class AppendSpellLevelOperation implements BiConsumer<JPanel, DDCharacterClass> {
+		@NonFinal int previousHighestSpellLevel = 0;
+		IntValue ability;
+		TriFunction<DDCharacterClass, Integer, IntValue, JPanel> function;
+
+		@Override
+		public void accept(final JPanel root, final DDCharacterClass dclass) {		
+			for (int i = previousHighestSpellLevel; i < dclass.getHighestSpellLevel(); ++i) {
+				if (dclass.getSpellBook().get().numSpellsKnownAtLevel(i) == 0) break;
+				root.add(function.apply(dclass, i, ability));
+			}
+			previousHighestSpellLevel = dclass.getHighestSpellLevel();
 		}
 	}
-
 }

+ 6 - 0
src/main/lombok/org/leumasjaffe/function/TriFunction.java

@@ -0,0 +1,6 @@
+package org.leumasjaffe.function;
+
+@FunctionalInterface
+public interface TriFunction<A, B, C, R> {
+	R apply(A arg0, B arg1, C arg2);
+}

+ 1 - 0
src/main/lombok/org/leumasjaffe/function/VoidVoidFunction.java

@@ -1,5 +1,6 @@
 package org.leumasjaffe.function;
 
+@FunctionalInterface
 public interface VoidVoidFunction {
 	void apply();
 }

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/controller/inventory/PopClickListener.java

@@ -1,4 +1,4 @@
-package org.leumasjaffe.charsheet.controller.inventory;
+package org.leumasjaffe.graphics;
 
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;