package net.sf.jabref.gui;
import java.util.Vector;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import net.sf.jabref.Globals;
/**
* Listens for TableColumnModelEvents to keep track of changes made to the
* MainTable columns, like reordering or resizing.
*
* Changes to columns without a name and the "#" column are not saved. To have
* consistent behavior (e.g. as in TableColumnsTab).
*
* @author Fabian Bieker
* @author Daniel Waeber
* @since 12/2008
*
*/
public class PersistenceTableColumnListener implements TableColumnModelListener {
public static final String ACTIVATE_PREF_KEY =
"ActivatePersistenceTableColumnListener";
public static final boolean DEFAULT_ENABLED = true;
private static final String simpleClassName =
PersistenceTableColumnListener.class.getSimpleName();
// needed to get column names / indices mapped from view to model
// and to access the table model
private final MainTable mainTable;
/**
* @param mainTable
*/
public PersistenceTableColumnListener(final MainTable mainTable) {
this.mainTable = mainTable;
}
/**
* update columns names and their width, store it in the global prefs.
*/
private void updateColumnPrefs() {
final int columnCount = mainTable.getColumnCount();
Vector<String> storedColumns = new Vector<String>(columnCount - 1);
Vector<String> columnsWidths = new Vector<String>(columnCount - 1);
int ncWidth = -1;
for (int i = 0; i < columnCount; i++) {
final String name = mainTable.getColumnName(i);
if (name == null || name.equals("")) {
continue;
} else if (name.equals("#")) { // TODO: get "#" from prefs?
ncWidth = mainTable.getColumnModel().getColumn(i).getWidth();
} else {
storedColumns.add(name.toLowerCase());
columnsWidths.add(String.valueOf(mainTable.getColumnModel().getColumn(
i).getWidth()));
}
}
// Finally, we store the new preferences.
Globals.prefs.putStringArray("columnNames",
storedColumns.toArray(new String[0]));
Globals.prefs.putStringArray("columnWidths",
columnsWidths.toArray(new String[0]));
// width of the number ("#") column
Globals.prefs.putInt("numberColWidth", ncWidth);
}
/**
* @see javax.swing.event.TableColumnModelListener#columnAdded(javax.swing.event.TableColumnModelEvent)
*/
public void columnAdded(TableColumnModelEvent e) {
assert e != null : simpleClassName + " received null event";
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.swing.event.ChangeEvent)
*/
public void columnMarginChanged(ChangeEvent e) {
assert e != null : simpleClassName + " received null event";
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event.TableColumnModelEvent)
*/
public void columnMoved(TableColumnModelEvent e) {
assert e != null : simpleClassName + " received null event";
// not really moved, ignore ...
if (e.getFromIndex() == e.getToIndex())
return;
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.event.TableColumnModelEvent)
*/
public void columnRemoved(TableColumnModelEvent e) {
assert e != null : simpleClassName + " received null event";
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax.swing.event.ListSelectionEvent)
*/
public void columnSelectionChanged(ListSelectionEvent e) {
// ignore
}
}