Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
GroupListPanel.java
Go to the documentation of this file.
1/*
2 * Autopsy
3 *
4 * Copyright 2019 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 */
19package org.sleuthkit.autopsy.discovery.ui;
20
21import org.sleuthkit.autopsy.discovery.search.AbstractFilter;
22import com.google.common.eventbus.Subscribe;
23import java.awt.Cursor;
24import java.awt.Graphics2D;
25import java.awt.font.FontRenderContext;
26import java.util.List;
27import java.util.Map;
28import javax.swing.DefaultListCellRenderer;
29import javax.swing.DefaultListModel;
30import javax.swing.JList;
31import javax.swing.JOptionPane;
32import javax.swing.SwingUtilities;
33import org.openide.util.NbBundle.Messages;
34import org.sleuthkit.autopsy.coreutils.ThreadConfined;
35import org.sleuthkit.autopsy.discovery.search.DiscoveryAttributes;
36import org.sleuthkit.autopsy.discovery.search.DiscoveryEventUtils;
37import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.GroupKey;
38import org.sleuthkit.autopsy.discovery.search.Group;
39import org.sleuthkit.autopsy.discovery.search.ResultsSorter;
40import org.sleuthkit.autopsy.discovery.search.SearchData.Type;
41import static org.sleuthkit.autopsy.discovery.search.SearchData.Type.DOMAIN;
42
46final class GroupListPanel extends javax.swing.JPanel {
47
48 private static final long serialVersionUID = 1L;
49 private Type type = null;
50 private Map<GroupKey, Integer> groupMap = null;
51 private List<AbstractFilter> searchfilters;
52 private DiscoveryAttributes.AttributeType groupingAttribute;
53 private Group.GroupSortingAlgorithm groupSort;
54 private ResultsSorter.SortingMethod resultSortMethod;
55 private GroupKey selectedGroupKey;
56
60 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
61 GroupListPanel() {
62 initComponents();
63 }
64
70 @Subscribe
71 void handleSearchStartedEvent(DiscoveryEventUtils.SearchStartedEvent searchStartedEvent) {
72 type = searchStartedEvent.getType();
73 groupKeyList.setListData(new GroupKey[0]);
74 }
75
76 @Messages({"GroupsListPanel.noFileResults.message.text=No files were found for the selected filters.\n\n"
77 + "Reminder:\n"
78 + " -The File Type Identification module must be run on each data source you want to find results in.\n"
79 + " -The Hash Lookup module must be run on each data source if you want to filter by past occurrence.\n"
80 + " -The Picture Analyzer module must be run on each data source if you are filtering by User Created content.",
81 "GroupsListPanel.noDomainResults.message.text=No domains were found for the selected filters.\n\n"
82 + "Reminder:\n"
83 + " -The Recent Activity module must be run on each data source you want to find results in.\n"
84 + " -The Central Repository module must be run on each data source if you want to filter or sort by past occurrences.\n"
85 + " -The iOS Analyzer (iLEAPP) module must be run on each data source which contains data from an iOS device.\n",
86 "GroupsListPanel.noResults.title.text=No results found"})
93 @Subscribe
94 void handleSearchCompleteEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompleteEvent) {
95 groupMap = searchCompleteEvent.getGroupMap();
96 searchfilters = searchCompleteEvent.getFilters();
97 groupingAttribute = searchCompleteEvent.getGroupingAttr();
98 groupSort = searchCompleteEvent.getGroupSort();
99 resultSortMethod = searchCompleteEvent.getResultSort();
100 groupKeyList.setListData(groupMap.keySet().toArray(new GroupKey[groupMap.keySet().size()]));
101 SwingUtilities.invokeLater(() -> {
102 if (groupKeyList.getModel().getSize() > 0) {
103 groupKeyList.setSelectedIndex(0);
104 } else if (type == DOMAIN) {
105 JOptionPane.showMessageDialog(DiscoveryTopComponent.getTopComponent(),
106 Bundle.GroupsListPanel_noDomainResults_message_text(),
107 Bundle.GroupsListPanel_noResults_title_text(),
108 JOptionPane.PLAIN_MESSAGE);
109 } else {
110 JOptionPane.showMessageDialog(DiscoveryTopComponent.getTopComponent(),
111 Bundle.GroupsListPanel_noFileResults_message_text(),
112 Bundle.GroupsListPanel_noResults_title_text(),
113 JOptionPane.PLAIN_MESSAGE);
114 }
115 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
116 });
117 }
118
124 @Subscribe
125 void handleSearchCancelledEvent(DiscoveryEventUtils.SearchCancelledEvent searchCancelledEvent) {
126 SwingUtilities.invokeLater(() -> {
127 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
128 });
129 }
130
136 @SuppressWarnings("unchecked")
137 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
138 private void initComponents() {
139
140 javax.swing.JScrollPane groupListScrollPane = new javax.swing.JScrollPane();
141 groupKeyList = new javax.swing.JList<>();
142
143 groupKeyList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(GroupListPanel.class, "GroupListPanel.groupKeyList.border.title"))); // NOI18N
144 groupKeyList.setModel(new DefaultListModel<GroupKey>());
145 groupKeyList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
146 groupKeyList.setCellRenderer(new GroupListRenderer());
147 groupKeyList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
148 public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
149 groupSelected(evt);
150 }
151 });
152 groupListScrollPane.setViewportView(groupKeyList);
153
154 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
155 this.setLayout(layout);
156 layout.setHorizontalGroup(
157 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
158 .addGap(0, 144, Short.MAX_VALUE)
159 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
160 .addComponent(groupListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE))
161 );
162 layout.setVerticalGroup(
163 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
164 .addGap(0, 300, Short.MAX_VALUE)
165 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
166 .addComponent(groupListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE))
167 );
168 }// </editor-fold>//GEN-END:initComponents
169
174 void resetGroupList() {
175 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
176 groupKeyList.setListData(new GroupKey[0]);
177 }
178
184 private void groupSelected(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_groupSelected
185 if (!evt.getValueIsAdjusting()) {
186 if (groupKeyList.getSelectedValue() != null) {
187 GroupKey selectedGroup = groupKeyList.getSelectedValue();
188 for (GroupKey groupKey : groupMap.keySet()) {
189 if (selectedGroup.equals(groupKey)) {
190 selectedGroupKey = groupKey;
192 searchfilters, groupingAttribute, groupSort, resultSortMethod, selectedGroupKey, groupMap.get(selectedGroupKey), type));
193 break;
194 }
195 }
196 } else {
198
199 }
200 }
201 }//GEN-LAST:event_groupSelected
202
203 // Variables declaration - do not modify//GEN-BEGIN:variables
204 private javax.swing.JList<GroupKey> groupKeyList;
205 // End of variables declaration//GEN-END:variables
206
211 private class GroupListRenderer extends DefaultListCellRenderer {
212
213 private static final long serialVersionUID = 1L;
214
216 @Override
217 public java.awt.Component getListCellRendererComponent(
218 JList<?> list,
219 Object value,
220 int index,
221 boolean isSelected,
222 boolean cellHasFocus) {
223 Object newValue = value;
224 if (newValue instanceof GroupKey) {
225 String valueString = newValue.toString();
226 setToolTipText(valueString);
227 valueString += " (" + groupMap.get(newValue) + ")";
228
229 if (groupingAttribute instanceof DiscoveryAttributes.ParentPathAttribute) {
230 // Using the list FontRenderContext instead of this because
231 // the label RenderContext was sometimes null, but this should work.
232 FontRenderContext context = ((Graphics2D) list.getGraphics()).getFontRenderContext();
233
234 //Determine the width of the string with the given font.
235 double stringWidth = getFont().getStringBounds(valueString, context).getWidth();
236 // subtracting 10 from the width as a littl inset.
237 int listWidth = list.getWidth() - 10;
238
239 if (stringWidth > listWidth) {
240 double avgCharWidth = Math.floor(stringWidth / valueString.length());
241
242 // The extra 5 is to account for the " ... " that is being added back.
243 int charToRemove = (int) Math.ceil((stringWidth - listWidth) / avgCharWidth) + 5;
244 int charactersToShow = (int) Math.ceil((valueString.length() - charToRemove) / 2);
245 valueString = valueString.substring(0, charactersToShow) + " ... " + valueString.substring(valueString.length() - charactersToShow);
246 }
247 }
248 newValue = valueString;
249 }
250 super.getListCellRendererComponent(list, newValue, index, isSelected, cellHasFocus);
251 return this;
252 }
253 }
254
255}
java.awt.Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.