Autopsy  4.5.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-2016 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 javax.swing.DefaultListModel;
28 import javax.swing.JOptionPane;
29 import javax.swing.event.ListSelectionEvent;
30 import org.netbeans.spi.options.OptionsPanelController;
31 import org.openide.util.NbBundle;
32 import org.openide.util.NbBundle.Messages;
36 import org.sleuthkit.datamodel.TagName;
37 import org.sleuthkit.datamodel.TskData;
38 
42 final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
43 
44  private static final long serialVersionUID = 1L;
45  private static final TagName.HTML_COLOR DEFAULT_COLOR = TagName.HTML_COLOR.NONE;
46  private final DefaultListModel<TagNameDefinition> tagTypesListModel;
47  private Set<TagNameDefinition> tagTypes;
48  private IngestJobEventPropertyChangeListener ingestJobEventsListener;
49  private Set<String> updatedStatusTags;
50 
54  TagOptionsPanel() {
55  tagTypesListModel = new DefaultListModel<>();
56  tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions());
57  updatedStatusTags = new HashSet<>();
58  initComponents();
59  customizeComponents();
60  }
61 
62  @Messages({"TagOptionsPanel.panelDescriptionTextArea.text=Create and manage tags. "
63  + "Tags can be applied to files and results in the case. Notable tags will cause "
64  + "items tagged with them to be flagged as notable when using a central repository. "
65  + "Changing the status of a tag will only effect items in the current case.",
66  "TagOptionsPanel.ingestRunningWarningLabel.text=Cannot make changes to existing tags when ingest is running!",
67  "TagOptionsPanel.descriptionLabel.text=Tag Description:",
68  "TagOptionsPanel.notableYesOrNoLabel.text=",
69  "TagOptionsPanel.isNotableLabel.text=Tag indicates item is notable: ",
70  "TagOptionsPanel.editTagNameButton.text=Edit Tag"})
71 
72  private void customizeComponents() {
73  tagNamesList.setModel(tagTypesListModel);
74  tagNamesList.addListSelectionListener((ListSelectionEvent event) -> {
75  updatePanel();
76  });
77  addIngestJobEventsListener();
78  }
79 
86  private void addIngestJobEventsListener() {
87  ingestJobEventsListener = new IngestJobEventPropertyChangeListener();
88  IngestManager.getInstance().addIngestJobEventListener(ingestJobEventsListener);
89  }
90 
96  @SuppressWarnings("unchecked")
97  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
98  private void initComponents() {
99 
100  jPanel1 = new javax.swing.JPanel();
101  jScrollPane2 = new javax.swing.JScrollPane();
102  jSplitPane1 = new javax.swing.JSplitPane();
103  modifyTagTypesListPanel = new javax.swing.JPanel();
104  tagTypesListLabel = new javax.swing.JLabel();
105  TagNameScrollPane = new javax.swing.JScrollPane();
106  tagNamesList = new javax.swing.JList<>();
107  newTagNameButton = new javax.swing.JButton();
108  deleteTagNameButton = new javax.swing.JButton();
109  editTagNameButton = new javax.swing.JButton();
110  panelDescriptionScrollPane = new javax.swing.JScrollPane();
111  panelDescriptionTextArea = new javax.swing.JTextArea();
112  tagTypesAdditionalPanel = new javax.swing.JPanel();
113  descriptionLabel = new javax.swing.JLabel();
114  descriptionScrollPane = new javax.swing.JScrollPane();
115  descriptionTextArea = new javax.swing.JTextArea();
116  isNotableLabel = new javax.swing.JLabel();
117  notableYesOrNoLabel = new javax.swing.JLabel();
118  ingestRunningWarningLabel = new javax.swing.JLabel();
119 
120  jPanel1.setPreferredSize(new java.awt.Dimension(750, 490));
121 
122  jScrollPane2.setPreferredSize(new java.awt.Dimension(750, 490));
123 
124  jSplitPane1.setDividerLocation(365);
125  jSplitPane1.setDividerSize(1);
126  jSplitPane1.setPreferredSize(new java.awt.Dimension(748, 488));
127 
128  org.openide.awt.Mnemonics.setLocalizedText(tagTypesListLabel, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.tagTypesListLabel.text")); // NOI18N
129 
130  tagNamesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
131  TagNameScrollPane.setViewportView(tagNamesList);
132 
133  newTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add-tag.png"))); // NOI18N
134  org.openide.awt.Mnemonics.setLocalizedText(newTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.newTagNameButton.text")); // NOI18N
135  newTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
136  newTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
137  newTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
138  newTagNameButton.addActionListener(new java.awt.event.ActionListener() {
139  public void actionPerformed(java.awt.event.ActionEvent evt) {
140  newTagNameButtonActionPerformed(evt);
141  }
142  });
143 
144  deleteTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete-tag.png"))); // NOI18N
145  org.openide.awt.Mnemonics.setLocalizedText(deleteTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.deleteTagNameButton.text")); // NOI18N
146  deleteTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
147  deleteTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
148  deleteTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
149  deleteTagNameButton.addActionListener(new java.awt.event.ActionListener() {
150  public void actionPerformed(java.awt.event.ActionEvent evt) {
151  deleteTagNameButtonActionPerformed(evt);
152  }
153  });
154 
155  editTagNameButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit-tag.png"))); // NOI18N
156  org.openide.awt.Mnemonics.setLocalizedText(editTagNameButton, org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.editTagNameButton.text")); // NOI18N
157  editTagNameButton.setMaximumSize(new java.awt.Dimension(111, 25));
158  editTagNameButton.setMinimumSize(new java.awt.Dimension(111, 25));
159  editTagNameButton.setPreferredSize(new java.awt.Dimension(111, 25));
160  editTagNameButton.addActionListener(new java.awt.event.ActionListener() {
161  public void actionPerformed(java.awt.event.ActionEvent evt) {
162  editTagNameButtonActionPerformed(evt);
163  }
164  });
165 
166  panelDescriptionTextArea.setEditable(false);
167  panelDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
168  panelDescriptionTextArea.setColumns(20);
169  panelDescriptionTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
170  panelDescriptionTextArea.setLineWrap(true);
171  panelDescriptionTextArea.setRows(3);
172  panelDescriptionTextArea.setText(org.openide.util.NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.panelDescriptionTextArea.text")); // NOI18N
173  panelDescriptionTextArea.setWrapStyleWord(true);
174  panelDescriptionTextArea.setFocusable(false);
175  panelDescriptionScrollPane.setViewportView(panelDescriptionTextArea);
176 
177  javax.swing.GroupLayout modifyTagTypesListPanelLayout = new javax.swing.GroupLayout(modifyTagTypesListPanel);
178  modifyTagTypesListPanel.setLayout(modifyTagTypesListPanelLayout);
179  modifyTagTypesListPanelLayout.setHorizontalGroup(
180  modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
181  .addGroup(modifyTagTypesListPanelLayout.createSequentialGroup()
182  .addContainerGap()
183  .addGroup(modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
184  .addComponent(tagTypesListLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
185  .addGroup(modifyTagTypesListPanelLayout.createSequentialGroup()
186  .addGroup(modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
187  .addGroup(modifyTagTypesListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
188  .addComponent(TagNameScrollPane, javax.swing.GroupLayout.Alignment.LEADING)
189  .addGroup(javax.swing.GroupLayout.Alignment.LEADING, modifyTagTypesListPanelLayout.createSequentialGroup()
190  .addComponent(newTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
191  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
192  .addComponent(editTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
193  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
194  .addComponent(deleteTagNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
195  .addComponent(panelDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 345, javax.swing.GroupLayout.PREFERRED_SIZE))
196  .addGap(0, 0, Short.MAX_VALUE)))
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, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE)
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, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE)
251  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
252  .addGroup(tagTypesAdditionalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
253  .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
254  .addGroup(tagTypesAdditionalPanelLayout.createSequentialGroup()
255  .addComponent(isNotableLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
256  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
257  .addComponent(notableYesOrNoLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
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, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
272  .addComponent(notableYesOrNoLabel))
273  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 304, 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(null,
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  if (Case.isCaseOpen()) {
428  Case.getCurrentCase().notifyTagDefinitionChanged(modifiedTagDisplayName);
429  }
430  }
431  updatedStatusTags.clear();
432  }
433 
438  private void updatePanel() {
439  boolean ingestIsRunning = IngestManager.getInstance().isIngestRunning();
440  /*
441  * Only enable the delete button when there is a tag type selected in
442  * the tag types JList.
443  */
444  ingestRunningWarningLabel.setVisible(ingestIsRunning);
445  boolean isSelected = tagNamesList.getSelectedIndex() != -1;
446  boolean enableEdit = !ingestIsRunning && isSelected;
447  editTagNameButton.setEnabled(enableEdit);
448  boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName());
449  deleteTagNameButton.setEnabled(enableDelete);
450  if (isSelected) {
451  descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription());
452  if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) {
453  notableYesOrNoLabel.setText("Yes");
454  } else {
455  notableYesOrNoLabel.setText("No");
456  }
457  } else {
458  descriptionTextArea.setText("");
459  notableYesOrNoLabel.setText("");
460  }
461  }
462 
466  @Override
467  @SuppressWarnings("FinalizeDeclaration")
468  protected void finalize() throws Throwable {
469  IngestManager.getInstance().removeIngestJobEventListener(ingestJobEventsListener);
470  super.finalize();
471  }
472 
476  private class IngestJobEventPropertyChangeListener implements PropertyChangeListener {
477 
478  @Override
479  public void propertyChange(PropertyChangeEvent evt) {
480  EventQueue.invokeLater(new Runnable() {
481  @Override
482  public void run() {
483  updatePanel();
484  }
485  });
486  }
487  }
488 }

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