package org.jabref.gui.maintable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.swing.JLabel;
import org.jabref.Globals;
import org.jabref.gui.IconTheme;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldName;
import org.jabref.preferences.JabRefPreferences;
import ca.odell.glazedlists.gui.TableFormat;
/**
* Class defining the contents and column headers of the main table.
*/
public class MainTableFormat implements TableFormat<BibEntry> {
// Values to gather iconImages for those columns
// These values are also used to put a heading into the table; see getColumnName(int)
private static final List<String> URL_FIRST = Arrays.asList(FieldName.URL, FieldName.DOI);
private static final List<String> DOI_FIRST = Arrays.asList(FieldName.DOI, FieldName.URL);
private static final List<String> ARXIV = Collections.singletonList(FieldName.EPRINT);
private final BibDatabase database;
private final List<MainTableColumn> tableColumns = new ArrayList<>();
public MainTableFormat(BibDatabase database) {
this.database = database;
}
@Override
public int getColumnCount() {
return tableColumns.size();
}
/**
* @return the string that should be put in the column header. null if field is empty.
*/
@Override
public String getColumnName(int col) {
return tableColumns.get(col).getDisplayName();
}
public MainTableColumn getTableColumn(int index) {
return tableColumns.get(index);
}
/**
* Finds the column index for the given column name.
*
* @param colName The column name
* @return The column index if any, or -1 if no column has that name.
*/
public int getColumnIndex(String colName) {
for (MainTableColumn tableColumn : tableColumns) {
if (tableColumn.getColumnName().equalsIgnoreCase(colName)) {
return tableColumns.lastIndexOf(tableColumn);
}
}
return -1;
}
@Override
public Object getColumnValue(BibEntry be, int col) {
return tableColumns.get(col).getColumnValue(be);
}
public void updateTableFormat() {
// clear existing column configuration
tableColumns.clear();
SpecialMainTableColumnsBuilder builder = new SpecialMainTableColumnsBuilder();
// Add numbering column to tableColumns
tableColumns.add(builder.buildNumberColumn());
// Add all file based columns
if (Globals.prefs.getBoolean(JabRefPreferences.FILE_COLUMN)) {
tableColumns.add(builder.buildFileColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.URL_COLUMN)) {
if (Globals.prefs.getBoolean(JabRefPreferences.PREFER_URL_DOI)) {
tableColumns.add(builder
.createIconColumn(JabRefPreferences.URL_COLUMN, MainTableFormat.DOI_FIRST,
new JLabel(IconTheme.JabRefIcon.DOI.getSmallIcon())));
} else {
tableColumns.add(builder
.createIconColumn(JabRefPreferences.URL_COLUMN, MainTableFormat.URL_FIRST,
new JLabel(IconTheme.JabRefIcon.WWW.getSmallIcon())));
}
}
if (Globals.prefs.getBoolean(JabRefPreferences.ARXIV_COLUMN)) {
tableColumns.add(builder
.createIconColumn(JabRefPreferences.ARXIV_COLUMN, MainTableFormat.ARXIV,
new JLabel(IconTheme.JabRefIcon.WWW.getSmallIcon())));
}
if (Globals.prefs.getBoolean(JabRefPreferences.EXTRA_FILE_COLUMNS)) {
List<String> desiredColumns = Globals.prefs.getStringList(JabRefPreferences.LIST_OF_FILE_COLUMNS);
for (String desiredColumn : desiredColumns) {
tableColumns.add(builder.createFileIconColumn(desiredColumn));
}
}
// Add 'normal' bibtex fields as configured in the preferences
// Read table columns from prefs:
List<String> colSettings = Globals.prefs.getStringList(JabRefPreferences.COLUMN_NAMES);
for (String columnName : colSettings) {
// stored column name will be used as columnName
// There might be more than one field to display, e.g., "author/editor" or "date/year" - so split
// at MainTableFormat.COL_DEFINITION_FIELD_SEPARATOR
String[] fields = columnName.split(FieldName.FIELD_SEPARATOR);
tableColumns.add(new MainTableColumn(columnName, Arrays.asList(fields), database));
}
// Add the "special" icon columns (e.g., ranking, file, ...) that are enabled in preferences.
if (Globals.prefs.getBoolean(JabRefPreferences.SPECIALFIELDSENABLED)) {
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RANKING)) {
tableColumns.add(builder.buildRankingColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_RELEVANCE)) {
tableColumns.add(builder.buildRelevanceColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_QUALITY)) {
tableColumns.add(builder.buildQualityColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRIORITY)) {
tableColumns.add(builder.buildPriorityColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_PRINTED)) {
tableColumns.add(builder.buildPrintedColumn());
}
if (Globals.prefs.getBoolean(JabRefPreferences.SHOWCOLUMN_READ)) {
tableColumns.add(builder.buildReadStatusColumn());
}
}
}
}