package de.hs_mannheim.informatik.spreadsheet; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Part of a simplified spreadsheet system for the PR1 programming lab at Hochschule Mannheim. * * @author Oliver Hummel & Victor Waitz */ public class Axel { static Scanner keyboard = new Scanner(System.in); static Spreadsheet spr = new Spreadsheet(11,11); public static void main(String[] args) throws FileNotFoundException { // Spreadsheet spr = new Spreadsheet(6,9); spr.put("A1", "1"); spr.put("A2", "1"); spr.put("A3", "123"); spr.put("B1", "2"); spr.put("B2", "4"); spr.put("B3", "1"); spr.put("B4", "=41+A2"); spr.put("C5", "=7*6"); spr.put("D1", "=3/2"); System.out.println(spr); // spr.saveCsv("/tmp/test.csv"); // DONE: You might want to put "UI loop" for entering value and formulas here resp. in some UI methods. // TODO ME: Implement program commands System.out.println("Welcome to Axel (Totally not Excel)"); System.out.println(); while(true) { String userCommandPositionInput = userCommandPositionInput(); if (userCommandPositionInput.charAt(0) == '*'){ executeCommand(userCommandPositionInput); System.out.println(spr); continue; } String userPositionInput = userCommandPositionInput; String userValueFormulaInput = userValueFormulaInput(); spr.put(userPositionInput, userValueFormulaInput); System.out.println(spr); } } //? User input for a program command or a position public static String userCommandPositionInput(){ System.out.println(); System.out.println("Input a command for the program or a position"); System.out.printf("List of program commands: *exit, *save, *load or *help %nFormat for position: A1 or B14%n"); System.out.print("Input: "); String userCommandPositionInput = keyboard.nextLine(); return userCommandPositionComputation(userCommandPositionInput); } public static String userCommandPositionComputation(String userCommandPositionInput){ if (userCommandPositionInput.isEmpty()){ System.out.println("Input is empty!"); return userCommandPositionInput(); } //? Program command if (userCommandPositionInput.charAt(0) == '*'){ if (!(userCommandErrorCheck(userCommandPositionInput))) { System.out.println("Invalid command!"); return userCommandPositionInput(); } return userCommandPositionInput; } //? Position if (!(userPositionErrorCheck(userCommandPositionInput))){ System.out.println("Invalid position!"); return userCommandPositionInput(); } if (!(userPositionBoundsErrorCheck(userCommandPositionInput, spr))){ System.out.println("Position out of bounds!"); return userCommandPositionInput(); } return userCommandPositionInput; } public static boolean userCommandErrorCheck(String CommandToCheck){ //? true if valid //? valid inputs are: *exit, *save, *load, *help (and all upper case variants) CommandToCheck = CommandToCheck.toLowerCase(); if (CommandToCheck.equals("*exit") || CommandToCheck.equals("*save") || CommandToCheck.equals("*load") || CommandToCheck.equals("*help")){ return true; } return false; } public static boolean userPositionErrorCheck(String positionToCheck){ //? true if valid //? valid inputs are: A1, B14, C79, E99, F1, G99, J1, M98, ... (and all lower case variants) positionToCheck = positionToCheck.toUpperCase(); //? Check if input is the right length if (positionToCheck.length() < 2 || positionToCheck.length() > 3){ return false; } //? Check if input is in the right format if (!(Character.isLetter(positionToCheck.charAt(0)) && Character.isDigit(positionToCheck.charAt(1)))){ return false; } if (positionToCheck.length() == 3){ if (!(Character.isDigit(positionToCheck.charAt(2)))){ return false; } } return true; } public static boolean userPositionBoundsErrorCheck(String positionToCheck, Spreadsheet spr){ //? true if valid positionToCheck = positionToCheck.toUpperCase(); if ((spr.getRow(positionToCheck) >= spr.getRowsLCount()) || (spr.getCol(positionToCheck) >= spr.getColsCount())) { return false; } return true; } //? User input for a value or a formula public static String userValueFormulaInput(){ System.out.println(); System.out.printf("Input a value of a formula for the selected position.%n"); System.out.printf("Format for a value: 7 or 1337 %nFormat for a formula: =7*6 or =SUMME(A1:A3)%n"); System.out.print("Input: "); String userCommandInput = keyboard.nextLine(); return userValueFormulaComputation(userCommandInput); } public static String userValueFormulaComputation(String userValueFormulaInput){ if (userValueFormulaInput.isEmpty()){ System.out.println("Input is empty!"); return userValueFormulaInput(); } //? Formula if (userValueFormulaInput.charAt(0) == '='){ if (!(userFormulaErrorCheck(userValueFormulaInput))) { System.out.println("Invalid formula!"); return userValueFormulaInput(); } return userValueFormulaInput; } //? Value if (!(userValueErrorCheck(userValueFormulaInput))){ System.out.println("Invalid value!"); return userValueFormulaInput(); } return userValueFormulaInput; } public static boolean userFormulaErrorCheck(String formulaToCheck){ //? true if valid //? valid inputs are: =7*6, =SUM(A1:A3), =A1, =A1+A2, =A1-A2, ... (and all lower case variants) //TODO ME: Formula format check, maybe too much work //TODO ME: Check if formula vars are in bounds //? remove '=' at the beginning and make everything upper case formulaToCheck = formulaToCheck.toUpperCase().substring(1); if (formulaToCheck.startsWith("SUMME(") || formulaToCheck.startsWith("PRODUKT(") || formulaToCheck.startsWith("MITTELWERT(") || formulaToCheck.startsWith("STABW(") || formulaToCheck.startsWith("MIN(") || formulaToCheck.startsWith("MAX(")){ return userFormulaFunctionErrorCheck(formulaToCheck); } return userFormulaExpressionErrorCheck(formulaToCheck); } public static boolean userFormulaFunctionErrorCheck(String functionToCheck){ String[] functionCorners = spr.isolateFunctionCorners(functionToCheck); String[] functionBlock= spr.wholeFunctionBlock(functionToCheck); if (functionCorners.length != 2){ return false; } for (String functionCorner: functionCorners){ System.out.printf("Corner: %s - Cell test: %s %n", functionCorner, spr.isValueCellName(functionCorner)); if (!(spr.isValueCellName(functionCorner).equals("cellName"))){ return false; } if (!userPositionBoundsErrorCheck(functionCorner, spr)){ return false; } } return true; } public static boolean userFormulaExpressionErrorCheck(String expressionToCheck){ return true; } public static boolean userValueErrorCheck(String valueToCheck){ //? true if valid //? valid inputs are: 7, 1337, 0, , -213,... //? For floating point numbers // String digitCheckRegex = "-?\\d+(\\.\\d+)?"; //? For integers String digitCheckRegex = "-?\\d+"; if (!(valueToCheck.matches(digitCheckRegex))){ return false; } return true; } public static void executeCommand(String command) { System.out.printf("Executing command: %s%n", command); //TODO ME: switch (command){ case "*load": progLoad(); break; } } private static void progLoad(){ int rows = spr.getRowsLCount(); int cols = spr.getColsCount(); for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ spr.cells[r][c].setValue(""); } } spr.put("A1", "1"); spr.put("A2", "2"); spr.put("A3", "3"); spr.put("A4", "4"); spr.put("B1", "5"); spr.put("B2", "6"); spr.put("B3", "7"); spr.put("B4", "8"); spr.put("K1", "200"); spr.put("K11", "100"); spr.put("J4", "4"); spr.put("I10", "69"); } }