[CLIENT] #16 : ProductManagerScreen : modification de l'update des données; certains champs et boutons sont désormais bloqué dans certaines conditions; Correction potentielle NPE durant le check de faisabilité du produit

This commit is contained in:
Notmoo-PC\Notmoo 2018-01-24 21:55:45 +01:00
parent 73e91c12c6
commit c8832f6f35
4 changed files with 134 additions and 30 deletions

View File

@ -21,6 +21,7 @@ class ProductManagerScreenController {
void setView(ProductManagerScreenView view){
this.view = view;
view.setCategoryCollection(model.getCategoryCollection());
}
ChangeListener<? super Product> getProductComponentSelectionListener() {
@ -36,9 +37,10 @@ class ProductManagerScreenController {
}
void updateView() {
//view.setCategoryCollection(model.getCategoryCollection());
view.setProduct(model.getActualProductState());
view.setCategoryCollection(model.getCategoryCollection());
view.setProductCollection(model.getEligibleComponentList());
view.updateGuiLocks();
}
IValidatorComponentListener getValidatorListener() {
@ -63,32 +65,46 @@ class ProductManagerScreenController {
listenerList.remove(IValidatorComponentListener.class, l);
}
boolean lockAmountRemainingfield(){
return !model.getActualProductState().getComponents().isEmpty();
}
boolean lockValidationButton(){
return !model.isProductCreationPossible();
}
boolean isProductHighlighted(Product product) {
return model.getActualProductState().getComponents().contains(product);
}
void onNameChanged(String oldVal, String newVal) {
void onNameChanged(String newVal) {
model.changeName(newVal);
updateView();
}
void onPriceChanged(double oldVal, double newVal) {
void onPriceChanged(double newVal) {
model.changePrice(newVal);
updateView();
}
void onCategoryChanged(Category oldVal, Category newVal) {
void onCategoryChanged(Category newVal) {
model.changeCategory(newVal);
view.updateGuiLocks();
}
void onAmountRemainingChanged(int oldVal, int newVal) {
void onAmountRemainingChanged(int newVal) {
model.changeAmountRemaining(newVal);
updateView();
}
void onAmountSoldChanged(int oldVal, int newVal) {
void onAmountSoldChanged(int newVal) {
model.changeAmountSold(newVal);
updateView();
}
void onSellableStateChanged(boolean oldVal, boolean newVal) {
void onSellableStateChanged(boolean newVal) {
model.setSellable(newVal);
updateView();
}
public void delete() {

View File

@ -39,6 +39,7 @@ class ProductManagerScreenModel {
boolean isProductCreationPossible() {
return (initialData==null || !areProductsEqual(initialData, currentData))
&& currentData.getName() != null
&& !currentData.getName().isEmpty()
&& currentData.getCategory()!=null
&& currentData.getPrice()>=0;

View File

@ -32,6 +32,7 @@ class ProductManagerScreenView implements IFXComponent {
private ComboBox<Category> productCategoryComboBox;
private CheckBox productSellableCheckBox;
private ListView<Product> productComponentsListView;
private SimpleValidator validator;
ProductManagerScreenView(ProductManagerScreenController ctrl) {
this.ctrl = ctrl;
@ -52,55 +53,70 @@ class ProductManagerScreenView implements IFXComponent {
Label productNameLabel = new Label(GUIStringTool.getProductNameLabel());
productNameTextField = new TextField();
productNameTextField.textProperty().addListener((obs, oldVal, newVal)->ctrl.onNameChanged(oldVal,newVal));
productNameTextField.focusedProperty().addListener((obs, oldVal, newVal)->{
if(!newVal)
ctrl.onNameChanged(productNameTextField.getText());
});
addLineToGrid(mainPaneCenterContent, productNameLabel, productNameTextField);
Label productCategoryLabel = new Label(GUIStringTool.getProductCategoryLabel());
productCategoryComboBox = new ComboBox<>();
productCategoryComboBox.setEditable(true);
productCategoryComboBox.setConverter(GUIStringTool.getCategoryStringConverter());
productCategoryComboBox.valueProperty().addListener((obs, oldVal, newVal)->ctrl.onCategoryChanged(oldVal, newVal));
productCategoryComboBox.valueProperty().addListener((obs, oldVal, newVal)->{
ctrl.onCategoryChanged(newVal);
});
addLineToGrid(mainPaneCenterContent, productCategoryLabel, productCategoryComboBox);
Label productAmountRemainingLabel = new Label(GUIStringTool.getProductAmountRemainingLabel());
productAmountRemainingTextField = getNumberOnlyTextField(intFormat);
productAmountRemainingTextField.textProperty().addListener((obs, oldVal, newVal)->{
try{
int oldInt = oldVal.isEmpty()?0:Integer.parseInt(oldVal);
int newInt = newVal.isEmpty()?0:Integer.parseInt(newVal);
ctrl.onAmountRemainingChanged(oldInt, newInt);
}catch(NumberFormatException e){
productAmountRemainingTextField.focusedProperty().addListener((obs, oldVal, newVal)->{
if(!newVal) {
try {
int newInt = productAmountRemainingTextField.getText().isEmpty() ?
0 :
Integer.parseInt(productAmountRemainingTextField.getText());
ctrl.onAmountRemainingChanged(newInt);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
});
addLineToGrid(mainPaneCenterContent, productAmountRemainingLabel, productAmountRemainingTextField);
Label productAmountSoldLabel = new Label(GUIStringTool.getProductAmountSoldLabel());
productAmountSoldTextField = getNumberOnlyTextField(intFormat);
productAmountSoldTextField.textProperty().addListener((obs, oldVal, newVal)->{
try{
int oldInt = oldVal.isEmpty()?0:Integer.parseInt(oldVal);
int newInt = newVal.isEmpty()?0:Integer.parseInt(newVal);
ctrl.onAmountSoldChanged(oldInt, newInt);
}catch(NumberFormatException e){
productAmountSoldTextField.focusedProperty().addListener((obs, oldVal, newVal)->{
if(!newVal) {
try {
int newInt = productAmountSoldTextField.getText().isEmpty() ?
0 :
Integer.parseInt(productAmountSoldTextField.getText());
ctrl.onAmountSoldChanged(newInt);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
});
addLineToGrid(mainPaneCenterContent, productAmountSoldLabel, productAmountSoldTextField);
Label productSellableLabel = new Label(GUIStringTool.getProductSellableLabel());
productSellableCheckBox = new CheckBox();
productSellableCheckBox.selectedProperty().addListener((obs, oldVal, newVal)->ctrl.onSellableStateChanged(oldVal,newVal));
productSellableCheckBox.selectedProperty().addListener((obs, oldVal, newVal)->ctrl.onSellableStateChanged(newVal));
addLineToGrid(mainPaneCenterContent, productSellableLabel, productSellableCheckBox);
Label productPriceLabel = new Label(GUIStringTool.getProductPriceLabel());
productPriceTextField = getNumberOnlyTextField(priceFormat);
productPriceTextField.textProperty().addListener((obs, oldVal, newVal)->{
try{
ctrl.onPriceChanged((oldVal.isEmpty()?-1:Double.parseDouble(oldVal)), (newVal.isEmpty()?-1:Double.parseDouble(newVal)));
}catch(NumberFormatException e){
productPriceTextField.focusedProperty().addListener((obs, oldVal, newVal)->{
if(!newVal) {
try {
ctrl.onPriceChanged((productPriceTextField.getText().isEmpty() ?
-1 :
Double.parseDouble(productPriceTextField.getText())));
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
});
addLineToGrid(mainPaneCenterContent, productPriceLabel, productPriceTextField);
@ -147,7 +163,7 @@ class ProductManagerScreenView implements IFXComponent {
HBox mainPaneBottomContent = new HBox();
HBox separator = new HBox();
SimpleValidator validator = new SimpleValidator();
validator = new SimpleValidator();
validator.addListener(ctrl.getValidatorListener());
mainPaneBottomContent.getChildren().addAll(separator, validator.getPane());
HBox.setHgrow(separator, Priority.ALWAYS);
@ -209,6 +225,14 @@ class ProductManagerScreenView implements IFXComponent {
productComponentsListView.getItems().addAll(productCollection);
});
}
void updateGuiLocks(){
Platform.runLater(()->{
productAmountRemainingTextField.setDisable(ctrl.lockAmountRemainingfield());
validator.setValidationButtonEnable(!ctrl.lockValidationButton());
});
}
public void delete() {
ctrl = null;
}

View File

@ -0,0 +1,63 @@
package com.pqt.server;
import com.pqt.core.communication.GSonMessageToolFactory;
import com.pqt.core.communication.IMessageToolFactory;
import com.pqt.core.communication.IObjectFormatter;
import com.pqt.core.entities.messages.Message;
import com.pqt.core.entities.messages.MessageType;
import com.pqt.core.entities.product.Category;
import com.pqt.core.entities.product.Product;
import com.pqt.core.entities.user_account.Account;
import com.pqt.core.entities.user_account.AccountLevel;
import com.pqt.server.module.account.FileAccountDao;
import com.pqt.server.module.account.IAccountDao;
import com.pqt.server.module.stock.FileStockDao;
import com.pqt.server.module.stock.IStockDao;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args){
IMessageToolFactory messageToolFactory = new GSonMessageToolFactory();
IObjectFormatter<Message> messageFormater = messageToolFactory.getObjectFormatter(Message.class);
System.out.println(messageFormater.format(new Message(MessageType.QUERY_PING, null, null, null, null)));
//generateAccountFile();
//generateProductFile();
}
private static void generateProductFile(){
System.out.println("PRODUCTS");
List<Product> products = new ArrayList<>();
Category mealsCat = new Category(0, "Meals");
Category drinksCat = new Category(1, "Drinks");
Category sidesCat = new Category(2, "Sides");
//long id, String name, int amountRemaining, int amountSold, boolean sellable, double price, List<Long> components, Category category
products.add(new Product(0, "Meal 1", 10, 0, true, 1d, null, mealsCat));
products.add(new Product(0, "Meal 2", 20, 10, true, 1.5d, null, mealsCat));
products.add(new Product(0, "Drink 1", 30, 20, true, 2d, null, drinksCat));
products.add(new Product(0, "Side 1", 40, 30, true, 2.5d, null, sidesCat));
IStockDao stockDao = new FileStockDao("G:\\temp");
products.forEach(stockDao::addProduct);
}
private static void generateAccountFile(){
System.out.println("ACCOUNTS");
List<Account> accounts = new ArrayList<>();
accounts.add(new Account("Master", "Master", AccountLevel.MASTER));
accounts.add(new Account("Waiter", "Waiter", AccountLevel.WAITER));
accounts.add(new Account("Guest", "Guest", AccountLevel.GUEST));
accounts.add(new Account("Staff", "Staff", AccountLevel.STAFF));
accounts.add(new Account("Lowest", "Lowest", AccountLevel.LOWEST));
IAccountDao accountDao = new FileAccountDao("G:\\temp");
accounts.forEach(accountDao::addAccount);
}
}