package org.leumasjaffe.recipe.view; import javax.swing.JPanel; import org.leumasjaffe.observer.ObservableController; import org.leumasjaffe.observer.ObservableListener; import org.leumasjaffe.observer.ObserverDispatch; import org.leumasjaffe.recipe.model.Rest; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import java.awt.GridBagLayout; import javax.swing.JComboBox; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import java.awt.GridBagConstraints; import java.awt.Insets; @SuppressWarnings("serial") @FieldDefaults(level=AccessLevel.PRIVATE) public class RestPanel extends JPanel { ObservableListener durationController; ObservableListener upToController; JComboBox jcbLocation; DurationPanel panelDuration; DurationPanel panelUpTo; // TODO Rest model; public RestPanel() { GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0}; gridBagLayout.rowHeights = new int[]{0, 0}; gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; setLayout(gridBagLayout); JLabel lblRest = new JLabel("Rest"); GridBagConstraints gbc_lblRest = new GridBagConstraints(); gbc_lblRest.insets = new Insets(0, 0, 0, 5); gbc_lblRest.gridx = 0; gbc_lblRest.gridy = 0; add(lblRest, gbc_lblRest); jcbLocation = new JComboBox<>(Rest.Where.values()); GridBagConstraints gbc_lblLocation = new GridBagConstraints(); gbc_lblLocation.insets = new Insets(0, 0, 0, 5); gbc_lblLocation.gridx = 1; gbc_lblLocation.gridy = 0; add(jcbLocation, gbc_lblLocation); panelDuration = new DurationPanel(""); GridBagConstraints gbc_panelDuration = new GridBagConstraints(); gbc_panelDuration.gridx = 2; gbc_panelDuration.gridy = 0; add(panelDuration, gbc_panelDuration); panelUpTo = new DurationPanel("and up to"); GridBagConstraints gbc_panelUpTo = new GridBagConstraints(); gbc_panelUpTo.gridx = 3; gbc_panelUpTo.gridy = 0; add(panelUpTo, gbc_panelUpTo); jcbLocation.addItemListener(e -> { panelDuration.txtTime.setEditable(isResting()); panelUpTo.txtTime.setEditable(isResting()); this.model.setWhere(Rest.Where.class.cast(e.getItem())); }); durationController = ObservableController.from(panelDuration.txtTime, Rest::getDuration, Rest::setDuration); upToController = ObservableController.from(panelUpTo.txtTime, Rest::getUpTo, Rest::setUpTo); panelDuration.txtTime.setEditable(false); panelUpTo.txtTime.setEditable(false); } public RestPanel(final Rest rest) { this(); setModel(rest); } public void setModel(final Rest rest) { this.model = rest; jcbLocation.setSelectedItem(rest.getWhere()); durationController.setObserved(rest); upToController.setObserved(rest); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); setVisible(enabled || isResting()); jcbLocation.setEnabled(enabled); panelDuration.txtTime.setEditable(enabled && isResting()); panelUpTo.txtTime.setEditable(enabled && isResting()); } @Override public void removeNotify() { super.removeNotify(); ObserverDispatch.unsubscribeAll(durationController); } private boolean isResting() { return !jcbLocation.getSelectedItem().equals(Rest.Where.NONE); } }