package org.rr.jeborker.gui.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.event.EventListenerList; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import org.apache.commons.lang.ObjectUtils; import org.rr.commons.collection.BlindElementList; import org.rr.commons.collection.CacheValueList; import org.rr.commons.collection.CompoundList; import org.rr.commons.collection.TransformValueList; import org.rr.commons.mufs.IResourceHandler; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.db.item.EbookPropertyItemUtils; public class EbookPropertyFileTableModel extends AbstractEbookPropertyTableModel { private List<EbookPropertyItem> ebookPropertyItems; /** List of listeners */ protected EventListenerList listenerList = new EventListenerList(); public EbookPropertyFileTableModel(List<IResourceHandler> resources) { ebookPropertyItems = new CacheValueList<EbookPropertyItem>(new TransformValueList<IResourceHandler, EbookPropertyItem>(resources) { @Override public EbookPropertyItem transform(IResourceHandler fileResource) { return EbookPropertyItemUtils.createEbookPropertyItem(fileResource, fileResource.getParentResource()); } }); } /** * Adds a listener to the list that's notified each time a change to the data model occurs. * * @param l the TableModelListener */ @Override public void addTableModelListener(TableModelListener l) { listenerList.add(TableModelListener.class, l); } @Override public Class<?> getColumnClass(int columnIndex) { return String.class; } @Override public int getColumnCount() { return 1; } @Override public String getColumnName(int columnIndex) { return Bundle.getString("EbookPropertyDBTableModel.headline"); } @Override public int getRowCount() { return ebookPropertyItems.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return ebookPropertyItems.get(rowIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if(columnIndex == 0) { return true; } return false; } /** * Removes a listener from the list that's notified each time a change to the data model occurs. * * @param l the TableModelListener */ public void removeTableModelListener(TableModelListener l) { listenerList.remove(TableModelListener.class, l); } @Override public void setValueAt(Object arg0, int row, int column) { fireTableCellUpdated(row, column); } /** * Notifies all listeners that the value of the cell at <code>[row, column]</code> has been updated. * * @param row row of cell which has been updated * @param column column of cell which has been updated * @see TableModelEvent * @see EventListenerList */ public void fireTableCellUpdated(int row, int column) { fireTableChanged(new TableModelEvent(this, row, row, column)); } /** * Forwards the given notification event to all <code>TableModelListeners</code> that registered themselves as listeners for this table * model. * * @param e the event to be forwarded * * @see #addTableModelListener * @see TableModelEvent * @see EventListenerList */ public void fireTableChanged(TableModelEvent e) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == TableModelListener.class) { ((TableModelListener) listeners[i + 1]).tableChanged(e); } } } /** * Notifies all listeners that rows in the range <code>[firstRow, lastRow]</code>, inclusive, have been inserted. * * @param firstRow the first row * @param lastRow the last row * * @see TableModelEvent * @see EventListenerList */ public void fireTableRowsInserted(int firstRow, int lastRow) { fireTableChanged(new TableModelEvent(this, firstRow, lastRow + 1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); } /** * Notifies all listeners that rows in the range <code>[firstRow, lastRow]</code>, inclusive, have been deleted. * * @param firstRow the first row * @param lastRow the last row * * @see TableModelEvent * @see EventListenerList */ public void fireTableRowsDeleted(int firstRow, int lastRow) { fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE)); } @Override public void reloadEbookPropertyItemAt(int rowIndex) { IResourceHandler resource = ebookPropertyItems.get(rowIndex).getResourceHandler(); ArrayList<EbookPropertyItem> ebookPropertyItems = new ArrayList<>(this.ebookPropertyItems); ebookPropertyItems.set(rowIndex, EbookPropertyItemUtils.createEbookPropertyItem(resource, resource.getParentResource())); } @Override public EbookPropertyItem getEbookPropertyItemAt(int rowIndex) { return ebookPropertyItems.get(rowIndex); } @Override public void addRow(EbookPropertyItem item, int row) { ebookPropertyItems = new CompoundList<>(ebookPropertyItems, Collections.singletonList(item)); fireTableRowsInserted(ebookPropertyItems.size() -1, ebookPropertyItems.size()); } @Override public int searchRow(EbookPropertyItem item) { for (int i = 0; i < ebookPropertyItems.size(); i++) { EbookPropertyItem ebookPropertyItem = ebookPropertyItems.get(i); if(ObjectUtils.equals(item, ebookPropertyItem)) { return i; } } return -1; } @Override public boolean removeRow(EbookPropertyItem item) { int row = searchRow(item); if(row >= 0) { ebookPropertyItems = new BlindElementList<>(ebookPropertyItems, row); fireTableRowsDeleted(row, row); return true; } return false; } }