Autopsy  4.6.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
FileExtMismatchSettingsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2018 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.modules.fileextmismatch;
20 
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.HashSet;
25 import java.util.Set;
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;
38 
43 final class FileExtMismatchSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
44 
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;
57 
58  public FileExtMismatchSettingsPanel() {
59  mimeTableModel = new MimeTableModel();
60  extTableModel = new ExtTableModel();
61 
62  try {
63  fileTypeDetector = new FileTypeDetector();
64  } catch (FileTypeDetector.FileTypeDetectorInitException ex) {
65  logger.log(Level.SEVERE, "Failed to create file type detector", ex); //NON-NLS
66  fileTypeDetector = null;
67  }
68 
69  initComponents();
70  customizeComponents();
71  }
72 
73  @NbBundle.Messages({"FileExtMismatchSettingsPanel.Title=Global File Extension Mismatch Identification Settings"})
74  private void customizeComponents() {
75  setName(Bundle.FileExtMismatchSettingsPanel_Title());
76 
77  // Handle selections on the left table
78  lsm = mimeTable.getSelectionModel();
79  lsm.addListSelectionListener(new ListSelectionListener() {
80  @Override
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);
86 
87  selectedMime = mimeList.get(index);
88  String labelStr = EXT_HEADER_LABEL + selectedMime + ":";
89  if (labelStr.length() > 80) {
90  labelStr = labelStr.substring(0, 80);
91  }
92  extHeaderLabel.setText(labelStr);
93  updateExtList();
94 
95  extTableModel.resync();
96  removeTypeButton.setEnabled(true);
97  newExtButton.setEnabled(true);
98  //initButtons();
99  } else {
100  selectedMime = "";
101  currentExtensions = null;
102  removeTypeButton.setEnabled(false);
103  newExtButton.setEnabled(false);
104  extTableModel.resync();
105  }
106  }
107  });
108 
109  // Handle selections on the right table
110  ListSelectionModel extLsm = extTable.getSelectionModel();
111  extLsm.addListSelectionListener(new ListSelectionListener() {
112  @Override
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);
118 
119  selectedExt = currentExtensions.get(index);
120  removeExtButton.setEnabled(true);
121  } else {
122  selectedExt = "";
123  removeExtButton.setEnabled(false);
124  }
125 
126  }
127  });
128  removeExtButton.setEnabled(false);
129  removeTypeButton.setEnabled(false);
130  newExtButton.setEnabled(false);
131  }
132 
138  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
139  private void initComponents() {
140 
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();
156 
157  setPreferredSize(new java.awt.Dimension(718, 430));
158 
159  jPanel1.setPreferredSize(new java.awt.Dimension(718, 430));
160 
161  jScrollPane1.setRequestFocusEnabled(false);
162 
163  jSplitPane1.setDividerLocation(365);
164  jSplitPane1.setDividerSize(1);
165 
166  mimePanel.setPreferredSize(new java.awt.Dimension(369, 424));
167  mimePanel.setRequestFocusEnabled(false);
168 
169  jLabel1.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.jLabel1.text")); // NOI18N
170 
171  mimeTable.setModel(mimeTableModel);
172  jScrollPane2.setViewportView(mimeTable);
173 
174  newTypeButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
175  newTypeButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.newTypeButton.text")); // NOI18N
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);
181  }
182  });
183 
184  removeTypeButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
185  removeTypeButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.removeTypeButton.text")); // NOI18N
186  removeTypeButton.setToolTipText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.removeTypeButton.toolTipText")); // NOI18N
187  removeTypeButton.addActionListener(new java.awt.event.ActionListener() {
188  public void actionPerformed(java.awt.event.ActionEvent evt) {
189  removeTypeButtonActionPerformed(evt);
190  }
191  });
192 
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()
198  .addContainerGap()
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)
209  .addGap(10, 10, 10)
210  .addComponent(removeTypeButton)))
211  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
212  );
213  mimePanelLayout.setVerticalGroup(
214  mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
215  .addGroup(mimePanelLayout.createSequentialGroup()
216  .addContainerGap()
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))
224  .addContainerGap())
225  );
226 
227  jSplitPane1.setLeftComponent(mimePanel);
228 
229  extensionPanel.setPreferredSize(new java.awt.Dimension(344, 424));
230 
231  newExtButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
232  newExtButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.newExtButton.text")); // NOI18N
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);
238  }
239  });
240 
241  extTable.setModel(extTableModel);
242  jScrollPane3.setViewportView(extTable);
243 
244  removeExtButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
245  removeExtButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.removeExtButton.text")); // NOI18N
246  removeExtButton.addActionListener(new java.awt.event.ActionListener() {
247  public void actionPerformed(java.awt.event.ActionEvent evt) {
248  removeExtButtonActionPerformed(evt);
249  }
250  });
251 
252  extHeaderLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.extHeaderLabel.text")); // NOI18N
253 
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()
259  .addContainerGap()
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)))
270  .addContainerGap())
271  );
272  extensionPanelLayout.setVerticalGroup(
273  extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
274  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, extensionPanelLayout.createSequentialGroup()
275  .addContainerGap()
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))
283  .addContainerGap())
284  );
285 
286  jSplitPane1.setRightComponent(extensionPanel);
287 
288  jScrollPane1.setViewportView(jSplitPane1);
289 
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()
295  .addGap(0, 0, 0)
296  .addComponent(jScrollPane1)
297  .addGap(0, 0, 0))
298  );
299  jPanel1Layout.setVerticalGroup(
300  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
301  .addGroup(jPanel1Layout.createSequentialGroup()
302  .addGap(0, 0, 0)
303  .addComponent(jScrollPane1)
304  .addGap(0, 0, 0))
305  );
306 
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)
312  );
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)
316  );
317  }// </editor-fold>//GEN-END:initComponents
318 
319  // Add a user-provided filename extension string to the selecte mimetype
320  private void newExtButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newExtButtonActionPerformed
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, "");
323 
324  if (newExt == null) {
325  return;
326  }
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);
332  return;
333  }
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);
339  return;
340  }
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);
346  return;
347  }
348 
349  Set<String> editedExtensions = editableMap.get(selectedMime);
350  editedExtensions.add(newExt);
351 
352  // Old array will be replaced by new array for this key
353  editableMap.put(selectedMime, editedExtensions);
354 
355  // Refresh table
356  updateExtList();
357  extTableModel.resync();
358  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
359  }//GEN-LAST:event_newExtButtonActionPerformed
360 
361  private void removeExtButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeExtButtonActionPerformed
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);
367  return;
368  }
369 
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);
375  return;
376  }
377 
378  Set<String> editedExtensions = editableMap.get(selectedMime);
379  editedExtensions.remove(selectedExt);
380  String deadExt = selectedExt;
381 
382  // Old array will be replaced by new array for this key
383  editableMap.put(selectedMime, editedExtensions);
384 
385  // Refresh tables
386  updateExtList();
387  extTableModel.resync();
388  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
389  }//GEN-LAST:event_removeExtButtonActionPerformed
390 
391  private void removeTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeTypeButtonActionPerformed
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);
397  return;
398  }
399 
400  editableMap.remove(selectedMime);
401 
402  // Refresh table
403  updateMimeList();
404  mimeTableModel.resync();
405  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
406  }//GEN-LAST:event_removeTypeButtonActionPerformed
407 
408  private void newTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTypeButtonActionPerformed
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, "");
411 
412  if (newMime == null) {
413  return;
414  }
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);
420  return;
421  }
422  if (newMime.equals("application/octet-stream")) { //NON-NLS
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);
427  return;
428  }
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);
434  return;
435  }
436 
437  FileTypeDetector detector;
438  try {
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);
442  return;
443  }
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);
450  return;
451  }
452 
453  editableMap.put(newMime, new HashSet<String>());
454 
455  // Refresh table
456  updateMimeList();
457  mimeTableModel.resync();
458  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
459  }//GEN-LAST:event_newTypeButtonActionPerformed
460 
461  private void updateMimeList() {
462  mimeList = new ArrayList<>(editableMap.keySet());
463  if (mimeList.size() > 0) {
464  Collections.sort(mimeList);
465  }
466  }
467 
468  private void updateExtList() {
469  Set<String> temp = editableMap.get(selectedMime);
470  if (temp != null) {
471  currentExtensions = new ArrayList<>(temp);
472  if (temp.size() > 0) {
473  Collections.sort(currentExtensions);
474  }
475  } else {
476  currentExtensions = null;
477  }
478  }
479 
480  @Override
481  public void saveSettings() {
482  try {
483  FileExtMismatchSettings.writeSettings(new FileExtMismatchSettings(editableMap));
484  } catch (FileExtMismatchSettings.FileExtMismatchSettingsException ex) {
485  //error
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);
492  }
493  }
494 
495  @Override
496  public void load() {
497  try {
498  // Load the configuration into a buffer that the user can modify. They can choose
499  // to save it back to the file after making changes.
500  editableMap = FileExtMismatchSettings.readSettings().getMimeTypeToExtsMap();
501 
502  } catch (FileExtMismatchSettings.FileExtMismatchSettingsException ex) {
503  //error
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);
510  }
511  updateMimeList();
512  updateExtList();
513  }
514 
515  @Override
516  public void store() {
517  saveSettings();
518  }
519 
520  public void cancel() {
521  load(); // The next time this panel is opened, we want it to be fresh
522  }
523 
524  public void ok() {
525  store();
526  load(); // The next time this panel is opened, we want it to be fresh
527  }
528 
529  boolean valid() {
530  return true;
531  }
532  // Variables declaration - do not modify//GEN-BEGIN:variables
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;
548  // End of variables declaration//GEN-END:variables
549 
550  private class MimeTableModel extends AbstractTableModel {
551 
552  @Override
553  public int getColumnCount() {
554  return 1;
555  }
556 
557  @Override
558  public int getRowCount() {
559  return editableMap == null ? 0 : editableMap.size();
560  }
561 
562  @Override
563  public String getColumnName(int column) {
564  String colName = null;
565  return colName;
566  }
567 
568  @Override
569  public Object getValueAt(int rowIndex, int columnIndex) {
570  Object ret = null;
571  if ((mimeList == null) || (rowIndex > mimeList.size())) {
572  return "";
573  }
574  String word = mimeList.get(rowIndex);
575  switch (columnIndex) {
576  case 0:
577  ret = (Object) word;
578  break;
579  default:
580  logger.log(Level.SEVERE, "Invalid table column index: {0}", columnIndex); //NON-NLS
581  break;
582  }
583  return ret;
584  }
585 
586  @Override
587  public boolean isCellEditable(int rowIndex, int columnIndex) {
588  return false;
589  }
590 
591  @Override
592  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
593  }
594 
595  @Override
596  public Class<?> getColumnClass(int c) {
597  return getValueAt(0, c).getClass();
598  }
599 
600  void resync() {
601  fireTableDataChanged();
602  }
603  }
604 
605  private class ExtTableModel extends AbstractTableModel {
606 
607  @Override
608  public int getColumnCount() {
609  return 1;
610  }
611 
612  @Override
613  public int getRowCount() {
614  return currentExtensions == null ? 0 : currentExtensions.size();
615  }
616 
617  @Override
618  public String getColumnName(int column) {
619  String colName = null;
620  return colName;
621  }
622 
623  @Override
624  public Object getValueAt(int rowIndex, int columnIndex) {
625  Object ret = null;
626 
627  if ((currentExtensions == null) || (currentExtensions.isEmpty()) || (rowIndex > currentExtensions.size())) {
628  return "";
629  }
630  String word = currentExtensions.get(rowIndex);
631  switch (columnIndex) {
632  case 0:
633  ret = (Object) word;
634  break;
635  default:
636  logger.log(Level.SEVERE, "Invalid table column index: {0}", columnIndex); //NON-NLS
637  break;
638  }
639  return ret;
640  }
641 
642  @Override
643  public boolean isCellEditable(int rowIndex, int columnIndex) {
644  return false;
645  }
646 
647  @Override
648  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
649  }
650 
651  @Override
652  public Class<?> getColumnClass(int c) {
653  return getValueAt(0, c).getClass();
654  }
655 
656  void resync() {
657  fireTableDataChanged();
658  }
659  }
660 }

Copyright © 2012-2016 Basis Technology. Generated on: Mon May 7 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.