Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reorderable columns in maintable for groups, URI, file and eprint #5544

Merged
merged 17 commits into from
Nov 10, 2019
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fixed persistent state
calixtus committed Nov 1, 2019
commit bf4b02e128043080f3cedb062030ea016e758602
Original file line number Diff line number Diff line change
@@ -5,11 +5,7 @@
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.beans.value.ObservableValue;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;

import org.jabref.gui.icon.JabRefIcon;
import org.jabref.logic.layout.LayoutFormatter;
import org.jabref.logic.layout.format.LatexToUnicodeFormatter;
import org.jabref.model.database.BibDatabase;
@@ -22,27 +18,20 @@
/**
* A column that displays the text-value of the field
*/
public class NormalTableColumn extends TableColumn<BibEntryTableViewModel, String> {
public class FieldColumn extends MainTableColumn<String> {

private final OrFields bibtexFields;

private final boolean isIconColumn;

private final Optional<JabRefIcon> iconLabel;

private final Optional<BibDatabase> database;

private final LayoutFormatter toUnicode = new LatexToUnicodeFormatter();
private final String columnName;

public NormalTableColumn(String columnName, OrFields bibtexFields, BibDatabase database) {
this.columnName = columnName;
public FieldColumn(MainTableColumnModel model, OrFields bibtexFields, BibDatabase database) {
super(model);
this.bibtexFields = bibtexFields;
this.isIconColumn = false;
this.iconLabel = Optional.empty();
this.database = Optional.of(database);

setText(columnName);
setText(getDisplayName());
setCellValueFactory(param -> getColumnValue(param.getValue()));
}

@@ -51,16 +40,15 @@ public NormalTableColumn(String columnName, OrFields bibtexFields, BibDatabase d
*
* @return name to be displayed. null if field is empty.
*/
public String getDisplayName() {
return bibtexFields.getDisplayName();
}
@Override
public String getDisplayName() { return bibtexFields.getDisplayName(); }

public ObservableValue<String> getColumnValue(BibEntryTableViewModel entry) {
if (bibtexFields.isEmpty()) {
return null;
}

ObjectBinding<Field>[] dependencies = bibtexFields.stream().map(entry::getField).toArray(ObjectBinding[]::new);
ObjectBinding[] dependencies = bibtexFields.stream().map(entry::getField).toArray(ObjectBinding[]::new);
return Bindings.createStringBinding(() -> computeText(entry), dependencies);
}

@@ -88,14 +76,6 @@ private String computeText(BibEntryTableViewModel entry) {
return result;
}

public Node getHeaderLabel() {
if (isIconColumn) {
return iconLabel.map(JabRefIcon::getGraphicNode).get();
} else {
return new Label(getDisplayName());
}
}

/**
* Check if the value returned by getColumnValue() is the same as a simple check of the entry's field(s) would give
* The reasons for being different are (combinations may also happen): - The entry has a crossref where the field
@@ -131,7 +111,4 @@ public boolean isResolved(BibEntry entry) {
return (!resolvedFieldContent.equals(plainFieldContent));
}

public String getColumnName() {
return columnName;
}
}
35 changes: 35 additions & 0 deletions src/main/java/org/jabref/gui/maintable/MainTableColumn.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.jabref.gui.maintable;

import java.util.Optional;

import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;

import org.jabref.gui.icon.JabRefIcon;

public class MainTableColumn<T> extends TableColumn<BibEntryTableViewModel, T> {

private MainTableColumnModel model;

private final Optional<JabRefIcon> iconLabel;

public MainTableColumn(MainTableColumnModel model) {
this.model = model;
this.iconLabel = Optional.empty();
}

public MainTableColumnModel getModel() { return model; }

public Node getHeaderLabel() {
if (model.getType() == MainTableColumnModel.Type.GROUPS || model.getType() == MainTableColumnModel.Type.FILES) {
return iconLabel.map(JabRefIcon::getGraphicNode).get();
} else {
return new Label(model.getDisplayName());
}
}

public String getDisplayName() {
return model.getDisplayName();
}
}
29 changes: 16 additions & 13 deletions src/main/java/org/jabref/gui/maintable/MainTableColumnFactory.java
Original file line number Diff line number Diff line change
@@ -88,8 +88,8 @@ public MainTableColumnFactory(BibDatabaseContext database, ColumnPreferences pre
case GROUPS:
columns.add(createGroupColumn());
break;
case FILE:
columns.add(createFileColumn());
case FILES:
columns.add(createFilesColumn());
break;
case LINKED_IDENTIFIER:
columns.add(createIdentifierColumn());
@@ -106,14 +106,14 @@ public MainTableColumnFactory(BibDatabaseContext database, ColumnPreferences pre
columns.add(createSpecialFieldColumn((SpecialField) field));
} else {
LOGGER.warn(Localization.lang("Special field type %0 is unknown. Using normal column type.", column.getName()));
columns.add(createNormalColumn(field));
columns.add(createFieldColumn(field));
}
}
break;
case NORMALFIELD:
if (!column.getName().equals("")) {
field = FieldFactory.parseField(column.getName());
columns.add(createNormalColumn(field));
columns.add(createFieldColumn(field));
}
break;
default:
@@ -134,7 +134,7 @@ private void setExactWidth(TableColumn<?, ?> column, int width) {
* Creates a column for group color bars.
*/
private TableColumn<BibEntryTableViewModel, ?> createGroupColumn() {
TableColumn<BibEntryTableViewModel, List<AbstractGroup>> column = new TableColumn<>();
TableColumn<BibEntryTableViewModel, List<AbstractGroup>> column = new MainTableColumn<>(new MainTableColumnModel(MainTableColumnModel.Type.GROUPS));
Node headerGraphic = IconTheme.JabRefIcons.DEFAULT_GROUP_ICON.getGraphicNode();
Tooltip.install(headerGraphic, new Tooltip(Localization.lang("Group color")));
column.setGraphic(headerGraphic);
@@ -185,9 +185,12 @@ private Node createGroupColorRegion(BibEntryTableViewModel entry, List<AbstractG
/**
* Creates a text column to display any standard field.
*/
private TableColumn<BibEntryTableViewModel, ?> createNormalColumn(Field field) {
private TableColumn<BibEntryTableViewModel, ?> createFieldColumn(Field field) {
String columnName = field.getName();
NormalTableColumn column = new NormalTableColumn(columnName, FieldFactory.parseOrFields(columnName), database.getDatabase());
FieldColumn column = new FieldColumn(new MainTableColumnModel(
MainTableColumnModel.Type.NORMALFIELD, columnName),
FieldFactory.parseOrFields(columnName),
database.getDatabase());
new ValueTableCellFactory<BibEntryTableViewModel, String>()
.withText(text -> text)
.install(column);
@@ -200,8 +203,8 @@ private Node createGroupColorRegion(BibEntryTableViewModel entry, List<AbstractG
* Creates a column for all the linked files. Instead of creating a column for a single file type, like
* {@code createExtraFileColumn} does, this creates one single column collecting all file links.
*/
private TableColumn<BibEntryTableViewModel, List<LinkedFile>> createFileColumn() {
TableColumn<BibEntryTableViewModel, List<LinkedFile>> column = new TableColumn<>();
private TableColumn<BibEntryTableViewModel, List<LinkedFile>> createFilesColumn() {
TableColumn<BibEntryTableViewModel, List<LinkedFile>> column = new MainTableColumn<>(new MainTableColumnModel(MainTableColumnModel.Type.FILES));
Node headerGraphic = IconTheme.JabRefIcons.FILE.getGraphicNode();
Tooltip.install(headerGraphic, new Tooltip(Localization.lang("Linked files")));
column.setGraphic(headerGraphic);
@@ -265,7 +268,7 @@ private Node createFileIcon(List<LinkedFile> linkedFiles) {
* Creates a column for all the linked files of a single file type.
*/
private TableColumn<BibEntryTableViewModel, List<LinkedFile>> createExtraFileColumn(String externalFileTypeName) {
TableColumn<BibEntryTableViewModel, List<LinkedFile>> column = new TableColumn<>();
TableColumn<BibEntryTableViewModel, List<LinkedFile>> column = new MainTableColumn<>(new MainTableColumnModel(MainTableColumnModel.Type.EXTRAFILE, externalFileTypeName));
column.setGraphic(externalFileTypes
.getExternalFileTypeByName(externalFileTypeName)
.map(ExternalFileType::getIcon).orElse(IconTheme.JabRefIcons.FILE)
@@ -284,7 +287,7 @@ private TableColumn<BibEntryTableViewModel, List<LinkedFile>> createExtraFileCol
* Creates a clickable icons column for DOIs, URLs, URIs and EPrints.
*/
private TableColumn<BibEntryTableViewModel, Map<Field, String>> createIdentifierColumn() {
TableColumn<BibEntryTableViewModel, Map<Field, String>> column = new TableColumn<>();
TableColumn<BibEntryTableViewModel, Map<Field, String>> column = new MainTableColumn<>(new MainTableColumnModel(MainTableColumnModel.Type.LINKED_IDENTIFIER));
Node headerGraphic = IconTheme.JabRefIcons.WWW.getGraphicNode();
Tooltip.install(headerGraphic, new Tooltip(Localization.lang("Linked identifiers")));
column.setGraphic(headerGraphic);
@@ -333,10 +336,10 @@ private ContextMenu createIdentifierMenu(BibEntryTableViewModel entry, Map<Field
}

/**
* A column that displays a specialField
* A column that displays a SpecialField
*/
private TableColumn<BibEntryTableViewModel, Optional<SpecialFieldValueViewModel>> createSpecialFieldColumn(SpecialField specialField) {
TableColumn<BibEntryTableViewModel, Optional<SpecialFieldValueViewModel>> column = new TableColumn<>();
TableColumn<BibEntryTableViewModel, Optional<SpecialFieldValueViewModel>> column = new MainTableColumn<>(new MainTableColumnModel(MainTableColumnModel.Type.SPECIALFIELD, specialField.getName()));
SpecialFieldViewModel specialFieldViewModel = new SpecialFieldViewModel(specialField, undoManager);
Node headerGraphic = specialFieldViewModel.getIcon().getGraphicNode();
Tooltip.install(headerGraphic, new Tooltip(specialFieldViewModel.getLocalization()));
14 changes: 10 additions & 4 deletions src/main/java/org/jabref/gui/maintable/MainTableColumnModel.java
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ public class MainTableColumnModel {

public enum Type {
EXTRAFILE("extrafile", Localization.lang("File type")),
FILE("files", Localization.lang("Linked files")),
FILES("files", Localization.lang("Linked files")),
GROUPS("groups", Localization.lang("Groups")),
LINKED_IDENTIFIER("linked_id", Localization.lang("Linked identifiers")),
NORMALFIELD("field"),
@@ -40,7 +40,7 @@ public String getDisplayName() {
public static Type parse(String text) {
switch (text) {
case "groups": return GROUPS;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can use Enum.valueOf() to parse enum keys stored in strings (see for example the group mode union/intersection) thing.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will look into this. A very first try did not work. I probably have to put the enum in an extra file.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You have to call .name() on the enum keys for storing.
like here:

    public void setGroupViewMode(GroupViewMode mode) {
        put(GROUP_INTERSECT_UNION_VIEW_MODE, mode.name());
    }

Copy link
Member Author

@calixtus calixtus Nov 2, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

valueOf did not really work, as it parses only the name of the constant, but the text is different from the constant name ("linked_id" instead of "LINKED_IDENTIFIER" and "field" instead of "NORMALFIELD"). But I found another solution (with a little inspiration of stackoverflow) which should be somewhat a generic approach.

case "files": return FILE;
case "files": return FILES;
case "extrafile": return EXTRAFILE;
case "linked_id": return LINKED_IDENTIFIER;
case "special": return SPECIALFIELD;
@@ -58,7 +58,7 @@ public MainTableColumnModel(String rawColumnName) {

String[] splitname = rawColumnName.split(ColumnPreferences.QUALIFIER_SEPARATOR);
type = Type.parse(splitname[0]);
if (type == Type.GROUPS || type == Type.FILE || type == Type.LINKED_IDENTIFIER) {
if (type == Type.GROUPS || type == Type.FILES || type == Type.LINKED_IDENTIFIER) {
name = "";
} else {
if (splitname.length == 1) {
@@ -76,12 +76,18 @@ public MainTableColumnModel(Type type, String name) {
this.name = name;
}

public MainTableColumnModel(Type type) {
Objects.requireNonNull(type);
this.type = type;
this.name = "";
}

public Type getType() { return type; }

public String getName() { return name; }

public String getDisplayName() {
if ((type == Type.GROUPS || type == Type.FILE || type == Type.LINKED_IDENTIFIER) && name.isBlank()) {
if ((type == Type.GROUPS || type == Type.FILES || type == Type.LINKED_IDENTIFIER) && name.isBlank()) {
return type.getDisplayName();
} else {
return FieldsUtil.getNameWithType(FieldFactory.parseField(name));
Original file line number Diff line number Diff line change
@@ -57,12 +57,8 @@ private void updateColumnPreferences() {
List<String> columnsWidths = new ArrayList<>();

for (TableColumn<BibEntryTableViewModel, ?> column : mainTable.getColumns()) {
if (column instanceof NormalTableColumn) {
NormalTableColumn normalColumn = (NormalTableColumn) column;

columnNames.add(normalColumn.getColumnName());
columnsWidths.add(String.valueOf(Double.valueOf(normalColumn.getWidth()).intValue()));
}
columnNames.add(((MainTableColumn) column).getModel().toString());
columnsWidths.add(String.valueOf(Double.valueOf(column.getWidth()).intValue()));
}

if ((columnNames.size() == columnsWidths.size()) &&