make AdvancedSearch support use localization string search card name/rules text.

This commit is contained in:
CCTV-1
2020-02-18 12:27:08 +08:00
parent 661e41e220
commit 9b67b0a394

View File

@@ -39,16 +39,30 @@ import forge.util.CardTranslation;
public class AdvancedSearch { public class AdvancedSearch {
public enum FilterOption { public enum FilterOption {
NONE("lblNone", null, null, null), NONE("lblNone", null, null, null),
CARD_NAME("lblName", PaperCard.class, FilterOperator.STRING_OPS, new StringEvaluator<PaperCard>() { CARD_NAME("lblName", PaperCard.class, FilterOperator.STRINGS_OPS, new StringEvaluator<PaperCard>() {
@Override @Override
protected String getItemValue(PaperCard input) { protected String getItemValue(PaperCard input) {
return input.getName(); throw new RuntimeException("getItemValues should be called instead");
}
@Override
protected Set<String> getItemValues(PaperCard input) {
Set<String> 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<PaperCard>() { CARD_RULES_TEXT("lblRulesText", PaperCard.class, FilterOperator.STRINGS_OPS, new StringEvaluator<PaperCard>() {
@Override @Override
protected String getItemValue(PaperCard input) { protected String getItemValue(PaperCard input) {
return input.getRules().getOracleText(); throw new RuntimeException("getItemValues should be called instead");
}
@Override
protected Set<String> getItemValues(PaperCard input) {
Set<String> 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<PaperCard, Keyword>(Keyword.getAllKeywords()) { CARD_KEYWORDS("lblKeywords", PaperCard.class, FilterOperator.COLLECTION_OPS, new CustomListEvaluator<PaperCard, Keyword>(Keyword.getAllKeywords()) {
@@ -484,6 +498,18 @@ public class AdvancedSearch {
} }
return false; return false;
} }
@Override
public boolean apply(Set<String> inputs, List<String> 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<String>() { STARTS_WITH("lblStartsWith", "%1$s starts with '%2$s'", FilterValueCount.ONE, new OperatorEvaluator<String>() {
@Override @Override
@@ -493,6 +519,18 @@ public class AdvancedSearch {
} }
return false; return false;
} }
@Override
public boolean apply(Set<String> inputs, List<String> 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<String>() { ENDS_WITH("lblEndsWith", "%1$s ends with '%2$s'", FilterValueCount.ONE, new OperatorEvaluator<String>() {
@Override @Override
@@ -502,6 +540,18 @@ public class AdvancedSearch {
} }
return false; return false;
} }
@Override
public boolean apply(Set<String> inputs, List<String> 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 //Custom list operators
@@ -662,6 +712,9 @@ public class AdvancedSearch {
public static final FilterOperator[] STRING_OPS = new FilterOperator[] { public static final FilterOperator[] STRING_OPS = new FilterOperator[] {
CONTAINS, STARTS_WITH, ENDS_WITH 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[] { public static final FilterOperator[] SINGLE_LIST_OPS = new FilterOperator[] {
IS_ANY IS_ANY
}; };
@@ -716,27 +769,32 @@ public class AdvancedSearch {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final Filter<T> createFilter(FilterOption option, FilterOperator operator) { public final Filter<T> createFilter(FilterOption option, FilterOperator operator) {
final List<V> values = getValues(option, operator); final List<V> values = getValues(option, operator);
if (values == null || values.isEmpty()) { return null; } if (values == null || values.isEmpty()) {
return null;
}
String caption = getCaption(values, option, operator); String caption = getCaption(values, option, operator);
final OperatorEvaluator<V> evaluator = (OperatorEvaluator<V>)operator.evaluator; final OperatorEvaluator<V> evaluator = (OperatorEvaluator<V>) operator.evaluator;
Predicate<T> predicate; Predicate<T> predicate = new Predicate<T>() {
if (option.operatorOptions == FilterOperator.MULTI_LIST_OPS || option.operatorOptions == FilterOperator.COMBINATION_OPS || option.operatorOptions == FilterOperator.COLLECTION_OPS) { @Override
predicate = new Predicate<T>() { public boolean apply(T input) {
@Override return evaluator.apply(getItemValue(input), values);
public boolean apply(T input) { }
return evaluator.apply(getItemValues(input), values); };
} ;
}; final FilterOperator[][] manyValueOperators = { FilterOperator.MULTI_LIST_OPS,
} FilterOperator.COMBINATION_OPS, FilterOperator.COLLECTION_OPS, FilterOperator.STRINGS_OPS };
else { for (FilterOperator[] oper : manyValueOperators) {
predicate = new Predicate<T>() { if (option.operatorOptions == oper) {
@Override predicate = new Predicate<T>() {
public boolean apply(T input) { @Override
return evaluator.apply(getItemValue(input), values); public boolean apply(T input) {
} return evaluator.apply(getItemValues(input), values);
}; }
};
break;
}
} }
return new Filter<>(option, operator, caption, predicate); return new Filter<>(option, operator, caption, predicate);
} }