Files
NotEnoughItems/src/main/java/codechicken/nei/SearchField.java
T

147 lines
4.9 KiB
Java
Raw Normal View History

2014-04-29 10:54:20 +10:00
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.world;
2019-12-24 13:37:41 -08:00
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.ItemList.AnyMultiItemFilter;
import codechicken.nei.ItemList.EverythingItemFilter;
import codechicken.nei.ItemList.PatternItemFilter;
import codechicken.nei.api.API;
import codechicken.nei.api.ItemFilter;
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import net.minecraft.util.EnumChatFormatting;
public class SearchField extends TextField implements ItemFilterProvider {
/**
* Interface for returning a custom filter based on search field text
*/
public static interface ISearchProvider {
/**
* @return false if this filter should only be used if no other non-default filters match the search string
*/
public boolean isPrimary();
/**
* @return An item filter for items matching SearchTex null to ignore this provider
*/
public ItemFilter getFilter(String searchText);
}
private static class DefaultSearchProvider implements ISearchProvider {
@Override
public boolean isPrimary() {
return false;
}
@Override
public ItemFilter getFilter(String searchText) {
Pattern pattern = getPattern(searchText);
return pattern == null ? null : new PatternItemFilter(pattern);
}
}
2019-12-30 20:19:16 -08:00
public static List<ISearchProvider> searchProviders = new LinkedList<>();
long lastclicktime;
2014-04-29 10:54:20 +10:00
public SearchField(String ident) {
super(ident);
API.addItemFilter(this);
API.addSearchProvider(new DefaultSearchProvider());
2014-04-29 10:54:20 +10:00
}
public static boolean searchInventories() {
return world.nbt.getBoolean("searchinventories");
}
@Override
public int getTextColour() {
2022-01-02 23:30:54 +02:00
if (ItemPanels.itemPanel.getItems().isEmpty()) {
2019-12-24 13:37:41 -08:00
return focused() ? 0xFFcc3300 : 0xFF993300;
} else {
return focused() ? 0xFFE0E0E0 : 0xFF909090;
}
}
@Override
public void draw(int mousex, int mousey) {
super.draw(mousex, mousey);
if (searchInventories()) {
GuiDraw.drawGradientRect(x - 1, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); // Left
GuiDraw.drawGradientRect(x - 1, y - 1, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); // Top
GuiDraw.drawGradientRect(x + w, y - 1, 1, h + 2, 0xFFFFFF00, 0xFFC0B000); // Left
GuiDraw.drawGradientRect(x - 1, y + h, w + 2, 1, 0xFFFFFF00, 0xFFC0B000); // Bottom
2019-12-24 13:37:41 -08:00
}
2014-04-29 10:54:20 +10:00
}
@Override
public boolean handleClick(int mousex, int mousey, int button) {
if (button == 0) {
if (focused() && (System.currentTimeMillis() - lastclicktime < 400)) { // double click
NEIClientConfig.world.nbt.setBoolean("searchinventories", !searchInventories());
NEIClientConfig.world.saveNBT();
2014-04-29 10:54:20 +10:00
}
lastclicktime = System.currentTimeMillis();
}
return super.handleClick(mousex, mousey, button);
}
@Override
public void onTextChange(String oldText) {
2019-12-24 13:37:41 -08:00
final String newText = text();
if (newText.length() > 0) NEIClientConfig.logger.debug("Searching for " + text());
2019-12-24 13:37:41 -08:00
NEIClientConfig.setSearchExpression(newText);
ItemList.updateFilter.restart();
2014-04-29 10:54:20 +10:00
}
@Override
public void lastKeyTyped(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.search")) setFocus(true);
2014-04-29 10:54:20 +10:00
}
@Override
public String filterText(String s) {
return EnumChatFormatting.getTextWithoutFormattingCodes(s);
}
2014-12-14 17:10:00 +10:00
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 {
2014-12-14 17:10:00 +10:00
pattern = Pattern.compile(search);
} catch (PatternSyntaxException ignored) {
}
2014-12-14 17:10:00 +10:00
return pattern == null || pattern.toString().length() == 0 ? null : pattern;
}
@Override
public ItemFilter getFilter() {
String s_filter = text().toLowerCase();
2019-12-30 20:19:16 -08:00
List<ItemFilter> primary = new LinkedList<>();
List<ItemFilter> secondary = new LinkedList<>();
for (ISearchProvider p : searchProviders) {
2014-12-14 17:10:00 +10:00
ItemFilter filter = p.getFilter(s_filter);
if (filter != null) (p.isPrimary() ? primary : secondary).add(filter);
2014-12-14 17:10:00 +10:00
}
if (!primary.isEmpty()) return new AnyMultiItemFilter(primary);
if (!secondary.isEmpty()) return new AnyMultiItemFilter(secondary);
return new EverythingItemFilter();
}
2014-04-29 10:54:20 +10:00
}