Cell.java 2.34 KB
package kernel;

import kernel.exception.CreateCycleException;
import kernel.exception.InvalidIntervalException;

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<Cell> usedIn = new ArrayList<>();
	
	public Cell(String column, int line, double value) throws InvalidIntervalException {
		column = column.toUpperCase();
		if (!validateInterval(column, line))
			throw new InvalidIntervalException();
		
		this.column = column;
		this.line = line;
		this.setValue(value);
	}
	
	public Cell(String column, int line, Formula formula)
			throws CreateCycleException, InvalidIntervalException {
		column = column.toUpperCase();
		if (!validateInterval(column, line))
			throw new InvalidIntervalException();
		
		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<Cell> 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;
	}
}