|
@@ -3,6 +3,7 @@ package org.leumasjaffe.charsheet.view.magic;
|
|
|
import java.awt.GridBagConstraints;
|
|
import java.awt.GridBagConstraints;
|
|
|
import java.awt.GridBagLayout;
|
|
import java.awt.GridBagLayout;
|
|
|
import java.awt.Insets;
|
|
import java.awt.Insets;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JLabel;
|
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JPanel;
|
|
@@ -10,10 +11,12 @@ import javax.swing.JTextField;
|
|
|
|
|
|
|
|
import org.leumasjaffe.charsheet.model.Ability;
|
|
import org.leumasjaffe.charsheet.model.Ability;
|
|
|
import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
|
|
import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
|
|
|
-import org.leumasjaffe.observer.ObservableListener;
|
|
|
|
|
|
|
+import org.leumasjaffe.observer.IndirectObservableListener;
|
|
|
|
|
+import org.leumasjaffe.observer.Observable;
|
|
|
import org.leumasjaffe.observer.ObserverDispatch;
|
|
import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
|
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.Dimension;
|
|
|
|
|
+import javax.swing.SwingConstants;
|
|
|
|
|
|
|
|
class SpellsPerDayHeader extends JPanel {
|
|
class SpellsPerDayHeader extends JPanel {
|
|
|
/**
|
|
/**
|
|
@@ -21,12 +24,12 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
*/
|
|
*/
|
|
|
private static final long serialVersionUID = 1L;
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
|
|
|
|
- ObservableListener<JTextField, DDSpellbook> listener;
|
|
|
|
|
|
|
+ IndirectObservableListener<JTextField, List<DDSpellbook>> listener;
|
|
|
|
|
|
|
|
- public SpellsPerDayHeader(int level, DDSpellbook model, Ability.Scores ability) {
|
|
|
|
|
|
|
+ public SpellsPerDayHeader(int level, List<DDSpellbook> model, Ability.Scores ability) {
|
|
|
setPreferredSize(new Dimension(350, 20));
|
|
setPreferredSize(new Dimension(350, 20));
|
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
|
- gridBagLayout.columnWidths = new int[]{0, 30, 0, 30, 0, 30, 0, 30, 0, 0};
|
|
|
|
|
|
|
+ gridBagLayout.columnWidths = new int[]{0, 30, 0, 35, 0, 45, 0, 45, 0, 0};
|
|
|
gridBagLayout.rowHeights = new int[]{0, 0};
|
|
gridBagLayout.rowHeights = new int[]{0, 0};
|
|
|
gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
|
|
gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
|
|
|
gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
|
|
gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
|
|
@@ -41,6 +44,7 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
add(lblSpellLevel, gbc_lblSpellLevel);
|
|
add(lblSpellLevel, gbc_lblSpellLevel);
|
|
|
|
|
|
|
|
JTextField textFieldLevel = new JTextField(Integer.toString(level));
|
|
JTextField textFieldLevel = new JTextField(Integer.toString(level));
|
|
|
|
|
+ textFieldLevel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
textFieldLevel.setEditable(false);
|
|
textFieldLevel.setEditable(false);
|
|
|
GridBagConstraints gbc_textFieldLevel = new GridBagConstraints();
|
|
GridBagConstraints gbc_textFieldLevel = new GridBagConstraints();
|
|
|
gbc_textFieldLevel.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_textFieldLevel.fill = GridBagConstraints.HORIZONTAL;
|
|
@@ -59,6 +63,7 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
add(lblSaveDc, gbc_lblSaveDc);
|
|
add(lblSaveDc, gbc_lblSaveDc);
|
|
|
|
|
|
|
|
JTextField textFieldSpellSave = new JTextField(Integer.toString(10 + level + ability.modifier()));
|
|
JTextField textFieldSpellSave = new JTextField(Integer.toString(10 + level + ability.modifier()));
|
|
|
|
|
+ textFieldSpellSave.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
textFieldSpellSave.setEditable(false);
|
|
textFieldSpellSave.setEditable(false);
|
|
|
textFieldSpellSave.setColumns(10);
|
|
textFieldSpellSave.setColumns(10);
|
|
|
GridBagConstraints gbc_textFieldSpellSave = new GridBagConstraints();
|
|
GridBagConstraints gbc_textFieldSpellSave = new GridBagConstraints();
|
|
@@ -76,6 +81,7 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
add(lblSpellsPerDay, gbc_lblSpellsPerDay);
|
|
add(lblSpellsPerDay, gbc_lblSpellsPerDay);
|
|
|
|
|
|
|
|
JTextField textFieldRemaining = new JTextField();
|
|
JTextField textFieldRemaining = new JTextField();
|
|
|
|
|
+ textFieldRemaining.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
GridBagConstraints gbc_textFieldRemaining = new GridBagConstraints();
|
|
GridBagConstraints gbc_textFieldRemaining = new GridBagConstraints();
|
|
|
gbc_textFieldRemaining.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_textFieldRemaining.fill = GridBagConstraints.HORIZONTAL;
|
|
|
gbc_textFieldRemaining.insets = new Insets(0, 0, 0, 5);
|
|
gbc_textFieldRemaining.insets = new Insets(0, 0, 0, 5);
|
|
@@ -92,7 +98,8 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
gbc_label.gridy = 0;
|
|
gbc_label.gridy = 0;
|
|
|
add(label, gbc_label);
|
|
add(label, gbc_label);
|
|
|
|
|
|
|
|
- JTextField textFieldOutOf = new JTextField(Integer.toString(model.numSpellsPerDayAtLevel(level)));
|
|
|
|
|
|
|
+ JTextField textFieldOutOf = new JTextField(getSpellPerDayListing(level, model));
|
|
|
|
|
+ textFieldOutOf.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
GridBagConstraints gbc_textFieldOutOf = new GridBagConstraints();
|
|
GridBagConstraints gbc_textFieldOutOf = new GridBagConstraints();
|
|
|
gbc_textFieldOutOf.insets = new Insets(0, 0, 0, 5);
|
|
gbc_textFieldOutOf.insets = new Insets(0, 0, 0, 5);
|
|
|
gbc_textFieldOutOf.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_textFieldOutOf.fill = GridBagConstraints.HORIZONTAL;
|
|
@@ -102,12 +109,17 @@ class SpellsPerDayHeader extends JPanel {
|
|
|
textFieldOutOf.setEditable(false);
|
|
textFieldOutOf.setEditable(false);
|
|
|
textFieldOutOf.setColumns(10);
|
|
textFieldOutOf.setColumns(10);
|
|
|
|
|
|
|
|
- listener = new ObservableListener<JTextField, DDSpellbook>(textFieldRemaining, (c, v) -> {
|
|
|
|
|
- c.setText(Integer.toString(v.numSpellsPerDayRemainingAtLevel(level)));
|
|
|
|
|
|
|
+ listener = new IndirectObservableListener<JTextField, List<DDSpellbook>>(textFieldRemaining, (c, v) -> {
|
|
|
|
|
+ c.setText(getSpellPerDayListing(level, v));
|
|
|
});
|
|
});
|
|
|
- listener.setObserved(model);
|
|
|
|
|
|
|
+ listener.setObserved(model, model.toArray(new Observable[0]));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private String getSpellPerDayListing(int level, List<DDSpellbook> model) {
|
|
|
|
|
+ return model.stream().mapToInt(sb -> sb.numSpellsPerDayAtLevel(level))
|
|
|
|
|
+ .mapToObj(Integer::toString).reduce("", (l, r) -> l.isEmpty() ? r : l + "+" + r);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public void removeNotify() {
|
|
public void removeNotify() {
|
|
|
super.removeNotify();
|
|
super.removeNotify();
|