Skip to content

Commit

Permalink
Reimplement option field editors in JavaFX (#2824)
Browse files Browse the repository at this point in the history
* Reimplement option field editors in JavaFX

* Update localization

* Update EditorTypeEditorViewModel.java

* Update GenderEditorViewModel.java

* Update PaginationEditorViewModel.java

* Update PatentTypeEditorViewModel.java

* Update TypeEditorViewModel.java

* Update YesNoEditorViewModel.java
  • Loading branch information
tobiasdiez authored May 6, 2017
1 parent 98e2e43 commit 4543592
Show file tree
Hide file tree
Showing 32 changed files with 364 additions and 263 deletions.
13 changes: 0 additions & 13 deletions src/main/java/org/jabref/gui/entryeditor/EntryEditor.java
Original file line number Diff line number Diff line change
Expand Up @@ -588,19 +588,6 @@ public Optional<JComponent> getExtra(final FieldEditor editor) {
if (!panel.getBibDatabaseContext().getMetaData().getContentSelectorValuesForField(fieldName).isEmpty()) {
return FieldExtraComponents.getSelectorExtraComponent(frame, panel, editor, contentSelectors,
storeFieldAction);
} else if (fieldExtras.contains(FieldProperty.YES_NO)) {
return FieldExtraComponents.getYesNoExtraComponent(editor, this);
} else if (fieldExtras.contains(FieldProperty.MONTH)) {
return FieldExtraComponents.getMonthExtraComponent(editor, this,
frame.getCurrentBasePanel().getBibDatabaseContext().getMode());
} else if (fieldExtras.contains(FieldProperty.GENDER)) {
return FieldExtraComponents.getGenderExtraComponent(editor, this);
} else if (fieldExtras.contains(FieldProperty.EDITOR_TYPE)) {
return FieldExtraComponents.getEditorTypeExtraComponent(editor, this);
} else if (fieldExtras.contains(FieldProperty.PAGINATION)) {
return FieldExtraComponents.getPaginationExtraComponent(editor, this);
} else if (fieldExtras.contains(FieldProperty.TYPE)) {
return FieldExtraComponents.getTypeExtraComponent(editor, this, "patent".equalsIgnoreCase(entry.getType()));
}
return Optional.empty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ private void setupPanel(JabRefFrame frame, BasePanel bPanel, boolean addKeyField
fieldEditor.setAutoCompleteListener(autoCompleteListener);
*/

FieldEditorFX fieldEditor = FieldEditors.getForField(fieldName, Globals.taskExecutor, new FXDialogService(), Globals.journalAbbreviationLoader, Globals.prefs.getJournalAbbreviationPreferences(), Globals.prefs, bPanel.getBibDatabaseContext());
FieldEditorFX fieldEditor = FieldEditors.getForField(fieldName, Globals.taskExecutor, new FXDialogService(), Globals.journalAbbreviationLoader, Globals.prefs.getJournalAbbreviationPreferences(), Globals.prefs, bPanel.getBibDatabaseContext(), entry.getType());
editors.put(fieldName, fieldEditor);
/*
// TODO: Reenable this
Expand Down
170 changes: 0 additions & 170 deletions src/main/java/org/jabref/gui/entryeditor/FieldExtraComponents.java
Original file line number Diff line number Diff line change
@@ -1,87 +1,23 @@
package org.jabref.gui.entryeditor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import javax.swing.JComboBox;
import javax.swing.JComponent;

import org.jabref.gui.BasePanel;
import org.jabref.gui.JabRefFrame;
import org.jabref.gui.contentselector.FieldContentSelector;
import org.jabref.gui.entryeditor.EntryEditor.StoreFieldAction;
import org.jabref.gui.fieldeditors.FieldEditor;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabaseMode;
import org.jabref.model.entry.FieldProperty;
import org.jabref.model.entry.InternalBibtexFields;
import org.jabref.model.entry.Month;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class FieldExtraComponents {

private static final Log LOGGER = LogFactory.getLog(FieldExtraComponents.class);

private FieldExtraComponents() {
}

/**
* Return a dropdown list containing Yes and No for fields with EXTRA_YES_NO
*
* @param fieldEditor
* @param entryEditor
* @return
*/
public static Optional<JComponent> getYesNoExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor) {
final String[] options = {"", "Yes", "No"};
JComboBox<String> yesno = new JComboBox<>(options);
yesno.addActionListener(actionEvent -> {
fieldEditor.setText(((String) yesno.getSelectedItem()).toLowerCase(Locale.ROOT));
entryEditor.updateField(fieldEditor);
});
return Optional.of(yesno);

}

/**
* Return a dropdown list with the month names for fields with EXTRA_MONTH
*
* @param fieldEditor
* @param entryEditor
* @param type
* @return
*/
public static Optional<JComponent> getMonthExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor, BibDatabaseMode type) {
List<String> monthNames = Arrays.stream(Month.values()).map(Month::getFullName).collect(Collectors.toList());
List<String> options = new ArrayList<>(13);
options.add(Localization.lang("Select"));
options.addAll(monthNames);

JComboBox<String> month = new JComboBox<>(options.toArray(new String[0]));
month.addActionListener(actionEvent -> {
int monthNumber = month.getSelectedIndex();
if (monthNumber >= 1) {
if (type == BibDatabaseMode.BIBLATEX) {
fieldEditor.setText(String.valueOf(monthNumber));
} else {
fieldEditor.setText(Month.getMonthByNumber(monthNumber).get().getJabRefFormat());
}
} else {
fieldEditor.setText("");
}
entryEditor.updateField(fieldEditor);
month.setSelectedIndex(0);
});
return Optional.of(month);

}

/**
* Return a button opening a content selector for fields where one exists
Expand All @@ -101,110 +37,4 @@ public static Optional<JComponent> getSelectorExtraComponent(JabRefFrame frame,
contentSelectors.add(ws);
return Optional.of(ws);
}

/**
* Return a dropdown list with the alternatives for editor type fields
*
* @param fieldEditor
* @param entryEditor
* @return
*/

public static Optional<JComponent> getEditorTypeExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor) {
final String[] optionValues = {"", "editor", "compiler", "founder", "continuator", "redactor", "reviser",
"collaborator"};
final String[] optionDescriptions = {Localization.lang("Select"), Localization.lang("Editor"),
Localization.lang("Compiler"), Localization.lang("Founder"), Localization.lang("Continuator"),
Localization.lang("Redactor"), Localization.lang("Reviser"), Localization.lang("Collaborator")};
JComboBox<String> editorType = new JComboBox<>(optionDescriptions);
editorType.addActionListener(actionEvent -> {
fieldEditor.setText(optionValues[editorType.getSelectedIndex()]);
entryEditor.updateField(fieldEditor);
});
return Optional.of(editorType);

}

