Commit ebf0bdb20e997f6d9f18ac4e43d0b458a8c0502e

Authored by mandjemb
1 parent 0c4a46ca

interface ok: manque nb column

essai.ser
No preview for this file type
src/app/Application.java
@@ -7,6 +7,7 @@ import kernel.exception.CreateCycleException; @@ -7,6 +7,7 @@ import kernel.exception.CreateCycleException;
7 import kernel.exception.InvalidIntervalLineColumnEception; 7 import kernel.exception.InvalidIntervalLineColumnEception;
8 import kernel.function.Average; 8 import kernel.function.Average;
9 import kernel.function.Sum; 9 import kernel.function.Sum;
  10 +import kernel.operation.Addition;
10 11
11 import java.io.File; 12 import java.io.File;
12 import java.io.FileOutputStream; 13 import java.io.FileOutputStream;
@@ -29,9 +30,11 @@ public class Application { @@ -29,9 +30,11 @@ public class Application {
29 System.out.println("Création de quelques cases..."); 30 System.out.println("Création de quelques cases...");
30 31
31 try { 32 try {
32 - grid.createCell("A", 1, 10.); 33 + grid.createCell("A", 1, 60.);
33 grid.createCell("B", 1, 0.); 34 grid.createCell("B", 1, 0.);
34 grid.createCell("A", 2, 5.); 35 grid.createCell("A", 2, 5.);
  36 + grid.createCell("A", 6, new Addition(grid.getCell("A", 1),grid.getCell("A", 2)));
  37 +
35 List<Cell> sumList = new ArrayList<>(); 38 List<Cell> sumList = new ArrayList<>();
36 sumList.add(grid.getCell("A", 1)); 39 sumList.add(grid.getCell("A", 1));
37 sumList.add(grid.getCell("A", 2)); 40 sumList.add(grid.getCell("A", 2));
src/ihm/TablooProto$MyTableModel.class 0 → 100644
No preview for this file type
src/ihm/TablooProto$PremiereColonneSpecificRenderer.class 0 → 100644
No preview for this file type
src/ihm/TablooProto.class 0 → 100644
No preview for this file type
src/ihm/TablooProto.java 0 → 100644
@@ -0,0 +1,239 @@ @@ -0,0 +1,239 @@
  1 +package ihm;
  2 +
  3 +/*
  4 + * TablooProto.java requires no other files.
  5 + *
  6 + */
  7 +import java.awt.Color;
  8 +import java.awt.Component;
  9 +import javax.swing.JFrame;
  10 +import javax.swing.JScrollPane;
  11 +import javax.swing.JTable;
  12 +import javax.swing.table.AbstractTableModel;
  13 +import java.awt.Dimension;
  14 +import java.awt.GridLayout;
  15 +import java.io.File;
  16 +import java.io.FileInputStream;
  17 +import java.io.IOException;
  18 +import java.io.ObjectInputStream;
  19 +import java.util.Collections;
  20 +
  21 +import javax.swing.JLabel;
  22 +import javax.swing.JPanel;
  23 +import javax.swing.table.DefaultTableCellRenderer;
  24 +import javax.swing.table.TableColumn;
  25 +
  26 +import kernel.Grid;
  27 +import kernel.exception.CellNotFoundException;
  28 +import kernel.exception.InvalidIntervalLineColumnEception;
  29 +
  30 +public class TablooProto extends JPanel {
  31 +
  32 + private static final long serialVersionUID = 1L;
  33 +
  34 + // Fourni: ne rien changer.
  35 + public TablooProto() throws ClassNotFoundException, IOException {
  36 + super(new GridLayout(1, 0));
  37 +
  38 + // modele de donnees
  39 + // cf. plus loin la inner classe MyTableModel a modifier...
  40 + MyTableModel tableModel = new MyTableModel();
  41 +
  42 + // la JTable et ses parametres
  43 + JTable table = new JTable(tableModel);
  44 + table.setPreferredScrollableViewportSize(new Dimension(1000, 500));
  45 + table.setGridColor(Color.BLACK);
  46 + table.setShowGrid(true);
  47 +
  48 + // on ajoute un scroll
  49 + JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  50 + add(scrollPane);
  51 + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  52 +
  53 + // parametrage de la 1ere ligne = noms des colonnes
  54 + ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);
  55 +
  56 + // parametrage de la 1ere colonne consacree a la numerotation des lignes
  57 + TableColumn tm = table.getColumnModel().getColumn(0);
  58 + tm.setPreferredWidth(tm.getPreferredWidth() * 2 / 3);
  59 + tm.setCellRenderer(new PremiereColonneSpecificRenderer(Color.LIGHT_GRAY));
  60 +
  61 + }
  62 +
  63 + // Inner class pour changer l'aspect de la premiere colonne consacree a la numerotation des lignes
  64 + // Fourni: ne rien changer.
  65 + class PremiereColonneSpecificRenderer extends DefaultTableCellRenderer {
  66 +
  67 + /**
  68 + *
  69 + */
  70 + private static final long serialVersionUID = 1L;
  71 + Color couleur;
  72 +
  73 + public PremiereColonneSpecificRenderer(Color couleur) {
  74 + super();
  75 + this.couleur = couleur;
  76 + this.setHorizontalAlignment(JLabel.CENTER);
  77 + }
  78 +
  79 + @Override
  80 + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  81 + Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  82 + cell.setBackground(couleur);
  83 + return cell;
  84 + }
  85 + }
  86 +
  87 + // Inner class pour etablir la connexion entre la JTable graphique et un modele de donnees.
  88 + // Pour nous le modele de donnees sera une grille du noyau de representation et de calcul
  89 + // construite et sauvegardee par serialisation comme precedemmment.
  90 + // Dans ce prototype exemple, le modele de donnees est une simple matrice de String "en dur".
  91 + // Il faudra le remplacer par une connexion a une telle grille.
  92 + class MyTableModel extends AbstractTableModel {
  93 +
  94 + /**
  95 + *
  96 + */
  97 + private static final long serialVersionUID = 1L;
  98 + // TODO
  99 + // remplacer ce tableau en dur du prototype par la grille serialisee:
  100 + // noyau.Grille calc;
  101 + Grid calc;
  102 +
  103 + MyTableModel() throws ClassNotFoundException, IOException {
  104 + // TODO: remplacer cette initialisation par le chargement de la grille serialisee
  105 + File fichier = new File("essai.ser") ;
  106 + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fichier)) ;
  107 + calc = (Grid)ois.readObject() ;
  108 + ois.close();
  109 + }
  110 +
  111 + @Override
  112 + // Standard: doit retourner le nbre de colonnes de la JTable
  113 + public int getColumnCount() {
  114 + // TODO: remplacer par le nbre de colonnes de la grille
  115 + // + 1 pour la colonne 0 consacrée aux numeros de ligne)
  116 + //return Collections.max(calc.getTotalColumn())+1;
  117 + return 10;
  118 + }
  119 +
  120 + @Override
  121 + // Standard: doit retourner le nbre de lignes de la JTable
  122 + public int getRowCount() {
  123 + // TODO: remplacer par le nbre de lignes de la grille
  124 + return Collections.max(calc.getTotalLine())+1;
  125 + //return 10;
  126 +
  127 + }
  128 +
  129 + // Standard: doit renvoyer le nom de la colonne a afficher en tete
  130 + // Fourni: ne rien changer.
  131 + @Override
  132 + public String getColumnName(int col) {
  133 + if (col == 0) {
  134 + return ""; // colonne consacrée aux numeros de ligne
  135 + } else {
  136 + return "" + (char) ((int) ('A') + col - 1);
  137 + }
  138 + }
  139 +
  140 + // Utilitaire interne fourni (ne rien changer)
  141 + // Retourne le nom d'une case a partir de ses coordonnees dans la JTable.
  142 + String getNomCase(int row, int col) {
  143 + return this.getColumnName(col) + String.valueOf(row + 1); // row commence a 0
  144 + }
  145 +
  146 + @Override
  147 + // Standard: doit renvoyer le contenu a afficher de la case correspondante
  148 + public Object getValueAt(int row, int col) {
  149 + if (col == 0) {
  150 + // Fourni: ne rien changer.
  151 + // en colonne 0 : numeros de lignes
  152 + return "" + String.valueOf(row + 1);
  153 + } else {
  154 + // TODO: remplacer par le contenu + la valeur
  155 + // de la case de nom getNomCase(row, col)
  156 + // dans la grille (comme dans la figure 1 du sujet).
  157 + try {
  158 + return "" + calc.getDevelopedFormula(this.getColumnName(col), row+1)+"="+calc.getValue(this.getColumnName(col), row+1);
  159 + } catch (CellNotFoundException e) {
  160 +
  161 +
  162 + }
  163 + }
  164 + return 0;
  165 +
  166 + }
  167 +
  168 + // Standard.
  169 + // Fourni: ne rien changer.
  170 + @Override
  171 + public Class getColumnClass(int c) {
  172 + return getValueAt(0, c).getClass();
  173 + }
  174 +
  175 + // Standard: determine si une case est editable ou non.
  176 + // Fourni: ne rien changer.
  177 + // Seules les cases de la 1er colonne ne le sont pas
  178 + // (consacrees a la numerotation des lignes)
  179 + @Override
  180 + public boolean isCellEditable(int row, int col) {
  181 + if (col < 1) {
  182 + return false; // col 0 consacree a la numerotation des lignes (non editable)
  183 + } else {
  184 + return true;
  185 + }
  186 + }
  187 +
  188 +
  189 + // Standard: l'utilisateur a entré une valeur dans une case,
  190 + // mettre a jour le modèle de donnees connecte.
  191 + // L'utilisateur a modifie une case.
  192 + // Si c'est une valeur numerique (sinon ne rien faire)
  193 + // - modifier la case correspondante dans la grille si cette case existe
  194 + // - ajouter la case correspondante dans la grille
  195 + @Override
  196 + public void setValueAt(Object value, int row, int col) {
  197 +
  198 + // TODO remplacer par le code correspondant
  199 + if (value instanceof String) {
  200 + if (calc.getCellsId().contains(this.getNomCase(row, col)))
  201 + try {
  202 + calc.setValue(this.getColumnName(col), row+1, Double.parseDouble((String)value));
  203 + } catch (CellNotFoundException e) {
  204 + // TODO Auto-generated catch block
  205 + e.printStackTrace();
  206 + }
  207 + else
  208 + try {
  209 + calc.createCell(this.getColumnName(col), row+1, Double.parseDouble((String)value));
  210 + } catch (InvalidIntervalLineColumnEception e) {
  211 + // TODO Auto-generated catch block
  212 + e.printStackTrace();
  213 + }
  214 + }
  215 + // Ne pas modifier :
  216 + // mise a jour automatique de l'affichage suite a la modification
  217 + fireTableCellUpdated(row, col);
  218 + }
  219 + }
  220 + // Fin de la inner class MyTableModel
  221 +
  222 + // Exécution de l'interface graphique a partir d'un terminal.
  223 + // TODO: parametrer le tout par un fichier de grille serialisee.
  224 + public static void main(String[] args) throws ClassNotFoundException, IOException {
  225 + // TODO: parametrer le tableur par un fichier de grille serialisee
  226 + // a charger comme modele de donnees.
  227 + TablooProto tableur = new TablooProto();
  228 +
  229 + // Creation de l'application et lancement
  230 + // Fourni: ne rien changer.
  231 + JFrame frame = new JFrame("TABLO");
  232 + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  233 + tableur.setOpaque(true);
  234 + frame.setContentPane(tableur);
  235 + frame.pack();
  236 + frame.setVisible(true);
  237 +
  238 + }
  239 +}
