diff --git a/src/codechicken/nei/ItemList.java b/src/codechicken/nei/ItemList.java index 79f63f9d..1c484df0 100644 --- a/src/codechicken/nei/ItemList.java +++ b/src/codechicken/nei/ItemList.java @@ -54,7 +54,7 @@ public class ItemList public static class PatternItemFilter implements ItemFilter { - Pattern pattern; + public Pattern pattern; public PatternItemFilter(Pattern pattern) { this.pattern = pattern; @@ -66,6 +66,56 @@ public class ItemList } } + public static class AllMultiItemFilter implements ItemFilter + { + public List filters = new LinkedList(); + + public AllMultiItemFilter(List filters) { + this.filters = filters; + } + + public AllMultiItemFilter() { + this(new LinkedList()); + } + + @Override + public boolean matches(ItemStack item) { + for(ItemFilter filter : filters) + try { + if (!filter.matches(item)) return false; + } catch (Exception e) { + NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e); + } + + return true; + } + } + + public static class AnyMultiItemFilter implements ItemFilter + { + public List filters = new LinkedList(); + + public AnyMultiItemFilter(List filters) { + this.filters = filters; + } + + public AnyMultiItemFilter() { + this(new LinkedList()); + } + + @Override + public boolean matches(ItemStack item) { + for(ItemFilter filter : filters) + try { + if (filter.matches(item)) return true; + } catch (Exception e) { + NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e); + } + + return false; + } + } + public static interface ItemsLoadedCallback { public void itemsLoaded(); @@ -84,8 +134,16 @@ public class ItemList return true; } + /** + * @deprecated use getItemListFilter().matches(item) + */ + @Deprecated public static boolean itemMatches(ItemStack item) { - return itemMatchesAll(item, getItemFilters()); + return getItemListFilter().matches(item); + } + + public static ItemFilter getItemListFilter() { + return new AllMultiItemFilter(getItemFilters()); } public static List getItemFilters() { @@ -171,11 +229,11 @@ public class ItemList @Override public void execute() { ArrayList filtered = new ArrayList(); - List filters = getItemFilters(); + ItemFilter filter = getItemListFilter(); for(ItemStack item : items) { if (interrupted()) return; - if(itemMatchesAll(item, filters)) + if(filter.matches(item)) filtered.add(item); } diff --git a/src/codechicken/nei/SearchField.java b/src/codechicken/nei/SearchField.java index f21f6869..084749fe 100644 --- a/src/codechicken/nei/SearchField.java +++ b/src/codechicken/nei/SearchField.java @@ -80,6 +80,26 @@ public class SearchField extends TextField implements ItemFilterProvider return EnumChatFormatting.getTextWithoutFormattingCodes(s); } + public static Pattern getPattern(String search) { + switch(NEIClientConfig.getIntSetting("inventory.searchmode")) { + case 0://plain + search = "\\Q"+search+"\\E"; + break; + case 1: + search = search + .replace(".", "") + .replace("?", ".") + .replace("*", ".+?"); + break; + } + + Pattern pattern = null; + try { + pattern = Pattern.compile(search); + } catch (PatternSyntaxException ignored) {} + return pattern == null || pattern.toString().length() == 0 ? null : pattern; + } + @Override public ItemFilter getFilter() { String s_filter = text().toLowerCase(); @@ -90,25 +110,7 @@ public class SearchField extends TextField implements ItemFilterProvider return filter; } - switch(NEIClientConfig.getIntSetting("inventory.searchmode")) { - case 0://plain - s_filter = "\\Q"+s_filter+"\\E"; - break; - case 1: - s_filter = s_filter - .replace(".", "") - .replace("?", ".") - .replace("*", ".+?"); - break; - } - - Pattern pattern = null; - try { - pattern = Pattern.compile(s_filter); - } catch (PatternSyntaxException ignored) {} - if (pattern == null || pattern.toString().equals("")) - return new EverythingItemFilter(); - - return new PatternItemFilter(pattern); + Pattern pattern = getPattern(s_filter); + return pattern == null ? new EverythingItemFilter() : new PatternItemFilter(pattern); } } diff --git a/src/codechicken/nei/SubsetWidget.java b/src/codechicken/nei/SubsetWidget.java index 71bca9d9..4ac5421d 100644 --- a/src/codechicken/nei/SubsetWidget.java +++ b/src/codechicken/nei/SubsetWidget.java @@ -3,6 +3,7 @@ package codechicken.nei; import codechicken.core.gui.GuiScrollSlot; import codechicken.lib.gui.GuiDraw; import codechicken.lib.vec.Rectangle4i; +import codechicken.nei.ItemList.AnyMultiItemFilter; import codechicken.nei.ItemList.ItemsLoadedCallback; import codechicken.nei.ItemList.NothingItemFilter; import codechicken.nei.SearchField.ISearchProvider; @@ -21,6 +22,7 @@ import java.awt.*; import java.util.*; import java.util.List; import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Pattern; public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoadedCallback, ISearchProvider { @@ -203,25 +205,20 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa tag.cacheState(); } - public ItemFilter compositeFilter() { - final List filters = new LinkedList(); + public void addFilters(List filters) { if(filter != null) filters.add(filter); for(SubsetTag child : sorted) - filters.add(child.compositeFilter()); + child.addFilters(filters); + } - return new ItemFilter() - { - @Override - public boolean matches(ItemStack item) { - for(ItemFilter filter : filters) - if(filter.matches(item)) - return true; - - return false; - } - }; + public void search(List tags, Pattern p) { + if(fullname != null && p.matcher(fullname.toLowerCase()).find()) + tags.add(this); + else + for(SubsetTag child : sorted) + child.search(tags, p); } public void updateVisiblity(int mx, int my) { @@ -709,8 +706,22 @@ public class SubsetWidget extends Button implements ItemFilterProvider, ItemsLoa if(!searchText.startsWith("@")) return null; - SubsetTag tag = getTag(searchText.substring(1)); - return tag != null ? tag.compositeFilter() : null; + searchText = searchText.substring(1); + AnyMultiItemFilter filter = new AnyMultiItemFilter(); + SubsetTag tag = getTag(searchText); + if(tag != null) + tag.addFilters(filter.filters); + else { + Pattern p = SearchField.getPattern(searchText); + if(p == null) return null; + + List matching = new LinkedList(); + root.search(matching, p); + if(matching.isEmpty()) return null; + for(SubsetTag tag2 : matching) + tag2.addFilters(filter.filters); + } + return filter; } @Override diff --git a/src/codechicken/nei/config/GuiItemIconDumper.java b/src/codechicken/nei/config/GuiItemIconDumper.java index 9008fb30..001c2130 100644 --- a/src/codechicken/nei/config/GuiItemIconDumper.java +++ b/src/codechicken/nei/config/GuiItemIconDumper.java @@ -79,8 +79,7 @@ public class GuiItemIconDumper extends GuiScreen try { drawItems(); exportItems(); - } - catch (Exception e) { + } catch (Exception e) { NEIClientConfig.logger.error("Error dumping item icons", e); } }