19 package org.sleuthkit.autopsy.casemodule;
22 import java.awt.event.WindowAdapter;
23 import java.awt.event.WindowEvent;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.ArrayList;
27 import java.util.logging.Level;
29 import javax.swing.JFileChooser;
30 import javax.swing.JFrame;
31 import javax.swing.JOptionPane;
32 import org.openide.util.NbBundle;
33 import org.openide.windows.WindowManager;
39 class MissingImageDialog
extends javax.swing.JDialog {
41 private static final Logger logger = Logger.getLogger(MissingImageDialog.class.getName());
44 static final GeneralFilter rawFilter =
new GeneralFilter(GeneralFilter.RAW_IMAGE_EXTS, GeneralFilter.RAW_IMAGE_DESC);
45 static final GeneralFilter encaseFilter =
new GeneralFilter(GeneralFilter.ENCASE_IMAGE_EXTS, GeneralFilter.ENCASE_IMAGE_DESC);
46 static final List<String> allExt =
new ArrayList<String>();
49 allExt.addAll(GeneralFilter.RAW_IMAGE_EXTS);
50 allExt.addAll(GeneralFilter.ENCASE_IMAGE_EXTS);
52 static final String allDesc = NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.allDesc.text");
53 static final GeneralFilter allFilter =
new GeneralFilter(allExt, allDesc);
54 private JFileChooser fc =
new JFileChooser();
56 private MissingImageDialog(
long obj_id, SleuthkitCase db) {
57 super((JFrame) WindowManager.getDefault().getMainWindow(),
true);
62 fc.setDragEnabled(
false);
63 fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
64 fc.setMultiSelectionEnabled(
false);
66 fc.addChoosableFileFilter(rawFilter);
67 fc.addChoosableFileFilter(encaseFilter);
68 fc.setFileFilter(allFilter);
79 static void makeDialog(
long obj_id, SleuthkitCase db) {
80 final MissingImageDialog dialog =
new MissingImageDialog(obj_id, db);
81 dialog.addWindowListener(
new WindowAdapter() {
83 public void windowClosing(WindowEvent e) {
90 private void customInit() {
92 selectButton.setEnabled(
false);
95 private void display() {
96 this.setTitle(NbBundle.getMessage(
this.getClass(),
"MissingImageDialog.display.title"));
97 Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
99 int w = this.getSize().width;
100 int h = this.getSize().height;
102 setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2);
104 this.setVisible(
true);
110 private void moveFocusToSelect() {
111 this.selectButton.requestFocusInWindow();
117 private void updateSelectButton() {
120 if (!pathNameTextField.getText().isEmpty()) {
121 String filePath = pathNameTextField.getText();
122 boolean isExist =
new File(filePath).isFile() || DriveUtils.driveExists(filePath);
123 selectButton.setEnabled(isExist);
132 @SuppressWarnings(
"unchecked")
134 private
void initComponents() {
136 buttonPanel =
new javax.swing.JPanel();
137 selectButton =
new javax.swing.JButton();
138 cancelButton =
new javax.swing.JButton();
139 containerPanel =
new javax.swing.JPanel();
140 pathNameTextField =
new javax.swing.JTextField();
141 browseButton =
new javax.swing.JButton();
142 lbWarning =
new javax.swing.JLabel();
143 titleLabel =
new javax.swing.JLabel();
144 titleSeparator =
new javax.swing.JSeparator();
146 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
148 selectButton.setFont(selectButton.getFont().deriveFont(selectButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
149 org.openide.awt.Mnemonics.setLocalizedText(selectButton,
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.selectButton.text"));
150 selectButton.addActionListener(
new java.awt.event.ActionListener() {
151 public void actionPerformed(java.awt.event.ActionEvent evt) {
152 selectButtonActionPerformed(evt);
156 cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
157 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.cancelButton.text"));
158 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
159 public void actionPerformed(java.awt.event.ActionEvent evt) {
160 cancelButtonActionPerformed(evt);
164 javax.swing.GroupLayout buttonPanelLayout =
new javax.swing.GroupLayout(buttonPanel);
165 buttonPanel.setLayout(buttonPanelLayout);
166 buttonPanelLayout.setHorizontalGroup(
167 buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
168 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup()
169 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
170 .addComponent(selectButton)
171 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
172 .addComponent(cancelButton)
175 buttonPanelLayout.setVerticalGroup(
176 buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
177 .addGroup(buttonPanelLayout.createSequentialGroup()
179 .addGroup(buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
180 .addComponent(selectButton)
181 .addComponent(cancelButton))
182 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
185 pathNameTextField.setFont(pathNameTextField.getFont().deriveFont(pathNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
186 pathNameTextField.setText(
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.pathNameTextField.text"));
187 pathNameTextField.addActionListener(
new java.awt.event.ActionListener() {
188 public void actionPerformed(java.awt.event.ActionEvent evt) {
189 pathNameTextFieldActionPerformed(evt);
193 browseButton.setFont(browseButton.getFont().deriveFont(browseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
194 org.openide.awt.Mnemonics.setLocalizedText(browseButton,
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.browseButton.text"));
195 browseButton.addActionListener(
new java.awt.event.ActionListener() {
196 public void actionPerformed(java.awt.event.ActionEvent evt) {
197 browseButtonActionPerformed(evt);
201 lbWarning.setFont(lbWarning.getFont().deriveFont(lbWarning.getFont().getStyle() | java.awt.Font.BOLD, 12));
202 lbWarning.setForeground(
new java.awt.Color(244, 0, 0));
203 org.openide.awt.Mnemonics.setLocalizedText(lbWarning,
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.lbWarning.text"));
204 lbWarning.setToolTipText(
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.lbWarning.toolTipText"));
206 javax.swing.GroupLayout containerPanelLayout =
new javax.swing.GroupLayout(containerPanel);
207 containerPanel.setLayout(containerPanelLayout);
208 containerPanelLayout.setHorizontalGroup(
209 containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
210 .addGroup(containerPanelLayout.createSequentialGroup()
212 .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
213 .addComponent(lbWarning, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
214 .addGroup(containerPanelLayout.createSequentialGroup()
215 .addComponent(pathNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)
216 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
217 .addComponent(browseButton)
218 .addContainerGap(83, Short.MAX_VALUE))))
220 containerPanelLayout.setVerticalGroup(
221 containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
222 .addGroup(containerPanelLayout.createSequentialGroup()
224 .addGroup(containerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
225 .addComponent(pathNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
226 .addComponent(browseButton))
227 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
228 .addComponent(lbWarning, javax.swing.GroupLayout.DEFAULT_SIZE, 19, Short.MAX_VALUE)
232 titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getStyle() | java.awt.Font.BOLD, 12));
233 org.openide.awt.Mnemonics.setLocalizedText(titleLabel,
org.openide.util.NbBundle.getMessage(MissingImageDialog.class,
"MissingImageDialog.titleLabel.text"));
235 titleSeparator.setForeground(
new java.awt.Color(102, 102, 102));
237 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
238 getContentPane().setLayout(layout);
239 layout.setHorizontalGroup(
240 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
241 .addComponent(buttonPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
242 .addGroup(layout.createSequentialGroup()
244 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
245 .addComponent(containerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
246 .addGroup(layout.createSequentialGroup()
247 .addComponent(titleLabel)
248 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
249 .addComponent(titleSeparator)))
252 layout.setVerticalGroup(
253 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
254 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
256 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
257 .addComponent(titleLabel)
258 .addComponent(titleSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE))
259 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
260 .addComponent(containerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
261 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
262 .addComponent(buttonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
268 private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {
270 String newPath = pathNameTextField.getText();
272 db.setImagePaths(obj_id, Arrays.asList(
new String[]{newPath}));
274 }
catch (TskCoreException ex) {
275 lbWarning.setText(NbBundle.getMessage(
this.getClass(),
"MissingImageDialog.ErrorSettingImage"));
276 logger.log(Level.WARNING,
"Error setting image paths", ex);
280 private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
284 private void pathNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
287 updateSelectButton();
290 private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {
292 String oldText = pathNameTextField.getText();
293 lbWarning.setText(
"");
295 File currentDir =
new File(oldText);
296 if (currentDir.exists()) {
297 fc.setCurrentDirectory(currentDir);
300 int retval = fc.showOpenDialog(
this);
301 if (retval == JFileChooser.APPROVE_OPTION) {
302 String path = fc.getSelectedFile().getPath();
303 pathNameTextField.setText(path);
307 updateSelectButton();
310 private javax.swing.JButton browseButton;
311 private javax.swing.JPanel buttonPanel;
312 private javax.swing.JButton cancelButton;
313 private javax.swing.JPanel containerPanel;
314 private javax.swing.JLabel lbWarning;
315 private javax.swing.JTextField pathNameTextField;
316 private javax.swing.JButton selectButton;
317 private javax.swing.JLabel titleLabel;
318 private javax.swing.JSeparator titleSeparator;
325 int ret = JOptionPane.showConfirmDialog(null,
326 NbBundle.getMessage(
this.getClass(),
327 "MissingImageDialog.confDlg.noFileSel.msg"),
328 NbBundle.getMessage(
this.getClass(),
329 "MissingImageDialog.confDlg.noFileSel.title"),
330 JOptionPane.YES_NO_OPTION);
331 if (ret == JOptionPane.YES_OPTION) {