InitiativeLine.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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.config.Constants;
  9. import org.leumasjaffe.charsheet.model.Ability;
  10. import org.leumasjaffe.charsheet.model.DDCharacter;
  11. import org.leumasjaffe.charsheet.model.features.GroupedBonus;
  12. import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
  13. import org.leumasjaffe.collections.Tree;
  14. import org.leumasjaffe.format.StringHelper;
  15. import org.leumasjaffe.observer.IndirectObservableListener;
  16. import org.leumasjaffe.observer.ObservableListener;
  17. import org.leumasjaffe.observer.ObserverDispatch;
  18. import lombok.AccessLevel;
  19. import lombok.experimental.FieldDefaults;
  20. import java.awt.Font;
  21. import javax.swing.SwingConstants;
  22. import java.awt.Dimension;
  23. import javax.swing.JTextField;
  24. import java.awt.Insets;
  25. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  26. public class InitiativeLine extends JPanel {
  27. /**
  28. *
  29. */
  30. private static final long serialVersionUID = 1L;
  31. IndirectObservableListener<JTextField, DDCharacter> ttlObserver;
  32. ObservableListener<JTextField, Ability.Scores> dexObserver;
  33. ObservableListener<JTextField, DDCharacter> tempObserver;
  34. public InitiativeLine() {
  35. setOpaque(false);
  36. GridBagLayout gridBagLayout = new GridBagLayout();
  37. gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0};
  38. gridBagLayout.rowHeights = new int[]{0, 0};
  39. gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
  40. gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
  41. setLayout(gridBagLayout);
  42. JLabel lblInitiative = new JLabel("INITIATIVE");
  43. lblInitiative.setToolTipText("");
  44. lblInitiative.setPreferredSize(new Dimension(120, 25));
  45. lblInitiative.setOpaque(true);
  46. lblInitiative.setMinimumSize(new Dimension(50, 25));
  47. lblInitiative.setMaximumSize(new Dimension(50, 25));
  48. lblInitiative.setHorizontalAlignment(SwingConstants.CENTER);
  49. lblInitiative.setForeground(Color.WHITE);
  50. lblInitiative.setFont(new Font("Tahoma", Font.BOLD, 18));
  51. lblInitiative.setBorder(new LineBorder(Color.WHITE));
  52. lblInitiative.setBackground(Color.BLACK);
  53. GridBagConstraints gbc_lblInitiative = new GridBagConstraints();
  54. gbc_lblInitiative.insets = new Insets(0, 0, 0, 5);
  55. gbc_lblInitiative.anchor = GridBagConstraints.EAST;
  56. gbc_lblInitiative.gridx = 0;
  57. gbc_lblInitiative.gridy = 0;
  58. add(lblInitiative, gbc_lblInitiative);
  59. JTextField total = new JTextField();
  60. total.setToolTipText("Total Initiative");
  61. total.setPreferredSize(new Dimension(30, 20));
  62. total.setMinimumSize(new Dimension(30, 20));
  63. total.setMaximumSize(new Dimension(30, 20));
  64. total.setHorizontalAlignment(SwingConstants.CENTER);
  65. total.setEditable(false);
  66. total.setColumns(3);
  67. total.setBorder(new LineBorder(Color.BLACK));
  68. GridBagConstraints gbc_total = new GridBagConstraints();
  69. gbc_total.insets = new Insets(0, 0, 0, 5);
  70. gbc_total.fill = GridBagConstraints.HORIZONTAL;
  71. gbc_total.gridx = 1;
  72. gbc_total.gridy = 0;
  73. add(total, gbc_total);
  74. JLabel label = new JLabel("=");
  75. GridBagConstraints gbc_label = new GridBagConstraints();
  76. gbc_label.insets = new Insets(0, 0, 0, 5);
  77. gbc_label.anchor = GridBagConstraints.EAST;
  78. gbc_label.gridx = 2;
  79. gbc_label.gridy = 0;
  80. add(label, gbc_label);
  81. JTextField dex = new JTextField();
  82. dex.setToolTipText("Dexterity Modifier");
  83. dex.setPreferredSize(new Dimension(30, 20));
  84. dex.setMinimumSize(new Dimension(30, 20));
  85. dex.setMaximumSize(new Dimension(30, 20));
  86. dex.setHorizontalAlignment(SwingConstants.CENTER);
  87. dex.setEditable(false);
  88. dex.setColumns(3);
  89. dex.setBorder(new LineBorder(Color.BLACK));
  90. GridBagConstraints gbc_dex = new GridBagConstraints();
  91. gbc_dex.insets = new Insets(0, 0, 0, 5);
  92. gbc_dex.fill = GridBagConstraints.HORIZONTAL;
  93. gbc_dex.gridx = 3;
  94. gbc_dex.gridy = 0;
  95. add(dex, gbc_dex);
  96. JLabel label_1 = new JLabel("+");
  97. GridBagConstraints gbc_label_1 = new GridBagConstraints();
  98. gbc_label_1.insets = new Insets(0, 0, 0, 5);
  99. gbc_label_1.anchor = GridBagConstraints.EAST;
  100. gbc_label_1.gridx = 4;
  101. gbc_label_1.gridy = 0;
  102. add(label_1, gbc_label_1);
  103. JTextField misc = new JTextField();
  104. misc.setToolTipText("Miscellaneous Modifier");
  105. misc.setPreferredSize(new Dimension(30, 20));
  106. misc.setMinimumSize(new Dimension(30, 20));
  107. misc.setMaximumSize(new Dimension(30, 20));
  108. misc.setHorizontalAlignment(SwingConstants.CENTER);
  109. misc.setEditable(false);
  110. misc.setColumns(3);
  111. misc.setBorder(new LineBorder(Color.BLACK));
  112. GridBagConstraints gbc_misc = new GridBagConstraints();
  113. gbc_misc.fill = GridBagConstraints.HORIZONTAL;
  114. gbc_misc.gridx = 5;
  115. gbc_misc.gridy = 0;
  116. add(misc, gbc_misc);
  117. ttlObserver = new IndirectObservableListener<>(total,
  118. (c, v) -> {
  119. final int adex = v.getAbilities().getDex().modifier();
  120. final int miscValue = getInitiativeBonuses(v);
  121. c.setText(StringHelper.toString( adex + miscValue ));
  122. });
  123. dexObserver = new ObservableListener<>(dex,
  124. new AbilModStringify());
  125. tempObserver = new ObservableListener<>(misc, (c, v) -> {
  126. final int miscValue = getInitiativeBonuses(v);
  127. c.setText(StringHelper.toString(miscValue));
  128. });
  129. }
  130. private int getInitiativeBonuses(DDCharacter v) {
  131. Tree<String, GroupedBonus> props = new Tree<>();
  132. v.getFeatureBonuses(Constants.INITIATIVE).stream().forEach(f -> f.accumulate(props));
  133. return props.getOrDefault(new GroupedBonus()).intValue();
  134. }
  135. public void setModel(DDCharacter model) {
  136. final Ability.Scores dex = model.getAbilities().getDex();
  137. ttlObserver.setObserved(model, model, dex);
  138. dexObserver.setObserved(dex);
  139. tempObserver.setObserved(model);
  140. }
  141. @Override
  142. public void removeNotify() {
  143. super.removeNotify();
  144. ObserverDispatch.unsubscribeAll(ttlObserver);
  145. ObserverDispatch.unsubscribeAll(dexObserver);
  146. ObserverDispatch.unsubscribeAll(tempObserver);
  147. }
  148. }