Autopsy  4.4
Graphical digital forensics platform for The Sleuth Kit and other tools.
LocalDiskPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2017 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.casemodule;
20 
21 import java.io.File;
22 import java.nio.file.Paths;
23 import java.util.ArrayList;
24 import java.util.Calendar;
25 import java.util.List;
26 import java.util.SimpleTimeZone;
27 import java.util.TimeZone;
28 import java.util.concurrent.CancellationException;
29 import java.util.logging.Level;
30 import javax.swing.JFileChooser;
31 import javax.swing.JPanel;
32 import javax.swing.SwingWorker;
33 import javax.swing.event.ListSelectionEvent;
34 import javax.swing.event.ListSelectionListener;
35 import javax.swing.event.TableModelListener;
36 import javax.swing.table.TableModel;
37 import org.openide.util.NbBundle;
44 
45 @NbBundle.Messages({"LocalDiskPanel.refreshTablebutton.text=Refresh Local Disks"
46 })
51 final class LocalDiskPanel extends JPanel {
52 
53  private static final Logger logger = Logger.getLogger(LocalDiskPanel.class.getName());
54  private static LocalDiskPanel instance;
55  private static final long serialVersionUID = 1L;
56  private List<LocalDisk> disks;
57  private boolean enableNext = false;
58  private final LocalDiskModel model;
59  private final JFileChooser fc = new JFileChooser();
60 
64  LocalDiskPanel() {
65  this.model = new LocalDiskModel();
66 
67  this.disks = new ArrayList<>();
68  initComponents();
69  customInit();
70  createTimeZoneList();
71  refreshTable();
72  diskTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
73  @Override
74  public void valueChanged(ListSelectionEvent e) {
75  if (diskTable.getSelectedRow() >= 0 && diskTable.getSelectedRow() < disks.size()) {
76  enableNext = true;
77  setPotentialImageWriterPath(disks.get(diskTable.getSelectedRow()));
78  try {
79  firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
80  } catch (Exception ex) {
81  logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS
82  MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"),
83  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"),
84  MessageNotifyUtil.MessageType.ERROR);
85  }
86  } else { //The selection changed to nothing valid being selected, such as with ctrl+click
87  enableNext = false;
88  try {
89  firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
90  } catch (Exception ex) {
91  logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS
92  MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"),
93  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"),
94  MessageNotifyUtil.MessageType.ERROR);
95  }
96  }
97  }
98  });
99  }
100 
104  static synchronized LocalDiskPanel getDefault() {
105  if (instance == null) {
106  instance = new LocalDiskPanel();
107  }
108  return instance;
109  }
110 
111  @SuppressWarnings("unchecked")
112  private void customInit() {
113  errorLabel.setVisible(false);
114  errorLabel.setText("");
115  diskTable.setEnabled(false);
116  imageWriterErrorLabel.setVisible(false);
117  imageWriterErrorLabel.setText("");
118  if(! PlatformUtil.isWindowsOS()){
119  copyImageCheckbox.setSelected(false);
120  copyImageCheckbox.setEnabled(false);
121  }
122  pathTextField.setEnabled(copyImageCheckbox.isSelected());
123  browseButton.setEnabled(copyImageCheckbox.isSelected());
124  changeDatabasePathCheckbox.setEnabled(copyImageCheckbox.isSelected());
125  }
126 
132  @SuppressWarnings("unchecked")
133  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
134  private void initComponents() {
135 
136  diskLabel = new javax.swing.JLabel();
137  errorLabel = new javax.swing.JLabel();
138  timeZoneLabel = new javax.swing.JLabel();
139  timeZoneComboBox = new javax.swing.JComboBox<>();
140  noFatOrphansCheckbox = new javax.swing.JCheckBox();
141  descLabel = new javax.swing.JLabel();
142  jScrollPane1 = new javax.swing.JScrollPane();
143  diskTable = new javax.swing.JTable();
144  copyImageCheckbox = new javax.swing.JCheckBox();
145  pathTextField = new javax.swing.JTextField();
146  browseButton = new javax.swing.JButton();
147  jLabel1 = new javax.swing.JLabel();
148  imageWriterErrorLabel = new javax.swing.JLabel();
149  changeDatabasePathCheckbox = new javax.swing.JCheckBox();
150  refreshTablebutton = new javax.swing.JButton();
151 
152  setMinimumSize(new java.awt.Dimension(0, 420));
153  setPreferredSize(new java.awt.Dimension(485, 410));
154 
155  diskLabel.setFont(diskLabel.getFont().deriveFont(diskLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
156  org.openide.awt.Mnemonics.setLocalizedText(diskLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.diskLabel.text")); // NOI18N
157 
158  errorLabel.setFont(errorLabel.getFont().deriveFont(errorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
159  errorLabel.setForeground(new java.awt.Color(255, 0, 0));
160  org.openide.awt.Mnemonics.setLocalizedText(errorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.errorLabel.text")); // NOI18N
161 
162  timeZoneLabel.setFont(timeZoneLabel.getFont().deriveFont(timeZoneLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
163  org.openide.awt.Mnemonics.setLocalizedText(timeZoneLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.timeZoneLabel.text")); // NOI18N
164 
165  timeZoneComboBox.setFont(timeZoneComboBox.getFont().deriveFont(timeZoneComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
166  timeZoneComboBox.setMaximumRowCount(30);
167 
168  noFatOrphansCheckbox.setFont(noFatOrphansCheckbox.getFont().deriveFont(noFatOrphansCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
169  org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.noFatOrphansCheckbox.text")); // NOI18N
170  noFatOrphansCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.noFatOrphansCheckbox.toolTipText")); // NOI18N
171 
172  descLabel.setFont(descLabel.getFont().deriveFont(descLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
173  org.openide.awt.Mnemonics.setLocalizedText(descLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.descLabel.text")); // NOI18N
174 
175  diskTable.setModel(model);
176  diskTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
177  jScrollPane1.setViewportView(diskTable);
178 
179  org.openide.awt.Mnemonics.setLocalizedText(copyImageCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.copyImageCheckbox.text")); // NOI18N
180  copyImageCheckbox.addActionListener(new java.awt.event.ActionListener() {
181  public void actionPerformed(java.awt.event.ActionEvent evt) {
182  copyImageCheckboxActionPerformed(evt);
183  }
184  });
185 
186  pathTextField.setText(org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.pathTextField.text")); // NOI18N
187  pathTextField.addKeyListener(new java.awt.event.KeyAdapter() {
188  public void keyReleased(java.awt.event.KeyEvent evt) {
189  pathTextFieldKeyReleased(evt);
190  }
191  });
192 
193  org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.browseButton.text")); // NOI18N
194  browseButton.addActionListener(new java.awt.event.ActionListener() {
195  public void actionPerformed(java.awt.event.ActionEvent evt) {
196  browseButtonActionPerformed(evt);
197  }
198  });
199 
200  org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.jLabel1.text")); // NOI18N
201 
202  imageWriterErrorLabel.setFont(imageWriterErrorLabel.getFont().deriveFont(imageWriterErrorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
203  imageWriterErrorLabel.setForeground(new java.awt.Color(255, 0, 0));
204  org.openide.awt.Mnemonics.setLocalizedText(imageWriterErrorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.imageWriterErrorLabel.text")); // NOI18N
205 
206  org.openide.awt.Mnemonics.setLocalizedText(changeDatabasePathCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.changeDatabasePathCheckbox.text")); // NOI18N
207 
208  org.openide.awt.Mnemonics.setLocalizedText(refreshTablebutton, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.refreshTablebutton.text")); // NOI18N
209  refreshTablebutton.addActionListener(new java.awt.event.ActionListener() {
210  public void actionPerformed(java.awt.event.ActionEvent evt) {
211  refreshTablebuttonActionPerformed(evt);
212  }
213  });
214 
215  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
216  this.setLayout(layout);
217  layout.setHorizontalGroup(
218  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
219  .addGroup(layout.createSequentialGroup()
220  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
221  .addGroup(layout.createSequentialGroup()
222  .addContainerGap()
223  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
224  .addGroup(layout.createSequentialGroup()
225  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
226  .addComponent(noFatOrphansCheckbox)
227  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
228  .addComponent(copyImageCheckbox)
229  .addComponent(descLabel))
230  .addGroup(layout.createSequentialGroup()
231  .addGap(21, 21, 21)
232  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
233  .addGroup(layout.createSequentialGroup()
234  .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
235  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
236  .addComponent(browseButton, javax.swing.GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE))
237  .addGroup(layout.createSequentialGroup()
238  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
239  .addComponent(imageWriterErrorLabel)
240  .addComponent(jLabel1)
241  .addComponent(changeDatabasePathCheckbox))
242  .addGap(0, 0, Short.MAX_VALUE)))))
243  .addGap(0, 0, Short.MAX_VALUE))
244  .addGroup(layout.createSequentialGroup()
245  .addComponent(timeZoneLabel)
246  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
247  .addComponent(timeZoneComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
248  .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 488, Short.MAX_VALUE)
249  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
250  .addGap(0, 0, Short.MAX_VALUE)
251  .addComponent(refreshTablebutton, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE))
252  .addGroup(layout.createSequentialGroup()
253  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
254  .addComponent(diskLabel)
255  .addComponent(errorLabel))
256  .addGap(0, 0, Short.MAX_VALUE)))
257  .addContainerGap())
258  );
259  layout.setVerticalGroup(
260  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
261  .addGroup(layout.createSequentialGroup()
262  .addComponent(diskLabel)
263  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
264  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
265  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
266  .addComponent(refreshTablebutton)
267  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
268  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
269  .addComponent(timeZoneLabel)
270  .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
271  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
272  .addComponent(noFatOrphansCheckbox)
273  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
274  .addComponent(descLabel)
275  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
276  .addComponent(copyImageCheckbox)
277  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
278  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
279  .addComponent(browseButton)
280  .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
281  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
282  .addComponent(changeDatabasePathCheckbox)
283  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
284  .addComponent(jLabel1)
285  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
286  .addComponent(imageWriterErrorLabel)
287  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
288  .addComponent(errorLabel)
289  .addContainerGap(58, Short.MAX_VALUE))
290  );
291  }// </editor-fold>//GEN-END:initComponents
292 
293  private void copyImageCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyImageCheckboxActionPerformed
294  pathTextField.setEnabled(copyImageCheckbox.isSelected());
295  browseButton.setEnabled(copyImageCheckbox.isSelected());
296  changeDatabasePathCheckbox.setEnabled(copyImageCheckbox.isSelected());
297  fireUpdateEvent();
298  }//GEN-LAST:event_copyImageCheckboxActionPerformed
299 
300  private void pathTextFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_pathTextFieldKeyReleased
301  fireUpdateEvent();
302  }//GEN-LAST:event_pathTextFieldKeyReleased
303 
304  private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
305  String oldText = pathTextField.getText();
306  // set the current directory of the FileChooser if the ImagePath Field is valid
307  File currentFile = new File(oldText);
308  if ((currentFile.getParentFile() != null) && (currentFile.getParentFile().exists())) {
309  fc.setSelectedFile(currentFile);
310  }
311 
312  int retval = fc.showOpenDialog(this);
313  if (retval == JFileChooser.APPROVE_OPTION) {
314  String path = fc.getSelectedFile().getPath();
315  pathTextField.setText(path);
316  }
317  fireUpdateEvent();
318  }//GEN-LAST:event_browseButtonActionPerformed
319 
320  private void refreshTablebuttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshTablebuttonActionPerformed
321  refreshTable();
322  }//GEN-LAST:event_refreshTablebuttonActionPerformed
323 
324  // Variables declaration - do not modify//GEN-BEGIN:variables
325  private javax.swing.JButton browseButton;
326  private javax.swing.JCheckBox changeDatabasePathCheckbox;
327  private javax.swing.JCheckBox copyImageCheckbox;
328  private javax.swing.JLabel descLabel;
329  private javax.swing.JLabel diskLabel;
330  private javax.swing.JTable diskTable;
331  private javax.swing.JLabel errorLabel;
332  private javax.swing.JLabel imageWriterErrorLabel;
333  private javax.swing.JLabel jLabel1;
334  private javax.swing.JScrollPane jScrollPane1;
335  private javax.swing.JCheckBox noFatOrphansCheckbox;
336  private javax.swing.JTextField pathTextField;
337  private javax.swing.JButton refreshTablebutton;
338  private javax.swing.JComboBox<String> timeZoneComboBox;
339  private javax.swing.JLabel timeZoneLabel;
340  // End of variables declaration//GEN-END:variables
341 
342  private void fireUpdateEvent() {
343  try {
344  firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
345  } catch (Exception e) {
346  logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS
347  MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"),
348  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"),
349  MessageNotifyUtil.MessageType.ERROR);
350  }
351  }
352 
358  String getContentPaths() {
359  if (disks.size() > 0) {
360  int selectedRow = diskTable.getSelectedRow();
361  LocalDisk selected = disks.get(selectedRow);
362  return selected.getPath();
363  } else {
364  return "";
365  }
366  }
367 
368  String getTimeZone() {
369  String tz = timeZoneComboBox.getSelectedItem().toString();
370  return tz.substring(tz.indexOf(")") + 2).trim();
371 
372  }
373 
374  boolean getNoFatOrphans() {
375  return noFatOrphansCheckbox.isSelected();
376  }
377 
378  private static String getDefaultImageWriterFolder() {
379  return Paths.get(Case.getCurrentCase().getModuleDirectory(), "Image Writer").toString();
380  }
381 
382  private void setPotentialImageWriterPath(LocalDisk disk) {
383 
384  File subDirectory = Paths.get(getDefaultImageWriterFolder()).toFile();
385  if (!subDirectory.exists()) {
386  subDirectory.mkdirs();
387  }
388 
389  String path = disk.getName();
390 
391  // Remove any character that isn't alphanumeric, a space, parent, or underscore.
392  // If the name ends up empty or starting with a space, prepend "localDisk"
393  path = path.replaceAll("[^0-9A-Za-z _()]", ""); // NON-NLS
394  if (path.isEmpty() || path.startsWith(" ")) {
395  path = "localDisk" + path;
396  }
397 
398  path += " " + System.currentTimeMillis();
399  path += ".vhd";
400  pathTextField.setText(Paths.get(getDefaultImageWriterFolder(), path).toString());
401  }
402 
403  private boolean imageWriterPathIsValid() {
404  if ((!copyImageCheckbox.isSelected()) || !(diskTable.getSelectedRow() >= 0 && diskTable.getSelectedRow() < disks.size())) {
405  imageWriterErrorLabel.setVisible(false);
406  imageWriterErrorLabel.setText("");
407  return true;
408  }
409 
410  if (pathTextField.getText().isEmpty()) {
411  imageWriterErrorLabel.setVisible(true);
412  imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterEmptyPathError.text"));
413  return false;
414  }
415 
416  File f = new File(pathTextField.getText());
417  if (((f.getParentFile() != null) && (!f.getParentFile().exists()))
418  || (f.getParentFile() == null)) {
419  imageWriterErrorLabel.setVisible(true);
420  imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterDirError.text"));
421  return false;
422  }
423  if (f.isDirectory()) {
424  imageWriterErrorLabel.setVisible(true);
425  imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterIsDirError.text"));
426  return false;
427  }
428  if (f.exists()) {
429  imageWriterErrorLabel.setVisible(true);
430  imageWriterErrorLabel.setText(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.imageWriterFileExistsError.text"));
431  return false;
432  }
433  imageWriterErrorLabel.setVisible(false);
434  imageWriterErrorLabel.setText("");
435  return true;
436  }
437 
438  boolean getImageWriterEnabled() {
439  return copyImageCheckbox.isSelected();
440  }
441 
442  ImageWriterSettings getImageWriterSettings() {
443  return new ImageWriterSettings(pathTextField.getText(), changeDatabasePathCheckbox.isSelected());
444  }
445 
452  boolean validatePanel() {
453  if (!imageWriterPathIsValid()) {
454  return false;
455  }
456  return enableNext;
457  }
458 
462  public void refreshTable() {
463  model.loadDisks();
464  }
465 
470  public void createTimeZoneList() {
471  // load and add all timezone
472  String[] ids = SimpleTimeZone.getAvailableIDs();
473  for (String id : ids) {
474  TimeZone zone = TimeZone.getTimeZone(id);
475  int offset = zone.getRawOffset() / 1000;
476  int hour = offset / 3600;
477  int minutes = (offset % 3600) / 60;
478  String item = String.format("(GMT%+d:%02d) %s", hour, minutes, id); //NON-NLS
479 
480  /*
481  * DateFormat dfm = new SimpleDateFormat("z");
482  * dfm.setTimeZone(zone); boolean hasDaylight =
483  * zone.useDaylightTime(); String first = dfm.format(new Date(2010,
484  * 1, 1)); String second = dfm.format(new Date(2011, 6, 6)); int mid
485  * = hour * -1; String result = first + Integer.toString(mid);
486  * if(hasDaylight){ result = result + second; }
487  * timeZoneComboBox.addItem(item + " (" + result + ")");
488  */
489  timeZoneComboBox.addItem(item);
490  }
491  // get the current timezone
492  TimeZone thisTimeZone = Calendar.getInstance().getTimeZone();
493  int thisOffset = thisTimeZone.getRawOffset() / 1000;
494  int thisHour = thisOffset / 3600;
495  int thisMinutes = (thisOffset % 3600) / 60;
496  String formatted = String.format("(GMT%+d:%02d) %s", thisHour, thisMinutes, thisTimeZone.getID()); //NON-NLS
497 
498  // set the selected timezone
499  timeZoneComboBox.setSelectedItem(formatted);
500 
501  }
502 
506  private class LocalDiskModel implements TableModel {
507 
508  private LocalDiskThread worker = null;
509  private boolean ready = false;
510  private volatile boolean loadingDisks = false;
511 
512  //private String SELECT = "Select a local disk:";
513  private final String LOADING = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.loading.msg");
514  private final String NO_DRIVES = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.nodrives.msg");
515 
516  private void loadDisks() {
517 
518  // if there is a worker already building the lists, then cancel it first.
519  if (loadingDisks && worker != null) {
520  worker.cancel(false);
521  }
522 
523  // Clear the lists
524  errorLabel.setText("");
525  diskTable.setEnabled(false);
526  ready = false;
527  enableNext = false;
528  loadingDisks = true;
529  worker = new LocalDiskThread();
530  worker.execute();
531  }
532 
533  @Override
534  public int getRowCount() {
535  if (disks.isEmpty()) {
536  return 0;
537  }
538  return disks.size();
539  }
540 
541  @Override
542  public int getColumnCount() {
543  return 2;
544 
545  }
546 
547  @NbBundle.Messages({"LocalDiskPanel.diskTable.column1.title=Disk Name",
548  "LocalDiskPanel.diskTable.column2.title=Disk Size"
549  })
550 
551  @Override
552  public String getColumnName(int columnIndex) {
553  switch (columnIndex) {
554  case 0:
555  return NbBundle.getMessage(this.getClass(), "LocalDiskPanel.diskTable.column1.title");
556  case 1:
557  return NbBundle.getMessage(this.getClass(), "LocalDiskPanel.diskTable.column2.title");
558  default:
559  return "Unnamed"; //NON-NLS
560  }
561  }
562 
563  @Override
564  public Class<?> getColumnClass(int columnIndex) {
565  return String.class;
566  }
567 
568  @Override
569  public boolean isCellEditable(int rowIndex, int columnIndex) {
570  return false;
571  }
572 
573  @Override
574  public Object getValueAt(int rowIndex, int columnIndex) {
575  if (ready) {
576  if (disks.isEmpty()) {
577  return NO_DRIVES;
578  }
579  switch (columnIndex) {
580  case 0:
581  return disks.get(rowIndex).getName();
582  case 1:
583  return disks.get(rowIndex).getReadableSize();
584  default:
585  return disks.get(rowIndex).getPath();
586  }
587  } else {
588  return LOADING;
589  }
590  }
591 
592  @Override
593  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
594  //setter does nothing they should not be able to modify table
595  }
596 
597  @Override
598  public void addTableModelListener(TableModelListener l) {
599 
600  }
601 
602  @Override
603  public void removeTableModelListener(TableModelListener l) {
604 
605  }
606 
611  class LocalDiskThread extends SwingWorker<Object, Void> {
612 
613  private final Logger logger = Logger.getLogger(LocalDiskThread.class.getName());
614  private List<LocalDisk> physicalDrives = new ArrayList<>();
615  private List<LocalDisk> partitions = new ArrayList<>();
616 
617  @Override
618  protected Object doInBackground() throws Exception {
619  // Populate the lists
620  physicalDrives = new ArrayList<>();
621  partitions = new ArrayList<>();
622  physicalDrives = PlatformUtil.getPhysicalDrives();
623  partitions = PlatformUtil.getPartitions();
624  return null;
625  }
626 
631  private void displayErrors() {
632  if (physicalDrives.isEmpty() && partitions.isEmpty()) {
633  if (PlatformUtil.isWindowsOS()) {
634  errorLabel.setText(
635  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.disksNotDetected.text"));
636  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
637  "LocalDiskPanel.errLabel.disksNotDetected.toolTipText"));
638  } else {
639  errorLabel.setText(
640  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.drivesNotDetected.text"));
641  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
642  "LocalDiskPanel.errLabel.drivesNotDetected.toolTipText"));
643  }
644  errorLabel.setVisible(true);
645  diskTable.setEnabled(false);
646  } else if (physicalDrives.isEmpty()) {
647  errorLabel.setText(
648  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text"));
649  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
650  "LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText"));
651  errorLabel.setVisible(true);
652  }
653  }
654 
655  @Override
656  protected void done() {
657  try {
658  super.get(); //block and get all exceptions thrown while doInBackground()
659  } catch (CancellationException ex) {
660  logger.log(Level.INFO, "Loading local disks was canceled."); //NON-NLS
661  } catch (InterruptedException ex) {
662  logger.log(Level.INFO, "Loading local disks was interrupted."); //NON-NLS
663  } catch (Exception ex) {
664  logger.log(Level.SEVERE, "Fatal error when loading local disks", ex); //NON-NLS
665  } finally {
666  if (!this.isCancelled()) {
667  enableNext = false;
668  displayErrors();
669  worker = null;
670  loadingDisks = false;
671  disks = new ArrayList<>();
672  disks.addAll(physicalDrives);
673  disks.addAll(partitions);
674  if (disks.size() > 0) {
675  diskTable.setEnabled(true);
676  diskTable.clearSelection();
677  }
678  pathTextField.setText("");
679  fireUpdateEvent();
680  ready = true;
681  }
682  }
683  diskTable.revalidate();
684  }
685  }
686  }
687 }
void setValueAt(Object aValue, int rowIndex, int columnIndex)
static List< LocalDisk > getPhysicalDrives()
synchronized static Logger getLogger(String name)
Definition: Logger.java:161

Copyright © 2012-2016 Basis Technology. Generated on: Tue Jun 13 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.