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.model.Ability; import org.leumasjaffe.charsheet.model.DDCharacter; import org.leumasjaffe.charsheet.observer.helper.AbilModStringify; import org.leumasjaffe.format.StringHelper; import org.leumasjaffe.graphics.NumberTextField; 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; import java.util.function.Function; import javax.swing.JFormattedTextField; @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class ResistanceLine extends JPanel { /** * */ private static final long serialVersionUID = 1L; Function access; IndirectObservableListener totalObserver; IndirectObservableListener baseObserver; ObservableListener abilObserver; public ResistanceLine(final String name, Function save, Function func) { this.access = func; setMinimumSize(new Dimension(400, 25)); setMaximumSize(new Dimension(400, 25)); setPreferredSize(new Dimension(400, 25)); setOpaque(false); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 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, 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 label = new JLabel(name.toUpperCase()); label.setPreferredSize(new Dimension(120, 25)); label.setOpaque(true); label.setMinimumSize(new Dimension(120, 25)); label.setMaximumSize(new Dimension(120, 25)); label.setHorizontalAlignment(SwingConstants.CENTER); label.setForeground(Color.WHITE); label.setFont(new Font("Tahoma", Font.BOLD, 18)); label.setBorder(new LineBorder(Color.WHITE)); label.setBackground(Color.BLACK); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.fill = GridBagConstraints.HORIZONTAL; gbc_label.insets = new Insets(0, 0, 0, 3); gbc_label.gridx = 0; gbc_label.gridy = 0; add(label, gbc_label); JTextField totalField = new JTextField(); totalField.setToolTipText("Saving Throw"); totalField.setPreferredSize(new Dimension(30, 20)); totalField.setMinimumSize(new Dimension(30, 20)); totalField.setMaximumSize(new Dimension(30, 20)); totalField.setHorizontalAlignment(SwingConstants.CENTER); totalField.setEditable(false); totalField.setColumns(3); totalField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_total = new GridBagConstraints(); gbc_total.insets = new Insets(0, 0, 0, 3); gbc_total.fill = GridBagConstraints.HORIZONTAL; gbc_total.gridx = 1; gbc_total.gridy = 0; add(totalField, gbc_total); JLabel label_1 = new JLabel("="); GridBagConstraints gbc_label_1 = new GridBagConstraints(); gbc_label_1.anchor = GridBagConstraints.EAST; gbc_label_1.insets = new Insets(0, 0, 0, 3); gbc_label_1.gridx = 2; gbc_label_1.gridy = 0; add(label_1, gbc_label_1); JFormattedTextField baseSaveField = new NumberTextField(); baseSaveField.setEditable(false); baseSaveField.setToolTipText("Base Save"); baseSaveField.setPreferredSize(new Dimension(30, 20)); baseSaveField.setMinimumSize(new Dimension(30, 20)); baseSaveField.setMaximumSize(new Dimension(30, 20)); baseSaveField.setHorizontalAlignment(SwingConstants.CENTER); baseSaveField.setColumns(3); baseSaveField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_baseSave = new GridBagConstraints(); gbc_baseSave.insets = new Insets(0, 0, 0, 3); gbc_baseSave.fill = GridBagConstraints.HORIZONTAL; gbc_baseSave.gridx = 3; gbc_baseSave.gridy = 0; add(baseSaveField, gbc_baseSave); JLabel label_2 = new JLabel("+"); GridBagConstraints gbc_label_2 = new GridBagConstraints(); gbc_label_2.insets = new Insets(0, 0, 0, 3); gbc_label_2.anchor = GridBagConstraints.EAST; gbc_label_2.gridx = 4; gbc_label_2.gridy = 0; add(label_2, gbc_label_2); JTextField abilityField = new JTextField(); abilityField.setToolTipText("Ability Modifier"); abilityField.setPreferredSize(new Dimension(30, 20)); abilityField.setMinimumSize(new Dimension(30, 20)); abilityField.setMaximumSize(new Dimension(30, 20)); abilityField.setHorizontalAlignment(SwingConstants.CENTER); abilityField.setEditable(false); abilityField.setColumns(3); abilityField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_ability = new GridBagConstraints(); gbc_ability.insets = new Insets(0, 0, 0, 3); gbc_ability.fill = GridBagConstraints.HORIZONTAL; gbc_ability.gridx = 5; gbc_ability.gridy = 0; add(abilityField, gbc_ability); JLabel label_3 = new JLabel("+"); GridBagConstraints gbc_label_3 = new GridBagConstraints(); gbc_label_3.anchor = GridBagConstraints.EAST; gbc_label_3.insets = new Insets(0, 0, 0, 3); gbc_label_3.gridx = 6; gbc_label_3.gridy = 0; add(label_3, gbc_label_3); JFormattedTextField magicField = new NumberTextField(); magicField.setToolTipText("Magic Modifier"); magicField.setPreferredSize(new Dimension(30, 20)); magicField.setMinimumSize(new Dimension(30, 20)); magicField.setMaximumSize(new Dimension(30, 20)); magicField.setHorizontalAlignment(SwingConstants.CENTER); magicField.setColumns(3); magicField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_magic = new GridBagConstraints(); gbc_magic.insets = new Insets(0, 0, 0, 3); gbc_magic.fill = GridBagConstraints.HORIZONTAL; gbc_magic.gridx = 7; gbc_magic.gridy = 0; add(magicField, gbc_magic); JLabel label_4 = new JLabel("+"); GridBagConstraints gbc_label_4 = new GridBagConstraints(); gbc_label_4.anchor = GridBagConstraints.EAST; gbc_label_4.insets = new Insets(0, 0, 0, 3); gbc_label_4.gridx = 8; gbc_label_4.gridy = 0; add(label_4, gbc_label_4); JFormattedTextField miscField = new NumberTextField(); miscField.setToolTipText("Miscellaneous Modifier"); miscField.setPreferredSize(new Dimension(30, 20)); miscField.setMinimumSize(new Dimension(30, 20)); miscField.setMaximumSize(new Dimension(30, 20)); miscField.setHorizontalAlignment(SwingConstants.CENTER); miscField.setColumns(3); miscField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_misc = new GridBagConstraints(); gbc_misc.insets = new Insets(0, 0, 0, 3); gbc_misc.fill = GridBagConstraints.HORIZONTAL; gbc_misc.gridx = 9; gbc_misc.gridy = 0; add(miscField, gbc_misc); JLabel label_5 = new JLabel("+"); GridBagConstraints gbc_label_5 = new GridBagConstraints(); gbc_label_5.insets = new Insets(0, 0, 0, 3); gbc_label_5.anchor = GridBagConstraints.EAST; gbc_label_5.gridx = 10; gbc_label_5.gridy = 0; add(label_5, gbc_label_5); JPanel panel = new JPanel(); panel.setBackground(Color.LIGHT_GRAY); panel.setPreferredSize(new Dimension(45, 25)); GridBagConstraints gbc_panel = new GridBagConstraints(); gbc_panel.fill = GridBagConstraints.BOTH; gbc_panel.gridx = 11; gbc_panel.gridy = 0; add(panel, gbc_panel); GridBagLayout gbl_panel = new GridBagLayout(); gbl_panel.columnWidths = new int[]{0, 0}; gbl_panel.rowHeights = new int[]{0, 0}; gbl_panel.columnWeights = new double[]{0.0, Double.MIN_VALUE}; gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; panel.setLayout(gbl_panel); NumberTextField tempField = new NumberTextField(); tempField.setToolTipText("Temporary Modifier"); tempField.setPreferredSize(new Dimension(30, 20)); tempField.setMinimumSize(new Dimension(30, 20)); tempField.setMaximumSize(new Dimension(30, 20)); tempField.setHorizontalAlignment(SwingConstants.CENTER); tempField.setColumns(3); tempField.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_temp = new GridBagConstraints(); gbc_temp.insets = new Insets(3, 3, 0, 3); gbc_temp.gridx = 0; gbc_temp.gridy = 0; panel.add(tempField, gbc_temp); totalObserver = new IndirectObservableListener<>(totalField, (c, v) -> { final int base = save.apply(v); final int abil = access.apply(v.getAbilities()).modifier(); final int magic = 0; final int misc = 0; final int temp = 0; c.setText(StringHelper.toString(base + abil + magic + misc + temp)); }); baseObserver = new IndirectObservableListener<>(baseSaveField, (c, v) -> c.setText(StringHelper.toString(save.apply(v)))); abilObserver = new ObservableListener<>(abilityField, new AbilModStringify()); } public void setModel(DDCharacter model) { final Ability.Scores abil = access.apply(model.getAbilities()); totalObserver.setObserved(model, model, abil); baseObserver.setObserved(model, model, abil); abilObserver.setObserved(abil); } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(totalObserver); ObserverDispatch.unsubscribeAll(baseObserver); ObserverDispatch.unsubscribeAll(abilObserver); } }