package kernel; import kernel.exception.CannotDeleteCellException; import kernel.exception.CellNotFoundException; import kernel.exception.CreateCycleException; import kernel.exception.InvalidIntervalException; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Grid implements Serializable { private static final long serialVersionUID = 1L; private static final int MAX_ROWS = 20; private static final String MAX_COLUMNS = "Z"; private Map cells = new HashMap<>(); public static LanguageEnum language = LanguageEnum.FR; public void createCell(String column, int line, double value) throws InvalidIntervalException { if (!validateInterval(column, line)) throw new InvalidIntervalException(); String id = this.getCellId(column, line); Cell cell = new Cell(column, line, value); this.cells.put(id, cell); } public void createCell(String column, int line, Formula formula) throws CreateCycleException, InvalidIntervalException { if (!validateInterval(column, line)) throw new InvalidIntervalException(); String id = this.getCellId(column, line); Cell cell = new Cell(column, line, formula); this.cells.put(id, cell); } public void setValue(String column, int line, double value) throws CellNotFoundException { this.getCell(column, line).setValue(value); } public void setFormula(String column, int line, Formula formula) throws CellNotFoundException, CreateCycleException { this.getCell(column, line).setFormula(formula); } public Cell getCell(String column, int line) throws CellNotFoundException { String id = this.getCellId(column, line); Cell cell = this.cells.get(id); if (cell != null) return cell; else throw new CellNotFoundException("La cellule " + id + " n'existe pas."); } public Cell getCell(String id) { return this.cells.get(id); } public List getCells() { return new ArrayList<>(this.cells.values()); } public double getValue(String column, int line) throws CellNotFoundException { return this.getCell(column.toUpperCase(), line).getValue(); } public String getFormulaAsString(String column, int line) throws CellNotFoundException { return this.getCell(column.toUpperCase(), line).toString(); } public String getDevelopedFormula(String column, int line) throws CellNotFoundException { return this.getCell(column.toUpperCase(), line).getDevelopedFormula(); } private String getCellId(String column, int line) { return column.toUpperCase() + line; } public int getTotalColumn() { return MAX_COLUMNS.charAt(0) - (int) 'A' + 1; } public int getTotalRow() { return MAX_ROWS; } private boolean validateInterval(String column, int line) { return line >= 1 && line <= MAX_ROWS && convertStringToInt(column) >= convertStringToInt("A") && convertStringToInt(column) <= convertStringToInt(MAX_COLUMNS); } public boolean cellExist(String key) { return this.cells.containsKey(key); } public void deleteCell(String column, int line) throws CannotDeleteCellException { String id = this.getCellId(column, line); if (this.cellExist(id)) { Cell cell = this.getCell(id); if (!cell.getUsedIn().isEmpty()) throw new CannotDeleteCellException("La cellule " + id + " est utilisée dans une autre case."); cell.updateUsedIn(); this.cells.remove(id); } } private int convertStringToInt(String str) { int ascii = 0; for (int i = 0; i < str.length(); i++) { // while counting characters if less than the length add one char character = str.charAt(i); // start on the first character ascii = ascii + (int) character; } return ascii; } public void save(String fileName) throws IOException { File file = new File(fileName); ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file)); stream.writeObject(this); stream.close(); } public static Grid load(String fileName) throws IOException, ClassNotFoundException { File file = new File(fileName); ObjectInputStream stream = new ObjectInputStream(new FileInputStream(file)); Grid grid = (Grid) stream.readObject(); stream.close(); return grid; } }