diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index 73802114be5..6336479628c 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -253,7 +253,7 @@ public class AdvancedSearchFilter extends ItemFilter FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { - final AdvancedSearch.Filter newFilter = AdvancedSearch.getFilter(itemManager.getGenericType()); + final AdvancedSearch.Filter newFilter = AdvancedSearch.getFilter(itemManager.getGenericType(), filter); if (newFilter != null) { FThreads.invokeInEdtLater(new Runnable() { @Override diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index c294a64e315..45c445b1777 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.ArrayList; import java.util.Collection; import java.util.List; - -import org.apache.commons.lang3.StringUtils; +import com.google.common.base.Function; +import com.google.common.base.Predicate; import forge.card.CardEdition; import forge.card.CardRarity; @@ -22,7 +22,7 @@ public class AdvancedSearch { private enum FilterOption { CARD_NAME("Name", PaperCard.class, FilterOperator.STRING_OPS, new StringValueSelector()), CARD_RULES_TEXT("Rules Text", PaperCard.class, FilterOperator.STRING_OPS, new StringValueSelector()), - CARD_EXPANSION("Expansion", PaperCard.class, FilterOperator.SINGLE_LIST_OPS, new CustomListValueSelector(FModel.getMagicDb().getSortedEditions())), + CARD_SET("Set", PaperCard.class, FilterOperator.SINGLE_LIST_OPS, new CustomListValueSelector(FModel.getMagicDb().getSortedEditions(), CardEdition.FN_GET_CODE)), CARD_FORMAT("Format", PaperCard.class, FilterOperator.SINGLE_LIST_OPS, new CustomListValueSelector((List)FModel.getFormats().getOrderedList())), CARD_COLOR("Color", PaperCard.class, FilterOperator.MULTI_LIST_OPS, new CustomListValueSelector(MagicColor.Constant.COLORS_AND_COLORLESS)), CARD_TYPE("Type", PaperCard.class, FilterOperator.MULTI_LIST_OPS, new CustomListValueSelector(CardType.getSortedCoreAndSuperTypes())), @@ -37,9 +37,9 @@ public class AdvancedSearch { private final String name; private final Class type; private final FilterOperator[] operatorOptions; - private final FilterValueSelector valueSelector; + private final FilterValueSelector valueSelector; - private FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterValueSelector valueSelector0) { + private FilterOption(String name0, Class type0, FilterOperator[] operatorOptions0, FilterValueSelector valueSelector0) { name = name0; type = type0; operatorOptions = operatorOptions0; @@ -114,11 +114,11 @@ public class AdvancedSearch { MANY_AND } - private static abstract class FilterValueSelector { - public abstract List getValues(String message, FilterOption option, FilterOperator operator); + private static abstract class FilterValueSelector { + public abstract Filter createFilter(String message, FilterOption option, FilterOperator operator); } - private static class NumericValueSelector extends FilterValueSelector { + private static class NumericValueSelector extends FilterValueSelector { private final int min, max; public NumericValueSelector(int min0, int max0) { @@ -127,7 +127,7 @@ public class AdvancedSearch { } @Override - public List getValues(String message, FilterOption option, FilterOperator operator) { + public Filter createFilter(String message, FilterOption option, FilterOperator operator) { String msg = message; if (operator.valueCount == FilterValueCount.TWO) { msg += " (Lower Bound)"; @@ -135,55 +135,111 @@ public class AdvancedSearch { Integer lowerBound = SGuiChoose.getInteger(msg, min, max); if (lowerBound == null) { return null; } - List values = new ArrayList(); - values.add(lowerBound); + final String caption; if (operator.valueCount == FilterValueCount.TWO) { //prompt for upper bound if needed msg = message + " (Upper Bound)"; Integer upperBound = SGuiChoose.getInteger(msg, lowerBound, max); if (upperBound == null) { return null; } - values.add(upperBound); + + caption = String.format(operator.formatStr, option.name, lowerBound, upperBound); } - return values; + else { + caption = String.format(operator.formatStr, option.name, lowerBound); + } + + return new Filter(option, operator, caption, null); } } - private static class StringValueSelector extends FilterValueSelector { + private static class StringValueSelector extends FilterValueSelector { public StringValueSelector() { } @Override - public List getValues(String message, FilterOption option, FilterOperator operator) { + public Filter createFilter(String message, FilterOption option, FilterOperator operator) { String value = SOptionPane.showInputDialog("", message); if (value == null) { return null; } - List values = new ArrayList(); - values.add(value); - return values; + final String caption = String.format(operator.formatStr, option.name, value); + + return new Filter(option, operator, caption, null); } } - private static class CustomListValueSelector extends FilterValueSelector { - private final Collection choices; + private static class CustomListValueSelector extends FilterValueSelector { + private final Collection choices; + private final Function toShortString, toLongString; - public CustomListValueSelector(Collection choices0) { + public CustomListValueSelector(Collection choices0) { + this(choices0, null, null); + } + public CustomListValueSelector(Collection choices0, Function toShortString0) { + this(choices0, toShortString0, null); + } + public CustomListValueSelector(Collection choices0, Function toShortString0, Function toLongString0) { choices = choices0; + toShortString = toShortString0; + toLongString = toLongString0; } @Override - public List getValues(String message, FilterOption option, FilterOperator operator) { + public Filter createFilter(String message, FilterOption option, FilterOperator operator) { int max = choices.size(); if (operator == FilterOperator.IS_EXACTLY && option.operatorOptions == FilterOperator.SINGLE_LIST_OPS) { max = 1; } - List values = SGuiChoose.getChoices(message, 0, max, choices); + List values = SGuiChoose.getChoices(message, 0, max, choices); if (values == null || values.isEmpty()) { return null; } - return values; + + String valuesStr; + switch (operator.valueCount) { + case MANY: + valuesStr = formatValues(values, " ", " "); + break; + case MANY_OR: + valuesStr = formatValues(values, ", ", " or "); + break; + case MANY_AND: + default: + valuesStr = formatValues(values, ", ", " and "); + break; + } + + + final String caption = String.format(operator.formatStr, option.name, valuesStr); + + return new Filter(option, operator, caption, null); + } + + private String formatValues(List values, String delim, String finalDelim) { + int valueCount = values.size(); + switch (valueCount) { + case 1: + return formatValue(values.get(0)); + case 2: + return formatValue(values.get(0)) + finalDelim + " " + formatValue(values.get(1)); + default: + int lastValueIdx = valueCount - 1; + String result = formatValue(values.get(0)); + for (int i = 1; i < lastValueIdx; i++) { + result += delim + formatValue(values.get(i)); + } + result += delim.trim() + finalDelim + formatValue(values.get(lastValueIdx)); + return result; + } + } + + private String formatValue(V value) { + if (toShortString == null) { + return value.toString(); + } + return toShortString.apply(value); } } - public static Filter getFilter(Class type) { + public static Filter getFilter(Class type, Filter editFilter) { //build list of filter options based on ItemManager type List options = new ArrayList(); for (FilterOption opt : FilterOption.values()) { @@ -192,66 +248,38 @@ public class AdvancedSearch { } } - final FilterOption option = SGuiChoose.oneOrNone("Select a filter type", options); + final FilterOption defaultOption = editFilter == null ? null : editFilter.option; + final FilterOption option = SGuiChoose.oneOrNone("Select a filter type", options, defaultOption, null); if (option == null) { return null; } - final FilterOperator operator = SGuiChoose.oneOrNone("Select an operator for " + option.name, option.operatorOptions); + final FilterOperator defaultOperator = option == defaultOption ? editFilter.operator : null; + final FilterOperator operator = SGuiChoose.oneOrNone("Select an operator for " + option.name, option.operatorOptions, defaultOperator, null); if (operator == null) { return null; } final String message = option.name + " " + operator.caption + " ?"; - final List values = option.valueSelector.getValues(message, option, operator); - if (values == null) { return null; } - - return new Filter(option, operator, values); + return option.valueSelector.createFilter(message, option, operator); } public static class Filter { private final FilterOption option; private final FilterOperator operator; - private final List values; private final String caption; + private final Predicate predicate; - private Filter(FilterOption option0, FilterOperator operator0, List values0) { + private Filter(FilterOption option0, FilterOperator operator0, String caption0, Predicate predicate0) { option = option0; operator = operator0; - values = values0; + caption = caption0; + predicate = predicate0; + } - switch (operator.valueCount) { - case ONE: - caption = String.format(operator.formatStr, option.name, values.get(0)); - break; - case TWO: - caption = String.format(operator.formatStr, option.name, values.get(0), values.get(1)); - break; - case MANY: - caption = String.format(operator.formatStr, option.name, StringUtils.join(values, ", ")); - break; - case MANY_OR: - caption = String.format(operator.formatStr, option.name, formatValues(", ", "or")); - break; - case MANY_AND: - default: - caption = String.format(operator.formatStr, option.name, formatValues(", ", "and")); - break; - } + public Predicate getPredicate() { + return predicate; } @Override public String toString() { return caption; } - - private String formatValues(String delim, String finalDelim) { - switch (values.size()) { - case 1: - return values.get(0).toString(); - case 2: - return values.get(0) + " " + finalDelim + " " + values.get(1); - default: - String result = StringUtils.join(values, delim); - int index = result.lastIndexOf(delim) + delim.length(); - return result.substring(0, index) + finalDelim + " " + result.substring(index); - } - } } } diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java index 56e7d6e612e..33f46a7565f 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java @@ -29,18 +29,23 @@ public class SGuiChoose { * @see #getChoices(String, int, int, Object...) */ public static T oneOrNone(final String message, final T[] choices) { + return oneOrNone(message, choices, null, null); + } + public static T oneOrNone(final String message, final T[] choices, T selected, Function display) { if ((choices == null) || (choices.length == 0)) { return null; } - final List choice = SGuiChoose.getChoices(message, 0, 1, choices); + final List choice = SGuiChoose.getChoices(message, 0, 1, choices, selected, display); return choice.isEmpty() ? null : choice.get(0); } - public static T oneOrNone(final String message, final Collection choices) { + return oneOrNone(message, choices, null, null); + } + public static T oneOrNone(final String message, final Collection choices, T selected, Function display) { if ((choices == null) || choices.isEmpty()) { return null; } - final List choice = SGuiChoose.getChoices(message, 0, 1, choices); + final List choice = SGuiChoose.getChoices(message, 0, 1, choices, selected, display); return choice.isEmpty() ? null : choice.get(0); } @@ -143,11 +148,12 @@ public class SGuiChoose { public static List getChoices(final String message, final int min, final int max, final T[] choices) { return getChoices(message, min, max, Arrays.asList(choices), null, null); } - + public static List getChoices(final String message, final int min, final int max, final T[] choices, final T selected, final Function display) { + return getChoices(message, min, max, Arrays.asList(choices), selected, display); + } public static List getChoices(final String message, final int min, final int max, final Collection choices) { return getChoices(message, min, max, choices, null, null); } - public static List getChoices(final String message, final int min, final int max, final Collection choices, final T selected, final Function display) { return GuiBase.getInterface().getChoices(message, min, max, choices, selected, display); }