Grid.java 4.01 KB
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<String, Cell> cells = new HashMap<>();
	public static LanguageEnum language = LanguageEnum.FR;
	
	
	public void createCell(String column, int line, double value) throws InvalidIntervalException {
		column = column.toUpperCase();
		
		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 {
		column = column.toUpperCase();
		
		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 {
		Cell cell = this.cells.get(this.getCellId(column, line));
		
		if (cell != null)
			return cell;
		else
			throw new CellNotFoundException();
	}
	
	public Cell getCell(String id) {
		return this.cells.get(id);
	}
	
	public List<Cell> getCells() {
		return new ArrayList<>(this.cells.values());
	}
	
	public double getValue(String column, int line) throws CellNotFoundException {
		return this.getCell(column, line).getValue();
	}
	
	public String getFormulaAsString(String column, int line) throws CellNotFoundException {
		return this.getCell(column, line).toString();
	}
	
	public String getDevelopedFormula(String column, int line) throws CellNotFoundException {
		return this.getCell(column, line).getDevelopedFormula();
	}
	
	private String getCellId(String column, int line) {
		return column + 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();
			
			cell.updateUsedIn();
			this.cells.remove(this.getCellId(column, line));
		}
	}
	
	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() throws IOException {
		File file = new File("grid.data");
		
		ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file));
		stream.writeObject(this);
		stream.close();
	}
	
	public static Grid load() throws IOException, ClassNotFoundException {
		File file = new File("grid.data");
		
		ObjectInputStream stream = new ObjectInputStream(new FileInputStream(file));
		
		return (Grid) stream.readObject();
	}
	
}