]> git.xonotic.org Git - xonotic/xonotic.git/blob - misc/tools/ObjToMap/objtomap/JFrameMain.java
initial checkin from nexuiz svn r8756
[xonotic/xonotic.git] / misc / tools / ObjToMap / objtomap / JFrameMain.java
1 /*
2  * JFrameMain.java
3  *
4  * Created on 16. Januar 2007, 15:36
5  */
6
7 package objtomap;
8
9 import java.io.IOException;
10 import java.util.Vector;
11 import javax.swing.JFileChooser;
12 import javax.swing.table.AbstractTableModel;
13
14 /**
15  *
16  * @author  user
17  */
18 public class JFrameMain extends javax.swing.JFrame {
19     
20     private Configuration config;
21     
22     /** Creates new form JFrameMain */
23     public JFrameMain(Configuration c) {
24         config = c;
25         initComponents();
26         
27         updateForms();
28     }
29     
30     private void updateForms() {
31         jTextFieldInputFile.setText(config.objfile);
32         jTextFieldOutputFile.setText(config.mapfile);
33         jTextFieldScale.setText(Double.toString(config.scale));
34         jTextFieldTextureScale.setText(Double.toString(config.texture_scale));
35         jTextFieldThickness.setText(Double.toString(config.brush_thickness));
36         jCheckDetail.setSelected(config.detail);
37         
38         jTableTexturing.setModel(new AutoTexturingTableModel(config.autotexturing));
39         
40         /*try {
41             jTableRelations.setDefaultEditor(Class.forName("businesslearner.Letter"), new DefaultCellEditor(comboBoxLetters));
42             jTableRelations.setDefaultEditor("".getClass(), new DefaultCellEditor(comboBoxRelations));
43         } catch (ClassNotFoundException ex) {
44             ex.printStackTrace();
45         }*/
46         
47     }
48     
49     
50     
51     
52     /** This method is called from within the constructor to
53      * initialize the form.
54      * WARNING: Do NOT modify this code. The content of this method is
55      * always regenerated by the Form Editor.
56      */
57     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
58     private void initComponents() {
59         jPanel1 = new javax.swing.JPanel();
60         jTextFieldInputFile = new javax.swing.JTextField();
61         jButtonSelectInputFile = new javax.swing.JButton();
62         jPanel2 = new javax.swing.JPanel();
63         jTextFieldOutputFile = new javax.swing.JTextField();
64         jButtonSelectOutputFile = new javax.swing.JButton();
65         jPanel3 = new javax.swing.JPanel();
66         jLabel1 = new javax.swing.JLabel();
67         jLabel2 = new javax.swing.JLabel();
68         jCheckDetail = new javax.swing.JCheckBox();
69         jTextFieldThickness = new javax.swing.JTextField();
70         jTextFieldScale = new javax.swing.JTextField();
71         jLabel3 = new javax.swing.JLabel();
72         jTextFieldTextureScale = new javax.swing.JTextField();
73         jButtonStart = new javax.swing.JButton();
74         jPanel4 = new javax.swing.JPanel();
75         jScrollPane1 = new javax.swing.JScrollPane();
76         jTableTexturing = new javax.swing.JTable();
77         jButtonAdd = new javax.swing.JButton();
78         jButtonDelte = new javax.swing.JButton();
79
80         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
81         setTitle("ObjToMap");
82         jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Input File (.obj)"));
83         jTextFieldInputFile.addFocusListener(new java.awt.event.FocusAdapter() {
84             public void focusLost(java.awt.event.FocusEvent evt) {
85                 jTextFieldInputFileFocusLost(evt);
86             }
87         });
88
89         jButtonSelectInputFile.setText("Select file");
90         jButtonSelectInputFile.addActionListener(new java.awt.event.ActionListener() {
91             public void actionPerformed(java.awt.event.ActionEvent evt) {
92                 jButtonSelectInputFileActionPerformed(evt);
93             }
94         });
95
96         org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
97         jPanel1.setLayout(jPanel1Layout);
98         jPanel1Layout.setHorizontalGroup(
99             jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
100             .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
101                 .addContainerGap()
102                 .add(jTextFieldInputFile, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 477, Short.MAX_VALUE)
103                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
104                 .add(jButtonSelectInputFile)
105                 .addContainerGap())
106         );
107         jPanel1Layout.setVerticalGroup(
108             jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
109             .add(jPanel1Layout.createSequentialGroup()
110                 .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
111                     .add(jButtonSelectInputFile)
112                     .add(jTextFieldInputFile, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
113                 .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
114         );
115
116         jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Output File (.map)"));
117         jTextFieldOutputFile.addFocusListener(new java.awt.event.FocusAdapter() {
118             public void focusLost(java.awt.event.FocusEvent evt) {
119                 jTextFieldOutputFileFocusLost(evt);
120             }
121         });
122
123         jButtonSelectOutputFile.setText("Select file");
124         jButtonSelectOutputFile.addActionListener(new java.awt.event.ActionListener() {
125             public void actionPerformed(java.awt.event.ActionEvent evt) {
126                 jButtonSelectOutputFileActionPerformed(evt);
127             }
128         });
129
130         org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
131         jPanel2.setLayout(jPanel2Layout);
132         jPanel2Layout.setHorizontalGroup(
133             jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
134             .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel2Layout.createSequentialGroup()
135                 .addContainerGap()
136                 .add(jTextFieldOutputFile, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 477, Short.MAX_VALUE)
137                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
138                 .add(jButtonSelectOutputFile)
139                 .addContainerGap())
140         );
141         jPanel2Layout.setVerticalGroup(
142             jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
143             .add(jPanel2Layout.createSequentialGroup()
144                 .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
145                     .add(jTextFieldOutputFile, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
146                     .add(jButtonSelectOutputFile))
147                 .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
148         );
149
150         jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Configuration"));
151         jLabel1.setText("Brush thickness:");
152
153         jLabel2.setText("Model scale:");
154
155         jCheckDetail.setText("Make generated brushes detail");
156         jCheckDetail.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
157         jCheckDetail.setMargin(new java.awt.Insets(0, 0, 0, 0));
158         jCheckDetail.addActionListener(new java.awt.event.ActionListener() {
159             public void actionPerformed(java.awt.event.ActionEvent evt) {
160                 jCheckDetailActionPerformed(evt);
161             }
162         });
163
164         jTextFieldThickness.addFocusListener(new java.awt.event.FocusAdapter() {
165             public void focusLost(java.awt.event.FocusEvent evt) {
166                 jTextFieldThicknessFocusLost(evt);
167             }
168         });
169
170         jTextFieldScale.addFocusListener(new java.awt.event.FocusAdapter() {
171             public void focusLost(java.awt.event.FocusEvent evt) {
172                 jTextFieldScaleFocusLost(evt);
173             }
174         });
175
176         jLabel3.setText("Texture scale:");
177
178         jTextFieldTextureScale.addFocusListener(new java.awt.event.FocusAdapter() {
179             public void focusLost(java.awt.event.FocusEvent evt) {
180                 jTextFieldTextureScaleFocusLost(evt);
181             }
182         });
183
184         org.jdesktop.layout.GroupLayout jPanel3Layout = new org.jdesktop.layout.GroupLayout(jPanel3);
185         jPanel3.setLayout(jPanel3Layout);
186         jPanel3Layout.setHorizontalGroup(
187             jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
188             .add(jPanel3Layout.createSequentialGroup()
189                 .addContainerGap()
190                 .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
191                     .add(jPanel3Layout.createSequentialGroup()
192                         .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
193                             .add(jLabel2)
194                             .add(jLabel1))
195                         .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
196                         .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
197                             .add(jTextFieldScale)
198                             .add(jTextFieldThickness, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 56, Short.MAX_VALUE))
199                         .add(29, 29, 29)
200                         .add(jLabel3)
201                         .add(12, 12, 12)
202                         .add(jTextFieldTextureScale, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 58, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
203                     .add(jCheckDetail))
204                 .addContainerGap(234, Short.MAX_VALUE))
205         );
206         jPanel3Layout.setVerticalGroup(
207             jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
208             .add(jPanel3Layout.createSequentialGroup()
209                 .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
210                     .add(jLabel1)
211                     .add(jTextFieldThickness, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
212                     .add(jLabel3)
213                     .add(jTextFieldTextureScale, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
214                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
215                 .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
216                     .add(jLabel2)
217                     .add(jTextFieldScale, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
218                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 19, Short.MAX_VALUE)
219                 .add(jCheckDetail)
220                 .addContainerGap())
221         );
222
223         jButtonStart.setText("Start conversion");
224         jButtonStart.addActionListener(new java.awt.event.ActionListener() {
225             public void actionPerformed(java.awt.event.ActionEvent evt) {
226                 jButtonStartActionPerformed(evt);
227             }
228         });
229
230         jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Auto-texturing"));
231         jTableTexturing.setModel(new javax.swing.table.DefaultTableModel(
232             new Object [][] {
233                 {null, null, null, null},
234                 {null, null, null, null},
235                 {null, null, null, null},
236                 {null, null, null, null}
237             },
238             new String [] {
239                 "Title 1", "Title 2", "Title 3", "Title 4"
240             }
241         ));
242         jScrollPane1.setViewportView(jTableTexturing);
243
244         jButtonAdd.setText("New");
245         jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
246             public void actionPerformed(java.awt.event.ActionEvent evt) {
247                 jButtonAddActionPerformed(evt);
248             }
249         });
250
251         jButtonDelte.setText("Remove");
252         jButtonDelte.addActionListener(new java.awt.event.ActionListener() {
253             public void actionPerformed(java.awt.event.ActionEvent evt) {
254                 jButtonDelteActionPerformed(evt);
255             }
256         });
257
258         org.jdesktop.layout.GroupLayout jPanel4Layout = new org.jdesktop.layout.GroupLayout(jPanel4);
259         jPanel4.setLayout(jPanel4Layout);
260         jPanel4Layout.setHorizontalGroup(
261             jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
262             .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel4Layout.createSequentialGroup()
263                 .addContainerGap()
264                 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 473, Short.MAX_VALUE)
265                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
266                 .add(jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
267                     .add(jButtonAdd, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
268                     .add(jButtonDelte, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE))
269                 .addContainerGap())
270         );
271         jPanel4Layout.setVerticalGroup(
272             jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
273             .add(jPanel4Layout.createSequentialGroup()
274                 .add(jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
275                     .add(jPanel4Layout.createSequentialGroup()
276                         .addContainerGap()
277                         .add(jButtonAdd)
278                         .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
279                         .add(jButtonDelte))
280                     .add(org.jdesktop.layout.GroupLayout.TRAILING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 167, Short.MAX_VALUE))
281                 .addContainerGap())
282         );
283
284         org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
285         getContentPane().setLayout(layout);
286         layout.setHorizontalGroup(
287             layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
288             .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
289                 .addContainerGap()
290                 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
291                     .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
292                     .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
293                     .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
294                     .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
295                     .add(jButtonStart))
296                 .addContainerGap())
297         );
298         layout.setVerticalGroup(
299             layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
300             .add(layout.createSequentialGroup()
301                 .addContainerGap()
302                 .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
303                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
304                 .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
305                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
306                 .add(jPanel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
307                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
308                 .add(jPanel4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
309                 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
310                 .add(jButtonStart)
311                 .addContainerGap())
312         );
313         pack();
314     }// </editor-fold>//GEN-END:initComponents
315
316     private void jButtonDelteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDelteActionPerformed
317         int index = jTableTexturing.getSelectedRow();
318         if(index < 0) return;
319         config.autotexturing.remove(index);
320         updateForms();
321     }//GEN-LAST:event_jButtonDelteActionPerformed
322
323     private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddActionPerformed
324         config.autotexturing.add(new AutoTexturingEntry());
325         updateForms();
326     }//GEN-LAST:event_jButtonAddActionPerformed
327     
328     private void jTextFieldOutputFileFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldOutputFileFocusLost
329         config.mapfile = jTextFieldOutputFile.getText();
330         updateForms();
331     }//GEN-LAST:event_jTextFieldOutputFileFocusLost
332     
333     private void jTextFieldInputFileFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldInputFileFocusLost
334         config.objfile = jTextFieldInputFile.getText();
335         updateForms();
336     }//GEN-LAST:event_jTextFieldInputFileFocusLost
337     
338     private void jTextFieldTextureScaleFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldTextureScaleFocusLost
339         try {
340             config.texture_scale = Double.parseDouble(jTextFieldTextureScale.getText());
341         } catch(Exception e) {}
342         updateForms();
343     }//GEN-LAST:event_jTextFieldTextureScaleFocusLost
344     
345     private void jButtonSelectOutputFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSelectOutputFileActionPerformed
346         JFileChooser fc = new JFileChooser();
347         int returnval = fc.showSaveDialog(this);
348         if(returnval == JFileChooser.APPROVE_OPTION) {
349             config.mapfile = fc.getSelectedFile().getPath();
350         }
351         updateForms();
352     }//GEN-LAST:event_jButtonSelectOutputFileActionPerformed
353     
354     private void jButtonSelectInputFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSelectInputFileActionPerformed
355         JFileChooser fc = new JFileChooser();
356         int returnval = fc.showOpenDialog(this);
357         if(returnval == JFileChooser.APPROVE_OPTION) {
358             config.objfile = fc.getSelectedFile().getPath();
359         }
360         updateForms();
361     }//GEN-LAST:event_jButtonSelectInputFileActionPerformed
362     
363     private void jButtonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonStartActionPerformed
364         config.objfile = jTextFieldInputFile.getText();
365         config.mapfile = jTextFieldOutputFile.getText();
366         
367         ObjToMap converter = new ObjToMap(config);
368         try {
369             converter.parseOBJ();
370             converter.writeMap();
371         } catch(Exception e) {
372             e.printStackTrace();
373         }
374     }//GEN-LAST:event_jButtonStartActionPerformed
375     
376     private void jCheckDetailActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckDetailActionPerformed
377         config.detail = jCheckDetail.isSelected();
378         updateForms();
379     }//GEN-LAST:event_jCheckDetailActionPerformed
380     
381     private void jTextFieldScaleFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldScaleFocusLost
382         try {
383             config.scale = Double.parseDouble(jTextFieldScale.getText());
384         } catch(Exception e) {}
385         updateForms();
386     }//GEN-LAST:event_jTextFieldScaleFocusLost
387     
388     private void jTextFieldThicknessFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldThicknessFocusLost
389         try {
390             config.brush_thickness = Double.parseDouble(jTextFieldThickness.getText());
391         } catch(Exception e) {}
392         updateForms();
393     }//GEN-LAST:event_jTextFieldThicknessFocusLost
394     
395     
396     // Variables declaration - do not modify//GEN-BEGIN:variables
397     private javax.swing.JButton jButtonAdd;
398     private javax.swing.JButton jButtonDelte;
399     private javax.swing.JButton jButtonSelectInputFile;
400     private javax.swing.JButton jButtonSelectOutputFile;
401     private javax.swing.JButton jButtonStart;
402     private javax.swing.JCheckBox jCheckDetail;
403     private javax.swing.JLabel jLabel1;
404     private javax.swing.JLabel jLabel2;
405     private javax.swing.JLabel jLabel3;
406     private javax.swing.JPanel jPanel1;
407     private javax.swing.JPanel jPanel2;
408     private javax.swing.JPanel jPanel3;
409     private javax.swing.JPanel jPanel4;
410     private javax.swing.JScrollPane jScrollPane1;
411     private javax.swing.JTable jTableTexturing;
412     private javax.swing.JTextField jTextFieldInputFile;
413     private javax.swing.JTextField jTextFieldOutputFile;
414     private javax.swing.JTextField jTextFieldScale;
415     private javax.swing.JTextField jTextFieldTextureScale;
416     private javax.swing.JTextField jTextFieldThickness;
417     // End of variables declaration//GEN-END:variables
418     
419     private class AutoTexturingTableModel extends AbstractTableModel {
420         
421         Vector texturing;
422         
423         public AutoTexturingTableModel(Vector t) {
424             texturing = t;
425         }
426         
427         private String[] columnNames = {"Starting angle (against xy plane)","Texture name"};
428         
429         
430         public int getColumnCount() {
431             return 2;
432         }
433         
434         public int getRowCount() {
435             return texturing.size();
436         }
437         
438         public String getColumnName(int col) {
439             return columnNames[col];
440         }
441         
442         public Object getValueAt(int row, int col) {
443             if(row < 0 | row > texturing.size()) return null;
444             
445             AutoTexturingEntry e = (AutoTexturingEntry)texturing.get(row);
446             if(col == 0)
447                 return new Double(e.angle);
448             else
449                 return e.texturename;
450         }
451         
452         public Class getColumnClass(int c) {
453             return getValueAt(0, c).getClass();
454         }
455         
456         public boolean isCellEditable(int row, int col) {
457             return true;
458         }
459         
460         public void setValueAt(Object value, int row, int col) {
461             
462             AutoTexturingEntry e = (AutoTexturingEntry)texturing.get(row);
463             
464             if(col == 0) {
465                 Double angle = (Double)value;
466                 e.angle = angle.doubleValue();
467             } else {
468                 e.texturename = (String)value;
469             }
470             
471             fireTableCellUpdated(row, col);
472         }
473     }
474     
475 }