|
|
@@ -4,8 +4,8 @@ import java.awt.Dimension;
|
|
|
import java.awt.GridBagConstraints;
|
|
|
import java.awt.GridBagLayout;
|
|
|
import java.awt.Insets;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.TreeMap;
|
|
|
|
|
|
import javax.swing.JLabel;
|
|
|
import javax.swing.JPanel;
|
|
|
@@ -16,6 +16,7 @@ import org.jdesktop.swingx.VerticalLayout;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacter;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacterClass;
|
|
|
import org.leumasjaffe.charsheet.model.observable.IntValue;
|
|
|
+import org.leumasjaffe.charsheet.model.skill.DDSkill;
|
|
|
import org.leumasjaffe.charsheet.model.skill.DDSkills;
|
|
|
import org.leumasjaffe.observer.ObservableListener;
|
|
|
import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
@@ -29,12 +30,23 @@ import javax.swing.ScrollPaneConstants;
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
public abstract class SkillLevelUpPanel extends JPanel {
|
|
|
ObservableListener<JTextField, IntValue> purchaseListener;
|
|
|
+ ObservableListener<SkillLevelUpPanel, DDSkills> listener;
|
|
|
+
|
|
|
@Getter(AccessLevel.PROTECTED) JPanel panel;
|
|
|
- List<SkillLevelUpLine> lines;
|
|
|
+ JPanel skillPanel;
|
|
|
+ Map<String, SkillLevelUpLine> lines = new TreeMap<>();
|
|
|
+
|
|
|
+ DDCharacter ddChara;
|
|
|
+ DDCharacterClass ddClass;
|
|
|
+ DDSkills skills;
|
|
|
+ IntValue pointsAvailable;
|
|
|
|
|
|
public SkillLevelUpPanel(final DDCharacter chara, final DDCharacterClass cclass) {
|
|
|
- final IntValue pointsAvailable = new IntValue(Math.max(1, cclass.getSkillPoints() +
|
|
|
- chara.getAbilities().getInt().baseModifier()));
|
|
|
+ this.ddChara = chara;
|
|
|
+ this.ddClass = cclass;
|
|
|
+ this.skills = ddChara.getSkills();
|
|
|
+ this.pointsAvailable = new IntValue(Math.max(1, ddClass.getSkillPoints() +
|
|
|
+ ddChara.getAbilities().getInt().baseModifier()));
|
|
|
|
|
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
|
|
gridBagLayout.columnWidths = new int[]{0, 0};
|
|
|
@@ -83,20 +95,19 @@ public abstract class SkillLevelUpPanel extends JPanel {
|
|
|
gbc_scrollPane.gridy = 1;
|
|
|
add(scrollPane, gbc_scrollPane);
|
|
|
|
|
|
- JPanel skillPanel = new JPanel();
|
|
|
+ skillPanel = new JPanel();
|
|
|
scrollPane.setPreferredSize(new Dimension(480, 300));
|
|
|
scrollPane.setViewportView(skillPanel);
|
|
|
skillPanel.setLayout(new VerticalLayout());
|
|
|
-
|
|
|
- lines = new ArrayList<>();
|
|
|
- final DDSkills skills = chara.getSkills();
|
|
|
- skills.getSkills().stream().forEach(skill -> {
|
|
|
- SkillLevelUpLine line = skill.isWildcardSkill()
|
|
|
- ? new WildcardSkillLevelUpLine(chara, cclass, skills, skill)
|
|
|
- : new NormalSkillLevelUpLine(chara, cclass, skill, pointsAvailable);
|
|
|
- skillPanel.add(line);
|
|
|
- lines.add(line);
|
|
|
+
|
|
|
+ listener = new ObservableListener<>(this, (c, v) -> {
|
|
|
+ v.getSkills().stream().forEach(skill -> {
|
|
|
+ c.lines.computeIfAbsent(skill.getName(), k -> createSkillLine(skill));
|
|
|
+ });
|
|
|
+ c.skillPanel.removeAll();
|
|
|
+ c.lines.values().forEach(c.skillPanel::add);
|
|
|
});
|
|
|
+ listener.setObserved(skills);
|
|
|
|
|
|
purchaseListener = new ObservableListener<>(pointsRemaining, (c, v) -> {
|
|
|
setIsReady(v.value() == 0);
|
|
|
@@ -104,11 +115,17 @@ public abstract class SkillLevelUpPanel extends JPanel {
|
|
|
});
|
|
|
purchaseListener.setObserved(pointsAvailable);
|
|
|
}
|
|
|
+
|
|
|
+ private SkillLevelUpLine createSkillLine(DDSkill skill) {
|
|
|
+ return skill.isWildcardSkill()
|
|
|
+ ? new WildcardSkillLevelUpLine(ddChara, ddClass, skills, skill)
|
|
|
+ : new NormalSkillLevelUpLine(ddChara, ddClass, skill, pointsAvailable);
|
|
|
+ }
|
|
|
|
|
|
protected abstract void setIsReady(boolean b);
|
|
|
|
|
|
public void commitAllChanges() {
|
|
|
- lines.forEach(SkillLevelUpLine::applyChange);
|
|
|
+ lines.values().forEach(SkillLevelUpLine::applyChange);
|
|
|
}
|
|
|
|
|
|
@Override
|