|
|
@@ -6,28 +6,33 @@ import javax.swing.JScrollPane;
|
|
|
import java.awt.GridBagConstraints;
|
|
|
import org.jdesktop.swingx.VerticalLayout;
|
|
|
import org.leumasjaffe.charsheet.model.DDCharacter;
|
|
|
+import org.leumasjaffe.charsheet.model.skill.DDSkill;
|
|
|
import org.leumasjaffe.charsheet.model.skill.DDSkills;
|
|
|
import org.leumasjaffe.charsheet.view.skills.SkillLine;
|
|
|
+import org.leumasjaffe.observer.ObservableListener;
|
|
|
+import org.leumasjaffe.observer.ObserverDispatch;
|
|
|
|
|
|
import lombok.AccessLevel;
|
|
|
import lombok.experimental.FieldDefaults;
|
|
|
import java.awt.Dimension;
|
|
|
import java.awt.Insets;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.TreeMap;
|
|
|
+import java.util.stream.Stream;
|
|
|
+
|
|
|
import javax.swing.JLabel;
|
|
|
import javax.swing.JTextField;
|
|
|
import java.awt.Component;
|
|
|
import javax.swing.Box;
|
|
|
|
|
|
+@SuppressWarnings("serial")
|
|
|
@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
public class SkillTab extends JPanel {
|
|
|
- /**
|
|
|
- *
|
|
|
- */
|
|
|
- private static final long serialVersionUID = 1L;
|
|
|
- JPanel skillPanel;
|
|
|
- JTextField txtTotalSkillPoints;
|
|
|
- JTextField txtClassSkills;
|
|
|
- JTextField txtCrossClass;
|
|
|
+
|
|
|
+ ObservableListener<JTextField, DDSkills> totalListener;
|
|
|
+ ObservableListener<JTextField, DDCharacter> classSkillListener;
|
|
|
+ ObservableListener<JTextField, DDCharacter> crossSkillListener;
|
|
|
+ ObservableListener<JPanel, DDCharacter> skillListener;
|
|
|
|
|
|
public SkillTab() {
|
|
|
setPreferredSize(new Dimension(600, 300));
|
|
|
@@ -60,7 +65,7 @@ public class SkillTab extends JPanel {
|
|
|
gbc_lblTotalSkillPoints.gridy = 0;
|
|
|
panel.add(lblTotalSkillPoints, gbc_lblTotalSkillPoints);
|
|
|
|
|
|
- txtTotalSkillPoints = new JTextField();
|
|
|
+ JTextField txtTotalSkillPoints = new JTextField();
|
|
|
txtTotalSkillPoints.setEditable(false);
|
|
|
GridBagConstraints gbc_txtTotalSkillPoints = new GridBagConstraints();
|
|
|
gbc_txtTotalSkillPoints.insets = new Insets(0, 0, 0, 5);
|
|
|
@@ -85,7 +90,7 @@ public class SkillTab extends JPanel {
|
|
|
gbc_lblMaxRanksClasscross.gridy = 0;
|
|
|
panel.add(lblMaxRanksClasscross, gbc_lblMaxRanksClasscross);
|
|
|
|
|
|
- txtClassSkills = new JTextField();
|
|
|
+ JTextField txtClassSkills = new JTextField();
|
|
|
txtClassSkills.setEditable(false);
|
|
|
GridBagConstraints gbc_txtClassSkills = new GridBagConstraints();
|
|
|
gbc_txtClassSkills.insets = new Insets(0, 0, 0, 5);
|
|
|
@@ -103,7 +108,7 @@ public class SkillTab extends JPanel {
|
|
|
gbc_label.gridy = 0;
|
|
|
panel.add(label, gbc_label);
|
|
|
|
|
|
- txtCrossClass = new JTextField();
|
|
|
+ JTextField txtCrossClass = new JTextField();
|
|
|
txtCrossClass.setEditable(false);
|
|
|
GridBagConstraints gbc_txtCrossClass = new GridBagConstraints();
|
|
|
gbc_txtCrossClass.fill = GridBagConstraints.HORIZONTAL;
|
|
|
@@ -119,25 +124,46 @@ public class SkillTab extends JPanel {
|
|
|
gbc_scrollPane.gridy = 1;
|
|
|
add(scrollPane, gbc_scrollPane);
|
|
|
|
|
|
- skillPanel = new JPanel();
|
|
|
+ JPanel skillPanel = new JPanel();
|
|
|
scrollPane.setViewportView(skillPanel);
|
|
|
skillPanel.setLayout(new VerticalLayout());
|
|
|
+
|
|
|
+ totalListener = new ObservableListener<>(txtTotalSkillPoints, (c, v) -> {
|
|
|
+ final int totalPoints = v.getSkills().stream().mapToInt(DDSkill::getPointsSpent).sum();
|
|
|
+ c.setText(Integer.toString(totalPoints));
|
|
|
+ });
|
|
|
+ classSkillListener = new ObservableListener<>(txtClassSkills, (c, v) -> {
|
|
|
+ c.setText(Integer.toString(v.getLevel() + 3));
|
|
|
+ });
|
|
|
+ crossSkillListener = new ObservableListener<>(txtCrossClass, (c, v) -> {
|
|
|
+ c.setText(Integer.toString((v.getLevel() + 3)/2));
|
|
|
+ });
|
|
|
+ Map<String, SkillLine> lines = new TreeMap<>();
|
|
|
+ skillListener = new ObservableListener<>(skillPanel, (c, v) -> {
|
|
|
+ Stream<DDSkill> st = v.getSkills().getSkills().stream().filter(
|
|
|
+ sk -> sk.getPointsSpent() > 0 || !sk.isRequiresTraining());
|
|
|
+ st.forEach(sk -> lines.computeIfAbsent(sk.getName(), k -> new SkillLine(v, sk)));
|
|
|
+ skillPanel.removeAll();
|
|
|
+ lines.values().forEach(skillPanel::add);
|
|
|
+ revalidate();
|
|
|
+ repaint();
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
public void setModel(final DDCharacter model) {
|
|
|
- // TODO (sjaffe): Observables?
|
|
|
- skillPanel.removeAll();
|
|
|
- int[] totalPoints = {0};
|
|
|
- final DDSkills skills = model.getSkills();
|
|
|
- skills.getSkills().stream().filter(sk -> sk.getPointsSpent() > 0 || !sk.isRequiresTraining())
|
|
|
- .forEach( skill -> {
|
|
|
- skillPanel.add(new SkillLine(model, skill));
|
|
|
- totalPoints[0] += skill.getPointsSpent();
|
|
|
- });
|
|
|
- txtTotalSkillPoints.setText(Integer.toString(totalPoints[0]));
|
|
|
- int classSkill = model.getLevel() + 3;
|
|
|
- txtClassSkills.setText(Integer.toString(classSkill));
|
|
|
- txtCrossClass.setText(Integer.toString(classSkill / 2));
|
|
|
+ DDSkills skills = model.getSkills();
|
|
|
+ classSkillListener.setObserved(model);
|
|
|
+ crossSkillListener.setObserved(model);
|
|
|
+ totalListener.setObserved(skills);
|
|
|
+ skillListener.setObserved(model);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void removeNotify() {
|
|
|
+ super.removeNotify();
|
|
|
+ ObserverDispatch.unsubscribeAll(classSkillListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(crossSkillListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(totalListener);
|
|
|
+ ObserverDispatch.unsubscribeAll(skillListener);
|
|
|
+ }
|
|
|
}
|