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 | 7 | import kernel.exception.InvalidIntervalLineColumnEception; |
8 | 8 | import kernel.function.Average; |
9 | 9 | import kernel.function.Sum; |
10 | +import kernel.operation.Addition; | |
10 | 11 | |
11 | 12 | import java.io.File; |
12 | 13 | import java.io.FileOutputStream; |
... | ... | @@ -29,9 +30,11 @@ public class Application { |
29 | 30 | System.out.println("Création de quelques cases..."); |
30 | 31 | |
31 | 32 | try { |
32 | - grid.createCell("A", 1, 10.); | |
33 | + grid.createCell("A", 1, 60.); | |
33 | 34 | grid.createCell("B", 1, 0.); |
34 | 35 | grid.createCell("A", 2, 5.); |
36 | + grid.createCell("A", 6, new Addition(grid.getCell("A", 1),grid.getCell("A", 2))); | |
37 | + | |
35 | 38 | List<Cell> sumList = new ArrayList<>(); |
36 | 39 | sumList.add(grid.getCell("A", 1)); |
37 | 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 @@ |
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 | 16 | |
17 | 17 | private Map<String, Cell> cells = new HashMap<>(); |
18 | 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 | 30 | public String createCell(String column, int line, double value) throws InvalidIntervalLineColumnEception { |
21 | 31 | String id = this.getCellId(column, line); |
22 | 32 | Cell cell = new Cell(column, line, value); |
23 | 33 | |
24 | 34 | this.cells.put(id, cell); |
25 | - | |
35 | + saveDifferentLineColumn(column,line); | |
26 | 36 | return id; |
27 | 37 | } |
28 | 38 | |
... | ... | @@ -31,7 +41,7 @@ public class Grid implements Serializable { |
31 | 41 | Cell cell = new Cell(column, line, formula); |
32 | 42 | |
33 | 43 | this.cells.put(id, cell); |
34 | - | |
44 | + saveDifferentLineColumn(column,line); | |
35 | 45 | return id; |
36 | 46 | } |
37 | 47 | |
... | ... | @@ -57,6 +67,10 @@ public class Grid implements Serializable { |
57 | 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 | 74 | public double getValue(String column, int line) throws CellNotFoundException { |
61 | 75 | return this.getCell(column, line).getValue(); |
62 | 76 | } |
... | ... | @@ -72,4 +86,11 @@ public class Grid implements Serializable { |
72 | 86 | private String getCellId(String column, int line) { |
73 | 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 | } | ... | ... |