/**
* Return a dropdown list with the alternatives for pagination type fields
*
* @param fieldEditor
* @param entryEditor
* @return
*/

public static Optional<JComponent> getPaginationExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor) {
final String[] optionValues = {"", "page", "column", "line", "verse", "section", "paragraph", "none"};
final String[] optionDescriptions = {Localization.lang("Select"), Localization.lang("Page"),
Localization.lang("Column"), Localization.lang("Line"), Localization.lang("Verse"),
Localization.lang("Section"), Localization.lang("Paragraph"), Localization.lang("None")};
JComboBox<String> pagination = new JComboBox<>(optionDescriptions);
pagination.addActionListener(actionEvent -> {
fieldEditor.setText(optionValues[pagination.getSelectedIndex()]);
entryEditor.updateField(fieldEditor);
});
return Optional.of(pagination);
}

/**
* Return a dropdown list with the alternatives for pagination type fields
*
* @param fieldEditor
* @param entryEditor
* @return
*/

public static Optional<JComponent> getTypeExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor,
boolean isPatent) {
String[] optionValues;
String[] optionDescriptions;
if (isPatent) {
optionValues = new String[] {"", "patent", "patentde", "patenteu", "patentfr", "patentuk", "patentus",
"patreq", "patreqde", "patreqeu", "patreqfr", "patrequk", "patrequs"};
optionDescriptions = new String[] {Localization.lang("Select"), Localization.lang("Patent"),
Localization.lang("German patent"), Localization.lang("European patent"),
Localization.lang("French patent"), Localization.lang("British patent"),
Localization.lang("U.S. patent"), Localization.lang("Patent request"),
Localization.lang("German patent request"), Localization.lang("European patent request"),
Localization.lang("French patent request"), Localization.lang("British patent request"),
Localization.lang("U.S. patent request")};
} else {
optionValues = new String[] {"", "mathesis", "phdthesis", "candthesis", "techreport", "resreport",
"software", "datacd", "audiocd"};
optionDescriptions = new String[] {Localization.lang("Select"), Localization.lang("Master's thesis"),
Localization.lang("PhD thesis"), Localization.lang("Candidate thesis"),
Localization.lang("Technical report"), Localization.lang("Research report"),
Localization.lang("Software"), Localization.lang("Data CD"), Localization.lang("Audio CD")};
}
JComboBox<String> type = new JComboBox<>(optionDescriptions);
type.addActionListener(actionEvent -> {
fieldEditor.setText(optionValues[type.getSelectedIndex()]);
entryEditor.updateField(fieldEditor);
});
return Optional.of(type);
}

