SpellLevelPanel.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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.DDCharacterClass.DDSpellbookWrapper;
  17. import org.leumasjaffe.charsheet.model.magic.DDSpell;
  18. import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
  19. import org.leumasjaffe.observer.IndirectObservableListener;
  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. GridBagLayout gridBagLayout = new GridBagLayout();
  33. gridBagLayout.columnWidths = new int[]{0, 0, 0};
  34. gridBagLayout.rowHeights = new int[]{0, 0, 0, 0};
  35. gridBagLayout.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
  36. gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
  37. setLayout(gridBagLayout);
  38. GridBagConstraints gbc_panel_1 = new GridBagConstraints();
  39. gbc_panel_1.gridwidth = 2;
  40. gbc_panel_1.insets = new Insets(0, 0, 5, 0);
  41. gbc_panel_1.fill = GridBagConstraints.BOTH;
  42. gbc_panel_1.gridx = 0;
  43. gbc_panel_1.gridy = 0;
  44. add(header, gbc_panel_1);
  45. JPanel panel = new JPanel(new VerticalLayout());
  46. GridBagConstraints gbc_panel = new GridBagConstraints();
  47. gbc_panel.insets = new Insets(0, 0, 5, 0);
  48. gbc_panel.fill = GridBagConstraints.BOTH;
  49. gbc_panel.gridx = 1;
  50. gbc_panel.gridy = 1;
  51. add(panel, gbc_panel);
  52. Component horizontalStrut = Box.createHorizontalStrut(20);
  53. GridBagConstraints gbc_horizontalStrut = new GridBagConstraints();
  54. gbc_horizontalStrut.insets = new Insets(0, 0, 0, 5);
  55. gbc_horizontalStrut.gridx = 0;
  56. gbc_horizontalStrut.gridy = 2;
  57. add(horizontalStrut, gbc_horizontalStrut);
  58. final DDSpellbookWrapper wrap = dclass.getSpellBook().get();
  59. listener = new IndirectObservableListener<>(panel, (c, v) -> {
  60. c.removeAll();
  61. {
  62. final DDSpellbook sb = wrap.getMain();
  63. final Collection<DDSpell> spells = getSpells.apply(sb, level);
  64. spells.forEach(spell -> c.add(new SpellLine(chara, v, sb, spell, isCastableFromHere())));
  65. }
  66. wrap.getSecondary().ifPresent(sb -> {
  67. final Collection<DDSpell> spells = getSpells.apply(sb, level);
  68. if (!spells.isEmpty()) c.add(new JSeparator(SwingConstants.HORIZONTAL));
  69. spells.forEach(spell -> c.add(new SpellLine(chara, v, sb, spell, isCastableFromHere())));
  70. });
  71. c.repaint();
  72. c.validate();
  73. });
  74. if (wrap.getSecondary().isPresent()) {
  75. listener.setObserved(dclass, wrap.getMain(), wrap.getSecondary().get());
  76. } else {
  77. listener.setObserved(dclass, wrap.getMain());
  78. }
  79. }
  80. public SpellLevelPanel(DDCharacter chara, DDCharacterClass dclass, int level, Ability.Scores ability) {
  81. this(new SpellsKnownHeader(level, dclass.getSpellBook().get().getMain(), ability),
  82. chara, dclass, level, DDSpellbook::spellsKnownAtLevel);
  83. }
  84. public boolean isCastableFromHere() { return false; }
  85. @Override
  86. public void removeNotify() {
  87. super.removeNotify();
  88. ObserverDispatch.unsubscribeAll(listener);
  89. }
  90. }