Commit ebf0bdb20e997f6d9f18ac4e43d0b458a8c0502e
1 parent
0c4a46ca
interface ok: manque nb column
Showing
7 changed files
with
266 additions
and
3 deletions
Show diff stats
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)); |
No preview for this file type
No preview for this file type
No preview for this file type
@@ -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 | } |