package org.leumasjaffe.charsheet.view.summary; import javax.swing.JFormattedTextField; import javax.swing.JPanel; import javax.swing.JTextField; import java.awt.Dimension; import static org.leumasjaffe.charsheet.model.Ability.modifier; import java.awt.Color; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import javax.swing.border.LineBorder; import org.leumasjaffe.charsheet.model.observable.IntValue; import org.leumasjaffe.charsheet.observer.helper.IntValueHelper; import org.leumasjaffe.charsheet.observer.helper.IntValueStringify; import org.leumasjaffe.charsheet.util.StringHelper; import org.leumasjaffe.graphics.NumberTextField; import org.leumasjaffe.observer.ObservableController; import org.leumasjaffe.observer.ObservableListener; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import javax.swing.SwingConstants; @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public class AbilityBox extends JPanel { /** * */ private static final long serialVersionUID = 1L; ObservableListener valueListener; ObservableListener modListener; public AbilityBox(final String name, final String heading) { setOpaque(false); setMaximumSize(new Dimension(80, 26)); setMinimumSize(new Dimension(80, 26)); setPreferredSize(new Dimension(80, 26)); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[]{0, 0, 0}; gridBagLayout.rowHeights = new int[]{25, 0}; gridBagLayout.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; setLayout(gridBagLayout); JFormattedTextField value = new NumberTextField(); value.setToolTipText(heading + " Score (" + name + ")"); value.setHorizontalAlignment(SwingConstants.CENTER); value.setMinimumSize(new Dimension(30, 20)); value.setMaximumSize(new Dimension(30, 20)); value.setPreferredSize(new Dimension(30, 20)); value.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_value = new GridBagConstraints(); gbc_value.insets = new Insets(0, 5, 0, 5); gbc_value.fill = GridBagConstraints.HORIZONTAL; gbc_value.gridx = 0; gbc_value.gridy = 0; add(value, gbc_value); value.setColumns(3); JTextField modifier = new JTextField(); modifier.setToolTipText(heading + " Modifier (" + name + ")"); modifier.setHorizontalAlignment(SwingConstants.CENTER); modifier.setEditable(false); modifier.setMinimumSize(new Dimension(30, 20)); modifier.setMaximumSize(new Dimension(30, 20)); modifier.setPreferredSize(new Dimension(30, 20)); modifier.setBorder(new LineBorder(Color.BLACK)); GridBagConstraints gbc_modifier = new GridBagConstraints(); gbc_modifier.insets = new Insets(0, 0, 0, 5); gbc_modifier.fill = GridBagConstraints.HORIZONTAL; gbc_modifier.gridx = 1; gbc_modifier.gridy = 0; add(modifier, gbc_modifier); modifier.setColumns(3); valueListener = new ObservableController<>(value, new IntValueHelper(), IntValueStringify.withDefault(-1), (v) -> { v.value(-1); modifier.setText(""); }); modListener = new ObservableListener<>(modifier, (c, v) -> c.setText(v.value() <= 0 ? "" : StringHelper.toString(modifier(v.value())))); } public void setModel(IntValue scores) { valueListener.setObserved(scores); modListener.setObserved(scores); } }