Autopsy  4.6.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
TagOptionsPanel.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.casemodule.services;
20 
21 import java.awt.EventQueue;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.HashSet;
25 import java.util.Set;
26 import java.util.TreeSet;
27 import java.util.logging.Level;
28 import javax.swing.DefaultListModel;
29 import javax.swing.JOptionPane;
30 import javax.swing.SwingUtilities;
31 import javax.swing.event.ListSelectionEvent;
32 import org.netbeans.spi.options.OptionsPanelController;
33 import org.openide.util.NbBundle;
34 import org.openide.util.NbBundle.Messages;
39 import org.sleuthkit.datamodel.TagName;
40 import org.sleuthkit.datamodel.TskData;
42 
46 final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
47 
48  private static final long serialVersionUID = 1L;
49  private static final TagName.HTML_COLOR DEFAULT_COLOR = TagName.HTML_COLOR.NONE;
50  private final DefaultListModel<TagNameDefinition> tagTypesListModel;
51  private Set<TagNameDefinition> tagTypes;
52  private IngestJobEventPropertyChangeListener ingestJobEventsListener;
53  private Set<String> updatedStatusTags;
54 
58  TagOptionsPanel() {
59  tagTypesListModel = new DefaultListModel<>();
60  tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions());
61  updatedStatusTags = new HashSet<>();
62  initComponents();
63  customizeComponents();
64  }
65 
66  @Messages({"TagOptionsPanel.panelDescriptionTextArea.text=Create and manage tags. "
67  + "Tags can be applied to files and results in the case. Notable tags will cause "
68  + "items tagged with them to be flagged as notable when using a central repository. "
69  + "Changing the status of a tag will only effect items in the current case.",
70  "TagOptionsPanel.ingestRunningWarningLabel.text=Cannot make changes to existing tags when ingest is running!",
71  "TagOptionsPanel.descriptionLabel.text=Tag Description:",
72  "TagOptionsPanel.notableYesOrNoLabel.text=",
73  "TagOptionsPanel.isNotableLabel.text=Tag indicates item is notable: ",
74  "TagOptionsPanel.editTagNameButton.text=Edit Tag"})
75 
76  private void customizeComponents() {
77  tagNamesList.setModel(tagTypesListModel);
78  tagNamesList.addListSelectionListener((ListSelectionEvent event) -> {
79  updatePanel();
80  });
81  addIngestJobEventsListener();
82  }
83 
90  private void addIngestJobEventsListener() {
91  ingestJobEventsListener = new IngestJobEventPropertyChangeListener();
92  IngestManager.getInstance().addIngestJobEventListener(ingestJobEventsListener);
93  }
94 
100  @SuppressWarnings("unchecked")
101  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
102  private void initComponents() {
103 
104  jPanel1 = new javax.swing.JPanel();
105  jScrollPane2 = new javax.swing.JScrollPane();
106  jSplitPane1 = new javax.swing.JSplitPane();
107  modifyTagTypesListPanel = new javax.swing.JPanel();
108  tagTypesListLabel = new javax.swing.JLabel();
109  TagNameScrollPane = new javax.swing.JScrollPane();
110  tagNamesList = new javax.swing.JList<>();
111  newTagNameButton = new javax.swing.JButton();
112  deleteTagNameButton = new javax.swing.JButton();
113  editTagNameButton = new javax.swing.JButton();
114  panelDescriptionScrollPane = new javax.swing.JScrollPane();
115  panelDescriptionTextArea = new javax.swing.JTextArea();
116  tagTypesAdditionalPanel = new javax.swing.JPanel();
117  descriptionLabel = new javax.swing.JLabel();
118  descriptionScrollPane = new javax.swing.JScrollPane();
119  descriptionTextArea = new javax.swing.JTextArea();
120  isNotableLabel = new javax.swing.JLabel();
121  notableYesOrNoLabel = new javax.swing.JLabel();
122  ingestRunningWarningLabel = new javax.swing.JLabel();
123 
124  jPanel1.setPreferredSize(new java.awt.Dimension(750, 490));
125 
126  jScrollPane2.setPreferredSize(new java.awt.Dimension(750, 490));
127 
128  jSplitPane1.setDividerLocation(450);
129  jSplitPane1.setDividerSize(1);
130  jSplitPane1.setPreferredSize(new java.awt.Dimension(748, 488));
131 
132  org.openide.awt.Mnemonics.setLocalizedText(tagTypesListLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.tagTypesListLabel.text")); // NOI18N
133 
134  tagNamesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
135  TagNameScrollPane.setViewportView(tagNamesList);
136 
137  newTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add-tag.png"))); // NOI18N
138  org.openide.awt.Mnemonics.setLocalizedText(newTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.newTagNameButton.text")); // NOI18N
139  newTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
140  newTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
141  newTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
142  newTagNameButton.addActionListener(new java.awt.event.ActionListener() {
143  public void actionPerformed(java.awt.event.ActionEvent evt) {
144  newTagNameButtonActionPerformed(evt);
145  }
146  });
147 
148  deleteTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete-tag.png"))); // NOI18N
149  org.openide.awt.Mnemonics.setLocalizedText(deleteTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.deleteTagNameButton.text")); // NOI18N
150  deleteTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
151  deleteTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
152  deleteTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
153  deleteTagNameButton.addActionListener(new java.awt.event.ActionListener() {
154  public void actionPerformed(java.awt.event.ActionEvent evt) {
155  deleteTagNameButtonActionPerformed(evt);
156  }
157  });
158 
159  editTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit-tag.png"))); // NOI18N
160  org.openide.awt.Mnemonics.setLocalizedText(editTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.editTagNameButton.text")); // NOI18N
161  editTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
162  editTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
163  editTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
164  editTagNameButton.addActionListener(new java.awt.event.ActionListener() {
165  public void actionPerformed(java.awt.event.ActionEvent evt) {
166  editTagNameButtonActionPerformed(evt);
167  }
168  });
169 
170  panelDescriptionTextArea.setEditable(false);
171  panelDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
172  panelDescriptionTextArea.setColumns(20);
173  panelDescriptionTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
174  panelDescriptionTextArea.setLineWrap(true);
175  panelDescriptionTextArea.setRows(3);
176  panelDescriptionTextArea.setText(org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.panelDescriptionTextArea.text")); // NOI18N
177  panelDescriptionTextArea.setWrapStyleWord(true);
178  panelDescriptionTextArea.setFocusable(false);
179  panelDescriptionScrollPane.setViewportView(panelDescriptionTextArea);
180 
181  javax.swing.GroupLayout modifyTagTypesListPanelLayout = new javax.swing.GroupLayout(modifyTagTypesListPanel);
182  modifyTagTypesListPanel.setLayout(modifyTagTypesListPanelLayout);
183  modifyTagTypesListPanelLayout.setHorizontalGroup(
184  modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
185  .addGroup(modifyTagTypesListPanelLayout.createSequentialGroup()
186  .addContainerGap()
187  .addGroup(modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
188  .addComponent(tagTypesListLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
189  .addGroup(modifyTagTypesListPanelLayout.createSequentialGroup()
190  .addComponent(newTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
191  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
192  .addComponent(editTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
193  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
194  .addComponent(deleteTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
195  .addComponent(TagNameScrollPane)
196  .addComponent(panelDescriptionScrollPane))
197  .addContainerGap())
198  );
199 
200  modifyTagTypesListPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteTagNameButton, editTagNameButton, newTagNameButton});
201 
202  modifyTagTypesListPanelLayout.setVerticalGroup(
203  modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
204  .addGroup(modifyTagTypesListPanelLayout.createSequentialGroup()
205  .addGap(10, 10, 10)
206  .addComponent(panelDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
207  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
208  .addComponent(tagTypesListLabel)
209  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
210  .addComponent(TagNameScrollPane)
211  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
212  .addGroup(modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
213  .addComponent(newTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
214  .addComponent(editTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
215  .addComponent(deleteTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
216  .addContainerGap())
217  );
218 
219  modifyTagTypesListPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deleteTagNameButton, editTagNameButton, newTagNameButton});
220 
221  jSplitPane1.setLeftComponent(modifyTagTypesListPanel);
222 
223  org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.descriptionLabel.text")); // NOI18N
224 
225  descriptionTextArea.setEditable(false);
226  descriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
227  descriptionTextArea.setColumns(20);
228  descriptionTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
229  descriptionTextArea.setLineWrap(true);
230  descriptionTextArea.setRows(5);
231  descriptionTextArea.setWrapStyleWord(true);
232  descriptionTextArea.setFocusable(false);
233  descriptionScrollPane.setViewportView(descriptionTextArea);
234 
235  org.openide.awt.Mnemonics.setLocalizedText(isNotableLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.isNotableLabel.text")); // NOI18N
236 
237  org.openide.awt.Mnemonics.setLocalizedText(notableYesOrNoLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.notableYesOrNoLabel.text")); // NOI18N
238 
239  ingestRunningWarningLabel.setFont(ingestRunningWarningLabel.getFont().deriveFont(ingestRunningWarningLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
240  ingestRunningWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/filetypeid/warning16.png"))); // NOI18N
241  org.openide.awt.Mnemonics.setLocalizedText(ingestRunningWarningLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.ingestRunningWarningLabel.text")); // NOI18N
242 
243  javax.swing.GroupLayout tagTypesAdditionalPanelLayout = new javax.swing.GroupLayout(tagTypesAdditionalPanel);
244  tagTypesAdditionalPanel.setLayout(tagTypesAdditionalPanelLayout);
245  tagTypesAdditionalPanelLayout.setHorizontalGroup(
246  tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
247  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
248  .addContainerGap()
249  .addGroup(tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
250  .addComponent(descriptionScrollPane)
251  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
252  .addGroup(tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
253  .addComponent(descriptionLabel)
254  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
255  .addComponent(isNotableLabel)
256  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
257  .addComponent(notableYesOrNoLabel))
258  .addComponent(ingestRunningWarningLabel))
259  .addGap(0, 0, Short.MAX_VALUE)))
260  .addContainerGap())
261  );
262  tagTypesAdditionalPanelLayout.setVerticalGroup(
263  tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
264  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
265  .addContainerGap()
266  .addComponent(descriptionLabel)
267  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
268  .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
269  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
270  .addGroup(tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
271  .addComponent(isNotableLabel)
272  .addComponent(notableYesOrNoLabel))
273  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 311, Short.MAX_VALUE)
274  .addComponent(ingestRunningWarningLabel)
275  .addGap(31, 31, 31))
276  );
277 
278  jSplitPane1.setRightComponent(tagTypesAdditionalPanel);
279 
280  jScrollPane2.setViewportView(jSplitPane1);
281 
282  javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
283  jPanel1.setLayout(jPanel1Layout);
284  jPanel1Layout.setHorizontalGroup(
285  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
286  .addGroup(jPanel1Layout.createSequentialGroup()
287  .addGap(0, 0, 0)
288  .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
289  .addGap(0, 0, 0))
290  );
291  jPanel1Layout.setVerticalGroup(
292  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293  .addGroup(jPanel1Layout.createSequentialGroup()
294  .addGap(0, 0, 0)
295  .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
296  .addGap(0, 0, 0))
297  );
298 
299  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
300  this.setLayout(layout);
301  layout.setHorizontalGroup(
302  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
303  .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
304  );
305  layout.setVerticalGroup(
306  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
307  .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
308  );
309  }// </editor-fold>//GEN-END:initComponents
310 
311  @Messages({"TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message=Tag name must be unique. A tag with this name already exists.",
312  "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title=Duplicate Tag Name"})
313 
314  private void newTagNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTagNameButtonActionPerformed
315  TagNameDialog dialog = new TagNameDialog();
316  TagNameDialog.BUTTON_PRESSED result = dialog.getResult();
317  if (result == TagNameDialog.BUTTON_PRESSED.OK) {
318  TskData.FileKnown status = dialog.isTagNotable() ? TskData.FileKnown.BAD : TskData.FileKnown.UNKNOWN;
319  TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status);
320  /*
321  * If tag name already exists, don't add the tag name.
322  */
323  if (!tagTypes.contains(newTagType)) {
324  tagTypes.add(newTagType);
325  updateTagNamesListModel();
326  tagNamesList.setSelectedValue(newTagType, true);
327  updatePanel();
328  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
329  } else {
330  JOptionPane.showMessageDialog(this,
331  NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message"),
332  NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title"),
333  JOptionPane.INFORMATION_MESSAGE);
334  }
335  }
336  }//GEN-LAST:event_newTagNameButtonActionPerformed
337 
338  private void deleteTagNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteTagNameButtonActionPerformed
339  TagNameDefinition tagName = tagNamesList.getSelectedValue();
340  tagTypes.remove(tagName);
341  updateTagNamesListModel();
342  updatePanel();
343  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
344 
345  }//GEN-LAST:event_deleteTagNameButtonActionPerformed
346 
347  private void editTagNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editTagNameButtonActionPerformed
348  TagNameDefinition originalTagName = tagNamesList.getSelectedValue();
349  TagNameDialog dialog = new TagNameDialog(originalTagName);
350  TagNameDialog.BUTTON_PRESSED result = dialog.getResult();
351  if (result == TagNameDialog.BUTTON_PRESSED.OK) {
352  TskData.FileKnown status = dialog.isTagNotable() ? TskData.FileKnown.BAD : TskData.FileKnown.UNKNOWN;
353  TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status);
354  /*
355  * If tag name already exists, don't add the tag name.
356  */
357  tagTypes.remove(originalTagName);
358  tagTypes.add(newTagType);
359  updateTagNamesListModel();
360  tagNamesList.setSelectedValue(newTagType, true);
361  updatePanel();
362  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
363  if (originalTagName.getKnownStatus() != newTagType.getKnownStatus() && Case.isCaseOpen()) {
364  updatedStatusTags.add(newTagType.getDisplayName());
365  }
366  }
367  }//GEN-LAST:event_editTagNameButtonActionPerformed
368 
369  // Variables declaration - do not modify//GEN-BEGIN:variables
370  private javax.swing.JScrollPane TagNameScrollPane;
371  private javax.swing.JButton deleteTagNameButton;
372  private javax.swing.JLabel descriptionLabel;
373  private javax.swing.JScrollPane descriptionScrollPane;
374  private javax.swing.JTextArea descriptionTextArea;
375  private javax.swing.JButton editTagNameButton;
376  private javax.swing.JLabel ingestRunningWarningLabel;
377  private javax.swing.JLabel isNotableLabel;
378  private javax.swing.JPanel jPanel1;
379  private javax.swing.JScrollPane jScrollPane2;
380  private javax.swing.JSplitPane jSplitPane1;
381  private javax.swing.JPanel modifyTagTypesListPanel;
382  private javax.swing.JButton newTagNameButton;
383  private javax.swing.JLabel notableYesOrNoLabel;
384  private javax.swing.JScrollPane panelDescriptionScrollPane;
385  private javax.swing.JTextArea panelDescriptionTextArea;
386  private javax.swing.JList<org.sleuthkit.autopsy.casemodule.services.TagNameDefinition> tagNamesList;
387  private javax.swing.JPanel tagTypesAdditionalPanel;
388  private javax.swing.JLabel tagTypesListLabel;
389  // End of variables declaration//GEN-END:variables
390 
394  private void updateTagNamesListModel() {
395  tagTypesListModel.clear();
396  for (TagNameDefinition tagName : tagTypes) {
397  tagTypesListModel.addElement(tagName);
398  }
399  }
400 
404  @Override
405  public void load() {
406  tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions());
407  updateTagNamesListModel();
408  updatePanel();
409  }
410 
414  @Override
415  public void store() {
416  TagNameDefinition.setTagNameDefinitions(tagTypes);
417  sendStatusChangedEvents();
418  }
419 
420  void cancelChanges() {
421  updatedStatusTags.clear();
422  }
423 
424  private void sendStatusChangedEvents() {
425  for (String modifiedTagDisplayName : updatedStatusTags) {
426  //if user closes their case after options have been changed but before application of them is complete don't notify
427  try {
428  Case.getOpenCase().notifyTagDefinitionChanged(modifiedTagDisplayName);
429  } catch (NoCurrentCaseException ex) {
430  Logger.getLogger(TagOptionsPanel.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex); //NON-NLS
431  }
432  }
433  updatedStatusTags.clear();
434  }
435 
440  private void updatePanel() {
441  boolean ingestIsRunning = IngestManager.getInstance().isIngestRunning();
442  /*
443  * Only enable the delete button when there is a tag type selected in
444  * the tag types JList.
445  */
446  ingestRunningWarningLabel.setVisible(ingestIsRunning);
447  boolean isSelected = tagNamesList.getSelectedIndex() != -1;
448  boolean enableEdit = !ingestIsRunning && isSelected;
449  editTagNameButton.setEnabled(enableEdit);
450  boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName());
451  deleteTagNameButton.setEnabled(enableDelete);
452  if (isSelected) {
453  descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription());
454  if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) {
455  notableYesOrNoLabel.setText("Yes");
456  } else {
457  notableYesOrNoLabel.setText("No");
458  }
459  } else {
460  descriptionTextArea.setText("");
461  notableYesOrNoLabel.setText("");
462  }
463  }
464 
468  @Override
469  @SuppressWarnings("FinalizeDeclaration")
470  protected void finalize() throws Throwable {
471  IngestManager.getInstance().removeIngestJobEventListener(ingestJobEventsListener);
472  super.finalize();
473  }
474 
478  private class IngestJobEventPropertyChangeListener implements PropertyChangeListener {
479 
480  @Override
481  public void propertyChange(PropertyChangeEvent evt) {
482  EventQueue.invokeLater(new Runnable() {
483  @Override
484  public void run() {
485  updatePanel();
486  }
487  });
488  }
489  }
490 }

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.