From 9b67b0a394d9dbbb0e7d2d8edc8e146e29a1ddf4 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Tue, 18 Feb 2020 12:27:08 +0800 Subject: [PATCH] make AdvancedSearch support use localization string search card name/rules text. --- .../forge/itemmanager/AdvancedSearch.java | 102 ++++++++++++++---- 1 file changed, 80 insertions(+), 22 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index 6abe7137f06..9eed3173cc4 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -39,16 +39,30 @@ import forge.util.CardTranslation; public class AdvancedSearch { public enum FilterOption { NONE("lblNone", null, null, null), - CARD_NAME("lblName", PaperCard.class, FilterOperator.STRING_OPS, new StringEvaluator() { + CARD_NAME("lblName", PaperCard.class, FilterOperator.STRINGS_OPS, new StringEvaluator() { @Override protected String getItemValue(PaperCard input) { - return input.getName(); + throw new RuntimeException("getItemValues should be called instead"); + } + @Override + protected Set getItemValues(PaperCard input) { + Set names = new HashSet<>(); + names.add(input.getName()); + names.add(CardTranslation.getTranslatedName(input.getName())); + return names; } }), - CARD_RULES_TEXT("lblRulesText", PaperCard.class, FilterOperator.STRING_OPS, new StringEvaluator() { + CARD_RULES_TEXT("lblRulesText", PaperCard.class, FilterOperator.STRINGS_OPS, new StringEvaluator() { @Override protected String getItemValue(PaperCard input) { - return input.getRules().getOracleText(); + throw new RuntimeException("getItemValues should be called instead"); + } + @Override + protected Set getItemValues(PaperCard input) { + Set names = new HashSet<>(); + names.add(input.getRules().getOracleText()); + names.add(CardTranslation.getTranslatedOracle(input.getName())); + return names; } }), CARD_KEYWORDS("lblKeywords", PaperCard.class, FilterOperator.COLLECTION_OPS, new CustomListEvaluator(Keyword.getAllKeywords()) { @@ -484,6 +498,18 @@ public class AdvancedSearch { } return false; } + @Override + public boolean apply(Set inputs, List values) { + if (inputs != null && !inputs.isEmpty() && !values.isEmpty()) { + for (String input : inputs) { + if (apply(input, values)) { + return true; + } + } + return false; + } + return false; + } }), STARTS_WITH("lblStartsWith", "%1$s starts with '%2$s'", FilterValueCount.ONE, new OperatorEvaluator() { @Override @@ -493,6 +519,18 @@ public class AdvancedSearch { } return false; } + @Override + public boolean apply(Set inputs, List values) { + if (inputs != null && !inputs.isEmpty() && !values.isEmpty()) { + for (String input : inputs) { + if (apply(input, values)) { + return true; + } + } + return false; + } + return false; + } }), ENDS_WITH("lblEndsWith", "%1$s ends with '%2$s'", FilterValueCount.ONE, new OperatorEvaluator() { @Override @@ -502,6 +540,18 @@ public class AdvancedSearch { } return false; } + @Override + public boolean apply(Set inputs, List values) { + if (inputs != null && !inputs.isEmpty() && !values.isEmpty()) { + for (String input : inputs) { + if (apply(input, values)) { + return true; + } + } + return false; + } + return false; + } }), //Custom list operators @@ -662,6 +712,9 @@ public class AdvancedSearch { public static final FilterOperator[] STRING_OPS = new FilterOperator[] { CONTAINS, STARTS_WITH, ENDS_WITH }; + public static final FilterOperator[] STRINGS_OPS = new FilterOperator[] { + CONTAINS, STARTS_WITH, ENDS_WITH + }; public static final FilterOperator[] SINGLE_LIST_OPS = new FilterOperator[] { IS_ANY }; @@ -716,27 +769,32 @@ public class AdvancedSearch { @SuppressWarnings("unchecked") public final Filter createFilter(FilterOption option, FilterOperator operator) { final List values = getValues(option, operator); - if (values == null || values.isEmpty()) { return null; } + if (values == null || values.isEmpty()) { + return null; + } String caption = getCaption(values, option, operator); - final OperatorEvaluator evaluator = (OperatorEvaluator)operator.evaluator; - Predicate predicate; - if (option.operatorOptions == FilterOperator.MULTI_LIST_OPS || option.operatorOptions == FilterOperator.COMBINATION_OPS || option.operatorOptions == FilterOperator.COLLECTION_OPS) { - predicate = new Predicate() { - @Override - public boolean apply(T input) { - return evaluator.apply(getItemValues(input), values); - } - }; - } - else { - predicate = new Predicate() { - @Override - public boolean apply(T input) { - return evaluator.apply(getItemValue(input), values); - } - }; + final OperatorEvaluator evaluator = (OperatorEvaluator) operator.evaluator; + Predicate predicate = new Predicate() { + @Override + public boolean apply(T input) { + return evaluator.apply(getItemValue(input), values); + } + }; + ; + final FilterOperator[][] manyValueOperators = { FilterOperator.MULTI_LIST_OPS, + FilterOperator.COMBINATION_OPS, FilterOperator.COLLECTION_OPS, FilterOperator.STRINGS_OPS }; + for (FilterOperator[] oper : manyValueOperators) { + if (option.operatorOptions == oper) { + predicate = new Predicate() { + @Override + public boolean apply(T input) { + return evaluator.apply(getItemValues(input), values); + } + }; + break; + } } return new Filter<>(option, operator, caption, predicate); }