ResistanceLine.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package org.leumasjaffe.charsheet.view.summary;
  2. import javax.swing.JPanel;
  3. import java.awt.GridBagLayout;
  4. import javax.swing.JLabel;
  5. import java.awt.GridBagConstraints;
  6. import java.awt.Color;
  7. import javax.swing.border.LineBorder;
  8. import org.leumasjaffe.charsheet.model.Ability;
  9. import org.leumasjaffe.charsheet.model.DDCharacter;
  10. import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
  11. import org.leumasjaffe.format.StringHelper;
  12. import org.leumasjaffe.graphics.NumberTextField;
  13. import org.leumasjaffe.observer.IndirectObservableListener;
  14. import org.leumasjaffe.observer.ObservableListener;
  15. import org.leumasjaffe.observer.ObserverDispatch;
  16. import lombok.AccessLevel;
  17. import lombok.experimental.FieldDefaults;
  18. import java.awt.Font;
  19. import javax.swing.SwingConstants;
  20. import java.awt.Dimension;
  21. import javax.swing.JTextField;
  22. import java.awt.Insets;
  23. import java.util.function.Function;
  24. import javax.swing.JFormattedTextField;
  25. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  26. public class ResistanceLine extends JPanel {
  27. /**
  28. *
  29. */
  30. private static final long serialVersionUID = 1L;
  31. Function<Ability, Ability.Scores> access;
  32. IndirectObservableListener<JTextField, DDCharacter> totalObserver;
  33. IndirectObservableListener<JTextField, DDCharacter> baseObserver;
  34. ObservableListener<JTextField, Ability.Scores> abilObserver;
  35. public ResistanceLine(final String name, Function<DDCharacter, Integer> save,
  36. Function<Ability, Ability.Scores> func) {
  37. this.access = func;
  38. setMinimumSize(new Dimension(400, 25));
  39. setMaximumSize(new Dimension(400, 25));
  40. setPreferredSize(new Dimension(400, 25));
  41. setOpaque(false);
  42. GridBagLayout gridBagLayout = new GridBagLayout();
  43. gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  44. gridBagLayout.rowHeights = new int[]{0, 0};
  45. gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
  46. gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
  47. setLayout(gridBagLayout);
  48. JLabel label = new JLabel(name.toUpperCase());
  49. label.setPreferredSize(new Dimension(120, 25));
  50. label.setOpaque(true);
  51. label.setMinimumSize(new Dimension(120, 25));
  52. label.setMaximumSize(new Dimension(120, 25));
  53. label.setHorizontalAlignment(SwingConstants.CENTER);
  54. label.setForeground(Color.WHITE);
  55. label.setFont(new Font("Tahoma", Font.BOLD, 18));
  56. label.setBorder(new LineBorder(Color.WHITE));
  57. label.setBackground(Color.BLACK);
  58. GridBagConstraints gbc_label = new GridBagConstraints();
  59. gbc_label.fill = GridBagConstraints.HORIZONTAL;
  60. gbc_label.insets = new Insets(0, 0, 0, 3);
  61. gbc_label.gridx = 0;
  62. gbc_label.gridy = 0;
  63. add(label, gbc_label);
  64. JTextField totalField = new JTextField();
  65. totalField.setToolTipText("Saving Throw");
  66. totalField.setPreferredSize(new Dimension(30, 20));
  67. totalField.setMinimumSize(new Dimension(30, 20));
  68. totalField.setMaximumSize(new Dimension(30, 20));
  69. totalField.setHorizontalAlignment(SwingConstants.CENTER);
  70. totalField.setEditable(false);
  71. totalField.setColumns(3);
  72. totalField.setBorder(new LineBorder(Color.BLACK));
  73. GridBagConstraints gbc_total = new GridBagConstraints();
  74. gbc_total.insets = new Insets(0, 0, 0, 3);
  75. gbc_total.fill = GridBagConstraints.HORIZONTAL;
  76. gbc_total.gridx = 1;
  77. gbc_total.gridy = 0;
  78. add(totalField, gbc_total);
  79. JLabel label_1 = new JLabel("=");
  80. GridBagConstraints gbc_label_1 = new GridBagConstraints();
  81. gbc_label_1.anchor = GridBagConstraints.EAST;
  82. gbc_label_1.insets = new Insets(0, 0, 0, 3);
  83. gbc_label_1.gridx = 2;
  84. gbc_label_1.gridy = 0;
  85. add(label_1, gbc_label_1);
  86. JFormattedTextField baseSaveField = new NumberTextField();
  87. baseSaveField.setEditable(false);
  88. baseSaveField.setToolTipText("Base Save");
  89. baseSaveField.setPreferredSize(new Dimension(30, 20));
  90. baseSaveField.setMinimumSize(new Dimension(30, 20));
  91. baseSaveField.setMaximumSize(new Dimension(30, 20));
  92. baseSaveField.setHorizontalAlignment(SwingConstants.CENTER);
  93. baseSaveField.setColumns(3);
  94. baseSaveField.setBorder(new LineBorder(Color.BLACK));
  95. GridBagConstraints gbc_baseSave = new GridBagConstraints();
  96. gbc_baseSave.insets = new Insets(0, 0, 0, 3);
  97. gbc_baseSave.fill = GridBagConstraints.HORIZONTAL;
  98. gbc_baseSave.gridx = 3;
  99. gbc_baseSave.gridy = 0;
  100. add(baseSaveField, gbc_baseSave);
  101. JLabel label_2 = new JLabel("+");
  102. GridBagConstraints gbc_label_2 = new GridBagConstraints();
  103. gbc_label_2.insets = new Insets(0, 0, 0, 3);
  104. gbc_label_2.anchor = GridBagConstraints.EAST;
  105. gbc_label_2.gridx = 4;
  106. gbc_label_2.gridy = 0;
  107. add(label_2, gbc_label_2);
  108. JTextField abilityField = new JTextField();
  109. abilityField.setToolTipText("Ability Modifier");
  110. abilityField.setPreferredSize(new Dimension(30, 20));
  111. abilityField.setMinimumSize(new Dimension(30, 20));
  112. abilityField.setMaximumSize(new Dimension(30, 20));
  113. abilityField.setHorizontalAlignment(SwingConstants.CENTER);
  114. abilityField.setEditable(false);
  115. abilityField.setColumns(3);
  116. abilityField.setBorder(new LineBorder(Color.BLACK));
  117. GridBagConstraints gbc_ability = new GridBagConstraints();
  118. gbc_ability.insets = new Insets(0, 0, 0, 3);
  119. gbc_ability.fill = GridBagConstraints.HORIZONTAL;
  120. gbc_ability.gridx = 5;
  121. gbc_ability.gridy = 0;
  122. add(abilityField, gbc_ability);
  123. JLabel label_3 = new JLabel("+");
  124. GridBagConstraints gbc_label_3 = new GridBagConstraints();
  125. gbc_label_3.anchor = GridBagConstraints.EAST;
  126. gbc_label_3.insets = new Insets(0, 0, 0, 3);
  127. gbc_label_3.gridx = 6;
  128. gbc_label_3.gridy = 0;
  129. add(label_3, gbc_label_3);
  130. JFormattedTextField magicField = new NumberTextField();
  131. magicField.setToolTipText("Magic Modifier");
  132. magicField.setPreferredSize(new Dimension(30, 20));
  133. magicField.setMinimumSize(new Dimension(30, 20));
  134. magicField.setMaximumSize(new Dimension(30, 20));
  135. magicField.setHorizontalAlignment(SwingConstants.CENTER);
  136. magicField.setColumns(3);
  137. magicField.setBorder(new LineBorder(Color.BLACK));
  138. GridBagConstraints gbc_magic = new GridBagConstraints();
  139. gbc_magic.insets = new Insets(0, 0, 0, 3);
  140. gbc_magic.fill = GridBagConstraints.HORIZONTAL;
  141. gbc_magic.gridx = 7;
  142. gbc_magic.gridy = 0;
  143. add(magicField, gbc_magic);
  144. JLabel label_4 = new JLabel("+");
  145. GridBagConstraints gbc_label_4 = new GridBagConstraints();
  146. gbc_label_4.anchor = GridBagConstraints.EAST;
  147. gbc_label_4.insets = new Insets(0, 0, 0, 3);
  148. gbc_label_4.gridx = 8;
  149. gbc_label_4.gridy = 0;
  150. add(label_4, gbc_label_4);
  151. JFormattedTextField miscField = new NumberTextField();
  152. miscField.setToolTipText("Miscellaneous Modifier");
  153. miscField.setPreferredSize(new Dimension(30, 20));
  154. miscField.setMinimumSize(new Dimension(30, 20));
  155. miscField.setMaximumSize(new Dimension(30, 20));
  156. miscField.setHorizontalAlignment(SwingConstants.CENTER);
  157. miscField.setColumns(3);
  158. miscField.setBorder(new LineBorder(Color.BLACK));
  159. GridBagConstraints gbc_misc = new GridBagConstraints();
  160. gbc_misc.insets = new Insets(0, 0, 0, 3);
  161. gbc_misc.fill = GridBagConstraints.HORIZONTAL;
  162. gbc_misc.gridx = 9;
  163. gbc_misc.gridy = 0;
  164. add(miscField, gbc_misc);
  165. JLabel label_5 = new JLabel("+");
  166. GridBagConstraints gbc_label_5 = new GridBagConstraints();
  167. gbc_label_5.insets = new Insets(0, 0, 0, 3);
  168. gbc_label_5.anchor = GridBagConstraints.EAST;
  169. gbc_label_5.gridx = 10;
  170. gbc_label_5.gridy = 0;
  171. add(label_5, gbc_label_5);
  172. JPanel panel = new JPanel();
  173. panel.setBackground(Color.LIGHT_GRAY);
  174. panel.setPreferredSize(new Dimension(45, 25));
  175. GridBagConstraints gbc_panel = new GridBagConstraints();
  176. gbc_panel.fill = GridBagConstraints.BOTH;
  177. gbc_panel.gridx = 11;
  178. gbc_panel.gridy = 0;
  179. add(panel, gbc_panel);
  180. GridBagLayout gbl_panel = new GridBagLayout();
  181. gbl_panel.columnWidths = new int[]{0, 0};
  182. gbl_panel.rowHeights = new int[]{0, 0};
  183. gbl_panel.columnWeights = new double[]{0.0, Double.MIN_VALUE};
  184. gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
  185. panel.setLayout(gbl_panel);
  186. NumberTextField tempField = new NumberTextField();
  187. tempField.setToolTipText("Temporary Modifier");
  188. tempField.setPreferredSize(new Dimension(30, 20));
  189. tempField.setMinimumSize(new Dimension(30, 20));
  190. tempField.setMaximumSize(new Dimension(30, 20));
  191. tempField.setHorizontalAlignment(SwingConstants.CENTER);
  192. tempField.setColumns(3);
  193. tempField.setBorder(new LineBorder(Color.BLACK));
  194. GridBagConstraints gbc_temp = new GridBagConstraints();
  195. gbc_temp.insets = new Insets(3, 3, 0, 3);
  196. gbc_temp.gridx = 0;
  197. gbc_temp.gridy = 0;
  198. panel.add(tempField, gbc_temp);
  199. totalObserver = new IndirectObservableListener<>(totalField,
  200. (c, v) -> {
  201. final int base = save.apply(v);
  202. final int abil = access.apply(v.getAbilities()).modifier();
  203. final int magic = 0;
  204. final int misc = 0;
  205. final int temp = 0;
  206. c.setText(StringHelper.toString(base + abil + magic + misc + temp));
  207. });
  208. baseObserver = new IndirectObservableListener<>(baseSaveField,
  209. (c, v) -> c.setText(StringHelper.toString(save.apply(v))));
  210. abilObserver = new ObservableListener<>(abilityField,
  211. new AbilModStringify());
  212. }
  213. public void setModel(DDCharacter model) {
  214. final Ability.Scores abil = access.apply(model.getAbilities());
  215. totalObserver.setObserved(model, model, abil);
  216. baseObserver.setObserved(model, model, abil);
  217. abilObserver.setObserved(abil);
  218. }
  219. @Override
  220. public void removeNotify() {
  221. super.removeNotify();
  222. ObserverDispatch.unsubscribeAll(totalObserver);
  223. ObserverDispatch.unsubscribeAll(baseObserver);
  224. ObserverDispatch.unsubscribeAll(abilObserver);
  225. }
  226. }