Menu.java 8.45 KB
package app;

import kernel.Cell;
import kernel.Formula;
import kernel.Grid;
import kernel.LanguageEnum;
import kernel.exception.BadSyntaxException;
import kernel.exception.CellNotFoundException;
import kernel.exception.CreateCycleException;
import kernel.exception.InvalidIntervalException;
import kernel.function.Average;
import kernel.function.Sum;
import kernel.operation.Addition;
import kernel.operation.Division;
import kernel.operation.Multiplication;
import kernel.operation.Subtraction;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Menu {
	
	public static void main(String[] args) throws IOException, CellNotFoundException {
		File fichier = new File("grid.data");
		
		// ouverture d'un flux sur un fichier
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fichier));
		
		Grid grid = new Grid();
		
		Scanner in = new Scanner(System.in);
		
		int choice;
		String column;
		int line;
		
		myLanguage();
		do {
			menu();
			System.out.print("VOTRE CHOIX? ");
			choice = in.nextInt();
			switch (choice) {
				case 1:
					try {
						createCase(grid);
					} catch (CreateCycleException | CellNotFoundException | BadSyntaxException e) {
						
						e.getMessage();
					}
					break;
				case 2:
					try {
						setCase(grid);
					} catch (CreateCycleException | CellNotFoundException | BadSyntaxException e) {
						
						e.getMessage();
					}
					break;
				case 3:
					System.out.println("\n Entrez la colonne de la case");
					column = in.next();
					System.out.println("\n Entrez la ligne de la case");
					line = in.nextInt();
					System.out.println(grid.getCell(column, line).getId() + ": " + grid.getCell(column, line).getDevelopedFormula());
					break;
				case 4:
					System.out.println("\n Entrez la colonne de la case");
					column = in.next();
					System.out.println("\n Entrez la ligne de la case");
					line = in.nextInt();
					System.out.println(grid.getCell(column, line).getId() + ": " + grid.getCell(column, line).toString());
					break;
				case 5:
					System.out.println("\n Entrez la colonne de la case");
					column = in.next();
					System.out.println("\n Entrez la ligne de la case");
					line = in.nextInt();
					System.out.println(grid.getCell(column, line).getId() + ": " + grid.getCell(column, line).getValue());
					break;
				case 6:
					gridPrint(grid);
					break;
				case 0: // quitter
			}
		} while (choice != 0);
		
		oos.writeObject(grid);
		oos.close();
		System.out.println("\n Adiós");
	}
	
	private static void menu() {
		System.out.println("\n1: CREER UNE CASE \n2: MODIFIER UNE CASE\n3:AFFICHER FORMULE DEVELOPPEEE CASE\n4:AFFICHER FORMULE CASE\n5:AFFICHER VALEUR CASE\n6:AFFICHER GRILLE\n0: QUITTER");
	}
	
	private static void createCase(Grid grid) throws CreateCycleException, CellNotFoundException, BadSyntaxException {
		Scanner in = new Scanner(System.in);
		
		String column;
		String formula;
		int line;
		int choice;
		double value;
		do {
			System.out.println("\n1: Case avec valeur\n2: Case avec formule\n0: Quitter");
			System.out.print("votre choix? ");
			choice = in.nextInt();
			switch (choice) {
				case 1:
					try {
						System.out.println("\n Entrez la colonne de la case");
						column = in.next();
						System.out.println("\n Entrez la ligne de la case");
						line = in.nextInt();
						System.out.println("\n Entrez la valeur de la case");
						value = in.nextDouble();
						grid.createCell(column, line, value);
						
					} catch (InvalidIntervalException exception) {
						System.out.println(exception.getMessage());
					}
					break;
				case 2:
					try {
						System.out.println("\n Entrez la colonne de la case");
						column = in.next();
						System.out.println("\n Entrez la ligne de la case");
						line = in.nextInt();
						System.out.println("\n Entrez la formule (Ex: A1+A2 ou SOMME(A1,A2)");
						formula = in.next();
						grid.createCell(column, line, generateFormulaWithString(formula, grid));
					} catch (InvalidIntervalException exception) {
						System.out.println(exception.getMessage());
					}
					break;
				case 0: // quitter
			}
		} while (choice != 0);
		
	}
	
	private static void gridPrint(Grid grid) {
		Scanner in = new Scanner(System.in);
		
		List<Cell> cells = grid.getCells();
		int choice;
		do {
			System.out.println("\n1: Afficher cases avec valeurs\n2: Afficher cases avec formules\n3: Afficher cases avec formules dévéloppées\n0: Quitter");
			System.out.print("votre choix? ");
			choice = in.nextInt();
			switch (choice) {
				case 1:
					System.out.println("Affichage des valeurs :");
					for (Cell cell : cells)
						System.out.println(cell.getId() + ": " + cell.getValue());
					break;
				case 2:
					System.out.println("Affichage des formules :");
					for (Cell cell : cells)
						System.out.println(cell.getId() + ": " + cell.toString());
					break;
				case 3:
					System.out.println("Affichage des formules développées :");
					for (Cell cell : cells)
						System.out.println(cell.getId() + ": " + cell.getDevelopedFormula());
					break;
				case 0: // quitter
			}
		} while (choice != 0);
	}
	
	private static void setCase(Grid grid) throws CreateCycleException, CellNotFoundException, BadSyntaxException {
		Scanner in = new Scanner(System.in);
		
		String column;
		String formula;
		int line;
		int choice;
		double value;
		do {
			System.out.println("\n1: Modifier case avec valeur\n2: Modifier case avec formule\n0: QUITTER");
			System.out.print("votre choix? ");
			choice = in.nextInt();
			switch (choice) {
				case 1:
					System.out.println("\n Entrez la colonne de la case");
					column = in.next();
					System.out.println("\n Entrez la ligne de la case");
					line = in.nextInt();
					System.out.println("\n Entrez la valeur de la case");
					value = in.nextDouble();
					grid.setValue(column, line, value);
					break;
				case 2:
					System.out.println("\n Entrez la colonne de la case");
					column = in.next();
					System.out.println("\n Entrez la ligne de la case");
					line = in.nextInt();
					System.out.println("\n Entrez la formule (Ex: (A1+A2) ou SOMME(A1,A2)");
					formula = in.next();
					grid.setFormula(column, line, generateFormulaWithString(formula, grid));
					break;
				case 0: // quitter
			}
		} while (choice != 0);
	}
	
	private static Formula generateFormulaWithString(String input, Grid grid) throws CellNotFoundException, BadSyntaxException {
		Pattern functionPattern = Pattern.compile("([A-Z]+)\\(([A-Z0-9,]+)\\)");
		Matcher functionMatcher = functionPattern.matcher(input);
		
		if (functionMatcher.matches()) {
			List<Cell> cells = Arrays.stream(functionMatcher.group(2).split(","))
					.map(c -> grid.getCell(c))
					.collect(Collectors.toList());
			
			if (cells.contains(null))
				throw new CellNotFoundException("Une des cellules demandées n'existe pas.");
			
			cells = cells.stream().filter(Objects::nonNull).collect(Collectors.toList());
			
			switch (functionMatcher.group(1)) {
				case "SUM":
				case "SOMME":
					return new Sum(cells);
				case "AVERAGE":
				case "MOYENNE":
					return new Average(cells);
			}
		} else {
			Pattern binaryOperationPattern = Pattern.compile("([A-Z]+[0-9]+)([+\\-*/])([A-Z]+[0-9]+)");
			Matcher binaryOperationMatcher = binaryOperationPattern.matcher(input);
			
			if (!binaryOperationMatcher.matches())
				throw new BadSyntaxException();
			
			Cell leftCell = grid.getCell(binaryOperationMatcher.group(1));
			Cell rightCell = grid.getCell(binaryOperationMatcher.group(3));
			
			if (leftCell == null || rightCell == null)
				throw new CellNotFoundException("Une des cellules demandées n'existe pas.");
			
			switch (binaryOperationMatcher.group(2)) {
				case "+":
					return new Addition(leftCell, rightCell);
				case "-":
					return new Subtraction(leftCell, rightCell);
				case "*":
					return new Multiplication(leftCell, rightCell);
				case "/":
					return new Division(leftCell, rightCell);
			}
		}
		
		return null;
	}
	
	private static void myLanguage() {
		Scanner in = new Scanner(System.in);
		
		int choix = 0;
		
		System.out.println("\n1: Francais/French\n2: Anglais/English");
		System.out.println("votre choix? ");
		choix = in.nextInt();
		
		switch (choix) {
			case 1:
				Grid.language = LanguageEnum.FR;
				break;
			case 2:
				Grid.language = LanguageEnum.EN;
				break;
		}
	}
}