dmolony-DiskBrowser/src/com/bytezone/diskbrowser/duplicates/DisksWindow.java

257 lines
7.9 KiB
Java
Raw Normal View History

2016-12-07 10:56:25 +00:00
package com.bytezone.diskbrowser.duplicates;
import java.awt.BorderLayout;
2016-12-10 07:36:44 +00:00
import java.awt.Color;
2016-12-12 10:53:28 +00:00
import java.awt.Dimension;
import java.awt.FlowLayout;
2016-12-10 07:36:44 +00:00
import java.awt.Rectangle;
2016-12-07 10:56:25 +00:00
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
2016-12-16 20:45:08 +00:00
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
2016-12-12 23:46:09 +00:00
import java.util.ArrayList;
2016-12-07 10:56:25 +00:00
import java.util.List;
2020-02-02 10:17:49 +00:00
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.ScrollPaneConstants;
2016-12-10 07:36:44 +00:00
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
2016-12-09 12:12:35 +00:00
import javax.swing.table.JTableHeader;
2016-12-12 07:43:19 +00:00
import javax.swing.table.TableColumnModel;
2016-12-10 07:36:44 +00:00
import javax.swing.table.TableRowSorter;
import com.bytezone.diskbrowser.gui.DuplicateAction.DiskTableSelectionListener;
2016-12-12 07:43:19 +00:00
import com.bytezone.diskbrowser.utilities.NumberRenderer;
2016-12-12 10:53:28 +00:00
import com.bytezone.diskbrowser.utilities.Utility;
2016-12-07 10:56:25 +00:00
2020-02-08 09:54:50 +00:00
// -----------------------------------------------------------------------------------//
2016-12-13 22:26:47 +00:00
public class DisksWindow extends JFrame
2020-02-08 09:54:50 +00:00
// -----------------------------------------------------------------------------------//
2016-12-07 10:56:25 +00:00
{
2016-12-09 11:31:03 +00:00
private final JTable table;
2016-12-07 10:56:25 +00:00
2016-12-10 07:36:44 +00:00
private final JButton btnExport = new JButton ("Export");
2016-12-16 20:45:08 +00:00
private final JButton btnDelete = new JButton ("Duplicates");
2016-12-10 07:36:44 +00:00
private final JButton btnHide = new JButton ("Close");
2016-12-13 22:26:47 +00:00
private final JButton btnTotals = new JButton ("Totals");
2016-12-12 10:53:28 +00:00
private final JPanel topPanel = new JPanel ();
2016-12-15 00:01:42 +00:00
2020-02-02 10:17:49 +00:00
private final List<JCheckBox> boxes = new ArrayList<> ();
2016-12-12 23:46:09 +00:00
private TableRowSorter<DiskTableModel> sorter;
private final CheckBoxActionListener checkBoxActionListener =
new CheckBoxActionListener ();
2016-12-15 00:01:42 +00:00
2016-12-13 03:36:26 +00:00
private DiskTableModel diskTableModel;
2016-12-13 22:26:47 +00:00
private final RootFolderData rootFolderData;
2016-12-16 20:45:08 +00:00
private final DeleteWindow deleteWindow;
2016-12-07 10:56:25 +00:00
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-13 22:26:47 +00:00
public DisksWindow (RootFolderData rootFolderData)
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-07 10:56:25 +00:00
{
2018-07-23 07:39:25 +00:00
super (rootFolderData.getRootFolderPathText ());
2016-12-13 22:26:47 +00:00
this.rootFolderData = rootFolderData;
2016-12-07 10:56:25 +00:00
2016-12-09 11:31:03 +00:00
table = new JTable ();
JScrollPane scrollPane =
new JScrollPane (table, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
2016-12-07 10:56:25 +00:00
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
2016-12-10 07:36:44 +00:00
2016-12-09 11:31:03 +00:00
table.setFillsViewportHeight (true);
2016-12-10 07:36:44 +00:00
table.setShowGrid (true);
table.setGridColor (Color.LIGHT_GRAY);
2016-12-09 11:31:03 +00:00
add (scrollPane, BorderLayout.CENTER);
2016-12-07 10:56:25 +00:00
JPanel panel = new JPanel ();
2016-12-13 22:26:47 +00:00
panel.add (btnTotals);
2016-12-10 07:36:44 +00:00
panel.add (btnHide);
panel.add (btnExport);
2016-12-16 20:45:08 +00:00
panel.add (btnDelete);
2016-12-07 10:56:25 +00:00
add (panel, BorderLayout.SOUTH);
2016-12-12 10:53:28 +00:00
topPanel.setLayout (new FlowLayout (FlowLayout.LEFT, 10, 5));
add (topPanel, BorderLayout.NORTH);
2016-12-10 07:36:44 +00:00
btnHide.setEnabled (true);
btnExport.setEnabled (false);
2016-12-07 10:56:25 +00:00
2016-12-13 22:26:47 +00:00
btnTotals.addActionListener (new ActionListener ()
{
@Override
public void actionPerformed (ActionEvent e)
{
DisksWindow.this.rootFolderData.dialogTotals.setVisible (true);
}
});
2016-12-10 07:36:44 +00:00
btnHide.addActionListener (new ActionListener ()
2016-12-07 10:56:25 +00:00
{
@Override
public void actionPerformed (ActionEvent e)
{
2016-12-12 23:46:09 +00:00
setVisible (false);
2016-12-07 10:56:25 +00:00
}
});
2016-12-16 20:45:08 +00:00
btnDelete.addActionListener (new ActionListener ()
{
@Override
public void actionPerformed (ActionEvent e)
{
deleteWindow.setVisible (true);
}
});
2016-12-13 03:36:26 +00:00
btnExport.addActionListener (new ActionListener ()
{
@Override
public void actionPerformed (ActionEvent e)
{
2016-12-13 10:03:15 +00:00
CSVFileWriter.write (diskTableModel, table);
2016-12-13 03:36:26 +00:00
}
});
2021-05-21 23:59:06 +00:00
scrollPane.setPreferredSize (new Dimension (1200, 693));
2016-12-07 10:56:25 +00:00
setDefaultCloseOperation (HIDE_ON_CLOSE);
2016-12-16 20:45:08 +00:00
deleteWindow = new DeleteWindow (rootFolderData);
2016-12-07 10:56:25 +00:00
}
2016-12-12 08:31:58 +00:00
// called from DuplicateSwingWorker
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-12 23:46:09 +00:00
public void setTableData (final RootFolderData rootFolderData)
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-07 10:56:25 +00:00
{
2016-12-13 03:36:26 +00:00
diskTableModel = new DiskTableModel (rootFolderData);
2016-12-12 08:31:58 +00:00
table.setModel (diskTableModel);
2016-12-10 07:36:44 +00:00
2016-12-15 07:27:38 +00:00
int[] columnWidths = { 300, 300, 30, 50, 30, 100 };
2016-12-12 07:43:19 +00:00
TableColumnModel tcm = table.getColumnModel ();
2016-12-10 07:36:44 +00:00
for (int i = 0; i < columnWidths.length; i++)
2016-12-12 07:43:19 +00:00
tcm.getColumn (i).setPreferredWidth (columnWidths[i]);
2016-12-15 00:01:42 +00:00
// extra column if doing checksums
if (rootFolderData.doChecksums)
2016-12-15 07:27:38 +00:00
tcm.getColumn (6).setPreferredWidth (tcm.getColumn (4).getPreferredWidth ());
2016-12-15 00:01:42 +00:00
2016-12-12 07:43:19 +00:00
tcm.getColumn (3).setCellRenderer (NumberRenderer.getIntegerRenderer ());
2016-12-10 07:36:44 +00:00
2016-12-12 23:46:09 +00:00
sorter = new TableRowSorter<DiskTableModel> ((DiskTableModel) table.getModel ());
2016-12-10 07:36:44 +00:00
table.setRowSorter (sorter);
ListSelectionModel listSelectionModel = table.getSelectionModel ();
listSelectionModel.addListSelectionListener (new ListSelectionListener ()
{
@Override
public void valueChanged (ListSelectionEvent e)
{
if (e.getValueIsAdjusting ())
return;
ListSelectionModel lsm = (ListSelectionModel) e.getSource ();
if (lsm.isSelectionEmpty ())
return;
table.scrollRectToVisible (
new Rectangle (table.getCellRect (lsm.getMinSelectionIndex (), 0, true)));
int selectedRow = table.getSelectedRow ();
int actualRow = sorter.convertRowIndexToModel (selectedRow);
DiskTableModel diskTableModel = (DiskTableModel) table.getModel ();
2016-12-15 00:01:42 +00:00
DiskDetails diskDetails = diskTableModel.getDiskDetails (actualRow);
2016-12-10 07:36:44 +00:00
2016-12-13 03:36:26 +00:00
long checksum = diskDetails.getChecksum ();
if (checksum == 0)
diskTableModel.updateChecksum (actualRow);
2016-12-12 23:46:09 +00:00
for (DiskTableSelectionListener listener : rootFolderData.listeners)
2016-12-10 07:36:44 +00:00
listener.diskSelected (diskDetails);
}
});
2016-12-09 12:12:35 +00:00
2016-12-16 20:45:08 +00:00
table.addMouseListener (new MouseAdapter ()
{
@Override
public void mousePressed (MouseEvent mouseEvent)
{
if (mouseEvent.getClickCount () == 2)
deleteWindow.setVisible (true);
}
});
2021-05-12 08:14:49 +00:00
for (int i = 0; i < Utility.getTotalSuffixes (); i++)
2016-12-12 10:53:28 +00:00
{
2016-12-13 10:03:15 +00:00
int total = rootFolderData.getTotalType (i);
2016-12-12 10:53:28 +00:00
JCheckBox btn =
2021-05-12 08:14:49 +00:00
new JCheckBox (String.format ("%s (%,d)", Utility.getSuffix (i), total));
2016-12-12 10:53:28 +00:00
topPanel.add (btn);
2016-12-12 23:46:09 +00:00
boxes.add (btn);
2016-12-12 10:53:28 +00:00
if (total > 0)
2016-12-12 23:46:09 +00:00
{
2016-12-12 10:53:28 +00:00
btn.setSelected (true);
2016-12-12 23:46:09 +00:00
btn.addActionListener (checkBoxActionListener);
}
else
btn.setEnabled (false);
2016-12-12 10:53:28 +00:00
}
2016-12-09 12:12:35 +00:00
JTableHeader header = table.getTableHeader ();
header.setFont (header.getFont ().deriveFont ((float) 13.0));
2016-12-12 10:53:28 +00:00
pack ();
setLocationRelativeTo (null);
2016-12-13 03:36:26 +00:00
btnExport.setEnabled (true);
2016-12-12 23:46:09 +00:00
2016-12-15 00:01:42 +00:00
setVisible (true);
2016-12-12 23:46:09 +00:00
}
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-12 23:46:09 +00:00
private String getFilterText ()
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-12 23:46:09 +00:00
{
StringBuilder filterText = new StringBuilder ();
2016-12-16 20:45:08 +00:00
2016-12-12 23:46:09 +00:00
for (JCheckBox box : boxes)
if (box.isSelected ())
{
String text = box.getText ();
int pos = text.indexOf (' ');
filterText.append (text.substring (0, pos) + "|");
}
if (filterText.length () > 0)
filterText.deleteCharAt (filterText.length () - 1);
return filterText.toString ();
}
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-12 23:46:09 +00:00
class CheckBoxActionListener implements ActionListener
2020-02-08 09:54:50 +00:00
// ---------------------------------------------------------------------------------//
2016-12-12 23:46:09 +00:00
{
@Override
public void actionPerformed (ActionEvent e)
{
RowFilter<DiskTableModel, Object> rf = null;
try
{
rf = RowFilter.regexFilter (getFilterText (), 2);
}
catch (java.util.regex.PatternSyntaxException exception)
{
return;
}
sorter.setRowFilter (rf);
}
2016-12-07 10:56:25 +00:00
}
2016-12-09 11:31:03 +00:00
}