Commit 02c44758abfb5eb59eca9fe012c197395e1e52e4

Authored by Remi
1 parent 08cc28cc

finish ihm

essai.ser renamed to grid.data
No preview for this file type
src/app/ApplicationDeserialization.java deleted
... ... @@ -1,38 +0,0 @@
1   -package app;
2   -
3   -import java.io.File;
4   -import java.io.FileInputStream;
5   -import java.io.IOException;
6   -import java.io.ObjectInputStream;
7   -import java.util.List;
8   -
9   -import kernel.Cell;
10   -import kernel.Grid;
11   -
12   -public class ApplicationDeserialization {
13   - public static void main(String[] args) throws IOException, ClassNotFoundException {
14   - File fichier = new File("essai.ser") ;
15   -
16   - // ouverture d'un flux sur un fichier
17   - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fichier)) ;
18   -
19   - // désérialization de l'objet
20   - Grid grid = (Grid)ois.readObject() ;
21   - // Affichage
22   - List<Cell> cells = grid.getCells();
23   -
24   - System.out.println("Affichage des valeurs :");
25   - for (Cell cell : cells)
26   - System.out.println(cell.getId() + ": " + cell.getValue());
27   -
28   - System.out.println("Affichage des formules :");
29   - for (Cell cell : cells)
30   - System.out.println(cell.getId() + ": " + cell.toString());
31   -
32   - System.out.println("Affichage des formules développées :");
33   - for (Cell cell : cells)
34   - System.out.println(cell.getId() + ": " + cell.getDevelopedFormula());
35   - ois.close();
36   - }
37   -
38   -}
src/ihm/TablooProto.java
... ... @@ -24,53 +24,69 @@ import javax.swing.table.DefaultTableCellRenderer;
24 24 import javax.swing.table.TableColumn;
25 25  
26 26 import kernel.Grid;
27   -import kernel.exception.CellNotFoundException;
28   -import kernel.exception.InvalidIntervalException;
  27 +import kernel.exception.*;
  28 +import kernel.function.Average;
  29 +import kernel.function.Sum;
  30 +import kernel.operation.Addition;
  31 +import kernel.operation.Division;
  32 +import kernel.operation.Multiplication;
  33 +import kernel.operation.Subtraction;
  34 +
  35 +import javax.swing.*;
  36 +import javax.swing.table.AbstractTableModel;
  37 +import javax.swing.table.DefaultTableCellRenderer;
  38 +import javax.swing.table.TableColumn;
  39 +import java.awt.*;
  40 +import java.awt.event.WindowAdapter;
  41 +import java.awt.event.WindowEvent;
  42 +import java.io.IOException;
  43 +import java.util.Arrays;
  44 +import java.util.List;
  45 +import java.util.Objects;
  46 +import java.util.regex.Matcher;
  47 +import java.util.regex.Pattern;
  48 +import java.util.stream.Collectors;
