package org.jabref.gui.maintable;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import javax.swing.JLabel;
import org.jabref.gui.GUIGlobals;
import org.jabref.gui.IconTheme;
import org.jabref.gui.externalfiletype.ExternalFileType;
import org.jabref.gui.filelist.FileListTableModel;
import org.jabref.gui.specialfields.SpecialFieldValueViewModel;
import org.jabref.gui.specialfields.SpecialFieldViewModel;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.FieldName;
import org.jabref.model.entry.specialfields.SpecialField;
class SpecialMainTableColumnsBuilder {
MainTableColumn buildNumberColumn() {
return new MainTableColumn(FieldName.NUMBER_COL) {
@Override
public Object getColumnValue(BibEntry entry) {
return "#";
}
@Override
public String getDisplayName() {
return "#";
}
}
;
}
MainTableColumn buildRankingColumn() {
return new MainTableColumn(SpecialField.RANKING.getFieldName(),
Collections.singletonList(SpecialField.RANKING.getFieldName()),
new JLabel(SpecialField.RANKING.getFieldName())) {
@Override
public Object getColumnValue(BibEntry entry) {
return entry.getField(SpecialField.RANKING.getFieldName())
.flatMap(SpecialField.RANKING::parse).map(rank -> new SpecialFieldValueViewModel(rank).createSpecialFieldValueLabel()).orElse(null);
}
};
}
MainTableColumn buildPriorityColumn() {
return new MainTableColumn(SpecialField.PRIORITY.getFieldName(),
Collections.singletonList(SpecialField.PRIORITY.getFieldName()),
new JLabel(new SpecialFieldViewModel(SpecialField.PRIORITY).getRepresentingIcon())) {
@Override
public Object getColumnValue(BibEntry entry) {
return entry.getField(SpecialField.PRIORITY.getFieldName())
.flatMap(SpecialField.PRIORITY::parse).map(prio -> new SpecialFieldValueViewModel(prio).createSpecialFieldValueLabel()).orElse(null);
}
};
}
MainTableColumn buildReadStatusColumn() {
return new MainTableColumn(SpecialField.READ_STATUS.getFieldName(),
Collections.singletonList(SpecialField.READ_STATUS.getFieldName()),
new JLabel(new SpecialFieldViewModel(SpecialField.READ_STATUS).getRepresentingIcon())) {
@Override
public Object getColumnValue(BibEntry entry) {
return entry.getField(SpecialField.READ_STATUS.getFieldName())
.flatMap(SpecialField.READ_STATUS::parse).map(status -> new SpecialFieldValueViewModel(status).createSpecialFieldValueLabel()).orElse(null);
}
};
}
MainTableColumn buildRelevanceColumn() {
return createIconColumn(SpecialField.RELEVANCE.getFieldName(),
Collections.singletonList(SpecialField.RELEVANCE.getFieldName()),
new JLabel(new SpecialFieldViewModel(SpecialField.RELEVANCE).getRepresentingIcon()));
}
MainTableColumn buildPrintedColumn() {
return createIconColumn(SpecialField.PRINTED.getFieldName(),
Collections.singletonList(SpecialField.PRINTED.getFieldName()),
new JLabel(new SpecialFieldViewModel(SpecialField.PRINTED).getRepresentingIcon()));
}
MainTableColumn buildQualityColumn() {
return createIconColumn(SpecialField.QUALITY.getFieldName(),
Collections.singletonList(SpecialField.QUALITY.getFieldName()),
new JLabel(new SpecialFieldViewModel(SpecialField.QUALITY).getRepresentingIcon()));
}
MainTableColumn buildFileColumn() {
return new MainTableColumn(FieldName.FILE,
Collections.singletonList(FieldName.FILE), new JLabel(IconTheme.JabRefIcon.FILE.getSmallIcon())) {
@Override
public Object getColumnValue(BibEntry entry) {
// We use a FileListTableModel to parse the field content:
FileListTableModel fileList = new FileListTableModel();
entry.getField(FieldName.FILE).ifPresent(fileList::setContent);
if (fileList.getRowCount() > 1) {
return new JLabel(IconTheme.JabRefIcon.FILE_MULTIPLE.getSmallIcon());
} else if (fileList.getRowCount() == 1) {
Optional<ExternalFileType> type = fileList.getEntry(0).getType();
if (type.isPresent()) {
return type.get().getIconLabel();
} else {
return new JLabel(IconTheme.JabRefIcon.FILE.getSmallIcon());
}
}
return null;
}
};
}
/**
* Creates a MainTableColumn which shows an icon instead textual content
*
* @param columnName the name of the column
* @param fields the entry fields which should be shown
* @return the crated MainTableColumn
*/
MainTableColumn createIconColumn(String columnName, List<String> fields, JLabel iconLabel) {
return new MainTableColumn(columnName, fields, iconLabel) {
@Override
public Object getColumnValue(BibEntry entry) {
JLabel iconLabel = null;
boolean iconFound = false;
// check for each field whether content is available
for (String field : fields) {
if (entry.hasField(field)) {
if (iconFound) {
return new JLabel(IconTheme.JabRefIcon.FILE_MULTIPLE.getSmallIcon());
} else {
iconLabel = GUIGlobals.getTableIcon(field);
iconFound = true;
}
}
}
return iconLabel;
}
};
}
/**
* create a MainTableColumn for specific file types.
* <p>
* Shows the icon for the given type (or the FILE_MULTIPLE icon)
*
* @param externalFileTypeName the name of the externalFileType
* @return the created MainTableColumn
*/
MainTableColumn createFileIconColumn(String externalFileTypeName) {
return new MainTableColumn(externalFileTypeName, Collections.singletonList(FieldName.FILE), new JLabel()) {
@Override
public boolean isFileFilter() {
return true;
}
@Override
public String getDisplayName() {
return externalFileTypeName;
}
@Override
public Object getColumnValue(BibEntry entry) {
boolean iconFound = false;
JLabel iconLabel = null;
FileListTableModel fileList = new FileListTableModel();
entry.getField(FieldName.FILE).ifPresent(fileList::setContent);
for (int i = 0; i < fileList.getRowCount(); i++) {
if ((fileList.getEntry(i).getType().isPresent())
&& externalFileTypeName.equalsIgnoreCase(fileList.getEntry(i).getType().get().getName())) {
if (iconFound) {
// already found another file of the desired type - show FILE_MULTIPLE Icon
return new JLabel(IconTheme.JabRefIcon.FILE_MULTIPLE.getSmallIcon());
} else {
iconLabel = fileList.getEntry(i).getType().get().getIconLabel();
iconFound = true;
}
}
}
return iconLabel;
}
};
}
}