|
|
@@ -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();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|