/**
* Return a dropdown list with the gender alternatives for fields with GENDER
*
* @param fieldEditor
* @param entryEditor
* @return
*/

public static Optional<JComponent> getGenderExtraComponent(FieldEditor fieldEditor, EntryEditor entryEditor) {
final String[] optionValues = {"", "sf", "sm", "sp", "pf", "pm", "pn", "pp"};
final String[] optionDescriptions = {Localization.lang("Select"), Localization.lang("Female name"),
Localization.lang("Male name"),
Localization.lang("Neuter name"), Localization.lang("Female names"), Localization.lang("Male names"),
Localization.lang("Neuter names"), Localization.lang("Mixed names")};
JComboBox<String> gender = new JComboBox<>(optionDescriptions);
gender.addActionListener(actionEvent -> {
fieldEditor.setText(optionValues[gender.getSelectedIndex()]);
entryEditor.updateField(fieldEditor);
});
return Optional.of(gender);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.jabref.gui.fieldeditors;

import org.jabref.logic.l10n.Localization;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class EditorTypeEditorViewModel extends MapBasedEditorViewModel<String> {

private BiMap<String, String> itemMap = HashBiMap.create(7);

public EditorTypeEditorViewModel() {
itemMap.put("editor", Localization.lang("Editor"));
itemMap.put("compiler", Localization.lang("Compiler"));
itemMap.put("founder", Localization.lang("Founder"));
itemMap.put("continuator", Localization.lang("Continuator"));
itemMap.put("redactor", Localization.lang("Redactor"));
itemMap.put("reviser", Localization.lang("Reviser"));
itemMap.put("collaborator", Localization.lang("Collaborator"));
}

@Override
protected BiMap<String, String> getItemMap() {
return itemMap;
}

@Override
public String convertToDisplayText(String object) {
return object;
}
}
23 changes: 12 additions & 11 deletions src/main/java/org/jabref/gui/fieldeditors/FieldEditors.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@

public class FieldEditors {

public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecutor, DialogService dialogService, JournalAbbreviationLoader journalAbbreviationLoader, JournalAbbreviationPreferences journalAbbreviationPreferences, JabRefPreferences preferences, BibDatabaseContext databaseContext) {
public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecutor, DialogService dialogService, JournalAbbreviationLoader journalAbbreviationLoader, JournalAbbreviationPreferences journalAbbreviationPreferences, JabRefPreferences preferences, BibDatabaseContext databaseContext, String entryType) {
final Set<FieldProperty> fieldExtras = InternalBibtexFields.getFieldProperties(fieldName);

// TODO: Implement all of them
if (Globals.prefs.get(JabRefPreferences.TIME_STAMP_FIELD).equals(fieldName) || fieldExtras.contains(FieldProperty.DATE)) {
if (fieldExtras.contains(FieldProperty.ISO_DATE)) {
return new DateEditor(fieldName, DateTimeFormatter.ofPattern("[uuuu][-MM][-dd]"));
Expand All @@ -29,26 +28,28 @@ public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecu
return new UrlEditor(fieldName, dialogService);
} else if (fieldExtras.contains(FieldProperty.JOURNAL_NAME)) {
return new JournalEditor(fieldName, journalAbbreviationLoader, journalAbbreviationPreferences);
} else if (fieldExtras.contains(FieldProperty.DOI) ||
fieldExtras.contains(FieldProperty.EPRINT) ||
fieldExtras.contains(FieldProperty.ISBN)) {
} else if (fieldExtras.contains(FieldProperty.DOI) || fieldExtras.contains(FieldProperty.EPRINT) || fieldExtras.contains(FieldProperty.ISBN)) {
return new IdentifierEditor(fieldName, taskExecutor, dialogService);
} else if (fieldExtras.contains(FieldProperty.OWNER)) {
return new OwnerEditor(fieldName, preferences);
} else if (fieldExtras.contains(FieldProperty.FILE_EDITOR)) {
return new LinkedFilesEditor(fieldName, dialogService, databaseContext, taskExecutor);
} else if (fieldExtras.contains(FieldProperty.YES_NO)) {
//return FieldExtraComponents.getYesNoExtraComponent(editor, this);
return new OptionEditor<>(fieldName, new YesNoEditorViewModel());
} else if (fieldExtras.contains(FieldProperty.MONTH)) {
//return FieldExtraComponents.getMonthExtraComponent(editor, this, frame.getCurrentBasePanel().getBibDatabaseContext().getMode());
return new OptionEditor<>(fieldName, new MonthEditorViewModel(databaseContext.getMode()));
} else if (fieldExtras.contains(FieldProperty.GENDER)) {
//return FieldExtraComponents.getGenderExtraComponent(editor, this);
return new OptionEditor<>(fieldName, new GenderEditorViewModel());
} else if (fieldExtras.contains(FieldProperty.EDITOR_TYPE)) {
//return FieldExtraComponents.getEditorTypeExtraComponent(editor, this);
return new OptionEditor<>(fieldName, new EditorTypeEditorViewModel());
} else if (fieldExtras.contains(FieldProperty.PAGINATION)) {
//return FieldExtraComponents.getPaginationExtraComponent(editor, this);
return new OptionEditor<>(fieldName, new PaginationEditorViewModel());
} else if (fieldExtras.contains(FieldProperty.TYPE)) {
//return FieldExtraComponents.getTypeExtraComponent(editor, this, "patent".equalsIgnoreCase(entry.getType()));
if ("patent".equalsIgnoreCase(entryType)) {
return new OptionEditor<>(fieldName, new PatentTypeEditorViewModel());
} else {
return new OptionEditor<>(fieldName, new TypeEditorViewModel());
}
}

// default
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.jabref.gui.fieldeditors;

import org.jabref.logic.l10n.Localization;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

public class GenderEditorViewModel extends MapBasedEditorViewModel<String> {

private BiMap<String, String> itemMap = HashBiMap.create(7);

public GenderEditorViewModel() {
itemMap.put("sf", Localization.lang("Female name"));
itemMap.put("sm", Localization.lang("Male name"));
itemMap.put("sn", Localization.lang("Neuter name"));
itemMap.put("pf", Localization.lang("Female names"));
itemMap.put("pm", Localization.lang("Male names"));
itemMap.put("pn", Localization.lang("Neuter names"));
itemMap.put("pp", Localization.lang("Mixed names"));
}

@Override
protected BiMap<String, String> getItemMap() {
return itemMap;
}

@Override
public String convertToDisplayText(String object) {
return object;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.jabref.gui.fieldeditors;

import java.util.ArrayList;
import java.util.List;

import javafx.util.StringConverter;

import com.google.common.collect.BiMap;

/**
* View model for a field editor that shows various options backed by a map.
*/
public abstract class MapBasedEditorViewModel<T> extends OptionEditorViewModel<T> {

protected abstract BiMap<String, T> getItemMap();

@Override
public StringConverter<T> getStringConverter() {
return new StringConverter<T>() {
@Override
public String toString(T object) {
if (object == null) {
return null;
} else {
return getItemMap().inverse().getOrDefault(object, "");
}
}

@Override
public T fromString(String string) {
if (string == null) {
return null;
} else {
return getItemMap().getOrDefault(string, null);
}
}
};
}

@Override
public List<T> getItems() {
return new ArrayList<>(getItemMap().values());
}
}
Loading

0 comments on commit 4543592

Please sign in to comment.