package org.freehep.swing.table.test; import java.io.File; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.ListIterator; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import junit.framework.TestCase; import org.freehep.swing.popup.PopupListener; import org.freehep.swing.table.DefaultSortableTableModel; import org.freehep.swing.table.TableColumnPacker; import org.freehep.swing.table.TableColumnSelector; import org.freehep.swing.table.TableSorter; /** * A Test routine for the Table Column Packer. * * @author Mark Donszelmann * @version $Id: DirectoryList.java 10766 2007-06-02 17:29:04Z tonyj $ */ public class DirectoryList extends TestCase { private static JTable table; private static File dir = new File("."); private static List files() { File[] list = dir.listFiles(); return Arrays.asList(list); } public void testMain() { DirectoryList.main(null); } public static void main(String[] args) { List dir = files(); final DirectoryTableModel model = new DirectoryTableModel(dir); TableColumnSelector selector = new TableColumnSelector(model); DefaultSortableTableModel sm = new DefaultSortableTableModel(selector.getFilteredTableModel()); final TableColumnPacker packer = new TableColumnPacker(); packer.setHeaderMargin(15); table = new JTable(sm) { public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); packer.packColumns(table); } }; table.addMouseListener(new PopupListener(selector.createPopupMenu())); new TableSorter(table); JFrame frame = new JFrame("Directory List"); frame.setContentPane(new JScrollPane(table)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); // Main thread continues in background to update display //Thread.currentThread().setDaemon(true); while (true) { try { Thread.sleep(1000); final List list = files(); Runnable r = new Runnable() { public void run() { model.update(list); } }; SwingUtilities.invokeAndWait(r); } catch (Exception x) { x.printStackTrace(); } } } private static class DirectoryTableModel extends AbstractTableModel { private List files; private String[] headers = { "name", "size", "dir", "r/o", "hidden", "modified", "path" }; private Class[] types = { String.class, Long.class, Boolean.class, Boolean.class , Boolean.class, Date.class, String.class }; DirectoryTableModel(List files) { this.files = files; } void update(List newFiles) { ListIterator i1 = files.listIterator(); ListIterator i2 = newFiles.listIterator(); int row = 0; File file1 = null; File file2 = null; boolean advance1 = true; boolean advance2 = true; while (true) { if (advance1) { if (i1.hasNext()) { file1 = (File) i1.next(); } else file1 = null; } if (advance2) { if (i2.hasNext()) { file2 = (File) i2.next(); } else file2 = null; } if ((file1 == null) && (file2 == null)) break; int c = file1.getName().compareTo(file2.getName()); if (c < 0) { i1.remove(); fireTableRowsDeleted(row,row); advance1 = true; advance2 = false; } else if (c == 0) { if (!file1.equals(file2)) { i1.set(file2); fireTableRowsUpdated(row,row); } row++; advance1 = advance2 = true; } else if (c > 0) { i1.add(file2); fireTableRowsInserted(row,row); row++; advance1 = false; advance2 = true; } } } public int getColumnCount() { return headers.length; } public Class getColumnClass(int col) { return types[col]; } public String getColumnName(int col) { return headers[col]; } public int getRowCount() { return files.size(); } public Object getValueAt(int row, int col) { File file = (File) files.get(row); switch (col) { case 0: return file.getName(); case 1: return new Long(file.length()); case 2: return new Boolean(file.isDirectory()); case 3: return new Boolean(!file.canWrite()); case 4: return new Boolean(file.isHidden()); case 5: return new Date(file.lastModified()); case 6: return file.getAbsolutePath(); default: return "N/A"; } } } }