19 package org.sleuthkit.autopsy.casemodule;
22 import java.util.Calendar;
23 import java.util.List;
24 import java.util.SimpleTimeZone;
25 import java.util.TimeZone;
26 import java.util.logging.Level;
27 import javax.swing.JFileChooser;
28 import javax.swing.JOptionPane;
29 import javax.swing.JPanel;
30 import javax.swing.event.DocumentEvent;
31 import javax.swing.event.DocumentListener;
32 import javax.swing.filechooser.FileFilter;
33 import org.apache.commons.lang3.StringUtils;
34 import org.openide.util.NbBundle;
68 private ImageFilePanel(String context, List<FileFilter> fileChooserFilters) {
69 this.contextName = context;
73 for (String
id : SimpleTimeZone.getAvailableIDs()) {
81 fileChooser.setDragEnabled(
false);
82 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
83 fileChooser.setMultiSelectionEnabled(
false);
84 fileChooserFilters.forEach(fileChooser::addChoosableFileFilter);
85 if (fileChooserFilters.isEmpty() ==
false) {
86 fileChooser.setFileFilter(fileChooserFilters.get(0));
103 instance.
pathTextField.getDocument().addDocumentListener(instance);
124 setMinimumSize(
new java.awt.Dimension(0, 65));
125 setPreferredSize(
new java.awt.Dimension(403, 65));
127 org.openide.awt.Mnemonics.setLocalizedText(
pathLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.pathLabel.text"));
130 browseButton.addActionListener(
new java.awt.event.ActionListener() {
131 public void actionPerformed(java.awt.event.ActionEvent evt) {
142 org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.noFatOrphansCheckbox.text"));
143 noFatOrphansCheckbox.setToolTipText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.noFatOrphansCheckbox.toolTipText"));
145 org.openide.awt.Mnemonics.setLocalizedText(
descLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.descLabel.text"));
147 errorLabel.setForeground(
new java.awt.Color(255, 0, 0));
148 org.openide.awt.Mnemonics.setLocalizedText(
errorLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.errorLabel.text"));
150 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
151 this.setLayout(layout);
152 layout.setHorizontalGroup(
153 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
154 .addGroup(layout.createSequentialGroup()
156 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
159 .addGroup(layout.createSequentialGroup()
160 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
161 .addGroup(layout.createSequentialGroup()
163 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
164 .addComponent(
timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE))
166 .addComponent(noFatOrphansCheckbox)
167 .addGroup(layout.createSequentialGroup()
171 .addGap(0, 20, Short.MAX_VALUE))
173 layout.setVerticalGroup(
174 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
175 .addGroup(layout.createSequentialGroup()
177 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
178 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
180 .addComponent(
pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
184 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
186 .addComponent(
timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
187 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
188 .addComponent(noFatOrphansCheckbox)
189 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
191 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
195 @NbBundle.Messages({
"ImageFilePanel.000.confirmationMessage=The selected file"
196 +
" has extenson .001 but there is a .000 file in the sequence of raw images."
197 +
"\nShould the .000 file be used as the start, instead of the selected .001 file?\n"})
201 File currentDir =
new File(oldText);
202 if (currentDir.exists()) {
203 fileChooser.setCurrentDirectory(currentDir);
206 if (fileChooser.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
207 String path = fileChooser.getSelectedFile().getPath();
208 if (path.endsWith(
".001")) {
209 String zeroX3_path = StringUtils.removeEnd(path,
".001") +
".000";
210 if (
new File(zeroX3_path).exists()) {
211 int showConfirmDialog = JOptionPane.showConfirmDialog(
this,
212 Bundle.ImageFilePanel_000_confirmationMessage(),
213 "Choose .001 file?", JOptionPane.YES_NO_OPTION);
214 if (showConfirmDialog == JOptionPane.YES_OPTION) {
255 String tz = timeZoneComboBox.getSelectedItem().toString();
256 return tz.substring(tz.indexOf(
')') + 2).trim();
273 @NbBundle.Messages(
"DataSourceOnCDriveError.text=Warning: Path to multi-user data source is on \"C:\" drive")
277 if (StringUtils.isBlank(path)) {
284 errorLabel.setText(Bundle.DataSourceOnCDriveError_text());
287 return new File(path).isFile()
294 if (null != imagePathName) {
295 String imagePath = imagePathName.substring(0, imagePathName.lastIndexOf(File.separator) + 1);
302 if (StringUtils.isNotBlank(lastImagePath)) {
316 int offset = zone.getRawOffset() / 1000;
317 int hour = offset / 3600;
318 int minutes = (offset % 3600) / 60;
319 return String.format(
"(GMT%+d:%02d) %s", hour, minutes, zone.getID());
343 @NbBundle.Messages({
"ImageFilePanel.moduleErr=Module Error",
344 "ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates."
345 +
" See log to determine which module. Some data could be incomplete.\n"})
349 }
catch (Exception e) {
350 logger.log(Level.SEVERE,
"ImageFilePanel listener threw exception", e);
javax.swing.JLabel descLabel
static final String PROP_LASTIMAGE_PATH
static boolean isPhysicalDrive(String path)
boolean getNoFatOrphans()
javax.swing.JLabel timeZoneLabel
javax.swing.JLabel pathLabel
static String timeZoneToString(TimeZone zone)
static synchronized ImageFilePanel createInstance(String context, List< FileFilter > fileChooserFilters)
final JFileChooser fileChooser
static boolean isValid(String path, Case.CaseType caseType)
void setContentPath(String s)
void browseButtonActionPerformed(java.awt.event.ActionEvent evt)
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
ImageFilePanel(String context, List< FileFilter > fileChooserFilters)
static final Logger logger
javax.swing.JComboBox< String > timeZoneComboBox
void changedUpdate(DocumentEvent e)
static String getConfigSetting(String moduleName, String settingName)
javax.swing.JButton browseButton
static void error(String title, String message)
static boolean isPartition(String path)
javax.swing.JTextField pathTextField
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
javax.swing.JLabel errorLabel
javax.swing.JCheckBox noFatOrphansCheckbox
void removeUpdate(DocumentEvent e)
void insertUpdate(DocumentEvent e)