Skip to content
Snippets Groups Projects
Commit b9964ec5 authored by Carl Gützkow's avatar Carl Gützkow :computer:
Browse files

feat: changed from a utility class to a builder class

parent 76dccc21
No related branches found
No related tags found
1 merge request!24enhance(dialogs): diolog builder
Pipeline #173678 passed
......@@ -4,20 +4,24 @@ import edu.ntnu.idatt2001.carljgu.Terrain;
import edu.ntnu.idatt2001.carljgu.battle.Battle;
import edu.ntnu.idatt2001.carljgu.FileExtensionException;
import edu.ntnu.idatt2001.carljgu.ArmyFileHandler;
import edu.ntnu.idatt2001.carljgu.client.dialogs.DialogBoxBuilder;
import edu.ntnu.idatt2001.carljgu.units.Army;
import edu.ntnu.idatt2001.carljgu.units.Unit;
import edu.ntnu.idatt2001.carljgu.units.UnitFactory;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Optional;
import java.util.ResourceBundle;
import edu.ntnu.idatt2001.carljgu.units.UnitFactory;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.fxml.FXML;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseButton;
import javafx.scene.text.Text;
import static javafx.scene.control.Alert.AlertType.*;
/**
* A controller class which
......@@ -61,26 +65,36 @@ public class BattleController implements Initializable {
* display its information in the
* given text elements.
*
* @param army - int - the selected army to import.
* @param armyNumber - int - the selected army to import.
* 0 for army one and 1 for army two
*/
private void importArmy(int army) {
private void importArmy(int armyNumber) {
ArmyFileHandler fileHandler = new ArmyFileHandler();
new DialogBoxBuilder(ERROR).build().showAndWait();
try {
filePaths[army] = fileHandler.getFilePath();
filePaths[armyNumber] = fileHandler.getFilePath();
if (filePaths[army] == null)
if (filePaths[armyNumber] == null)
return;
armies[army] = fileHandler.readArmyFromFile(filePaths[army]);
displayArmy(army, armies[army]);
DialogBoxUtility.giveInformation("Army was successfully imported.\n" +
"In the process " + fileHandler.getReadLinesSkipped() + " units were corrupted");
armies[armyNumber] = fileHandler.readArmyFromFile(filePaths[armyNumber]);
displayArmy(armyNumber, armies[armyNumber]);
new DialogBoxBuilder(INFORMATION)
.addTitle("Army imported")
.addMessage("Army was successfully imported.\n" +
"In the process " + fileHandler.getReadLinesSkipped() + " units were corrupted")
.build().showAndWait();
} catch (FileExtensionException e) {
DialogBoxUtility.giveError(e.getMessage());
new DialogBoxBuilder(ERROR)
.addTitle("File is not supported")
.addMessage(e.getMessage())
.build().showAndWait();
} catch (IOException e) {
DialogBoxUtility.giveError("File could not be loaded.");
new DialogBoxBuilder(ERROR)
.addHeader("File could not be loaded")
.addMessage(DialogBoxBuilder.recurringErrorMessage)
.build().showAndWait();
}
scores[0] = 0;
scores[1] = 0;
......@@ -134,9 +148,14 @@ public class BattleController implements Initializable {
result = true;
} catch (IllegalArgumentException e) {
DialogBoxUtility.giveError(e.getMessage());
new DialogBoxBuilder(ERROR)
.addMessage(e.getMessage())
.build().showAndWait();
} catch (NullPointerException e) {
DialogBoxUtility.giveError("Armies have not been imported.");
new DialogBoxBuilder(NONE)
.addTitle("Army does not exist")
.addMessage("Armies have not been imported")
.build().showAndWait();
}
return result;
}
......@@ -165,7 +184,9 @@ public class BattleController implements Initializable {
displayArmy(0, armyOne);
displayArmy(1, armyTwo);
} catch (UnsupportedOperationException | NullPointerException e) {
DialogBoxUtility.giveError(e.getMessage());
new DialogBoxBuilder(ERROR)
.addMessage(e.getMessage())
.build().showAndWait();
}
}
......@@ -210,14 +231,17 @@ public class BattleController implements Initializable {
if (click.getButton() == MouseButton.PRIMARY && click.getClickCount() == 2) {
Unit selectedUnit = armyUnitListViews.get(armyNumber).getSelectionModel().getSelectedItem();
if (selectedUnit != null) {
boolean result = DialogBoxUtility.getConfirmation("Are you sure you want to delete this unit? \n" +
selectedUnit);
Optional<ButtonType> optional = new DialogBoxBuilder(CONFIRMATION)
.addTitle("Delete unit?")
.addMessage("Are you sure you want to delete this unit?")
.build().showAndWait();
boolean result = optional.filter(buttonType -> buttonType == ButtonType.OK).isPresent();
if (result) {
armies[armyNumber].remove(selectedUnit);
displayArmy(armyNumber, armies[armyNumber]);
}
}
}
displayArmy(armyNumber, armies[armyNumber]);
});
}
......
package edu.ntnu.idatt2001.carljgu.client;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.Region;
import java.util.Optional;
/**
* A utility class with static methods
* and private constructor for giving
* out useful alerts and dialogs.
*
* @author Carl Gützkow
* @version 1.1 13.04.2022
*/
public class DialogBoxUtility {
private DialogBoxUtility() {
throw new UnsupportedOperationException("It is not possible to create an instance of this utility class.");
}
/**
* Creates an information dialog box.
* Static method that can be called by the controller.
*
* @param message String - the message to display
*/
public static void giveInformation(String message) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setTitle("Information");
alert.setHeaderText(null);
alert.setContentText(message);
alert.showAndWait();
}
/**
* Creates an error dialog box.
* Static method that can be called by the controller.
*
* @param message String - the message to display
*/
public static void giveError(String message) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setTitle("Error");
alert.setHeaderText(message);
alert.setContentText("If this a recurring and unsolvable event, please contact the creator of this program.");
alert.showAndWait();
}
/**
* Creates a confirmation dialog box.
* Returns a boolean value if depending on
* what the user clicked on.
* Static method that can be called by the controller.
* If the user closes the window, false is returned.
*
* @param message String - the message to display
* @return result - Boolean - the confirmation from the user
*/
public static boolean getConfirmation(String message) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setTitle("Confirmation");
alert.setHeaderText(null);
alert.setContentText(message);
Optional<ButtonType> result = alert.showAndWait();
return result.filter(buttonType -> buttonType == ButtonType.OK).isPresent();
}
}
package edu.ntnu.idatt2001.carljgu.client.dialogs;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
/**
* A dialog box that extends alert to use
* a builder to build a dialog box.
*
* @author Carl Gützkow
* @version 1.1 17.04.2022
*/
public class DialogBox extends Alert {
/**
* Constructor for a dialog box
* that uses a builder to set
* attributes. If the alert type is NONE,
* the window will only close if there is at
* least one button.
* If the builder has no image defined, then
* the default image is used. Otherwise, this
* constructor will add image from resource folder.
*
* @param builder
*/
public DialogBox(DialogBoxBuilder builder) {
super(builder.getAlertType());
this.setTitle(builder.getTitle());
this.setHeaderText(builder.getHeader());
this.setContentText(builder.getMessage());
if (builder.getAlertType() == AlertType.NONE) {
this.getDialogPane().getButtonTypes().add(ButtonType.OK);
}
if (builder.getImage() != null) {
this.setGraphic(new ImageView(builder.getImage()));
Stage stage = (Stage) this.getDialogPane().getScene().getWindow();
stage.getIcons().add(builder.getImage());
}
}
}
package edu.ntnu.idatt2001.carljgu.client.dialogs;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
/**
* A builder class which simplifies the
* DialogBox class. Using a builder makes it easy
* to create complex dialogs while still avoiding
* the telescoping constructors problem.
* It also makes it easier to add attributes in the future.
*
* @author Carl Gützkow
* @version 1.1 17.04.2022
*/
public class DialogBoxBuilder {
public static final String recurringErrorMessage =
"If this a recurring and unsolvable event, please contact the creator of this program.";
private AlertType alertType;
private String title;
private String header;
private String message;
private Image image;
/**
* Instantiates a new dialog box builder.
* Sets the title and message to a default.
* They are still optional to set.
*
* @param alertType AlertType - enum from inside the Alert class.
* Either ERROR, INFORMATION, NONE, CONFIRMATION or WARNING
*/
public DialogBoxBuilder(AlertType alertType) {
this.alertType = alertType;
this.title = alertType.name();
this.message = recurringErrorMessage;
}
/**
* Create the dialog box with the
* current configurations from this
* builder object.
*
* @return dialogBox - DialogBox - a dialog box with this builder's configurations.
*/
public DialogBox build() {
return new DialogBox(this);
}
/**
* Add title to the dialog box builder configuration.
* The title is displayed on the top of the window.
*
* @param title String - the title of the dialog box
* @return dialogBoxBuilder - DialogBoxBuilder - returned to add further configurations.
*/
public DialogBoxBuilder addTitle(String title) {
this.title = title;
return this;
}
/**
* Add header to the dialog box builder configuration.
* A header is displayed above the message
*
* @param header String - the header of the dialog box
* @return dialogBoxBuilder - DialogBoxBuilder - returned to add further configurations.
*/
public DialogBoxBuilder addHeader(String header) {
this.header = header;
return this;
}
/**
* Add message to the dialog box builder configuration.
*
* @param message String - the message of the dialog box
* @return dialogBoxBuilder - DialogBoxBuilder - returned to add further configurations.
*/
public DialogBoxBuilder addMessage(String message) {
this.message = message;
return this;
}
/**
* Add image to the dialog box builder configuration.
* The image is displayed as both the window icon
* and on the actual scene.
*
* @param imageName String - the name of the image to display.
* @return dialogBoxBuilder - DialogBoxBuilder - returned to add further configurations.
*/
public DialogBoxBuilder addImage(String imageName) {
this.image = new Image(imageName);
return this;
}
/**
* Gets the alert type for the dialog box.
*
* @return alertType - AlertType - enum from inside the Alert class.
* Either ERROR, INFORMATION, NONE, CONFIRMATION or WARNING
*/
public AlertType getAlertType() {
return alertType;
}
/**
* Gets the title of the dialog box.
*
* @return title - String - the dialog box' title
*/
public String getTitle() {
return title;
}
/**
* Gets the header for the dialog box.
*
* @return header - String - the dialog box' header
*/
public String getHeader() {
return header;
}
/**
* Gets the message for the dialog box.
*
* @return message - String - the dialog box' message
*/
public String getMessage() {
return message;
}
/**
* Gets the image for the dialog box-
*
* @return image - Image - the dialog box' icon and image
*/
public Image getImage() {
return image;
}
}
......@@ -8,4 +8,6 @@ module edu.ntnu.idatt2001.carljgu.client {
exports edu.ntnu.idatt2001.carljgu.units ;
exports edu.ntnu.idatt2001.carljgu ;
exports edu.ntnu.idatt2001.carljgu.battle;
exports edu.ntnu.idatt2001.carljgu.client.dialogs;
opens edu.ntnu.idatt2001.carljgu.client.dialogs to javafx.fxml;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment