SpellLevelPanel.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package org.leumasjaffe.charsheet.view.magic;
  2. import javax.swing.JPanel;
  3. import javax.swing.JSeparator;
  4. import javax.swing.SwingConstants;
  5. import java.awt.GridBagLayout;
  6. import java.awt.Component;
  7. import javax.swing.Box;
  8. import java.awt.GridBagConstraints;
  9. import java.awt.Insets;
  10. import java.util.Collection;
  11. import java.util.function.BiFunction;
  12. import org.jdesktop.swingx.VerticalLayout;
  13. import org.leumasjaffe.charsheet.model.Ability;
  14. import org.leumasjaffe.charsheet.model.DDCharacter;
  15. import org.leumasjaffe.charsheet.model.DDCharacterClass;
  16. import org.leumasjaffe.charsheet.model.magic.DDSpell;
  17. import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
  18. import org.leumasjaffe.observer.IndirectObservableListener;
  19. import org.leumasjaffe.observer.Observable;
  20. import org.leumasjaffe.observer.ObserverDispatch;
  21. import lombok.AccessLevel;
  22. import lombok.experimental.FieldDefaults;
  23. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  24. class SpellLevelPanel extends JPanel {
  25. /**
  26. *
  27. */
  28. private static final long serialVersionUID = 1L;
  29. IndirectObservableListener<JPanel, DDCharacterClass> listener;
  30. protected SpellLevelPanel(JPanel header, DDCharacter chara, DDCharacterClass dclass, int level,
  31. BiFunction<DDSpellbook, Integer, Collection<DDSpell>> getSpells) {
  32. // final Map<DDSpellbook, Collection<DDSpell>> spells = new HashMap<>();
  33. // dclass.getSpellBook().forEach(sb -> spells.put(sb, getSpells.apply(sb, level)));
  34. GridBagLayout gridBagLayout = new GridBagLayout();
  35. gridBagLayout.columnWidths = new int[]{0, 0, 0};
  36. gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
  37. gridBagLayout.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
  38. gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
  39. setLayout(gridBagLayout);
  40. GridBagConstraints gbc_panel_1 = new GridBagConstraints();
  41. gbc_panel_1.gridwidth = 2;
  42. gbc_panel_1.insets = new Insets(0, 0, 5, 0);
  43. gbc_panel_1.fill = GridBagConstraints.BOTH;
  44. gbc_panel_1.gridx = 0;
  45. gbc_panel_1.gridy = 0;
  46. add(header, gbc_panel_1);
  47. JPanel panel = new JPanel(new VerticalLayout());
  48. GridBagConstraints gbc_panel = new GridBagConstraints();
  49. gbc_panel.insets = new Insets(0, 0, 5, 0);
  50. gbc_panel.fill = GridBagConstraints.BOTH;
  51. gbc_panel.gridx = 1;
  52. gbc_panel.gridy = 1;
  53. add(panel, gbc_panel);
  54. Component horizontalStrut = Box.createHorizontalStrut(20);
  55. GridBagConstraints gbc_horizontalStrut = new GridBagConstraints();
  56. gbc_horizontalStrut.insets = new Insets(0, 0, 0, 5);
  57. gbc_horizontalStrut.gridx = 0;
  58. gbc_horizontalStrut.gridy = 2;
  59. add(horizontalStrut, gbc_horizontalStrut);
  60. listener = new IndirectObservableListener<>(panel, (c, v) -> {
  61. c.removeAll();
  62. for (int i = 0; i < dclass.getSpellBook().size(); ++i) {
  63. final DDSpellbook sb = dclass.getSpellBook().get(i);
  64. final Collection<DDSpell> spells = getSpells.apply(sb, level);
  65. if (spells.isEmpty()) continue;
  66. if (i != 0) c.add(new JSeparator(SwingConstants.HORIZONTAL));
  67. spells.forEach(spell -> c.add(new SpellLine(chara, v, sb, spell, isCastableFromHere())));
  68. }
  69. c.repaint();
  70. });
  71. listener.setObserved(dclass, dclass.getSpellBook().toArray(new Observable[0]));
  72. }
  73. public SpellLevelPanel(DDCharacter chara, DDCharacterClass dclass, int level, Ability.Scores ability) {
  74. // TODO figure out what to do about that get(0)
  75. this(new SpellsKnownHeader(level, dclass.getSpellBook().get(0), ability),
  76. chara, dclass, level, DDSpellbook::spellsKnownAtLevel);
  77. }
  78. public boolean isCastableFromHere() { return false; }
  79. @Override
  80. public void removeNotify() {
  81. super.removeNotify();
  82. ObserverDispatch.unsubscribeAll(listener);
  83. }
  84. }