package org.leumasjaffe.charsheet.view.skills; 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 javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; 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.DDSkills; import org.leumasjaffe.observer.ObservableListener; import org.leumasjaffe.observer.ObserverDispatch; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.FieldDefaults; import javax.swing.ScrollPaneConstants; @SuppressWarnings("serial") @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public abstract class SkillLevelUpPanel extends JPanel { ObservableListener purchaseListener; @Getter(AccessLevel.PROTECTED) JPanel panel; List lines; public SkillLevelUpPanel(final DDCharacter chara, final DDCharacterClass cclass) { final IntValue pointsAvaliable = new IntValue(Math.max(1, cclass.getSkillPoints() + chara.getAbilities().getInt().baseModifier())); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[]{0, 0}; gridBagLayout.rowHeights = new int[]{0, 0, 0}; gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; gridBagLayout.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; setLayout(gridBagLayout); panel = new JPanel(); GridBagConstraints gbc_panel = new GridBagConstraints(); gbc_panel.insets = new Insets(0, 0, 5, 0); gbc_panel.fill = GridBagConstraints.HORIZONTAL; gbc_panel.gridx = 0; gbc_panel.gridy = 0; add(panel, gbc_panel); GridBagLayout gbl_panel = new GridBagLayout(); gbl_panel.columnWidths = new int[]{0, 0, 0, 0}; gbl_panel.rowHeights = new int[]{0, 0}; gbl_panel.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; panel.setLayout(gbl_panel); JLabel lblPointsRemaining = new JLabel("Points Remaining:"); GridBagConstraints gbc_lblPointsRemaining = new GridBagConstraints(); gbc_lblPointsRemaining.insets = new Insets(0, 0, 0, 5); gbc_lblPointsRemaining.anchor = GridBagConstraints.EAST; gbc_lblPointsRemaining.gridx = 0; gbc_lblPointsRemaining.gridy = 0; panel.add(lblPointsRemaining, gbc_lblPointsRemaining); JTextField pointsRemaining = new JTextField(); pointsRemaining.setEditable(false); GridBagConstraints gbc_pointsRemaining = new GridBagConstraints(); gbc_pointsRemaining.insets = new Insets(0, 0, 0, 5); gbc_pointsRemaining.fill = GridBagConstraints.HORIZONTAL; gbc_pointsRemaining.gridx = 1; gbc_pointsRemaining.gridy = 0; panel.add(pointsRemaining, gbc_pointsRemaining); pointsRemaining.setColumns(10); JScrollPane scrollPane = new JScrollPane(); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); GridBagConstraints gbc_scrollPane = new GridBagConstraints(); gbc_scrollPane.fill = GridBagConstraints.BOTH; gbc_scrollPane.gridx = 0; gbc_scrollPane.gridy = 1; add(scrollPane, gbc_scrollPane); 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 = new NormalSkillLevelUpLine(chara, cclass, skill, pointsAvaliable); skillPanel.add(line); lines.add(line); }); purchaseListener = new ObservableListener<>(pointsRemaining, (c, v) -> { setIsReady(v.value() == 0); c.setText(Integer.toString(v.value())); }); purchaseListener.setObserved(pointsAvaliable); } protected abstract void setIsReady(boolean b); public void commitAllChanges() { lines.forEach(SkillLevelUpLine::applyChange); } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(purchaseListener); } }