package com.limegroup.gnutella.gui.library; import java.io.File; import javax.swing.JTable; import javax.swing.ListSelectionModel; import com.limegroup.gnutella.FileDesc; import com.limegroup.gnutella.gui.tables.ColoredCellImpl; import com.limegroup.gnutella.gui.tables.DataLine; import com.limegroup.gnutella.gui.tables.HashBasedDataLineModel; import com.limegroup.gnutella.gui.tables.SizeHolder; /** * Library specific DataLineModel. * Uses HashBasedDataLineModel instead of BasicDataLineModel * for quicker access to row's based on the file. */ //2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678| final class LibraryTableModel extends HashBasedDataLineModel { /** * The table this model is used for. * (Needed to make sure isCellEditable * is only true when a single thing is selected.) */ private JTable _table; LibraryTableModel() { super(LibraryTableDataLine.class); } /** * Creates a new LibraryTableDataLine */ public DataLine createDataLine() { return new LibraryTableDataLine(this); } /** * Set the table this model is used for * Needed for isCellEditable to work */ void setTable(JTable table) { _table = table; } /** * Override the normal refresh. * Because the DataLine's don't cache any data, * we can just call update & they'll show the correct info * now. */ public Object refresh() { fireTableRowsUpdated(0, getRowCount()); return null; } /** * OVerride default so new ones get added to the end */ public int add(Object o) { return add(o, getRowCount()); } /** * Override the dataline add so we can re-initialize files * to include the FileDesc. Necessary for changing pending status * to shared status. */ public int add(DataLine dl, int row) { Object init = dl.getInitializeObject(); if ( !contains(init) ) { return forceAdd(dl, row); } else { FileDesc fd = ((LibraryTableDataLine)dl).getFileDesc(); if ( fd != null ) { row = getRow(init); get( row ).initialize(fd); fireTableRowsUpdated( row, row ); } // we aren't going to use this dl, so clean it up. dl.cleanup(); } return -1; } /** * Reinitializes a dataline that is using the given initialize object. */ void reinitialize(File f) { if(contains(f)) { int row = getRow(f); get(row).initialize(f); fireTableRowsUpdated(row, row); } } /** * Reinitializes a dataline from using one file to use another. */ void reinitialize(File old, File now) { if(contains(old)) { int row = getRow(old); get(row).initialize(now); initializeObjectChanged(old, now); fireTableRowsUpdated(row, row); } } /** * Returns the file extension for the given row. * * @param row The row of the file * * @return A <code>String</code> object containing the file extension */ String getType(int row) { return (String)( (ColoredCellImpl)get(row).getValueAt( LibraryTableDataLine.TYPE_IDX)).getValue(); } /** * Returns the file object stored in the given row. * * @param row The row of the file * * @return The <code>File</code> object stored at the specified row */ File getFile(int row) { return (File)get(row).getInitializeObject(); } /** * Returns the name of the file at the given row. * * @param row The row of the file * * @return A <code>String</code> object containing the name of the file */ String getName(int row) { return (String)( (ColoredCellImpl)get(row).getValueAt( LibraryTableDataLine.NAME_IDX)).getValue(); } /** * Returns the name of the file at the given row. * * @param row The row of the file * * @return An <code>int</code> containing the size of the file */ long getSize(int row) { return ((SizeHolder)( (ColoredCellImpl)get(row).getValueAt( LibraryTableDataLine.SIZE_IDX)).getValue()).getSize(); } FileDesc getFileDesc(int row) { return ((LibraryTableDataLine)get(row)).getFileDesc(); } /** * Returns a boolean specifying whether or not specific cell in the table * is editable. * * @param row the row of the table to access * * @param col the column of the table to access * * @return <code>true</code> if the specified cell is editable, * <code>false</code> otherwise */ public boolean isCellEditable(int row, int col) { // disallow changing the name of incomplete files... // too many problems. if (LibraryMediator.incompleteDirectoryIsSelected()) return false; if (getFile(row).isDirectory()) return false; ListSelectionModel selModel = _table.getSelectionModel(); int min = selModel.getMinSelectionIndex(); int max = selModel.getMaxSelectionIndex(); return min == max && col == LibraryTableDataLine.NAME_IDX && _table.getSelectedRow() == row; } }