Skip to content

Commit

Permalink
Merge pull request #46 from FrancescoScandiffio/view
Browse files Browse the repository at this point in the history
Implement the feature to return an item; replace spinners validation
  • Loading branch information
FrancescoScandiffio committed Feb 9, 2022
2 parents 0743bc6 + e4ae11b commit e8dbdf8
Show file tree
Hide file tree
Showing 6 changed files with 791 additions and 316 deletions.
3 changes: 2 additions & 1 deletion raffaelliscandiffio.shop-totem/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/target/
*~
*~
/failed-gui-tests/
10 changes: 9 additions & 1 deletion raffaelliscandiffio.shop-totem/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
${project.build.directory}/failsafe-reports
</sonar.junit.reportPaths>

<sonar.issue.ignore.multicriteria>e1,e2,e3</sonar.issue.ignore.multicriteria>
<sonar.issue.ignore.multicriteria>e1,e2,e3,e4</sonar.issue.ignore.multicriteria>
<!-- disable rule on naming convention -->
<sonar.issue.ignore.multicriteria.e1.ruleKey>
java:S117
Expand All @@ -65,6 +65,14 @@
<sonar.issue.ignore.multicriteria.e3.resourceKey>
**/swing/TotemSwingView*
</sonar.issue.ignore.multicriteria.e3.resourceKey>

<!-- disable rule on cognitive complexity -->
<sonar.issue.ignore.multicriteria.e4.ruleKey>
java:S3776
</sonar.issue.ignore.multicriteria.e4.ruleKey>
<sonar.issue.ignore.multicriteria.e4.resourceKey>
**/swing/CartPanel*
</sonar.issue.ignore.multicriteria.e4.resourceKey>
</properties>

<dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.raffaelliscandiffio.view.swing;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
Expand All @@ -10,11 +11,13 @@
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.ListSelectionModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
Expand All @@ -41,15 +44,16 @@ public class CartPanel extends JPanel {
private JLabel lblQuantity;
private JSpinner spinner;
private Component horizontalStrut;
private SpinnerNumberModel spinnerModel;
private JFormattedTextField spinnerTextField;

public CartPanel() {

this.setBorder(new EmptyBorder(5, 5, 5, 5));
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 0, 243, 0, 0, 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 0, 243, 0, 0, 0, 0 };
gridBagLayout.columnWeights = new double[] { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, Double.MIN_VALUE };
gridBagLayout.rowWeights = new double[] { 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
gridBagLayout.rowWeights = new double[] { 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 };
setLayout(gridBagLayout);

btnContinueShopping = new JButton("Continue Shopping");
Expand Down Expand Up @@ -83,28 +87,16 @@ public CartPanel() {
add(scrollPane, gbc_scrollPane);

listOrderItemsModel = new DefaultListModel<>();
listOrderItemsModel.addListDataListener(new ListDataListener() {

@Override
public void intervalRemoved(ListDataEvent e) {
btnCheckout.setEnabled(!listOrderItemsModel.isEmpty());
}

@Override
public void intervalAdded(ListDataEvent e) {
btnCheckout.setEnabled(true);
}

@Override
public void contentsChanged(ListDataEvent e) {
// TODO Auto-generated method stub

}
listOrderItems = new JList<>(listOrderItemsModel);
listOrderItems.addListSelectionListener(e -> {
boolean isItemSelected = listOrderItems.getSelectedIndex() != -1;
btnRemoveSelected.setEnabled(isItemSelected);
boolean canReturnQuantity = isItemSelected && listOrderItems.getSelectedValue().getQuantity() > 1;
spinner.setEnabled(canReturnQuantity);
btnReturnQuantity.setEnabled(canReturnQuantity);
resetSpinnerForm();

});
listOrderItems = new JList<>(listOrderItemsModel);
listOrderItems
.addListSelectionListener(e -> btnRemoveSelected.setEnabled(listOrderItems.getSelectedIndex() != -1));
listOrderItems.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listOrderItems.setName("cartList");
listOrderItems.setCellRenderer(new DefaultListCellRenderer() {
Expand Down Expand Up @@ -137,16 +129,9 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i

lblQuantity = new JLabel("Quantity");
horizontalBox.add(lblQuantity);

horizontalStrut = Box.createHorizontalStrut(20);
horizontalBox.add(horizontalStrut);

spinner = new JSpinner();
spinner.setName("cartReturnSpinner");
horizontalBox.add(spinner);
spinner.setEnabled(false);
spinner.setModel(new SpinnerNumberModel(1, 1, null, 1));

btnReturnQuantity = new JButton("Return quantity");
btnReturnQuantity.setEnabled(false);
btnReturnQuantity.setFocusPainted(false);
Expand All @@ -156,6 +141,40 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i
gbc_btnReturnQuantity.gridx = 0;
gbc_btnReturnQuantity.gridy = 4;
add(btnReturnQuantity, gbc_btnReturnQuantity);
spinnerModel = new SpinnerNumberModel(1, 1, null, 1);
spinner = new JSpinner(spinnerModel);
spinner.setName("cartReturnSpinner");
horizontalBox.add(spinner);
spinner.setEnabled(false);
spinnerTextField = ((DefaultEditor) spinner.getEditor()).getTextField();

spinnerTextField.addCaretListener(e -> validateSpinnerContent());

listOrderItemsModel.addListDataListener(new ListDataListener() {

@Override
public void intervalRemoved(ListDataEvent e) {
btnCheckout.setEnabled(!listOrderItemsModel.isEmpty());
}

@Override
public void intervalAdded(ListDataEvent e) {
btnCheckout.setEnabled(true);
}

@Override
public void contentsChanged(ListDataEvent e) {
if (e.getIndex0() == listOrderItems.getSelectedIndex()) {
boolean isItemQuantityOne = listOrderItems.getSelectedValue().getQuantity() == 1;
spinner.setEnabled(!isItemQuantityOne);
if (isItemQuantityOne)
resetSpinnerForm();
else
validateSpinnerContent();
}
}

});

btnCheckout = new JButton("Checkout");
btnCheckout.setActionCommand("checkout");
Expand All @@ -174,7 +193,7 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i
btnRemoveSelected.setFocusPainted(false);
GridBagConstraints gbc_btnRemoveSelected = new GridBagConstraints();
gbc_btnRemoveSelected.fill = GridBagConstraints.HORIZONTAL;
gbc_btnRemoveSelected.insets = new Insets(0, 0, 0, 5);
gbc_btnRemoveSelected.insets = new Insets(0, 0, 5, 5);
gbc_btnRemoveSelected.gridx = 0;
gbc_btnRemoveSelected.gridy = 5;
add(btnRemoveSelected, gbc_btnRemoveSelected);
Expand All @@ -183,26 +202,56 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i
messageLabel.setName("cartMessageLabel");
GridBagConstraints gbc_messageLabel = new GridBagConstraints();
gbc_messageLabel.fill = GridBagConstraints.VERTICAL;
gbc_messageLabel.gridheight = 3;
gbc_messageLabel.gridwidth = 4;
gbc_messageLabel.insets = new Insets(0, 0, 0, 5);
gbc_messageLabel.gridx = 3;
gbc_messageLabel.gridy = 3;
gbc_messageLabel.gridwidth = 9;
gbc_messageLabel.gridx = 0;
gbc_messageLabel.gridy = 6;
add(messageLabel, gbc_messageLabel);
}

private String getDisplayRow(OrderItem orderItem) {
return orderItem.getProduct().getName() + " - Quantity: " + orderItem.getQuantity() + " - Price: "
+ orderItem.getProduct().getPrice() + " € - Subtotal: " + orderItem.getSubTotal() + " €";
}

public void addActionListener(ActionListener listener) {
btnContinueShopping.addActionListener(listener);
btnCancelShopping.addActionListener(listener);
btnCheckout.addActionListener(listener);
btnRemoveSelected.addActionListener(listener);
}

private void validateSpinnerContent() {
final String text = spinnerTextField.getText();
final boolean isPositiveInteger = text.matches("^[1-9][0-9]*$");
if (isPositiveInteger) {
if (!spinner.isEnabled()) {
messageLabel.setText(" ");
btnReturnQuantity.setEnabled(false);
} else {
final int itemQuantity = listOrderItems.getSelectedValue().getQuantity();
if (Integer.parseInt(text) < itemQuantity) {
btnReturnQuantity.setEnabled(true);
messageLabel.setText(" ");
} else {
btnReturnQuantity.setEnabled(false);
messageLabel.setText("Error: the input must be an integer in range [1," + (itemQuantity - 1)
+ "]. Received: " + text);
messageLabel.setForeground(Color.RED);
}
}
} else {
btnReturnQuantity.setEnabled(false);
messageLabel.setText("Error: the input must be a positive integer. Received: " + text);
messageLabel.setForeground(Color.RED);
}
}

private String getDisplayRow(OrderItem orderItem) {
return orderItem.getProduct().getName() + " - Quantity: " + orderItem.getQuantity() + " - Price: "
+ orderItem.getProduct().getPrice() + " € - Subtotal: " + orderItem.getSubTotal() + " €";
}

private void resetSpinnerForm() {
spinner.setValue(1);
spinnerTextField.setText("1");
messageLabel.setText(" ");
}

DefaultListModel<OrderItem> getListOrderItemsModel() {
return listOrderItemsModel;
}
Expand All @@ -211,7 +260,16 @@ JList<OrderItem> getListOrderItems() {
return listOrderItems;
}

public JLabel getMessageLabel() {
JLabel getMessageLabel() {
return messageLabel;
}

JSpinner getSpinner() {
return spinner;
}

JButton getBtnReturnQuantity() {
return btnReturnQuantity;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DefaultFormatter;

import com.github.raffaelliscandiffio.model.Product;

Expand Down Expand Up @@ -128,23 +127,20 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i
tf = ((JSpinner.DefaultEditor) editor).getTextField();
tf.setColumns(4);
tf.addCaretListener(e -> {
btnAddButton.setEnabled(tf.isEditValid() && listProducts.getSelectedIndex() != -1);

if (!tf.isEditValid()) {
boolean isValueValid = tf.getText().matches("^[1-9][0-9]*");
btnAddButton.setEnabled(isValueValid && listProducts.getSelectedIndex() != -1);
if (!isValueValid) {
lblMessage.setText("Invalid quantity");
lblMessage.setForeground(Color.RED);
} else {
lblMessage.setText(" ");
}
});

DefaultFormatter formatter = (DefaultFormatter) tf.getFormatter();
formatter.setCommitsOnValidEdit(true);

btnAddButton = new JButton("Add");
btnAddButton.setActionCommand("buyProduct");
btnAddButton.setEnabled(false);
btnAddButton.setFocusPainted(false);

GridBagConstraints gbc_btnAddButton = new GridBagConstraints();
gbc_btnAddButton.insets = new Insets(0, 0, 5, 0);
gbc_btnAddButton.gridx = 8;
Expand All @@ -169,7 +165,6 @@ private String getDisplayRow(Product product) {

void addActionListener(ActionListener listener) {
btnCancelButton.addActionListener(listener);
btnAddButton.addActionListener(listener);
btnCart.addActionListener(listener);
}

Expand All @@ -189,4 +184,8 @@ JLabel getLblMessage() {
return lblMessage;
}

JButton getAddProductButton() {
return btnAddButton;
}

}
Loading

0 comments on commit e8dbdf8

Please sign in to comment.