package kernel; import kernel.exception.CreateCycleException; import kernel.exception.InvalidIntervalLineColumnEception; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Cell implements Serializable { private static final long serialVersionUID = 1L; private static final int MAX_LIGNES = 20; private String column; private int line; private double value; private Formula formula; private List usedIn = new ArrayList<>(); public Cell(String column, int line, double value) throws InvalidIntervalLineColumnEception { column = column.toUpperCase(); if (!validateInterval(column, line)) throw new InvalidIntervalLineColumnEception(); this.column = column; this.line = line; this.setValue(value); } public Cell(String column, int line, Formula formula) throws CreateCycleException, InvalidIntervalLineColumnEception { column = column.toUpperCase(); if (!validateInterval(column, line)) throw new InvalidIntervalLineColumnEception(); this.column = column; this.line = line; this.setFormula(formula); } public double getValue() { return this.value; } public Formula getFormula() { return this.formula; } public String getDevelopedFormula() { return this.containFormula() ? this.formula.getDevelopedFormula() : this.getId(); } public String getId() { return this.column + this.line; } public List getUsedIn() { return this.usedIn; } public String toString() { return this.containFormula() ? this.formula.toString() : this.getId(); } public void updateValue() { if (this.containFormula()) this.value = this.formula.eval(); } public boolean containFormula() { return this.formula != null; } public void setFormula(Formula formula) throws CreateCycleException { if (formula.createCycle(this)) throw new CreateCycleException(); this.formula = formula; for (Cell cell : this.formula.getUtilisedCells()) cell.usedIn.add(this); this.updateValue(); this.spreadValue(); } public void setValue(double value) { this.value = value; this.formula = null; this.spreadValue(); } private void spreadValue() { for (Cell cell : this.usedIn) { cell.updateValue(); cell.spreadValue(); } } private boolean validateInterval(String column, int line) { return line >= 1 && line <= MAX_LIGNES && column.compareTo("A") >= 0 && column.compareTo("Z") <= 0; } }