Autopsy  4.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-2015 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.awt.Color;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.HashMap;
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;
33 import org.openide.util.NbBundle;
37 
42 final class FileExtMismatchSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
43 
44  private static final Logger logger = Logger.getLogger(FileExtMismatchSettingsPanel.class.getName());
45  private HashMap<String, String[]> editableMap = new HashMap<>();
46  private ArrayList<String> mimeList = null;
47  private ArrayList<String> currentExtensions = null;
48  private MimeTableModel mimeTableModel;
49  private ExtTableModel extTableModel;
50  private final String EXT_HEADER_LABEL = NbBundle.getMessage(FileExtMismatchSettingsPanel.class,
51  "AddFileExtensionAction.extHeaderLbl.text");
52  private String selectedMime = "";
53  private String selectedExt = "";
54  ListSelectionModel lsm = null;
55  private FileTypeDetector fileTypeDetector;
56 
57  public FileExtMismatchSettingsPanel() {
58  mimeTableModel = new MimeTableModel();
59  extTableModel = new ExtTableModel();
60 
61  try {
62  fileTypeDetector = new FileTypeDetector();
63  } catch (FileTypeDetector.FileTypeDetectorInitException ex) {
64  logger.log(Level.SEVERE, "Failed to create file type detector", ex); //NON-NLS
65  fileTypeDetector = null;
66  }
67 
68  initComponents();
69  customizeComponents();
70  }
71 
72  @NbBundle.Messages({"FileExtMismatchSettingsPanel.Title=Global File Extension Mismatch Identification Settings"})
73  private void customizeComponents() {
74  setName(Bundle.FileExtMismatchSettingsPanel_Title());
75 
76  // Handle selections on the left table
77  lsm = mimeTable.getSelectionModel();
78  lsm.addListSelectionListener(new ListSelectionListener() {
79  @Override
80  public void valueChanged(ListSelectionEvent e) {
81  ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
82  if (!listSelectionModel.isSelectionEmpty()) {
83  int index = listSelectionModel.getMinSelectionIndex();
84  listSelectionModel.setSelectionInterval(index, index);
85 
86  selectedMime = mimeList.get(index);
87  String labelStr = EXT_HEADER_LABEL + selectedMime + ":";
88  if (labelStr.length() > 80) {
89  labelStr = labelStr.substring(0, 80);
90  }
91  extHeaderLabel.setText(labelStr);
92  updateExtList();
93 
94  extTableModel.resync();
95  //initButtons();
96  } else {
97  selectedMime = "";
98  currentExtensions = null;
99  extTableModel.resync();
100  }
101 
102  clearErrLabels();
103  }
104  });
105 
106  // Handle selections on the right table
107  ListSelectionModel extLsm = extTable.getSelectionModel();
108  extLsm.addListSelectionListener(new ListSelectionListener() {
109  @Override
110  public void valueChanged(ListSelectionEvent e) {
111  ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
112  if (!listSelectionModel.isSelectionEmpty()) {
113  int index = listSelectionModel.getMinSelectionIndex();
114  listSelectionModel.setSelectionInterval(index, index);
115 
116  selectedExt = currentExtensions.get(index);
117  } else {
118  selectedExt = "";
119  }
120 
121  extRemoveErrLabel.setText(" ");
122 
123  }
124  });
125 
126  }
127 
128  private void clearErrLabels() {
129  mimeErrLabel.setText(" ");
130  mimeRemoveErrLabel.setText(" ");
131  extRemoveErrLabel.setText(" ");
132  extErrorLabel.setText(" ");
133  saveMsgLabel.setText(" ");
134  }
135 
141  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
142  private void initComponents() {
143 
144  jScrollPane1 = new javax.swing.JScrollPane();
145  jPanel1 = new javax.swing.JPanel();
146  jSplitPane1 = new javax.swing.JSplitPane();
147  mimePanel = new javax.swing.JPanel();
148  jLabel1 = new javax.swing.JLabel();
149  jScrollPane2 = new javax.swing.JScrollPane();
150  mimeTable = new javax.swing.JTable();
151  userTypeTextField = new javax.swing.JTextField();
152  addTypeButton = new javax.swing.JButton();
153  removeTypeButton = new javax.swing.JButton();
154  mimeErrLabel = new javax.swing.JLabel();
155  mimeRemoveErrLabel = new javax.swing.JLabel();
156  extensionPanel = new javax.swing.JPanel();
157  userExtTextField = new javax.swing.JTextField();
158  addExtButton = new javax.swing.JButton();
159  jScrollPane3 = new javax.swing.JScrollPane();
160  extTable = new javax.swing.JTable();
161  removeExtButton = new javax.swing.JButton();
162  extHeaderLabel = new javax.swing.JLabel();
163  extErrorLabel = new javax.swing.JLabel();
164  extRemoveErrLabel = new javax.swing.JLabel();
165  saveMsgLabel = new javax.swing.JLabel();
166 
167  jPanel1.setPreferredSize(new java.awt.Dimension(687, 450));
168 
169  jSplitPane1.setDividerLocation(430);
170 
171  jLabel1.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.jLabel1.text")); // NOI18N
172 
173  mimeTable.setModel(mimeTableModel);
174  jScrollPane2.setViewportView(mimeTable);
175 
176  userTypeTextField.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.userTypeTextField.text")); // NOI18N
177  userTypeTextField.addFocusListener(new java.awt.event.FocusAdapter() {
178  public void focusGained(java.awt.event.FocusEvent evt) {
179  userTypeTextFieldFocusGained(evt);
180  }
181  });
182 
183  addTypeButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.addTypeButton.text")); // NOI18N
184  addTypeButton.addActionListener(new java.awt.event.ActionListener() {
185  public void actionPerformed(java.awt.event.ActionEvent evt) {
186  addTypeButtonActionPerformed(evt);
187  }
188  });
189 
190  removeTypeButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.removeTypeButton.text")); // NOI18N
191  removeTypeButton.addActionListener(new java.awt.event.ActionListener() {
192  public void actionPerformed(java.awt.event.ActionEvent evt) {
193  removeTypeButtonActionPerformed(evt);
194  }
195  });
196 
197  mimeErrLabel.setForeground(new java.awt.Color(255, 0, 0));
198  mimeErrLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.mimeErrLabel.text")); // NOI18N
199 
200  mimeRemoveErrLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.mimeRemoveErrLabel.text")); // NOI18N
201 
202  javax.swing.GroupLayout mimePanelLayout = new javax.swing.GroupLayout(mimePanel);
203  mimePanel.setLayout(mimePanelLayout);
204  mimePanelLayout.setHorizontalGroup(
205  mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
206  .addGroup(mimePanelLayout.createSequentialGroup()
207  .addContainerGap()
208  .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
209  .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
210  .addGroup(mimePanelLayout.createSequentialGroup()
211  .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
212  .addComponent(jLabel1)
213  .addGroup(mimePanelLayout.createSequentialGroup()
214  .addComponent(userTypeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
215  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
216  .addComponent(addTypeButton))
217  .addComponent(removeTypeButton))
218  .addGap(0, 196, Short.MAX_VALUE))
219  .addComponent(mimeErrLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
220  .addComponent(mimeRemoveErrLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
221  .addContainerGap())
222  );
223  mimePanelLayout.setVerticalGroup(
224  mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
225  .addGroup(mimePanelLayout.createSequentialGroup()
226  .addContainerGap()
227  .addComponent(jLabel1)
228  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
229  .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)
230  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
231  .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
232  .addComponent(userTypeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
233  .addComponent(addTypeButton))
234  .addGap(3, 3, 3)
235  .addComponent(mimeErrLabel)
236  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
237  .addComponent(removeTypeButton)
238  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
239  .addComponent(mimeRemoveErrLabel)
240  .addContainerGap(83, Short.MAX_VALUE))
241  );
242 
243  jSplitPane1.setLeftComponent(mimePanel);
244 
245  userExtTextField.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.userExtTextField.text")); // NOI18N
246  userExtTextField.addFocusListener(new java.awt.event.FocusAdapter() {
247  public void focusGained(java.awt.event.FocusEvent evt) {
248  userExtTextFieldFocusGained(evt);
249  }
250  });
251 
252  addExtButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.addExtButton.text")); // NOI18N
253  addExtButton.addActionListener(new java.awt.event.ActionListener() {
254  public void actionPerformed(java.awt.event.ActionEvent evt) {
255  addExtButtonActionPerformed(evt);
256  }
257  });
258 
259  extTable.setModel(extTableModel);
260  jScrollPane3.setViewportView(extTable);
261 
262  removeExtButton.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.removeExtButton.text")); // NOI18N
263  removeExtButton.addActionListener(new java.awt.event.ActionListener() {
264  public void actionPerformed(java.awt.event.ActionEvent evt) {
265  removeExtButtonActionPerformed(evt);
266  }
267  });
268 
269  extHeaderLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.extHeaderLabel.text")); // NOI18N
270 
271  extErrorLabel.setForeground(new java.awt.Color(255, 0, 0));
272  extErrorLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.extErrorLabel.text")); // NOI18N
273 
274  extRemoveErrLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.extRemoveErrLabel.text")); // NOI18N
275 
276  javax.swing.GroupLayout extensionPanelLayout = new javax.swing.GroupLayout(extensionPanel);
277  extensionPanel.setLayout(extensionPanelLayout);
278  extensionPanelLayout.setHorizontalGroup(
279  extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
280  .addGroup(extensionPanelLayout.createSequentialGroup()
281  .addContainerGap()
282  .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
283  .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
284  .addComponent(extHeaderLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
285  .addGroup(extensionPanelLayout.createSequentialGroup()
286  .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
287  .addComponent(removeExtButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
288  .addGroup(extensionPanelLayout.createSequentialGroup()
289  .addComponent(userExtTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
290  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
291  .addComponent(addExtButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
292  .addGap(0, 46, Short.MAX_VALUE))
293  .addComponent(extErrorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
294  .addComponent(extRemoveErrLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
295  .addContainerGap())
296  );
297  extensionPanelLayout.setVerticalGroup(
298  extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
299  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, extensionPanelLayout.createSequentialGroup()
300  .addContainerGap()
301  .addComponent(extHeaderLabel)
302  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
303  .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)
304  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
305  .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
306  .addComponent(userExtTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
307  .addComponent(addExtButton))
308  .addGap(2, 2, 2)
309  .addComponent(extErrorLabel)
310  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
311  .addComponent(removeExtButton)
312  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
313  .addComponent(extRemoveErrLabel)
314  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
315  );
316 
317  jSplitPane1.setRightComponent(extensionPanel);
318 
319  saveMsgLabel.setForeground(new java.awt.Color(0, 0, 255));
320  saveMsgLabel.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchSettingsPanel.class, "FileExtMismatchSettingsPanel.saveMsgLabel.text")); // NOI18N
321 
322  javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
323  jPanel1.setLayout(jPanel1Layout);
324  jPanel1Layout.setHorizontalGroup(
325  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
326  .addGroup(jPanel1Layout.createSequentialGroup()
327  .addContainerGap()
328  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
329  .addComponent(jSplitPane1)
330  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
331  .addGap(0, 0, Short.MAX_VALUE)
332  .addComponent(saveMsgLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)))
333  .addContainerGap())
334  );
335  jPanel1Layout.setVerticalGroup(
336  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
337  .addGroup(jPanel1Layout.createSequentialGroup()
338  .addContainerGap()
339  .addComponent(jSplitPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 466, javax.swing.GroupLayout.PREFERRED_SIZE)
340  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
341  .addComponent(saveMsgLabel)
342  .addContainerGap())
343  );
344 
345  jScrollPane1.setViewportView(jPanel1);
346 
347  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
348  this.setLayout(layout);
349  layout.setHorizontalGroup(
350  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
351  .addComponent(jScrollPane1)
352  );
353  layout.setVerticalGroup(
354  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
355  .addGroup(layout.createSequentialGroup()
356  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 482, javax.swing.GroupLayout.PREFERRED_SIZE)
357  .addGap(0, 8, Short.MAX_VALUE))
358  );
359  }// </editor-fold>//GEN-END:initComponents
360 
361  // Add a user-provided filename extension string to the selecte mimetype
362  private void addExtButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addExtButtonActionPerformed
363  String newExt = userExtTextField.getText();
364  if (newExt.isEmpty()) {
365  extErrorLabel.setForeground(Color.red);
366  extErrorLabel.setText(
367  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addExtButton.errLabel.empty"));
368  return;
369  }
370 
371  if (selectedMime.isEmpty()) {
372  extErrorLabel.setForeground(Color.red);
373  extErrorLabel.setText(
374  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addExtButton.errLabel.noMimeType"));
375  return;
376  }
377 
378  if (currentExtensions.contains(newExt)) {
379  extErrorLabel.setForeground(Color.red);
380  extErrorLabel.setText(
381  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addExtButton.errLabel.extExists"));
382  return;
383  }
384 
385  ArrayList<String> editedExtensions = new ArrayList<>(Arrays.asList(editableMap.get(selectedMime)));
386  editedExtensions.add(newExt);
387 
388  // Old array will be replaced by new array for this key
389  editableMap.put(selectedMime, editedExtensions.toArray(new String[0]));
390 
391  // Refresh table
392  updateExtList();
393  extTableModel.resync();
394 
395  // user feedback for successful add
396  extErrorLabel.setForeground(Color.blue);
397  extErrorLabel.setText(
398  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addExtButton.errLabel.extAdded",
399  newExt));
400  extRemoveErrLabel.setText(" ");
401  userExtTextField.setText("");
402  setIsModified();
403  }//GEN-LAST:event_addExtButtonActionPerformed
404 
405  private void addTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addTypeButtonActionPerformed
406  String newMime = userTypeTextField.getText();
407  if (newMime.isEmpty()) {
408  mimeErrLabel.setForeground(Color.red);
409  mimeErrLabel.setText(NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addTypeButton.empty"));
410  return;
411  }
412  if (newMime.equals("application/octet-stream")) { //NON-NLS
413  mimeErrLabel.setForeground(Color.red);
414  mimeErrLabel.setText(NbBundle.getMessage(this.getClass(),
415  "FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotSupported"));
416  return;
417  }
418  if (mimeList.contains(newMime)) {
419  mimeErrLabel.setForeground(Color.red);
420  mimeErrLabel.setText(
421  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addTypeButton.mimeTypeExists"));
422  return;
423  }
424 
425  boolean mimeTypeDetectable = (null != fileTypeDetector) ? fileTypeDetector.isDetectable(newMime) : false;
426  if (!mimeTypeDetectable) {
427  mimeErrLabel.setForeground(Color.red);
428  mimeErrLabel.setText(NbBundle.getMessage(this.getClass(),
429  "FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotDetectable"));
430  return;
431  }
432 
433  editableMap.put(newMime, new String[0]);
434 
435  // Refresh table
436  updateMimeList();
437  mimeTableModel.resync();
438 
439  // user feedback for successful add
440  //selectByMimeString(newMime);
441  mimeErrLabel.setForeground(Color.blue);
442  mimeErrLabel.setText(
443  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.addTypeButton.mimeTypeAdded", newMime));
444  mimeRemoveErrLabel.setText(" ");
445  userTypeTextField.setText("");
446  setIsModified();
447  }//GEN-LAST:event_addTypeButtonActionPerformed
448 
449  private void userExtTextFieldFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_userExtTextFieldFocusGained
450  extErrorLabel.setText(" "); //space so Swing doesn't mess up vertical spacing
451  }//GEN-LAST:event_userExtTextFieldFocusGained
452 
453  private void userTypeTextFieldFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_userTypeTextFieldFocusGained
454  mimeErrLabel.setText(" "); //space so Swing doesn't mess up vertical spacing
455  }//GEN-LAST:event_userTypeTextFieldFocusGained
456 
457  private void removeTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeTypeButtonActionPerformed
458  if (selectedMime.isEmpty()) {
459  mimeRemoveErrLabel.setForeground(Color.red);
460  mimeRemoveErrLabel.setText(
461  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.removeTypeButton.noneSelected"));
462  return;
463  }
464 
465  editableMap.remove(selectedMime);
466  String deadMime = selectedMime;
467 
468  // Refresh table
469  updateMimeList();
470  mimeTableModel.resync();
471 
472  // user feedback for successful add
473  mimeRemoveErrLabel.setForeground(Color.blue);
474  mimeRemoveErrLabel.setText(
475  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.remoteTypeButton.deleted", deadMime));
476  setIsModified();
477  }//GEN-LAST:event_removeTypeButtonActionPerformed
478 
479  private void removeExtButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeExtButtonActionPerformed
480  if (selectedExt.isEmpty()) {
481  extRemoveErrLabel.setForeground(Color.red);
482  extRemoveErrLabel.setText(
483  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.removeExtButton.noneSelected"));
484  return;
485  }
486 
487  if (selectedMime.isEmpty()) {
488  extErrorLabel.setForeground(Color.red);
489  extErrorLabel.setText(NbBundle.getMessage(this.getClass(),
490  "FileExtMismatchConfigPanel.removeExtButton.noMimeTypeSelected"));
491  return;
492  }
493 
494  ArrayList<String> editedExtensions = new ArrayList<>(Arrays.asList(editableMap.get(selectedMime)));
495  editedExtensions.remove(selectedExt);
496  String deadExt = selectedExt;
497 
498  // Old array will be replaced by new array for this key
499  editableMap.put(selectedMime, editedExtensions.toArray(new String[0]));
500 
501  // Refresh tables
502  updateExtList();
503  extTableModel.resync();
504 
505  // user feedback for successful add
506  extRemoveErrLabel.setForeground(Color.blue);
507  extRemoveErrLabel.setText(
508  NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.removeExtButton.deleted", deadExt));
509  setIsModified();
510  }//GEN-LAST:event_removeExtButtonActionPerformed
511 
512  private void updateMimeList() {
513  mimeList = new ArrayList<>(editableMap.keySet());
514  if (mimeList.size() > 0) {
515  Collections.sort(mimeList);
516  }
517  }
518 
519  private void updateExtList() {
520  String[] temp = editableMap.get(selectedMime);
521  if (temp != null) {
522  currentExtensions = new ArrayList<>(Arrays.asList(temp));
523  if (temp.length > 0) {
524  Collections.sort(currentExtensions);
525  }
526  } else {
527  currentExtensions = null;
528  }
529  }
530 
531  @Override
532  public void saveSettings() {
533  if (FileExtMismatchXML.getDefault().save(editableMap)) {
534  mimeErrLabel.setText(" ");
535  mimeRemoveErrLabel.setText(" ");
536  extRemoveErrLabel.setText(" ");
537  extErrorLabel.setText(" ");
538 
539  saveMsgLabel.setText(NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.store.msg"));
540  } else {
541  //error
542  JOptionPane.showMessageDialog(this,
543  NbBundle.getMessage(this.getClass(),
544  "FileExtMismatchConfigPanel.store.msgDlg.msg"),
545  NbBundle.getMessage(this.getClass(),
546  "FileExtMismatchConfigPanel.save.msgDlg.title"),
547  JOptionPane.ERROR_MESSAGE);
548  }
549  }
550 
551  @Override
552  public void load() {
553  // Load the XML into a buffer that the user can modify. They can choose
554  // to save it back to the file after making changes.
555  editableMap = FileExtMismatchXML.getDefault().load();
556  updateMimeList();
557  updateExtList();
558  }
559 
560  @Override
561  public void store() {
562  saveSettings();
563  }
564 
565  private void setIsModified() {
566  saveMsgLabel.setText(" ");
567  }
568 
569  public void cancel() {
570  clearErrLabels();
571  load(); // The next time this panel is opened, we want it to be fresh
572  }
573 
574  public void ok() {
575  store();
576  clearErrLabels();
577  load(); // The next time this panel is opened, we want it to be fresh
578  }
579 
580  boolean valid() {
581  return true;
582  }
583  // Variables declaration - do not modify//GEN-BEGIN:variables
584  private javax.swing.JButton addExtButton;
585  private javax.swing.JButton addTypeButton;
586  private javax.swing.JLabel extErrorLabel;
587  private javax.swing.JLabel extHeaderLabel;
588  private javax.swing.JLabel extRemoveErrLabel;
589  private javax.swing.JTable extTable;
590  private javax.swing.JPanel extensionPanel;
591  private javax.swing.JLabel jLabel1;
592  private javax.swing.JPanel jPanel1;
593  private javax.swing.JScrollPane jScrollPane1;
594  private javax.swing.JScrollPane jScrollPane2;
595  private javax.swing.JScrollPane jScrollPane3;
596  private javax.swing.JSplitPane jSplitPane1;
597  private javax.swing.JLabel mimeErrLabel;
598  private javax.swing.JPanel mimePanel;
599  private javax.swing.JLabel mimeRemoveErrLabel;
600  private javax.swing.JTable mimeTable;
601  private javax.swing.JButton removeExtButton;
602  private javax.swing.JButton removeTypeButton;
603  private javax.swing.JLabel saveMsgLabel;
604  private javax.swing.JTextField userExtTextField;
605  private javax.swing.JTextField userTypeTextField;
606  // End of variables declaration//GEN-END:variables
607 
608  private class MimeTableModel extends AbstractTableModel {
609 
610  @Override
611  public int getColumnCount() {
612  return 1;
613  }
614 
615  @Override
616  public int getRowCount() {
617  return editableMap == null ? 0 : editableMap.size();
618  }
619 
620  @Override
621  public String getColumnName(int column) {
622  String colName = null;
623 
624  switch (column) {
625  case 0:
626  colName = NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.mimeTableModel.colName");
627  break;
628  default:
629  ;
630 
631  }
632  return colName;
633  }
634 
635  @Override
636  public Object getValueAt(int rowIndex, int columnIndex) {
637  Object ret = null;
638  if ((mimeList == null) || (rowIndex > mimeList.size())) {
639  return "";
640  }
641  String word = mimeList.get(rowIndex);
642  switch (columnIndex) {
643  case 0:
644  ret = (Object) word;
645  break;
646  default:
647  logger.log(Level.SEVERE, "Invalid table column index: {0}", columnIndex); //NON-NLS
648  break;
649  }
650  return ret;
651  }
652 
653  @Override
654  public boolean isCellEditable(int rowIndex, int columnIndex) {
655  return false;
656  }
657 
658  @Override
659  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
660  }
661 
662  @Override
663  public Class<?> getColumnClass(int c) {
664  return getValueAt(0, c).getClass();
665  }
666 
667  void resync() {
668  fireTableDataChanged();
669  }
670  }
671 
672  private class ExtTableModel extends AbstractTableModel {
673 
674  @Override
675  public int getColumnCount() {
676  return 1;
677  }
678 
679  @Override
680  public int getRowCount() {
681  return currentExtensions == null ? 0 : currentExtensions.size();
682  }
683 
684  @Override
685  public String getColumnName(int column) {
686  String colName = null;
687 
688  switch (column) {
689  case 0:
690  colName = NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.extTableModel.colName");
691  break;
692  default:
693  ;
694 
695  }
696  return colName;
697  }
698 
699  @Override
700  public Object getValueAt(int rowIndex, int columnIndex) {
701  Object ret = null;
702 
703  if ((currentExtensions == null) || (currentExtensions.isEmpty()) || (rowIndex > currentExtensions.size())) {
704  return "";
705  }
706  String word = currentExtensions.get(rowIndex);
707  switch (columnIndex) {
708  case 0:
709  ret = (Object) word;
710  break;
711  default:
712  logger.log(Level.SEVERE, "Invalid table column index: {0}", columnIndex); //NON-NLS
713  break;
714  }
715  return ret;
716  }
717 
718  @Override
719  public boolean isCellEditable(int rowIndex, int columnIndex) {
720  return false;
721  }
722 
723  @Override
724  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
725  }
726 
727  @Override
728  public Class<?> getColumnClass(int c) {
729  return getValueAt(0, c).getClass();
730  }
731 
732  void resync() {
733  fireTableDataChanged();
734  }
735  }
736 }

Copyright © 2012-2015 Basis Technology. Generated on: Wed Apr 6 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.