src/kernel/Grid.java
@@ -16,13 +16,23 @@ public class Grid implements Serializable { @@ -16,13 +16,23 @@ public class Grid implements Serializable {
16 16
17 private Map<String, Cell> cells = new HashMap<>(); 17 private Map<String, Cell> cells = new HashMap<>();
18 public static LanguageEnum language = LanguageEnum.FR; 18 public static LanguageEnum language = LanguageEnum.FR;
  19 + private List<Integer> listLine = new ArrayList<Integer>();
  20 + private List<Integer> listColumn=new ArrayList<Integer>();
  21 +
  22 + public void saveDifferentLineColumn(String column, int line) {
  23 + if (!this.listLine.contains(line))
  24 + listLine.add(line);
  25 + if (!this.listColumn.contains((int)column.charAt(0)))
  26 + listColumn.add((int)column.charAt(0)- (int)'A' + 1);
  27 +
19 28
  29 + }
20 public String createCell(String column, int line, double value) throws InvalidIntervalLineColumnEception { 30 public String createCell(String column, int line, double value) throws InvalidIntervalLineColumnEception {
21 String id = this.getCellId(column, line); 31 String id = this.getCellId(column, line);
22 Cell cell = new Cell(column, line, value); 32 Cell cell = new Cell(column, line, value);
23 33
24 this.cells.put(id, cell); 34 this.cells.put(id, cell);
25 - 35 + saveDifferentLineColumn(column,line);
26 return id; 36 return id;
27 } 37 }
28 38
@@ -31,7 +41,7 @@ public class Grid implements Serializable { @@ -31,7 +41,7 @@ public class Grid implements Serializable {
31 Cell cell = new Cell(column, line, formula); 41 Cell cell = new Cell(column, line, formula);
32 42
33 this.cells.put(id, cell); 43 this.cells.put(id, cell);
34 - 44 + saveDifferentLineColumn(column,line);
35 return id; 45 return id;
36 } 46 }
37 47
@@ -57,6 +67,10 @@ public class Grid implements Serializable { @@ -57,6 +67,10 @@ public class Grid implements Serializable {
57 return new ArrayList<>(this.cells.values()); 67 return new ArrayList<>(this.cells.values());
58 } 68 }
59 69
  70 + public List<String> getCellsId() {
  71 + return new ArrayList<>(this.cells.keySet());
  72 + }
  73 +
60 public double getValue(String column, int line) throws CellNotFoundException { 74 public double getValue(String column, int line) throws CellNotFoundException {
61 return this.getCell(column, line).getValue(); 75 return this.getCell(column, line).getValue();
62 } 76 }
@@ -72,4 +86,11 @@ public class Grid implements Serializable { @@ -72,4 +86,11 @@ public class Grid implements Serializable {
72 private String getCellId(String column, int line) { 86 private String getCellId(String column, int line) {
73 return column + line; 87 return column + line;
74 } 88 }
  89 + public List<Integer> getTotalColumn() {
  90 + return listColumn;
  91 + }
  92 + public List<Integer> getTotalLine() {
  93 + return listLine;
  94 +
  95 + }
75 } 96 }