29 49  
30 50 public class TablooProto extends JPanel {
31   -
32   - /**
33   - *
34   - */
35   - private static final long serialVersionUID = 1L;
36   -
  51 +
  52 + static Grid grid;
  53 +
37 54 // Fourni: ne rien changer.
38   - public TablooProto() throws FileNotFoundException, ClassNotFoundException, IOException {
39   - super(new GridLayout(1, 0));
40   -
41   - // modele de donnees
42   - // cf. plus loin la inner classe MyTableModel a modifier...
43   - MyTableModel tableModel = new MyTableModel();
44   -
45   - // la JTable et ses parametres
46   - JTable table = new JTable(tableModel);
47   - table.setPreferredScrollableViewportSize(new Dimension(1000, 500));
48   - table.setGridColor(Color.BLACK);
49   - table.setShowGrid(true);
50   -
51   - // on ajoute un scroll
52   - JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
53   - add(scrollPane);
54   - table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
55   -
56   - // parametrage de la 1ere ligne = noms des colonnes
57   - ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);
58   -
59   - // parametrage de la 1ere colonne consacree a la numerotation des lignes
60   - TableColumn tm = table.getColumnModel().getColumn(0);
61   - tm.setPreferredWidth(tm.getPreferredWidth() * 2 / 3);
62   - tm.setCellRenderer(new PremiereColonneSpecificRenderer(Color.LIGHT_GRAY));
63   -
64   - }
65   -
66   - // Inner class pour changer l'aspect de la premiere colonne consacree a la numerotation des lignes
67   - // Fourni: ne rien changer.
68   - class PremiereColonneSpecificRenderer extends DefaultTableCellRenderer {
69   -
70   - /**
71   - *
  55 + public TablooProto(Grid grid) throws ClassNotFoundException, IOException {
  56 + super(new GridLayout(1, 0));
  57 +
  58 + // modele de donnees
  59 + // cf. plus loin la inner classe MyTableModel a modifier...
  60 + MyTableModel tableModel = new MyTableModel(grid);
  61 +
  62 + // la JTable et ses parametres
  63 + JTable table = new JTable(tableModel);
  64 + table.setPreferredScrollableViewportSize(new Dimension(1000, 500));
  65 + table.setGridColor(Color.BLACK);
  66 + table.setShowGrid(true);
  67 +
  68 + // on ajoute un scroll
  69 + JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  70 + add(scrollPane);
  71 + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  72 +
  73 + // parametrage de la 1ere ligne = noms des colonnes
  74 + ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);
  75 +
  76 + // parametrage de la 1ere colonne consacree a la numerotation des lignes
  77 + TableColumn tm = table.getColumnModel().getColumn(0);
  78 + tm.setPreferredWidth(tm.getPreferredWidth() * 2 / 3);
  79 + tm.setCellRenderer(new PremiereColonneSpecificRenderer(Color.LIGHT_GRAY));
  80 +
  81 + }
  82 +
  83 + // Inner class pour changer l'aspect de la premiere colonne consacree a la numerotation des lignes
  84 + // Fourni: ne rien changer.
  85 + class PremiereColonneSpecificRenderer extends DefaultTableCellRenderer {
  86 +
  87 + /**
  88 + *
72 89 */
73   - private static final long serialVersionUID = 1L;
74 90 Color couleur;
75 91  
76 92 public PremiereColonneSpecificRenderer(Color couleur) {
... ... @@ -98,145 +114,212 @@ public class TablooProto extends JPanel {
98 114 *
99 115 */
100 116 private static final long serialVersionUID = 1L;
101   - // TODO
102   - // remplacer ce tableau en dur du prototype par la grille serialisee:
103   - kernel.Grid calc;
104   - //String[][] calc;
105   -
106   - MyTableModel() throws FileNotFoundException, IOException, ClassNotFoundException {
107   - // TODO: remplacer cette initialisation par le chargement de la grille serialisee
108   - File fichier = new File("grille.ser") ;
109   - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fichier)) ;
110   - calc = (Grid)ois.readObject() ;
111   - ois.close();
112   - //calc = new String[this.getRowCount()][this.getColumnCount()];
113   - //for (int ligne =0; ligne < calc.length; ligne++)
114   - //for (int colonne=0; colonne < calc[ligne].length; colonne++)
115   - //calc[ligne][colonne] = "";
116   - }
117   -
118   - @Override
119   - // Standard: doit retourner le nbre de colonnes de la JTable
120   - public int getColumnCount() {
121   - // TODO: remplacer par le nbre de colonnes de la grille
122   - // + 1 pour la colonne 0 consacrée aux numeros de ligne)
123   - return calc.getTotalColumn()+1;
124   - }
125   -
126   - @Override
127   - // Standard: doit retourner le nbre de lignes de la JTable
128   - public int getRowCount() {
129   - // TODO: remplacer par le nbre de lignes de la grille
130   - return calc.getTotalLine();
131   - }
132   -
133   - // Standard: doit renvoyer le nom de la colonne a afficher en tete
134   - // Fourni: ne rien changer.
135   - @Override
136   - public String getColumnName(int col) {
137   - if (col == 0) {
138   - return ""; // colonne consacrée aux numeros de ligne
139   - } else {
140   - return "" + (char) ((int) ('A') + col - 1);
141   - }
142   - }
143   -
144   - // Utilitaire interne fourni (ne rien changer)
145   - // Retourne le nom d'une case a partir de ses coordonnees dans la JTable.
146   - String getNomCase(int row, int col) {
147   - return this.getColumnName(col) + String.valueOf(row + 1); // row commence a 0
148   - }
149   -
150   - @Override
151   - // Standard: doit renvoyer le contenu a afficher de la case correspondante
152   - public Object getValueAt(int row, int col) {
153   - if (col == 0) {
154   - // Fourni: ne rien changer.
155   - // en colonne 0 : numeros de lignes
156   - return "" + String.valueOf(row + 1);
157   - } else {
158   - // TODO: remplacer par le contenu + la valeur
159   - // de la case de nom getNomCase(row, col)
160   - // dans la grille (comme dans la figure 1 du sujet).
161   - try {
162   - return "" + calc.getDevelopedFormula(this.getColumnName(col), row+1)+"="+calc.getValue(this.getColumnName(col), row+1);
  117 + private Grid grid;
  118 +
  119 + MyTableModel(Grid grid) {
  120 + this.grid = grid;
  121 + }
  122 +
  123 + @Override
  124 + // Standard: doit retourner le nbre de colonnes de la JTable
  125 + public int getColumnCount() {
  126 + return grid.getTotalColumn() + 1;
  127 + }
  128 +
  129 + @Override
  130 + // Standard: doit retourner le nbre de lignes de la JTable
  131 + public int getRowCount() {
  132 + return grid.getTotalRow();
  133 + }
  134 +
  135 + // Standard: doit renvoyer le nom de la colonne a afficher en tete
  136 + // Fourni: ne rien changer.
  137 + @Override
  138 + public String getColumnName(int col) {
  139 + if (col == 0) {
  140 + return ""; // colonne consacrée aux numeros de ligne
  141 + } else {
  142 + return "" + (char) ((int) ('A') + col - 1);
  143 + }
  144 + }
  145 +
  146 + // Utilitaire interne fourni (ne rien changer)
  147 + // Retourne le nom d'une case a partir de ses coordonnees dans la JTable.
  148 + private String getNomCase(int row, int col) {
  149 + return this.getColumnName(col) + (row + 1); // row commence a 0
  150 + }
  151 +
  152 + @Override
  153 + // Standard: doit renvoyer le contenu a afficher de la case correspondante
  154 + public Object getValueAt(int row, int col) {
  155 + if (col == 0) {
  156 + // Fourni: ne rien changer.
  157 + // en colonne 0 : numeros de lignes
  158 + return "" + (row + 1);
  159 + } else {
  160 + try {
  161 + return grid.getDevelopedFormula(this.getColumnName(col), row + 1) + "=" + grid.getValue(this.getColumnName(col), row + 1);
163 162 } catch (CellNotFoundException e) {
164 163 // TODO Auto-generated catch block
165 164  
166 165 }
167 166 }
168 167 return "";
169   - }
170   -
171   - // Standard.
172   - // Fourni: ne rien changer.
173   - @Override
174   - public Class getColumnClass(int c) {
175   - return getValueAt(0, c).getClass();
176   - }
177   -
178   - // Standard: determine si une case est editable ou non.
179   - // Fourni: ne rien changer.
180   - // Seules les cases de la 1er colonne ne le sont pas
181   - // (consacrees a la numerotation des lignes)
182   - @Override
183   - public boolean isCellEditable(int row, int col) {
184   - if (col < 1) {
185   - return false; // col 0 consacree a la numerotation des lignes (non editable)
186   - } else {
187   - return true;
188   - }
189   - }
190   -
191   -
192   - // Standard: l'utilisateur a entré une valeur dans une case,
193   - // mettre a jour le modèle de donnees connecte.
194   - // L'utilisateur a modifie une case.
195   - // Si c'est une valeur numerique (sinon ne rien faire)
196   - // - modifier la case correspondante dans la grille si cette case existe
197   - // - ajouter la case correspondante dans la grille
198   - @Override
199   - public void setValueAt(Object value, int row, int col) {
200   -
201   - // TODO remplacer par le code correspondant
202   - if (value instanceof String) {
203   - if (calc.getCellsId().contains(this.getNomCase(row, col)))
  168 + }
  169 +
  170 + // Standard.
  171 + // Fourni: ne rien changer.
  172 + @Override
  173 + public Class getColumnClass(int c) {
  174 + return getValueAt(0, c).getClass();
  175 + }
  176 +
  177 + // Standard: determine si une case est editable ou non.
  178 + // Fourni: ne rien changer.
  179 + // Seules les cases de la 1er colonne ne le sont pas
  180 + // (consacrees a la numerotation des lignes)
  181 + @Override
  182 + public boolean isCellEditable(int row, int col) {
  183 + return col > 0;
  184 + }
  185 +
  186 + // Standard: l'utilisateur a entré une valeur dans une case,
  187 + // mettre a jour le modèle de donnees connecte.
  188 + // L'utilisateur a modifie une case.
  189 + // Si c'est une valeur numerique
  190 + // - modifier la case correspondante dans la grille si cette case existe
  191 + // - ajouter la case correspondante dans la grille
  192 + @Override
  193 + public void setValueAt(Object input, int row, int col) {
  194 + Formula formula = new Addition(null, null);
  195 + double value = 0;
  196 + int cellType;
  197 +
  198 + if (input instanceof String && !((String) input).isEmpty()) {
  199 + String text = (String) input;
  200 + try {
204 201 try {
205   - calc.setValue(this.getColumnName(col), row+1, Double.parseDouble((String)value));
206   - } catch (CellNotFoundException e) {
207   - // TODO Auto-generated catch block
208   - e.printStackTrace();
  202 + // Récupération de la valeur
  203 + value = Double.parseDouble(text);
  204 + cellType = 0;
  205 + } catch (NumberFormatException exception) {
  206 + // Récupération de la formule
  207 + formula = this.generateFormulaWithString(text);
  208 + cellType = 1;
209 209 }
210   - else
211   - try {
212   - calc.createCell(this.getColumnName(col), row+1, Double.parseDouble((String)value));
213   - } catch (InvalidIntervalException e) {
214   - // TODO Auto-generated catch block
215   -
  210 +
  211 + String cellName = this.getNomCase(row, col);
  212 + switch (cellType) {
  213 + case 0:
  214 + if (this.grid.cellExist(cellName))
  215 + this.grid.setValue(this.getColumnName(col), row + 1, value);
  216 + else
  217 + this.grid.createCell(this.getColumnName(col), row + 1, value);
  218 + break;
  219 + case 1:
  220 + if (this.grid.cellExist(cellName))
  221 + this.grid.setFormula(this.getColumnName(col), row + 1, formula);
  222 + else
  223 + this.grid.createCell(this.getColumnName(col), row + 1, formula);
  224 + break;
216 225 }
217   - }
218   - // Ne pas modifier :
219   - // mise a jour automatique de l'affichage suite a la modification
220   - fireTableCellUpdated(row, col);
221   - }
222   - }
223   - // Fin de la inner class MyTableModel
224   -
225   - // Exécution de l'interface graphique a partir d'un terminal.
226   - // TODO: parametrer le tout par un fichier de grille serialisee.
227   - public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException {
228   - // TODO: parametrer le tableur par un fichier de grille serialisee
229   - // a charger comme modele de donnees.
230   - TablooProto tableur = new TablooProto();
231   -
232   - // Creation de l'application et lancement
233   - // Fourni: ne rien changer.
234   - JFrame frame = new JFrame("TABLO");
235   - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
236   - tableur.setOpaque(true);
237   - frame.setContentPane(tableur);
238   - frame.pack();
239   - frame.setVisible(true);
240   -
241   - }
  226 + } catch (CellNotFoundException | BadSyntaxException | CreateCycleException | InvalidIntervalException e) {
  227 + JOptionPane.showMessageDialog(null, e.getMessage(), "Attention", JOptionPane.INFORMATION_MESSAGE);
  228 + }
  229 + } else {
  230 + try {
  231 + this.grid.deleteCell(this.getColumnName(col), row + 1);
  232 + } catch (CannotDeleteCellException e) {
  233 + JOptionPane.showMessageDialog(null, e.getMessage(), "Attention", JOptionPane.INFORMATION_MESSAGE);
  234 + }
  235 + }
  236 +
  237 + // mise a jour automatique de l'affichage de toute la table suite a la modification
  238 + fireTableDataChanged();
  239 + }
  240 +
  241 + private Formula generateFormulaWithString(String input) throws CellNotFoundException, BadSyntaxException {
  242 + Pattern functionPattern = Pattern.compile("=([A-Z]+)\\(([A-Z0-9,]+)\\)");
  243 + Matcher functionMatcher = functionPattern.matcher(input);
  244 +
  245 + if (functionMatcher.matches()) {
  246 + List<Cell> cells = Arrays.stream(functionMatcher.group(2).split(","))
  247 + .map(c -> grid.getCell(c))
  248 + .collect(Collectors.toList());
  249 +
  250 + if (cells.contains(null))
  251 + throw new CellNotFoundException();
  252 +
  253 + cells = cells.stream().filter(Objects::nonNull).collect(Collectors.toList());
  254 +
  255 + switch (functionMatcher.group(1)) {
  256 + case "SUM":
  257 + case "SOMME":
  258 + return new Sum(cells);
  259 + case "AVERAGE":
  260 + case "MOYENNE":
  261 + return new Average(cells);
  262 + }
  263 + } else {
  264 + Pattern binaryOperationPattern = Pattern.compile("=([A-Z]+[0-9]+)([+\\-*/])([A-Z]+[0-9]+)");
  265 + Matcher binaryOperationMatcher = binaryOperationPattern.matcher(input);
  266 +
  267 + if (!binaryOperationMatcher.matches())
  268 + throw new BadSyntaxException();
  269 +
  270 + Cell leftCell = grid.getCell(binaryOperationMatcher.group(1));
  271 + Cell rightCell = grid.getCell(binaryOperationMatcher.group(3));
  272 +
  273 + if (leftCell == null || rightCell == null)
  274 + throw new CellNotFoundException();
  275 +
  276 + switch (binaryOperationMatcher.group(2)) {
  277 + case "+":
  278 + return new Addition(leftCell, rightCell);
  279 + case "-":
  280 + return new Subtraction(leftCell, rightCell);
  281 + case "*":
  282 + return new Multiplication(leftCell, rightCell);
  283 + case "/":
  284 + return new Division(leftCell, rightCell);
  285 + }
  286 + }
  287 +
  288 + return null;
  289 + }
  290 + }
  291 + // Fin de la inner class MyTableModel
  292 +
  293 + // Exécution de l'interface graphique a partir d'un terminal.
  294 + public static void main(String[] args) throws ClassNotFoundException, IOException {
  295 + try {
  296 + grid = Grid.load();
  297 + } catch (IOException | ClassNotFoundException e) {
  298 + grid = new Grid();
  299 + }
  300 + // a charger comme modele de donnees.
  301 + TablooProto tableur = new TablooProto(grid);
  302 +
  303 + // Creation de l'application et lancement
  304 + // Fourni: ne rien changer.
  305 + JFrame frame = new JFrame("TABLO");
  306 + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  307 + tableur.setOpaque(true);
  308 + frame.setContentPane(tableur);
  309 + frame.pack();
  310 + frame.setVisible(true);
  311 +
  312 + // Sauvegarde de la grille lors de la fermeture de l'application
  313 + frame.addWindowListener(new WindowAdapter() {
  314 + @Override
  315 + public void windowClosing(WindowEvent we) {
  316 + try {
  317 + grid.save();
  318 + } catch (IOException e) {
  319 + System.out.println(e.getMessage());
  320 + }
  321 + System.exit(0);
  322 + }
  323 + });
  324 + }
242 325 }
... ...
src/kernel/Cell.java
... ... @@ -65,6 +65,13 @@ public class Cell implements Serializable {
65 65 this.value = this.formula.eval();
66 66 }
67 67  
  68 + public void updateUsedIn() {
  69 + if (this.containFormula()) {
  70 + for (Cell cell : this.formula.getUtilisedCells())
  71 + cell.getUsedIn().remove(this);
  72 + }
  73 + }
  74 +
68 75 public boolean containFormula() {
69 76 return this.formula != null;
70 77 }
... ...
src/kernel/Grid.java
1 1 package kernel;
2 2  
  3 +import kernel.exception.CannotDeleteCellException;
3 4 import kernel.exception.CellNotFoundException;
4 5 import kernel.exception.CreateCycleException;
5 6 import kernel.exception.InvalidIntervalException;
6 7  
7   -import java.io.Serializable;
  8 +import java.io.*;
8 9 import java.util.ArrayList;
9 10 import java.util.HashMap;
10 11 import java.util.List;
... ... @@ -13,32 +14,32 @@ import java.util.Map;
13 14 public class Grid implements Serializable {
14 15  
15 16 private static final long serialVersionUID = 1L;
16   - private static final int MAX_LIGNES = 20;
17   - private static final String MAX_COLONNES = "Z";
  17 + private static final int MAX_ROWS = 20;
  18 + private static final String MAX_COLUMNS = "Z";
18 19 private Map<String, Cell> cells = new HashMap<>();
19 20 public static LanguageEnum language = LanguageEnum.FR;
20   -
  21 +
21 22  
22 23 public void createCell(String column, int line, double value) throws InvalidIntervalException {
23 24 column = column.toUpperCase();
24   -
  25 +
25 26 if (!validateInterval(column, line))
26 27 throw new InvalidIntervalException();
27 28 String id = this.getCellId(column, line);
28 29 Cell cell = new Cell(column, line, value);
29 30 this.cells.put(id, cell);
30   -
  31 +
31 32 }
32 33  
33 34 public void createCell(String column, int line, Formula formula) throws CreateCycleException, InvalidIntervalException {
34 35 column = column.toUpperCase();
35   -
  36 +
36 37 if (!validateInterval(column, line))
37 38 throw new InvalidIntervalException();
38 39 String id = this.getCellId(column, line);
39 40 Cell cell = new Cell(column, line, formula);
40 41 this.cells.put(id, cell);
41   -
  42 +
42 43 }
43 44  
44 45 public void setValue(String column, int line, double value) throws CellNotFoundException {
... ... @@ -63,10 +64,6 @@ public class Grid implements Serializable {
63 64 return new ArrayList<>(this.cells.values());
64 65 }
65 66  
66   - public List<String> getCellsId() {
67   - return new ArrayList<>(this.cells.keySet());
68   - }
69   -
70 67 public double getValue(String column, int line) throws CellNotFoundException {
71 68 return this.getCell(column, line).getValue();
72 69 }
... ... @@ -85,26 +82,59 @@ public class Grid implements Serializable {
85 82  
86 83  
87 84 public int getTotalColumn() {
88   - return MAX_COLONNES.charAt(0) - (int) 'A' + 1;
89   - //return convertStringToInt(MAX_COLONNES);
  85 + return MAX_COLUMNS.charAt(0) - (int) 'A' + 1;
90 86 }
91 87  
92   - public int getTotalLine() {
93   - return MAX_LIGNES;
  88 + public int getTotalRow() {
  89 + return MAX_ROWS;
94 90 }
95 91  
96 92 private boolean validateInterval(String column, int line) {
97   - return line >= 1 && line <= MAX_LIGNES && convertStringToInt(column)>=convertStringToInt("A") && convertStringToInt(column)<=convertStringToInt(MAX_COLONNES);
  93 + return line >= 1 && line <= MAX_ROWS && convertStringToInt(column) >= convertStringToInt("A") && convertStringToInt(column) <= convertStringToInt(MAX_COLUMNS);
  94 + }
  95 +
  96 + public boolean cellExist(String key) {
  97 + return this.cells.containsKey(key);
98 98 }
99 99  
100   - private int convertStringToInt(String str){
101   - int ascii=0;
102   - for(int i = 0; i < str.length(); i++){ // while counting characters if less than the length add one
  100 + public void deleteCell(String column, int line) throws CannotDeleteCellException {
  101 + String id = this.getCellId(column, line);
  102 +
  103 + if (this.cellExist(id)) {
  104 + Cell cell = this.getCell(id);
  105 +
  106 + if (!cell.getUsedIn().isEmpty())
  107 + throw new CannotDeleteCellException();
  108 +
  109 + cell.updateUsedIn();
  110 + this.cells.remove(this.getCellId(column, line));
  111 + }
  112 + }
  113 +
  114 + private int convertStringToInt(String str) {
  115 + int ascii = 0;
  116 + for (int i = 0; i < str.length(); i++) { // while counting characters if less than the length add one
103 117 char character = str.charAt(i); // start on the first character
104   - ascii = ascii+(int) character;
105   -
  118 + ascii = ascii + (int) character;
  119 +
106 120 }
107 121 return ascii;
108 122 }
109 123  
  124 + public void save() throws IOException {
  125 + File file = new File("grid.data");
  126 +
  127 + ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream(file));
  128 + stream.writeObject(this);
  129 + stream.close();
  130 + }
  131 +
  132 + public static Grid load() throws IOException, ClassNotFoundException {
  133 + File file = new File("grid.data");
  134 +
  135 + ObjectInputStream stream = new ObjectInputStream(new FileInputStream(file));
  136 +
  137 + return (Grid) stream.readObject();
  138 + }
  139 +
110 140 }
... ...
src/kernel/exception/CannotDeleteCellException.java 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +package kernel.exception;
  2 +
  3 +public class CannotDeleteCellException extends Exception {
  4 +
  5 + public CannotDeleteCellException() {
  6 + super("Cette cellule est utilisée dans une autre cellule.");
  7 + }
  8 +}
... ...
src/kernel/exception/CellNotFoundException.java
1 1 package kernel.exception;
2 2  
3 3 public class CellNotFoundException extends Exception {
  4 +
  5 + public CellNotFoundException() {
  6 + super("Vous voulez utiliser une cellule qui n'est pas encore créée.");
  7 + }
4 8 }
... ...