19 package org.sleuthkit.autopsy.actions;
21 import java.awt.Cursor;
22 import java.awt.Window;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.KeyEvent;
25 import java.util.ArrayList;
26 import java.util.List;
28 import java.util.TreeMap;
29 import java.util.concurrent.ExecutionException;
30 import java.util.logging.Level;
31 import javax.swing.AbstractAction;
32 import javax.swing.ActionMap;
33 import javax.swing.InputMap;
34 import javax.swing.JComponent;
35 import javax.swing.JDialog;
36 import javax.swing.JOptionPane;
37 import javax.swing.KeyStroke;
38 import javax.swing.SwingWorker;
39 import javax.swing.table.AbstractTableModel;
40 import org.openide.util.ImageUtilities;
41 import org.openide.util.NbBundle;
42 import org.openide.util.NbBundle.Messages;
43 import org.openide.windows.WindowManager;
55 @Messages({
"GetTagNameDialog.descriptionLabel.text=Description:",
56 "GetTagNameDialog.notableCheckbox.text=Tag indicates item is notable."})
57 @SuppressWarnings(
"PMD.SingularField")
60 private static final long serialVersionUID = 1L;
61 private static final String TAG_ICON_PATH =
"org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png";
62 private final Map<String, TagName> tagNamesMap =
new TreeMap<>();
74 return doDialog(WindowManager.getDefault().getMainWindow());
96 ModalityType.APPLICATION_MODAL);
100 setIconImage(ImageUtilities.loadImage(TAG_ICON_PATH));
104 String cancelName = NbBundle.getMessage(this.getClass(),
"GetTagNameDialog.cancelName");
105 InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
106 inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelName);
107 ActionMap actionMap = getRootPane().getActionMap();
108 actionMap.put(cancelName,
new AbstractAction() {
109 private static final long serialVersionUID = 1L;
112 public void actionPerformed(ActionEvent e) {
113 cancelButtonActionPerformed(e);
127 tagsTable.setModel(
new TagsTableModel(
new ArrayList<>(tagNamesMap.keySet())));
128 tagsTable.setTableHeader(null);
129 tagsTable.setCellSelectionEnabled(
false);
130 tagsTable.setFocusable(
false);
131 tagsTable.setRowHeight(tagsTable.getRowHeight() + 5);
134 this.setLocationRelativeTo(this.getOwner());
140 private static final long serialVersionUID = 1L;
141 private final ArrayList<String> tagDisplayNames =
new ArrayList<>();
144 for (String tagDisplayName : tagDisplayNames) {
145 this.tagDisplayNames.add(tagDisplayName);
151 return tagDisplayNames.size();
166 return tagDisplayNames.get(rowIndex);
182 this.description = description;
183 this.status = status;
197 }
catch (ExecutionException | InterruptedException ex) {
198 Logger.
getLogger(AddTagAction.class.getName()).log(Level.SEVERE,
"Error adding " + name +
" tag name", ex);
201 "GetTagNameDialog.unableToAddTagNameToCase.msg",
203 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.taggingErr"),
204 JOptionPane.ERROR_MESSAGE);
208 okButton.setEnabled(
true);
209 cancelButton.setEnabled(
true);
210 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
218 @SuppressWarnings(
"unchecked")
220 private
void initComponents() {
222 cancelButton =
new javax.swing.JButton();
223 okButton =
new javax.swing.JButton();
224 jScrollPane1 =
new javax.swing.JScrollPane();
225 tagsTable =
new javax.swing.JTable();
226 preexistingLabel =
new javax.swing.JLabel();
227 newTagPanel =
new javax.swing.JPanel();
228 tagNameLabel =
new javax.swing.JLabel();
229 tagNameField =
new javax.swing.JTextField();
230 descriptionLabel =
new javax.swing.JLabel();
231 descriptionScrollPane =
new javax.swing.JScrollPane();
232 descriptionTextArea =
new javax.swing.JTextArea();
233 notableCheckbox =
new javax.swing.JCheckBox();
235 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
236 addKeyListener(
new java.awt.event.KeyAdapter() {
237 public void keyReleased(java.awt.event.KeyEvent evt) {
238 formKeyReleased(evt);
242 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.cancelButton.text"));
243 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
244 public void actionPerformed(java.awt.event.ActionEvent evt) {
245 cancelButtonActionPerformed(evt);
249 org.openide.awt.Mnemonics.setLocalizedText(okButton,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.okButton.text"));
250 okButton.addActionListener(
new java.awt.event.ActionListener() {
251 public void actionPerformed(java.awt.event.ActionEvent evt) {
252 okButtonActionPerformed(evt);
256 jScrollPane1.setBackground(
new java.awt.Color(255, 255, 255));
258 tagsTable.setBackground(
new java.awt.Color(240, 240, 240));
259 tagsTable.setModel(
new javax.swing.table.DefaultTableModel(
267 tagsTable.setOpaque(
false);
268 tagsTable.setShowHorizontalLines(
false);
269 tagsTable.setShowVerticalLines(
false);
270 tagsTable.setTableHeader(null);
271 jScrollPane1.setViewportView(tagsTable);
273 org.openide.awt.Mnemonics.setLocalizedText(preexistingLabel,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.preexistingLabel.text"));
275 newTagPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.newTagPanel.border.title")));
277 org.openide.awt.Mnemonics.setLocalizedText(tagNameLabel,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.tagNameLabel.text"));
279 tagNameField.setText(
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.tagNameField.text"));
280 tagNameField.addKeyListener(
new java.awt.event.KeyAdapter() {
281 public void keyReleased(java.awt.event.KeyEvent evt) {
282 tagNameFieldKeyReleased(evt);
286 org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.descriptionLabel.text"));
288 descriptionTextArea.setColumns(20);
289 descriptionTextArea.setRows(3);
290 descriptionScrollPane.setViewportView(descriptionTextArea);
292 org.openide.awt.Mnemonics.setLocalizedText(notableCheckbox,
org.openide.util.NbBundle.getMessage(
GetTagNameDialog.class,
"GetTagNameDialog.notableCheckbox.text"));
294 javax.swing.GroupLayout newTagPanelLayout =
new javax.swing.GroupLayout(newTagPanel);
295 newTagPanel.setLayout(newTagPanelLayout);
296 newTagPanelLayout.setHorizontalGroup(
297 newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
298 .addGroup(newTagPanelLayout.createSequentialGroup()
300 .addGroup(newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
301 .addComponent(descriptionScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
302 .addComponent(tagNameField, javax.swing.GroupLayout.DEFAULT_SIZE, 323, Short.MAX_VALUE)
303 .addGroup(newTagPanelLayout.createSequentialGroup()
304 .addGroup(newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
305 .addComponent(notableCheckbox)
306 .addComponent(descriptionLabel)
307 .addComponent(tagNameLabel))
308 .addGap(0, 0, Short.MAX_VALUE)))
311 newTagPanelLayout.setVerticalGroup(
312 newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
313 .addGroup(newTagPanelLayout.createSequentialGroup()
315 .addComponent(tagNameLabel)
316 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
317 .addComponent(tagNameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
318 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
319 .addComponent(descriptionLabel)
320 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
321 .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE)
322 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
323 .addComponent(notableCheckbox)
324 .addContainerGap(31, Short.MAX_VALUE))
327 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
328 getContentPane().setLayout(layout);
329 layout.setHorizontalGroup(
330 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
331 .addGroup(layout.createSequentialGroup()
333 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
334 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
335 .addComponent(preexistingLabel))
336 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
337 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
338 .addGroup(layout.createSequentialGroup()
339 .addGap(0, 233, Short.MAX_VALUE)
340 .addComponent(okButton)
341 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
342 .addComponent(cancelButton))
343 .addComponent(newTagPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
346 layout.setVerticalGroup(
347 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
348 .addGroup(layout.createSequentialGroup()
350 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
351 .addGroup(layout.createSequentialGroup()
352 .addComponent(preexistingLabel)
353 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
354 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
355 .addComponent(newTagPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
356 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
357 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
358 .addComponent(cancelButton)
359 .addComponent(okButton))
371 @NbBundle.Messages({
"GetTagNameDialog.tagNameAlreadyExists.message=Tag name must be unique. A tag with this name already exists.",
372 "GetTagNameDialog.tagNameAlreadyExists.title=Duplicate Tag Name",
373 "GetTagNameDialog.tagDescriptionIllegalCharacters.message=Tag descriptions may not contain commas (,) or semicolons (;)",
374 "GetTagNameDialog.tagDescriptionIllegalCharacters.title=Invalid character in tag description"})
376 String tagDisplayName = tagNameField.getText();
377 String userTagDescription = descriptionTextArea.getText();
379 if (tagDisplayName.isEmpty()) {
380 JOptionPane.showMessageDialog(
this,
381 NbBundle.getMessage(
this.getClass(),
382 "GetTagNameDialog.mustSupplyTtagName.msg"),
383 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.tagNameErr"),
384 JOptionPane.ERROR_MESSAGE);
386 JOptionPane.showMessageDialog(
this,
387 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.illegalChars.msg"),
388 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.illegalCharsErr"),
389 JOptionPane.ERROR_MESSAGE);
390 }
else if (userTagDescription.contains(
",")
391 || userTagDescription.contains(
";")) {
392 JOptionPane.showMessageDialog(
this,
393 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.tagDescriptionIllegalCharacters.message"),
394 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.tagDescriptionIllegalCharacters.title"),
395 JOptionPane.ERROR_MESSAGE);
397 tagName = tagNamesMap.get(tagDisplayName);
399 if (tagName == null) {
401 okButton.setEnabled(
false);
402 cancelButton.setEnabled(
false);
403 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
407 JOptionPane.showMessageDialog(
this,
408 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.tagNameAlreadyExists.message"),
409 NbBundle.getMessage(
this.getClass(),
"GetTagNameDialog.tagNameAlreadyExists.title"),
410 JOptionPane.INFORMATION_MESSAGE);
416 if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
417 okButtonActionPerformed(null);
422 if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
423 okButtonActionPerformed(null);
javax.swing.JLabel preexistingLabel
void tagNameFieldKeyReleased(java.awt.event.KeyEvent evt)
javax.swing.JButton cancelButton
javax.swing.JScrollPane jScrollPane1
javax.swing.JTable tagsTable
void okButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JScrollPane descriptionScrollPane
javax.swing.JTextArea descriptionTextArea
javax.swing.JPanel newTagPanel
static TagName doDialog(Window owner)
TagsManager getTagsManager()
javax.swing.JLabel tagNameLabel
void formKeyReleased(java.awt.event.KeyEvent evt)
javax.swing.JButton okButton
final TagName.HTML_COLOR color
javax.swing.JLabel descriptionLabel
javax.swing.JTextField tagNameField
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
final TskData.TagType status
static TagName doDialog()
GetTagNameDialog(Window owner)
javax.swing.JCheckBox notableCheckbox
void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)