package org.jabref.gui.maintable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import org.jabref.Globals;
import org.jabref.model.entry.FieldName;
import org.jabref.preferences.JabRefPreferences;
/**
* 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 {
private static final String RECEIVED_NULL_EVENT = " received null event";
private static final String SIMPLE_CLASS_NAME = 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();
List<String> storedColumns = new ArrayList<>(columnCount - 1);
List<String> columnsWidths = new ArrayList<>(columnCount - 1);
int ncWidth = -1;
for (int i = 0; i < columnCount; i++) {
final String name = mainTable.getColumnName(i);
if ((name != null) && !name.isEmpty()) {
if (FieldName.NUMBER_COL.equals(name)) {
ncWidth = mainTable.getColumnModel().getColumn(i).getWidth();
} else {
storedColumns.add(name.toLowerCase(Locale.ROOT));
columnsWidths.add(String.valueOf(mainTable.getColumnModel().getColumn(i).getWidth()));
}
}
}
// Finally, we store the new preferences.
Globals.prefs.putStringList(JabRefPreferences.COLUMN_NAMES, storedColumns);
Globals.prefs.putStringList(JabRefPreferences.COLUMN_WIDTHS, columnsWidths);
// width of the number ("#") column
Globals.prefs.putInt(JabRefPreferences.NUMBER_COL_WIDTH, ncWidth);
}
/**
* @see javax.swing.event.TableColumnModelListener#columnAdded(javax.swing.event.TableColumnModelEvent)
*/
@Override
public void columnAdded(TableColumnModelEvent e) {
assert e != null : PersistenceTableColumnListener.SIMPLE_CLASS_NAME + RECEIVED_NULL_EVENT;
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.swing.event.ChangeEvent)
*/
@Override
public void columnMarginChanged(ChangeEvent e) {
assert e != null : PersistenceTableColumnListener.SIMPLE_CLASS_NAME + RECEIVED_NULL_EVENT;
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event.TableColumnModelEvent)
*/
@Override
public void columnMoved(TableColumnModelEvent e) {
assert e != null : PersistenceTableColumnListener.SIMPLE_CLASS_NAME + RECEIVED_NULL_EVENT;
// not really moved, ignore ...
if (e.getFromIndex() == e.getToIndex()) {
return;
}
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.event.TableColumnModelEvent)
*/
@Override
public void columnRemoved(TableColumnModelEvent e) {
assert e != null : PersistenceTableColumnListener.SIMPLE_CLASS_NAME + RECEIVED_NULL_EVENT;
updateColumnPrefs();
}
/**
* @see javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax.swing.event.ListSelectionEvent)
*/
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
// ignore
}
}