Autopsy  4.13.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
ImageThumbnailPanel.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  */
19 package org.sleuthkit.autopsy.filequery;
20 
21 import java.awt.Color;
22 import java.awt.Component;
23 import java.awt.Dimension;
24 import java.awt.Point;
25 import java.awt.event.MouseEvent;
26 import javax.swing.ImageIcon;
27 import javax.swing.JComponent;
28 import javax.swing.JList;
29 import javax.swing.ListCellRenderer;
30 import org.openide.util.ImageUtilities;
31 import org.openide.util.NbBundle;
32 
36 public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellRenderer<ImageThumbnailWrapper> {
37 
38  private static final long serialVersionUID = 1L;
39  private static final Color SELECTION_COLOR = new Color(0, 120, 215);
40  private static final int BYTE_UNIT_CONVERSION = 1000;
41  private static final int ICON_SIZE = 16;
42  private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png";
43  private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png";
44  private static final String DELETE_ICON_PATH = "/org/sleuthkit/autopsy/images/file-icon-deleted.png";
45  private static final ImageIcon INTERESTING_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH, false));
46  private static final ImageIcon NOTABLE_SCORE_ICON = new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH, false));
47  private static final ImageIcon DELETED_ICON = new ImageIcon(ImageUtilities.loadImage(DELETE_ICON_PATH, false));
48 
54  }
55 
61  @SuppressWarnings("unchecked")
62  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
63  private void initComponents() {
64 
65  javax.swing.JPanel thumbnailPanel = new javax.swing.JPanel();
66  thumbnailLabel = new javax.swing.JLabel();
67  fileSizeLabel = new javax.swing.JLabel();
68  countLabel = new javax.swing.JLabel();
69  isDeletedLabel = new javax.swing.JLabel();
70  scoreLabel = new javax.swing.JLabel();
71 
72  setToolTipText("");
73 
74  thumbnailPanel.setToolTipText("");
75  thumbnailPanel.setLayout(new java.awt.GridBagLayout());
76  thumbnailPanel.add(thumbnailLabel, new java.awt.GridBagConstraints());
77 
78  fileSizeLabel.setToolTipText("");
79 
80  countLabel.setToolTipText("");
81  countLabel.setMaximumSize(new java.awt.Dimension(159, 12));
82  countLabel.setMinimumSize(new java.awt.Dimension(159, 12));
83  countLabel.setPreferredSize(new java.awt.Dimension(159, 12));
84 
85  isDeletedLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/file-icon-deleted.png"))); // NOI18N
86  isDeletedLabel.setToolTipText("");
87  isDeletedLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
88  isDeletedLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
89  isDeletedLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
90 
91  scoreLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/red-circle-exclamation.png"))); // NOI18N
92  scoreLabel.setToolTipText("");
93  scoreLabel.setMaximumSize(new Dimension(ICON_SIZE,ICON_SIZE));
94  scoreLabel.setMinimumSize(new Dimension(ICON_SIZE,ICON_SIZE));
95  scoreLabel.setPreferredSize(new Dimension(ICON_SIZE,ICON_SIZE));
96 
97  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
98  this.setLayout(layout);
99  layout.setHorizontalGroup(
100  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
101  .addGroup(layout.createSequentialGroup()
102  .addContainerGap()
103  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
104  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
105  .addComponent(thumbnailPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 201, Short.MAX_VALUE)
106  .addComponent(fileSizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
107  .addGroup(layout.createSequentialGroup()
108  .addComponent(countLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
109  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
110  .addComponent(isDeletedLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
111  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
112  .addComponent(scoreLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
113  .addContainerGap())
114  );
115  layout.setVerticalGroup(
116  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
117  .addGroup(layout.createSequentialGroup()
118  .addContainerGap()
119  .addComponent(thumbnailPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
120  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
121  .addComponent(fileSizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
122  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
123  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
124  .addComponent(scoreLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
125  .addComponent(isDeletedLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
126  .addComponent(countLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
127  .addContainerGap())
128  );
129  }// </editor-fold>//GEN-END:initComponents
130 
131 
132  // Variables declaration - do not modify//GEN-BEGIN:variables
133  private javax.swing.JLabel countLabel;
134  private javax.swing.JLabel fileSizeLabel;
135  private javax.swing.JLabel isDeletedLabel;
136  private javax.swing.JLabel scoreLabel;
137  private javax.swing.JLabel thumbnailLabel;
138  // End of variables declaration//GEN-END:variables
139 
140  @NbBundle.Messages({
141  "# {0} - numberOfInstances",
142  "ImageThumbnailPanel.countLabel.text=Number of Instances: {0}",
143  "ImageThumbnailPanel.isDeleted.text=All instances of file are deleted."})
144  @Override
145  public Component getListCellRendererComponent(JList<? extends ImageThumbnailWrapper> list, ImageThumbnailWrapper value, int index, boolean isSelected, boolean cellHasFocus) {
146  fileSizeLabel.setText(getFileSizeString(value.getResultFile().getFirstInstance().getSize()));
147  countLabel.setText(Bundle.ImageThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size()));
148  thumbnailLabel.setIcon(new ImageIcon(value.getThumbnail()));
149  if (value.getResultFile().isDeleted()) {
150  isDeletedLabel.setIcon(DELETED_ICON);
151  isDeletedLabel.setToolTipText(Bundle.ImageThumbnailPanel_isDeleted_text());
152  } else {
153  isDeletedLabel.setIcon(null);
154  isDeletedLabel.setToolTipText(null);
155  }
156  switch (value.getResultFile().getScore()) {
157  case NOTABLE_SCORE:
158  scoreLabel.setIcon(NOTABLE_SCORE_ICON);
159  break;
160  case INTERESTING_SCORE:
161  scoreLabel.setIcon(INTERESTING_SCORE_ICON);
162  break;
163  case NO_SCORE: // empty case - this is interpreted as an intentional fall-through
164  default:
165  scoreLabel.setIcon(null);
166  break;
167  }
168  scoreLabel.setToolTipText(value.getResultFile().getScoreDescription());
169  setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
170 
171  return this;
172  }
173 
174  @NbBundle.Messages({"# {0} - fileSize",
175  "# {1} - units",
176  "ImageThumbnailPanel.sizeLabel.text=Size: {0} {1}",
177  "ImageThumbnailPanel.bytes.text=bytes",
178  "ImageThumbnailPanel.kiloBytes.text=KB",
179  "ImageThumbnailPanel.megaBytes.text=MB",
180  "ImageThumbnailPanel.gigaBytes.text=GB",
181  "ImageThumbnailPanel.terraBytes.text=TB"})
190  private String getFileSizeString(long bytes) {
191  long size = bytes;
192  int unitsSwitchValue = 0;
193  while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) {
194  size /= BYTE_UNIT_CONVERSION;
195  unitsSwitchValue++;
196  }
197  String units;
198  switch (unitsSwitchValue) {
199  case 1:
200  units = Bundle.ImageThumbnailPanel_kiloBytes_text();
201  break;
202  case 2:
203  units = Bundle.ImageThumbnailPanel_megaBytes_text();
204  break;
205  case 3:
206  units = Bundle.ImageThumbnailPanel_gigaBytes_text();
207  break;
208  case 4:
209  units = Bundle.ImageThumbnailPanel_terraBytes_text();
210  break;
211  default:
212  units = Bundle.ImageThumbnailPanel_bytes_text();
213  break;
214  }
215  return Bundle.ImageThumbnailPanel_sizeLabel_text(size, units);
216  }
217 
218  @Override
219  public String getToolTipText(MouseEvent event) {
220  if (event != null) {
221  //gets tooltip of internal panel item mouse is over
222  Point point = event.getPoint();
223  for (Component comp : getComponents()) {
224  if (isPointOnIcon(comp, point)) {
225  String toolTip = ((JComponent) comp).getToolTipText();
226  if (toolTip == null || toolTip.isEmpty()) {
227  return null;
228  } else {
229  return toolTip;
230  }
231  }
232  }
233  }
234  return null;
235  }
236 
245  private boolean isPointOnIcon(Component comp, Point point) {
246  return comp instanceof JComponent && point.x >= comp.getX() && point.x <= comp.getX() + ICON_SIZE && point.y >= comp.getY() && point.y <= comp.getY() + ICON_SIZE;
247  }
248 
249 }
Component getListCellRendererComponent(JList<?extends ImageThumbnailWrapper > list, ImageThumbnailWrapper value, int index, boolean isSelected, boolean cellHasFocus)
boolean isPointOnIcon(Component comp, Point point)

Copyright © 2012-2019 Basis Technology. Generated on: Tue Jan 7 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.