Blame view

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