Skip to content

Commit

Permalink
Add submenu and improve suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
priyanshu16095 committed Feb 21, 2025
1 parent 43292ba commit 249229b
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,24 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javafx.scene.control.ContextMenu;
import javafx.scene.control.CustomMenuItem;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldTableCell;

import org.jabref.logic.citationkeypattern.CitationKeyPattern;

public class CitationKeyPatternSuggestionCell extends TextFieldTableCell<CitationKeyPatternsPanelItemModel, String> {
private final CitationKeyPatternSuggestoinTextField searchField;
private final CitationKeyPatternSuggestionTextField searchField;

public CitationKeyPatternSuggestionCell(List<String> citationKeyPatterns) {
this.searchField = new CitationKeyPatternSuggestoinTextField(citationKeyPatterns);
this.searchField = new CitationKeyPatternSuggestionTextField(citationKeyPatterns);
searchField.setOnAction(event -> commitEdit(searchField.getText()));
}

Expand Down Expand Up @@ -50,15 +55,14 @@ public void updateItem(String item, boolean empty) {
}
}

static class CitationKeyPatternSuggestoinTextField extends TextField {

static class CitationKeyPatternSuggestionTextField extends TextField {
// Maximum number of entries that can be displayed in the popup menu.
private static final int MAX_ENTRIES = 7;

private final List<String> citationKeyPatterns;
private final ContextMenu suggestionsList;

public CitationKeyPatternSuggestoinTextField(List<String> citationKeyPatterns) {
public CitationKeyPatternSuggestionTextField(List<String> citationKeyPatterns) {
this.citationKeyPatterns = new ArrayList<>(citationKeyPatterns);
this.suggestionsList = new ContextMenu();

Expand All @@ -74,6 +78,7 @@ private void setListener() {
List<String> filteredEntries = citationKeyPatterns.stream()
.filter(e -> e.toLowerCase().contains(enteredText.toLowerCase()))
.collect(Collectors.toList());

if (!filteredEntries.isEmpty()) {
populatePopup(filteredEntries);
if (!suggestionsList.isShowing() && getScene() != null) {
Expand Down Expand Up @@ -114,11 +119,45 @@ private void populatePopup(List<String> searchResult) {
}

suggestionsList.getItems().clear();
suggestionsList.getItems().add(createPatternsSubMenu());
suggestionsList.getItems().addAll(menuItems);

if (!menuItems.isEmpty()) {
menuItems.getFirst().getContent().requestFocus();
}
}

private Menu createPatternsSubMenu() {
Menu patternsSubMenu = new Menu("All patterns");

Map<CitationKeyPattern.Category, List<CitationKeyPattern>> categorizedPatterns =
CitationKeyPattern.getAllPatterns().stream()
.collect(Collectors.groupingBy(CitationKeyPattern::getCategory));

Map<CitationKeyPattern.Category, String> categoryNames = Map.of(
CitationKeyPattern.Category.AUTHOR_RELATED, "Author related",
CitationKeyPattern.Category.EDITOR_RELATED, "Editor related",
CitationKeyPattern.Category.TITLE_RELATED, "Title related",
CitationKeyPattern.Category.OTHER_FIELDS, "Other fields",
CitationKeyPattern.Category.BIBENTRY_FIELDS, "BibEntry fields"
);

for (var entry : categoryNames.entrySet()) {
CitationKeyPattern.Category category = entry.getKey();
String categoryName = entry.getValue();

Menu categoryMenu = new Menu(categoryName);
List<CitationKeyPattern> patterns = categorizedPatterns.getOrDefault(category, List.of());

for (CitationKeyPattern pattern : patterns) {
MenuItem menuItem = new MenuItem(pattern.stringRepresentation());
categoryMenu.getItems().add(menuItem);
}

patternsSubMenu.getItems().add(categoryMenu);
}

return patternsSubMenu;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,72 +5,61 @@
import java.util.List;
import java.util.stream.Collectors;

public record CitationKeyPattern(String stringRepresentation) {
public static final CitationKeyPattern NULL_CITATION_KEY_PATTERN = new CitationKeyPattern("");
public record CitationKeyPattern(String stringRepresentation, Category category) {
public enum Category {
AUTHOR_RELATED, EDITOR_RELATED, TITLE_RELATED, OTHER_FIELDS, BIBENTRY_FIELDS
}

public static final CitationKeyPattern NULL_CITATION_KEY_PATTERN = new CitationKeyPattern("", Category.OTHER_FIELDS);

// region - Author-related field markers
public static final CitationKeyPattern AUTHOR_YEAR = new CitationKeyPattern("[auth]");
public static final CitationKeyPattern AUTHOR_FIRST_FULL = new CitationKeyPattern("[authFirstFull]");
public static final CitationKeyPattern AUTHOR_FORE_INI = new CitationKeyPattern("[authForeIni]");
public static final CitationKeyPattern AUTHOR_ETAL = new CitationKeyPattern("[auth.etal]");
public static final CitationKeyPattern AUTHOR_ET_AL = new CitationKeyPattern("[authEtAl]");
public static final CitationKeyPattern AUTHOR_AUTH_EA = new CitationKeyPattern("[auth.auth.ea]");
public static final CitationKeyPattern AUTHORS = new CitationKeyPattern("[authors]");
public static final CitationKeyPattern AUTHORS_N = new CitationKeyPattern("[authorsN]");
public static final CitationKeyPattern AUTH_INI_N = new CitationKeyPattern("[authIniN]");
public static final CitationKeyPattern AUTH_N = new CitationKeyPattern("[authN]");
public static final CitationKeyPattern AUTH_N_M = new CitationKeyPattern("[authN_M]");
public static final CitationKeyPattern AUTHOR_INI = new CitationKeyPattern("[authorIni]");
public static final CitationKeyPattern AUTH_SHORT = new CitationKeyPattern("[authshort]");
public static final CitationKeyPattern AUTHORS_ALPHA = new CitationKeyPattern("[authorsAlpha]");
public static final CitationKeyPattern AUTHORS_ALPHA_LNI = new CitationKeyPattern("[authorsAlphaLNI]");
public static final CitationKeyPattern AUTHORS_LAST = new CitationKeyPattern("[authorsLast]");
public static final CitationKeyPattern AUTHORS_LAST_FORE_INI = new CitationKeyPattern("[authorsLastForeIni]");
public static final CitationKeyPattern AUTHOR_YEAR = new CitationKeyPattern("[auth]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHOR_FIRST_FULL = new CitationKeyPattern("[authFirstFull]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHOR_FORE_INI = new CitationKeyPattern("[authForeIni]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHOR_ETAL = new CitationKeyPattern("[auth.etal]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHOR_ET_AL = new CitationKeyPattern("[authEtAl]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHORS = new CitationKeyPattern("[authors]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHORS_N = new CitationKeyPattern("[authorsN]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTH_INI_N = new CitationKeyPattern("[authIniN]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTH_N = new CitationKeyPattern("[authN]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTH_SHORT = new CitationKeyPattern("[authshort]", Category.AUTHOR_RELATED);
public static final CitationKeyPattern AUTHORS_ALPHA = new CitationKeyPattern("[authorsAlpha]", Category.AUTHOR_RELATED);
// endregion

// region - Editor-related field markers
public static final CitationKeyPattern EDTR = new CitationKeyPattern("[edtr]");
public static final CitationKeyPattern EDTR_INI_N = new CitationKeyPattern("[edtrIniN]");
public static final CitationKeyPattern EDITORS = new CitationKeyPattern("[editors]");
public static final CitationKeyPattern EDITOR_LAST = new CitationKeyPattern("[editorLast]");
public static final CitationKeyPattern EDITOR_INI = new CitationKeyPattern("[editorIni]");
public static final CitationKeyPattern EDTR_N = new CitationKeyPattern("[edtrN]");
public static final CitationKeyPattern EDTR_N_M = new CitationKeyPattern("[edtrN_M]");
public static final CitationKeyPattern EDTR_EDTR_EA = new CitationKeyPattern("[edtr.edtr.ea]");
public static final CitationKeyPattern EDTRSHORT = new CitationKeyPattern("[edtrshort]");
public static final CitationKeyPattern EDTR_FORE_INI = new CitationKeyPattern("[edtrForeIni]");
public static final CitationKeyPattern EDITOR_LAST_FORE_INI = new CitationKeyPattern("[editorLastForeIni]");
public static final CitationKeyPattern EDTR = new CitationKeyPattern("[edtr]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDITORS = new CitationKeyPattern("[editors]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDITOR_LAST = new CitationKeyPattern("[editorLast]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDITOR_INI = new CitationKeyPattern("[editorIni]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDTR_N = new CitationKeyPattern("[edtrN]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDTR_N_M = new CitationKeyPattern("[edtrN_M]", Category.EDITOR_RELATED);
public static final CitationKeyPattern EDITOR_LAST_FORE_INI = new CitationKeyPattern("[editorLastForeIni]", Category.EDITOR_RELATED);
// endregion

// region - Title-related field markers
public static final CitationKeyPattern SHORTTITLE = new CitationKeyPattern("[shorttitle]");
public static final CitationKeyPattern SHORTTITLE_INI = new CitationKeyPattern("[shorttitleINI]");
public static final CitationKeyPattern VERYSHORTTITLE = new CitationKeyPattern("[veryshorttitle]");
public static final CitationKeyPattern CAMEL = new CitationKeyPattern("[camel]");
public static final CitationKeyPattern CAMEL_N = new CitationKeyPattern("[camelN]");
public static final CitationKeyPattern TITLE = new CitationKeyPattern("[title]");
public static final CitationKeyPattern FULLTITLE = new CitationKeyPattern("[fulltitle]");
public static final CitationKeyPattern SHORTTITLE = new CitationKeyPattern("[shorttitle]", Category.TITLE_RELATED);
public static final CitationKeyPattern TITLE = new CitationKeyPattern("[title]", Category.TITLE_RELATED);
public static final CitationKeyPattern FULLTITLE = new CitationKeyPattern("[fulltitle]", Category.TITLE_RELATED);
// endregion

// region - Other field markers
public static final CitationKeyPattern ENTRYTYPE = new CitationKeyPattern("[entrytype]");
public static final CitationKeyPattern FIRSTPAGE = new CitationKeyPattern("[firstpage]");
public static final CitationKeyPattern PAGEPREFIX = new CitationKeyPattern("[pageprefix]");
public static final CitationKeyPattern KEYWORD_N = new CitationKeyPattern("[keywordN]");
public static final CitationKeyPattern KEYWORDS_N = new CitationKeyPattern("[keywordsN]");
public static final CitationKeyPattern LASTPAGE = new CitationKeyPattern("[lastpage]");
public static final CitationKeyPattern SHORTYEAR = new CitationKeyPattern("[shortyear]");
public static final CitationKeyPattern ENTRYTYPE = new CitationKeyPattern("[entrytype]", Category.OTHER_FIELDS);
public static final CitationKeyPattern FIRSTPAGE = new CitationKeyPattern("[firstpage]", Category.OTHER_FIELDS);
public static final CitationKeyPattern LASTPAGE = new CitationKeyPattern("[lastpage]", Category.OTHER_FIELDS);
public static final CitationKeyPattern SHORTYEAR = new CitationKeyPattern("[shortyear]", Category.OTHER_FIELDS);
// endregion

// region - Bibentry fields
public static final CitationKeyPattern AUTHOR = new CitationKeyPattern("[AUTHOR]");
public static final CitationKeyPattern DATE = new CitationKeyPattern("[DATE]");
public static final CitationKeyPattern DAY = new CitationKeyPattern("[DAY]");
public static final CitationKeyPattern GROUPS = new CitationKeyPattern("[GROUPS]");
public static final CitationKeyPattern MONTH = new CitationKeyPattern("[MONTH]");
public static final CitationKeyPattern YEAR = new CitationKeyPattern("[YEAR]");
public static final CitationKeyPattern AUTHOR = new CitationKeyPattern("[AUTHOR]", Category.BIBENTRY_FIELDS);
public static final CitationKeyPattern DATE = new CitationKeyPattern("[DATE]", Category.BIBENTRY_FIELDS);
public static final CitationKeyPattern MONTH = new CitationKeyPattern("[MONTH]", Category.BIBENTRY_FIELDS);
public static final CitationKeyPattern YEAR = new CitationKeyPattern("[YEAR]", Category.BIBENTRY_FIELDS);
// endregion

public CitationKeyPattern(String stringRepresentation) {
this(stringRepresentation, Category.OTHER_FIELDS);
}

public static List<CitationKeyPattern> getAllPatterns() {
return Arrays.stream(CitationKeyPattern.class.getDeclaredFields())
.filter(field -> {
Expand All @@ -90,4 +79,8 @@ public static List<CitationKeyPattern> getAllPatterns() {
})
.collect(Collectors.toList());
}

public Category getCategory() {
return this.category;
}
}

0 comments on commit 249229b

Please sign in to comment.