19 package org.sleuthkit.autopsy.report;
21 import java.awt.Component;
22 import java.awt.event.MouseAdapter;
23 import java.awt.event.MouseEvent;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.LinkedHashMap;
29 import java.util.List;
31 import java.util.logging.Level;
32 import javax.swing.JCheckBox;
33 import javax.swing.JLabel;
34 import javax.swing.JList;
35 import javax.swing.JOptionPane;
36 import javax.swing.ListCellRenderer;
37 import javax.swing.ListModel;
38 import javax.swing.event.ListDataListener;
39 import org.openide.util.NbBundle;
50 @SuppressWarnings(
"PMD.SingularField")
51 class PortableCaseTagsListPanel extends javax.swing.JPanel {
53 private List<TagName> tagNames;
54 private final Map<String, Boolean> tagNameSelections =
new LinkedHashMap<>();
55 private final TagNamesListModel tagsNamesListModel =
new TagNamesListModel();
56 private final TagsNamesListCellRenderer tagsNamesRenderer =
new TagsNamesListCellRenderer();
57 private final Map<String, Long> tagCounts =
new HashMap<>();
59 private final ReportWizardPortableCaseOptionsPanel wizPanel;
60 private final PortableCaseReportModule.PortableCaseOptions options;
65 PortableCaseTagsListPanel(ReportWizardPortableCaseOptionsPanel wizPanel, PortableCaseReportModule.PortableCaseOptions options) {
66 this.wizPanel = wizPanel;
67 this.options = options;
69 customizeComponents();
73 "PortableCaseTagsListPanel.error.errorTitle=Error getting tag names for case",
74 "PortableCaseTagsListPanel.error.noOpenCase=There is no case open",
75 "PortableCaseTagsListPanel.error.errorLoadingTags=Error loading tags",
77 private void customizeComponents() {
80 tagNames = Case.getCurrentCaseThrows().getServices().getTagsManager().getTagNamesInUse();
83 String query =
"tag_name_id, count(1) AS tag_count " +
85 "SELECT tag_name_id FROM content_tags UNION ALL SELECT tag_name_id FROM blackboard_artifact_tags" +
86 ") tag_ids GROUP BY tag_name_id";
87 GetTagCountsCallback callback =
new GetTagCountsCallback();
88 Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(query, callback);
89 Map<Long, Long> tagCountsByID = callback.getTagCountMap();
94 for (TagName tagName : tagNames) {
95 tagNameSelections.put(tagName.getDisplayName(), Boolean.FALSE);
96 if (tagCountsByID.containsKey(tagName.getId())) {
97 tagCounts.put(tagName.getDisplayName(), tagCountsByID.get(tagName.getId()));
99 tagCounts.put(tagName.getDisplayName(), 0L);
102 }
catch (TskCoreException ex) {
103 Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE,
"Failed to get tag names", ex);
104 JOptionPane.showMessageDialog(
this, Bundle.PortableCaseTagsListPanel_error_errorLoadingTags(), Bundle.PortableCaseTagsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
106 }
catch (NoCurrentCaseException ex) {
107 Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE,
"Exception while getting open case.", ex);
108 JOptionPane.showMessageDialog(
this, Bundle.PortableCaseTagsListPanel_error_noOpenCase(), Bundle.PortableCaseTagsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
115 tagNamesListBox.setModel(tagsNamesListModel);
116 tagNamesListBox.setCellRenderer(tagsNamesRenderer);
117 tagNamesListBox.setVisibleRowCount(-1);
118 tagNamesListBox.addMouseListener(
new MouseAdapter() {
120 public void mousePressed(MouseEvent evt) {
121 JList<?> list = (JList) evt.getSource();
122 int index = list.locationToIndex(evt.getPoint());
124 String value = tagsNamesListModel.getElementAt(index);
125 tagNameSelections.put(value, !tagNameSelections.get(value));
136 private void updateTagList() {
137 options.updateTagNames(getSelectedTagNames());
138 wizPanel.setFinish(options.isValid());
148 return tagNames.size();
153 return tagNames.get(index).getDisplayName();
171 private static final long serialVersionUID = 1L;
176 setEnabled(list.isEnabled());
177 setSelected(tagNameSelections.get(value));
178 setFont(list.getFont());
179 setBackground(list.getBackground());
180 setForeground(list.getForeground());
181 setText(value +
" (" + tagCounts.get(value) +
")");
193 private List<TagName> getSelectedTagNames() {
194 List<TagName> selectedTagNames =
new ArrayList<>();
195 for (TagName tagName : tagNames) {
196 if (tagNameSelections.get(tagName.getDisplayName())) {
197 selectedTagNames.add(tagName);
200 return selectedTagNames;
206 static class GetTagCountsCallback
implements CaseDbAccessManager.CaseDbAccessQueryCallback {
208 private static final Logger logger = Logger.getLogger(GetTagCountsCallback.class.getName());
209 private final Map<Long, Long> tagCounts =
new HashMap<>();
212 public void process(ResultSet rs) {
216 Long tagCount = rs.getLong(
"tag_count");
217 Long tagID = rs.getLong(
"tag_name_id");
219 tagCounts.put(tagID, tagCount);
221 }
catch (SQLException ex) {
222 logger.log(Level.WARNING,
"Unable to get data_source_obj_id or value from result set", ex);
225 }
catch (SQLException ex) {
226 logger.log(Level.WARNING,
"Failed to get next result for values by datasource", ex);
235 Map<Long, Long> getTagCountMap() {
245 @SuppressWarnings(
"unchecked")
247 private
void initComponents() {
249 jPanel1 =
new javax.swing.JPanel();
250 jScrollPane1 =
new javax.swing.JScrollPane();
251 tagNamesListBox =
new javax.swing.JList<>();
252 descLabel =
new javax.swing.JLabel();
253 selectButton =
new javax.swing.JButton();
254 deselectButton =
new javax.swing.JButton();
256 jScrollPane1.setViewportView(tagNamesListBox);
258 org.openide.awt.Mnemonics.setLocalizedText(descLabel,
org.openide.util.NbBundle.getMessage(PortableCaseTagsListPanel.class,
"PortableCaseTagsListPanel.descLabel.text"));
260 org.openide.awt.Mnemonics.setLocalizedText(selectButton,
org.openide.util.NbBundle.getMessage(PortableCaseTagsListPanel.class,
"PortableCaseTagsListPanel.selectButton.text"));
261 selectButton.setMaximumSize(
new java.awt.Dimension(87, 23));
262 selectButton.setMinimumSize(
new java.awt.Dimension(87, 23));
263 selectButton.addActionListener(
new java.awt.event.ActionListener() {
264 public void actionPerformed(java.awt.event.ActionEvent evt) {
265 selectButtonActionPerformed(evt);
269 org.openide.awt.Mnemonics.setLocalizedText(deselectButton,
org.openide.util.NbBundle.getMessage(PortableCaseTagsListPanel.class,
"PortableCaseTagsListPanel.deselectButton.text"));
270 deselectButton.addActionListener(
new java.awt.event.ActionListener() {
271 public void actionPerformed(java.awt.event.ActionEvent evt) {
272 deselectButtonActionPerformed(evt);
276 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
277 jPanel1.setLayout(jPanel1Layout);
278 jPanel1Layout.setHorizontalGroup(
279 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
280 .addGroup(jPanel1Layout.createSequentialGroup()
282 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
283 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE)
284 .addGroup(jPanel1Layout.createSequentialGroup()
285 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
286 .addComponent(descLabel)
287 .addGroup(jPanel1Layout.createSequentialGroup()
288 .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
289 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
290 .addComponent(deselectButton)))
291 .addGap(0, 0, Short.MAX_VALUE)))
294 jPanel1Layout.setVerticalGroup(
295 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
296 .addGroup(jPanel1Layout.createSequentialGroup()
298 .addComponent(descLabel)
299 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
300 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 178, Short.MAX_VALUE)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
302 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
303 .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
304 .addComponent(deselectButton)))
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)
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)
319 private void deselectButtonActionPerformed(java.awt.event.ActionEvent evt) {
320 for (TagName tagName : tagNames) {
321 tagNameSelections.put(tagName.getDisplayName(), Boolean.FALSE);
324 tagNamesListBox.repaint();
327 private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {
328 for (TagName tagName : tagNames) {
329 tagNameSelections.put(tagName.getDisplayName(), Boolean.TRUE);
332 tagNamesListBox.repaint();
337 private javax.swing.JLabel descLabel;
338 private javax.swing.JButton deselectButton;
339 private javax.swing.JPanel jPanel1;
340 private javax.swing.JScrollPane jScrollPane1;
341 private javax.swing.JButton selectButton;
342 private javax.swing.JList<String> tagNamesListBox;