19 package org.sleuthkit.autopsy.modules.fileextmismatch;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.HashSet;
26 import java.util.logging.Level;
27 import javax.swing.JOptionPane;
28 import javax.swing.ListSelectionModel;
29 import javax.swing.event.ListSelectionEvent;
30 import javax.swing.event.ListSelectionListener;
31 import javax.swing.table.AbstractTableModel;
32 import org.netbeans.spi.options.OptionsPanelController;
33 import org.openide.util.NbBundle;
43 final class FileExtMismatchSettingsPanel
extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
45 private static final Logger logger = Logger.getLogger(FileExtMismatchSettingsPanel.class.getName());
46 private HashMap<String, Set<String>> editableMap =
new HashMap<>();
47 private ArrayList<String> mimeList = null;
48 private ArrayList<String> currentExtensions = null;
49 private MimeTableModel mimeTableModel;
50 private ExtTableModel extTableModel;
51 private final String EXT_HEADER_LABEL = NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
52 "AddFileExtensionAction.extHeaderLbl.text");
53 private String selectedMime =
"";
54 private String selectedExt =
"";
55 ListSelectionModel lsm = null;
56 private FileTypeDetector fileTypeDetector;
58 public FileExtMismatchSettingsPanel() {
59 mimeTableModel =
new MimeTableModel();
60 extTableModel =
new ExtTableModel();
63 fileTypeDetector =
new FileTypeDetector();
64 }
catch (FileTypeDetector.FileTypeDetectorInitException ex) {
65 logger.log(Level.SEVERE,
"Failed to create file type detector", ex);
66 fileTypeDetector = null;
70 customizeComponents();
73 @NbBundle.Messages({
"FileExtMismatchSettingsPanel.Title=Global File Extension Mismatch Identification Settings"})
74 private void customizeComponents() {
75 setName(Bundle.FileExtMismatchSettingsPanel_Title());
78 lsm = mimeTable.getSelectionModel();
79 lsm.addListSelectionListener(
new ListSelectionListener() {
81 public void valueChanged(ListSelectionEvent e) {
82 ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
83 if (!listSelectionModel.isSelectionEmpty()) {
84 int index = listSelectionModel.getMinSelectionIndex();
85 listSelectionModel.setSelectionInterval(index, index);
87 selectedMime = mimeList.get(index);
88 String labelStr = EXT_HEADER_LABEL + selectedMime +
":";
89 if (labelStr.length() > 80) {
90 labelStr = labelStr.substring(0, 80);
92 extHeaderLabel.setText(labelStr);
95 extTableModel.resync();
96 removeTypeButton.setEnabled(
true);
97 newExtButton.setEnabled(
true);
101 currentExtensions = null;
102 removeTypeButton.setEnabled(
false);
103 newExtButton.setEnabled(
false);
104 extTableModel.resync();
110 ListSelectionModel extLsm = extTable.getSelectionModel();
111 extLsm.addListSelectionListener(
new ListSelectionListener() {
113 public void valueChanged(ListSelectionEvent e) {
114 ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
115 if (!listSelectionModel.isSelectionEmpty()) {
116 int index = listSelectionModel.getMinSelectionIndex();
117 listSelectionModel.setSelectionInterval(index, index);
119 selectedExt = currentExtensions.get(index);
120 removeExtButton.setEnabled(
true);
123 removeExtButton.setEnabled(
false);
128 removeExtButton.setEnabled(
false);
129 removeTypeButton.setEnabled(
false);
130 newExtButton.setEnabled(
false);
139 private void initComponents() {
141 jPanel1 =
new javax.swing.JPanel();
142 jScrollPane1 =
new javax.swing.JScrollPane();
143 jSplitPane1 =
new javax.swing.JSplitPane();
144 mimePanel =
new javax.swing.JPanel();
145 jLabel1 =
new javax.swing.JLabel();
146 jScrollPane2 =
new javax.swing.JScrollPane();
147 mimeTable =
new javax.swing.JTable();
148 newTypeButton =
new javax.swing.JButton();
149 removeTypeButton =
new javax.swing.JButton();
150 extensionPanel =
new javax.swing.JPanel();
151 newExtButton =
new javax.swing.JButton();
152 jScrollPane3 =
new javax.swing.JScrollPane();
153 extTable =
new javax.swing.JTable();
154 removeExtButton =
new javax.swing.JButton();
155 extHeaderLabel =
new javax.swing.JLabel();
157 setPreferredSize(
new java.awt.Dimension(718, 430));
159 jPanel1.setPreferredSize(
new java.awt.Dimension(718, 430));
161 jScrollPane1.setRequestFocusEnabled(
false);
163 jSplitPane1.setDividerLocation(365);
164 jSplitPane1.setDividerSize(1);
166 mimePanel.setPreferredSize(
new java.awt.Dimension(369, 424));
167 mimePanel.setRequestFocusEnabled(
false);
169 jLabel1.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.jLabel1.text"));
171 mimeTable.setModel(mimeTableModel);
172 jScrollPane2.setViewportView(mimeTable);
174 newTypeButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
175 newTypeButton.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newTypeButton.text"));
176 newTypeButton.setMaximumSize(
new java.awt.Dimension(111, 25));
177 newTypeButton.setMinimumSize(
new java.awt.Dimension(111, 25));
178 newTypeButton.addActionListener(
new java.awt.event.ActionListener() {
179 public void actionPerformed(java.awt.event.ActionEvent evt) {
180 newTypeButtonActionPerformed(evt);
184 removeTypeButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
185 removeTypeButton.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeTypeButton.text"));
186 removeTypeButton.setToolTipText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeTypeButton.toolTipText"));
187 removeTypeButton.addActionListener(
new java.awt.event.ActionListener() {
188 public void actionPerformed(java.awt.event.ActionEvent evt) {
189 removeTypeButtonActionPerformed(evt);
193 javax.swing.GroupLayout mimePanelLayout =
new javax.swing.GroupLayout(mimePanel);
194 mimePanel.setLayout(mimePanelLayout);
195 mimePanelLayout.setHorizontalGroup(
196 mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
197 .addGroup(mimePanelLayout.createSequentialGroup()
199 .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
200 .addGroup(mimePanelLayout.createSequentialGroup()
201 .addGap(0, 0, Short.MAX_VALUE)
202 .addComponent(jLabel1)
203 .addGap(286, 286, 286))
204 .addGroup(mimePanelLayout.createSequentialGroup()
205 .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
206 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 349, javax.swing.GroupLayout.PREFERRED_SIZE)
207 .addGroup(mimePanelLayout.createSequentialGroup()
208 .addComponent(newTypeButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
210 .addComponent(removeTypeButton)))
211 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
213 mimePanelLayout.setVerticalGroup(
214 mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
215 .addGroup(mimePanelLayout.createSequentialGroup()
217 .addComponent(jLabel1)
218 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
219 .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 341, Short.MAX_VALUE)
220 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
221 .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
222 .addComponent(newTypeButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
223 .addComponent(removeTypeButton))
227 jSplitPane1.setLeftComponent(mimePanel);
229 extensionPanel.setPreferredSize(
new java.awt.Dimension(344, 424));
231 newExtButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
232 newExtButton.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtButton.text"));
233 newExtButton.setMaximumSize(
new java.awt.Dimension(111, 25));
234 newExtButton.setMinimumSize(
new java.awt.Dimension(111, 25));
235 newExtButton.addActionListener(
new java.awt.event.ActionListener() {
236 public void actionPerformed(java.awt.event.ActionEvent evt) {
237 newExtButtonActionPerformed(evt);
241 extTable.setModel(extTableModel);
242 jScrollPane3.setViewportView(extTable);
244 removeExtButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
245 removeExtButton.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeExtButton.text"));
246 removeExtButton.addActionListener(
new java.awt.event.ActionListener() {
247 public void actionPerformed(java.awt.event.ActionEvent evt) {
248 removeExtButtonActionPerformed(evt);
252 extHeaderLabel.setText(
org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.extHeaderLabel.text"));
254 javax.swing.GroupLayout extensionPanelLayout =
new javax.swing.GroupLayout(extensionPanel);
255 extensionPanel.setLayout(extensionPanelLayout);
256 extensionPanelLayout.setHorizontalGroup(
257 extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
258 .addGroup(extensionPanelLayout.createSequentialGroup()
260 .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
261 .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
262 .addGroup(extensionPanelLayout.createSequentialGroup()
263 .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
264 .addComponent(extHeaderLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE)
265 .addGroup(extensionPanelLayout.createSequentialGroup()
266 .addComponent(newExtButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
267 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
268 .addComponent(removeExtButton)))
269 .addGap(0, 0, Short.MAX_VALUE)))
272 extensionPanelLayout.setVerticalGroup(
273 extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
274 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, extensionPanelLayout.createSequentialGroup()
276 .addComponent(extHeaderLabel)
277 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
278 .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 348, Short.MAX_VALUE)
279 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
280 .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
281 .addComponent(newExtButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
282 .addComponent(removeExtButton))
286 jSplitPane1.setRightComponent(extensionPanel);
288 jScrollPane1.setViewportView(jSplitPane1);
290 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
291 jPanel1.setLayout(jPanel1Layout);
292 jPanel1Layout.setHorizontalGroup(
293 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
294 .addGroup(jPanel1Layout.createSequentialGroup()
296 .addComponent(jScrollPane1)
299 jPanel1Layout.setVerticalGroup(
300 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
301 .addGroup(jPanel1Layout.createSequentialGroup()
303 .addComponent(jScrollPane1)
307 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
308 this.setLayout(layout);
309 layout.setHorizontalGroup(
310 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
311 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
313 layout.setVerticalGroup(
314 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
315 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
320 private void newExtButtonActionPerformed(java.awt.event.ActionEvent evt) {
321 String newExt = (String) JOptionPane.showInputDialog(
this, NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.message"),
322 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.title"), JOptionPane.PLAIN_MESSAGE, null, null,
"");
324 if (newExt == null) {
327 if (newExt.isEmpty()) {
328 JOptionPane.showMessageDialog(
this,
329 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.empty.message"),
330 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.empty.title"),
331 JOptionPane.ERROR_MESSAGE);
334 if (selectedMime.isEmpty()) {
335 JOptionPane.showMessageDialog(
this,
336 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message"),
337 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title"),
338 JOptionPane.ERROR_MESSAGE);
341 if (currentExtensions.contains(newExt)) {
342 JOptionPane.showMessageDialog(
this,
343 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.extExists.message"),
344 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newExtPrompt.extExists.title"),
345 JOptionPane.ERROR_MESSAGE);
349 Set<String> editedExtensions = editableMap.get(selectedMime);
350 editedExtensions.add(newExt);
353 editableMap.put(selectedMime, editedExtensions);
357 extTableModel.resync();
358 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
361 private void removeExtButtonActionPerformed(java.awt.event.ActionEvent evt) {
362 if (selectedExt.isEmpty()) {
363 JOptionPane.showMessageDialog(
this,
364 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message"),
365 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title"),
366 JOptionPane.ERROR_MESSAGE);
370 if (selectedMime.isEmpty()) {
371 JOptionPane.showMessageDialog(
this,
372 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message"),
373 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title"),
374 JOptionPane.ERROR_MESSAGE);
378 Set<String> editedExtensions = editableMap.get(selectedMime);
379 editedExtensions.remove(selectedExt);
380 String deadExt = selectedExt;
383 editableMap.put(selectedMime, editedExtensions);
387 extTableModel.resync();
388 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
391 private void removeTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {
392 if (selectedMime.isEmpty()) {
393 JOptionPane.showMessageDialog(
this,
394 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message"),
395 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title"),
396 JOptionPane.ERROR_MESSAGE);
400 editableMap.remove(selectedMime);
404 mimeTableModel.resync();
405 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
408 private void newTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {
409 String newMime = (String) JOptionPane.showInputDialog(
this, NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.message"),
410 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.title"), JOptionPane.PLAIN_MESSAGE, null, null,
"");
412 if (newMime == null) {
415 if (newMime.isEmpty()) {
416 JOptionPane.showMessageDialog(
this,
417 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message"),
418 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title"),
419 JOptionPane.ERROR_MESSAGE);
422 if (newMime.equals(
"application/octet-stream")) {
423 JOptionPane.showMessageDialog(
this,
424 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message"),
425 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title"),
426 JOptionPane.ERROR_MESSAGE);
429 if (mimeList.contains(newMime)) {
430 JOptionPane.showMessageDialog(
this,
431 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message"),
432 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title"),
433 JOptionPane.ERROR_MESSAGE);
437 FileTypeDetector detector;
439 detector =
new FileTypeDetector();
440 }
catch (FileTypeDetector.FileTypeDetectorInitException ex) {
441 logger.log(Level.WARNING,
"Couldn't create file type detector for file ext mismatch settings.", ex);
444 boolean mimeTypeDetectable = (null != detector) ? detector.isDetectable(newMime) :
false;
445 if (!mimeTypeDetectable) {
446 JOptionPane.showMessageDialog(
this,
447 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message"),
448 NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
"FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title"),
449 JOptionPane.ERROR_MESSAGE);
453 editableMap.put(newMime,
new HashSet<String>());
457 mimeTableModel.resync();
458 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
461 private void updateMimeList() {
462 mimeList =
new ArrayList<>(editableMap.keySet());
463 if (mimeList.size() > 0) {
464 Collections.sort(mimeList);
468 private void updateExtList() {
469 Set<String> temp = editableMap.get(selectedMime);
471 currentExtensions =
new ArrayList<>(temp);
472 if (temp.size() > 0) {
473 Collections.sort(currentExtensions);
476 currentExtensions = null;
481 public void saveSettings() {
483 FileExtMismatchSettings.writeSettings(
new FileExtMismatchSettings(editableMap));
484 }
catch (FileExtMismatchSettings.FileExtMismatchSettingsException ex) {
486 JOptionPane.showMessageDialog(
this,
487 NbBundle.getMessage(
this.getClass(),
488 "FileExtMismatchConfigPanel.store.msgDlg.msg"),
489 NbBundle.getMessage(
this.getClass(),
490 "FileExtMismatchConfigPanel.save.msgDlg.title"),
491 JOptionPane.ERROR_MESSAGE);
500 editableMap = FileExtMismatchSettings.readSettings().getMimeTypeToExtsMap();
502 }
catch (FileExtMismatchSettings.FileExtMismatchSettingsException ex) {
504 JOptionPane.showMessageDialog(
this,
505 NbBundle.getMessage(
this.getClass(),
506 "AddFileExtensionAction.msgDlg.msg2"),
507 NbBundle.getMessage(
this.getClass(),
508 "FileExtMismatchConfigPanel.save.msgDlg.title"),
509 JOptionPane.ERROR_MESSAGE);
516 public void store() {
520 public void cancel() {
533 private javax.swing.JLabel extHeaderLabel;
534 private javax.swing.JTable extTable;
535 private javax.swing.JPanel extensionPanel;
536 private javax.swing.JLabel jLabel1;
537 private javax.swing.JPanel jPanel1;
538 private javax.swing.JScrollPane jScrollPane1;
539 private javax.swing.JScrollPane jScrollPane2;
540 private javax.swing.JScrollPane jScrollPane3;
541 private javax.swing.JSplitPane jSplitPane1;
542 private javax.swing.JPanel mimePanel;
543 private javax.swing.JTable mimeTable;
544 private javax.swing.JButton newExtButton;
545 private javax.swing.JButton newTypeButton;
546 private javax.swing.JButton removeExtButton;
547 private javax.swing.JButton removeTypeButton;
559 return editableMap == null ? 0 : editableMap.size();
564 String colName = null;
571 if ((mimeList == null) || (rowIndex > mimeList.size())) {
574 String word = mimeList.get(rowIndex);
575 switch (columnIndex) {
580 logger.log(Level.SEVERE,
"Invalid table column index: {0}", columnIndex);
592 public void setValueAt(Object aValue,
int rowIndex,
int columnIndex) {
601 fireTableDataChanged();
614 return currentExtensions == null ? 0 : currentExtensions.size();
619 String colName = null;
627 if ((currentExtensions == null) || (currentExtensions.isEmpty()) || (rowIndex > currentExtensions.size())) {
630 String word = currentExtensions.get(rowIndex);
631 switch (columnIndex) {
636 logger.log(Level.SEVERE,
"Invalid table column index: {0}", columnIndex);
648 public void setValueAt(Object aValue,
int rowIndex,
int columnIndex) {
657 fireTableDataChanged();
String getColumnName(int column)
boolean isCellEditable(int rowIndex, int columnIndex)
Class<?> getColumnClass(int c)
void setValueAt(Object aValue, int rowIndex, int columnIndex)
Class<?> getColumnClass(int c)
void setValueAt(Object aValue, int rowIndex, int columnIndex)
boolean isCellEditable(int rowIndex, int columnIndex)
Object getValueAt(int rowIndex, int columnIndex)
Object getValueAt(int rowIndex, int columnIndex)
String getColumnName(int column)