-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
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
single line text fields #4138
single line text fields #4138
Changes from 4 commits
4c44087
24e2183
d426291
9223dfe
1bb4754
26475f6
218ad5c
ac10593
481007b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.jabref.gui.fieldeditors; | ||
|
||
import java.util.List; | ||
import java.util.function.Supplier; | ||
|
||
import javafx.scene.control.MenuItem; | ||
|
||
public interface ContextMenuAddable { | ||
/** | ||
* Adds the given list of menu items to the context menu. The usage of {@link Supplier} prevents that the menus need | ||
* to be instantiated at this point. They are populated when the user needs them which prevents many unnecessary | ||
* allocations when the main table is just scrolled with the entry editor open. | ||
*/ | ||
void addToContextMenu(final Supplier<List<MenuItem>> items); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package org.jabref.gui.fieldeditors; | ||
|
||
import java.net.URL; | ||
import java.util.List; | ||
import java.util.ResourceBundle; | ||
import java.util.function.Supplier; | ||
|
||
import javafx.fxml.Initializable; | ||
import javafx.scene.control.ContextMenu; | ||
import javafx.scene.control.MenuItem; | ||
import javafx.scene.input.KeyCode; | ||
import javafx.scene.input.KeyEvent; | ||
|
||
import com.sun.javafx.scene.control.skin.TextFieldSkin; | ||
|
||
public class EditorTextField extends javafx.scene.control.TextField implements Initializable, ContextMenuAddable { | ||
|
||
public EditorTextField() { | ||
this(""); | ||
} | ||
|
||
public EditorTextField(final String text) { | ||
super(text); | ||
|
||
setMinHeight(1); | ||
setMinWidth(200); | ||
|
||
// Should behave as a normal text field with respect to TAB behaviour | ||
addEventFilter(KeyEvent.KEY_PRESSED, event -> { | ||
if (event.getCode() == KeyCode.TAB) { | ||
TextFieldSkin skin = (TextFieldSkin) getSkin(); | ||
if (event.isShiftDown()) { | ||
// Shift + Tab > previous text area | ||
skin.getBehavior().traversePrevious(); | ||
} else { | ||
if (event.isControlDown()) { | ||
// Ctrl + Tab > insert tab | ||
skin.getBehavior().callAction("InsertTab"); | ||
} else { | ||
// Tab > next text area | ||
skin.getBehavior().traverseNext(); | ||
} | ||
} | ||
event.consume(); | ||
} | ||
}); | ||
} | ||
|
||
@Override | ||
public void addToContextMenu(final Supplier<List<MenuItem>> items) { | ||
TextFieldSkin customContextSkin = new TextFieldSkin(this) { | ||
@Override | ||
public void populateContextMenu(ContextMenu contextMenu) { | ||
super.populateContextMenu(contextMenu); | ||
contextMenu.getItems().addAll(0, items.get()); | ||
} | ||
}; | ||
setSkin(customContextSkin); | ||
} | ||
|
||
@Override | ||
public void initialize(URL location, ResourceBundle resources) { | ||
// not needed | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,9 @@ | ||
package org.jabref.gui.fieldeditors; | ||
|
||
import java.time.format.DateTimeFormatter; | ||
import java.util.Arrays; | ||
import java.util.Collections; | ||
import java.util.HashSet; | ||
import java.util.List; | ||
import java.util.Set; | ||
|
||
|
@@ -25,16 +28,40 @@ | |
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import static org.jabref.model.entry.FieldName.AUTHOR; | ||
import static org.jabref.model.entry.FieldName.INSTITUTION; | ||
import static org.jabref.model.entry.FieldName.TITLE; | ||
import static org.jabref.model.entry.FieldName.YEAR; | ||
|
||
public class FieldEditors { | ||
|
||
private static final Logger LOGGER = LoggerFactory.getLogger(FieldEditors.class); | ||
|
||
public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecutor, DialogService dialogService, JournalAbbreviationLoader journalAbbreviationLoader, JournalAbbreviationPreferences journalAbbreviationPreferences, JabRefPreferences preferences, BibDatabaseContext databaseContext, String entryType, SuggestionProviders suggestionProviders, UndoManager undoManager) { | ||
private static final Set<String> SINGLE_LINE_FIELDS = Collections.unmodifiableSet(new HashSet<>( | ||
Arrays.asList(TITLE, AUTHOR, YEAR, INSTITUTION) | ||
)); | ||
|
||
public static FieldEditorFX getForField(final String fieldName, | ||
final TaskExecutor taskExecutor, | ||
final DialogService dialogService, | ||
final JournalAbbreviationLoader journalAbbreviationLoader, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could extract the loader and the prefs parameter and directly pass the JounralAbbrev Repo stuff which is just passed onto the field checkers later There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done; I'm just wonder if it's ok to access repository at the beginning instead of calling for it every time? I mean, is there a way, that the repo could be updated? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In principle, the user might change the journal abbreviations at any time. However, it should be fine to use the repository since the field editors are recreated when switching to the new entry. |
||
final JournalAbbreviationPreferences journalAbbreviationPreferences, | ||
final JabRefPreferences preferences, | ||
final BibDatabaseContext databaseContext, | ||
final String entryType, | ||
final SuggestionProviders suggestionProviders, | ||
final UndoManager undoManager) { | ||
final Set<FieldProperty> fieldExtras = InternalBibtexFields.getFieldProperties(fieldName); | ||
|
||
AutoCompleteSuggestionProvider<?> suggestionProvider = getSuggestionProvider(fieldName, suggestionProviders, databaseContext.getMetaData()); | ||
final AutoCompleteSuggestionProvider<?> suggestionProvider = getSuggestionProvider(fieldName, suggestionProviders, databaseContext.getMetaData()); | ||
|
||
final FieldCheckers fieldCheckers = new FieldCheckers( | ||
databaseContext, | ||
preferences.getFileDirectoryPreferences(), | ||
journalAbbreviationLoader.getRepository(journalAbbreviationPreferences), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here the abbrev repo stuff is passed |
||
preferences.getBoolean(JabRefPreferences.ENFORCE_LEGAL_BIBTEX_KEY)); | ||
|
||
FieldCheckers fieldCheckers = new FieldCheckers(databaseContext, preferences.getFileDirectoryPreferences(), journalAbbreviationLoader.getRepository(journalAbbreviationPreferences), preferences.getBoolean(JabRefPreferences.ENFORCE_LEGAL_BIBTEX_KEY)); | ||
final boolean hasSingleLine = SINGLE_LINE_FIELDS.contains(fieldName.toLowerCase()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I might be mistaken here, but |
||
|
||
if (preferences.getTimestampPreferences().getTimestampField().equals(fieldName) || fieldExtras.contains(FieldProperty.DATE)) { | ||
if (fieldExtras.contains(FieldProperty.ISO_DATE)) { | ||
|
@@ -71,7 +98,7 @@ public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecu | |
} else if (fieldExtras.contains(FieldProperty.SINGLE_ENTRY_LINK) || fieldExtras.contains(FieldProperty.MULTIPLE_ENTRY_LINK)) { | ||
return new LinkedEntriesEditor(fieldName, databaseContext, suggestionProvider, fieldCheckers); | ||
} else if (fieldExtras.contains(FieldProperty.PERSON_NAMES)) { | ||
return new PersonsEditor(fieldName, suggestionProvider, preferences, fieldCheckers); | ||
return new PersonsEditor(fieldName, suggestionProvider, preferences, fieldCheckers, hasSingleLine); | ||
} else if (FieldName.KEYWORDS.equals(fieldName)) { | ||
return new KeywordsEditor(fieldName, suggestionProvider, fieldCheckers, preferences); | ||
} else if (fieldExtras.contains(FieldProperty.MULTILINE_TEXT)) { | ||
|
@@ -81,7 +108,7 @@ public static FieldEditorFX getForField(String fieldName, TaskExecutor taskExecu | |
} | ||
|
||
// default | ||
return new SimpleEditor(fieldName, suggestionProvider, fieldCheckers, preferences); | ||
return new SimpleEditor(fieldName, suggestionProvider, fieldCheckers, preferences, hasSingleLine); | ||
} | ||
|
||
@SuppressWarnings("unchecked") | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please add this list two
InternalBibtexFields
(this class needs to be refactored at some point, but for now it is good to have anything at one place).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep. Sorry for delay, I will do that on Saturday.