package org.leumasjaffe.charsheet.view.summary; import javax.swing.JPanel; import java.awt.GridBagLayout; import javax.swing.JLabel; import java.awt.GridBagConstraints; import java.awt.Color; import javax.swing.border.LineBorder; import org.leumasjaffe.charsheet.config.Constants; import org.leumasjaffe.charsheet.model.Ability; import org.leumasjaffe.charsheet.model.DDCharacter; import org.leumasjaffe.charsheet.model.features.GroupedBonus; import org.leumasjaffe.charsheet.observer.helper.AbilModStringify; import org.leumasjaffe.collections.Tree; import org.leumasjaffe.format.StringHelper; import org.leumasjaffe.observer.IndirectObservableListener; import org.leumasjaffe.observer.ObservableListener; import org.leumasjaffe.observer.ObserverDispatch; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import java.awt.Font; import javax.swing.SwingConstants; import java.awt.Dimension; import javax.swing.JTextField; import java.awt.Insets; @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class InitiativeLine extends JPanel { /** * */ private static final long serialVersionUID = 1L; IndirectObservableListener ttlObserver; ObservableListener dexObserver; ObservableListener tempObserver; public InitiativeLine() { setOpaque(false); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0}; gridBagLayout.rowHeights = new int[]{0, 0}; gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; setLayout(gridBagLayout); JLabel lblInitiative = new JLabel("INITIATIVE"); lblInitiative.setToolTipText(""); lblInitiative.setPreferredSize(new Dimension(120, 25)); lblInitiative.setOpaque(true); lblInitiative.setMinimumSize(new Dimension(50, 25)); lblInitiative.setMaximumSize(new Dimension(50, 25)); lblInitiative.setHorizontalAlignment(SwingConstants.CENTER); lblInitiative.setForeground(Color.WHITE); lblInitiative.setFont(new Font("Tahoma", Font.BOLD, 18)); lblInitiative.setBorder(new LineBorder(Color.WHITE)); lblInitiative.setBackground(Color.BLACK); GridBagConstraints gbc_lblInitiative = new GridBagConstraints(); gbc_lblInitiative.insets = new Insets(0, 0, 0, 5); gbc_lblInitiative.anchor = GridBagConstraints.EAST; gbc_lblInitiative.gridx = 0; gbc_lblInitiative.gridy = 0; add(lblInitiative, gbc_lblInitiative); JTextField total = new JTextField(); total.setToolTipText("Total Initiative"); total.setPreferredSize(new Dimension(30, 20)); total.setMinimumSize(new Dimension(30, 20)); total.setMaximumSize(new Dimension(30, 20)); total.setHorizontalAlignment(SwingConstants.CENTER); total.setEditable(false); total.setColumns(3); total.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_total = new GridBagConstraints(); gbc_total.insets = new Insets(0, 0, 0, 5); gbc_total.fill = GridBagConstraints.HORIZONTAL; gbc_total.gridx = 1; gbc_total.gridy = 0; add(total, gbc_total); JLabel label = new JLabel("="); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.insets = new Insets(0, 0, 0, 5); gbc_label.anchor = GridBagConstraints.EAST; gbc_label.gridx = 2; gbc_label.gridy = 0; add(label, gbc_label); JTextField dex = new JTextField(); dex.setToolTipText("Dexterity Modifier"); dex.setPreferredSize(new Dimension(30, 20)); dex.setMinimumSize(new Dimension(30, 20)); dex.setMaximumSize(new Dimension(30, 20)); dex.setHorizontalAlignment(SwingConstants.CENTER); dex.setEditable(false); dex.setColumns(3); dex.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_dex = new GridBagConstraints(); gbc_dex.insets = new Insets(0, 0, 0, 5); gbc_dex.fill = GridBagConstraints.HORIZONTAL; gbc_dex.gridx = 3; gbc_dex.gridy = 0; add(dex, gbc_dex); JLabel label_1 = new JLabel("+"); GridBagConstraints gbc_label_1 = new GridBagConstraints(); gbc_label_1.insets = new Insets(0, 0, 0, 5); gbc_label_1.anchor = GridBagConstraints.EAST; gbc_label_1.gridx = 4; gbc_label_1.gridy = 0; add(label_1, gbc_label_1); JTextField misc = new JTextField(); misc.setToolTipText("Miscellaneous Modifier"); misc.setPreferredSize(new Dimension(30, 20)); misc.setMinimumSize(new Dimension(30, 20)); misc.setMaximumSize(new Dimension(30, 20)); misc.setHorizontalAlignment(SwingConstants.CENTER); misc.setEditable(false); misc.setColumns(3); misc.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_misc = new GridBagConstraints(); gbc_misc.fill = GridBagConstraints.HORIZONTAL; gbc_misc.gridx = 5; gbc_misc.gridy = 0; add(misc, gbc_misc); ttlObserver = new IndirectObservableListener<>(total, (c, v) -> { final int adex = v.getAbilities().getDex().modifier(); final int miscValue = getInitiativeBonuses(v); c.setText(StringHelper.toString( adex + miscValue )); }); dexObserver = new ObservableListener<>(dex, new AbilModStringify()); tempObserver = new ObservableListener<>(misc, (c, v) -> { final int miscValue = getInitiativeBonuses(v); c.setText(StringHelper.toString(miscValue)); }); } private int getInitiativeBonuses(DDCharacter v) { Tree props = new Tree<>(); v.getFeatureBonuses(Constants.INITIATIVE).stream().forEach(f -> f.accumulate(props)); return props.getOrDefault(new GroupedBonus()).intValue(); } public void setModel(DDCharacter model) { final Ability.Scores dex = model.getAbilities().getDex(); ttlObserver.setObserved(model, model, dex); dexObserver.setObserved(dex); tempObserver.setObserved(model); } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(ttlObserver); ObserverDispatch.unsubscribeAll(dexObserver); ObserverDispatch.unsubscribeAll(tempObserver); } }