SpellPanel.java 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package org.leumasjaffe.charsheet.view.magic;
  2. import javax.swing.JPanel;
  3. import javax.swing.JScrollPane;
  4. import java.awt.GridBagLayout;
  5. import java.util.function.BiConsumer;
  6. import javax.swing.JTabbedPane;
  7. import org.jdesktop.swingx.VerticalLayout;
  8. import org.leumasjaffe.charsheet.model.Ability;
  9. import org.leumasjaffe.charsheet.model.DDCharacter;
  10. import org.leumasjaffe.charsheet.model.DDCharacterClass;
  11. import org.leumasjaffe.charsheet.util.AbilityHelper;
  12. import org.leumasjaffe.function.QuadFunction;
  13. import org.leumasjaffe.observer.IndirectObservableListener;
  14. import org.leumasjaffe.observer.ObserverDispatch;
  15. import lombok.AccessLevel;
  16. import lombok.RequiredArgsConstructor;
  17. import lombok.experimental.FieldDefaults;
  18. import lombok.experimental.NonFinal;
  19. import java.awt.GridBagConstraints;
  20. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  21. public class SpellPanel extends JPanel {
  22. /**
  23. *
  24. */
  25. private static final long serialVersionUID = 1L;
  26. IndirectObservableListener<JPanel, DDCharacterClass> listenerPerDay, listenerKnown;
  27. public SpellPanel(DDCharacter chara, final DDCharacterClass dclass) {
  28. GridBagLayout gridBagLayout = new GridBagLayout();
  29. gridBagLayout.columnWidths = new int[]{0, 0};
  30. gridBagLayout.rowHeights = new int[]{0, 0};
  31. gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
  32. gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
  33. setLayout(gridBagLayout);
  34. JTabbedPane spellsPane = new JTabbedPane(JTabbedPane.TOP);
  35. GridBagConstraints gbc_spells = new GridBagConstraints();
  36. gbc_spells.fill = GridBagConstraints.BOTH;
  37. gbc_spells.gridx = 0;
  38. gbc_spells.gridy = 0;
  39. add(spellsPane, gbc_spells);
  40. JScrollPane preparedPane = new JScrollPane();
  41. spellsPane.addTab("Prepared", null, preparedPane, "Spells the character can use today");
  42. JScrollPane knownPane = new JScrollPane();
  43. spellsPane.addTab("Known", null, knownPane, "Spells the player knows for this class");
  44. final Ability.Scores ability = AbilityHelper.get(chara, dclass);
  45. final JPanel prepared = new JPanel(new VerticalLayout());
  46. preparedPane.setViewportView(prepared);
  47. final JPanel known = new JPanel(new VerticalLayout());
  48. knownPane.setViewportView(known);
  49. listenerPerDay = new IndirectObservableListener<>(prepared,
  50. new AppendSpellLevelOperation(chara, ability, SpellLevelPerDayPanel::new));
  51. listenerPerDay.setObserved(dclass, ability, dclass.getLevel(), dclass.getSpellBook().get());
  52. listenerKnown = new IndirectObservableListener<>(known,
  53. new AppendSpellLevelOperation(chara, ability, SpellLevelPanel::new));
  54. listenerKnown.setObserved(dclass, ability, dclass.getLevel(), dclass.getSpellBook().get());
  55. }
  56. @RequiredArgsConstructor
  57. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  58. private static final class AppendSpellLevelOperation implements BiConsumer<JPanel, DDCharacterClass> {
  59. @NonFinal int previousHighestSpellLevel = 0;
  60. DDCharacter chara;
  61. Ability.Scores ability;
  62. QuadFunction<DDCharacter, DDCharacterClass, Integer, Ability.Scores, JPanel> function;
  63. @Override
  64. public void accept(final JPanel root, final DDCharacterClass dclass) {
  65. for (int i = previousHighestSpellLevel; i < dclass.getHighestSpellLevel(); ++i) {
  66. if (dclass.getSpellBook().get().numSpellsKnownAtLevel(i) == 0) break;
  67. root.add(function.apply(chara, dclass, i, ability));
  68. }
  69. previousHighestSpellLevel = dclass.getHighestSpellLevel();
  70. }
  71. }
  72. @Override
  73. public void removeNotify() {
  74. super.removeNotify();
  75. ObserverDispatch.unsubscribeAll(listenerKnown);
  76. ObserverDispatch.unsubscribeAll(listenerPerDay);
  77. }
  78. }