aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-06-06 16:29:32 +0800
committershedaniel <daniel@shedaniel.me>2020-06-06 16:29:32 +0800
commit3802055673e7877d66614791eba6ea0599488c7a (patch)
tree8a26efa9c9cea0c0ee1d00234c04eace52771dae /src/main/java
parentf7be9668e3b9508497e21ff74cc0f2f2e1b5d931 (diff)
downloadRoughlyEnoughItems-3802055673e7877d66614791eba6ea0599488c7a.tar.gz
RoughlyEnoughItems-3802055673e7877d66614791eba6ea0599488c7a.tar.bz2
RoughlyEnoughItems-3802055673e7877d66614791eba6ea0599488c7a.zip
Improved Search
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java2
-rw-r--r--src/main/java/me/shedaniel/rei/api/EntryStack.java13
-rw-r--r--src/main/java/me/shedaniel/rei/api/TextRepresentable.java25
-rw-r--r--src/main/java/me/shedaniel/rei/api/TextTest.java13
-rw-r--r--src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java8
-rw-r--r--src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java4
-rw-r--r--src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java3
-rw-r--r--src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java7
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java11
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java9
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java240
-rw-r--r--src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java42
-rw-r--r--src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java12
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java38
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RenderingEntry.java2
-rw-r--r--src/main/java/me/shedaniel/rei/impl/SearchArgument.java252
-rw-r--r--src/main/java/me/shedaniel/rei/impl/SimpleFluidRenderer.java62
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/AlwaysMatchingArgument.java27
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/Argument.java41
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/ArgumentsRegistry.java20
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/MatchStatus.java63
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/MatchType.java18
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/ModArgument.java43
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/RegexArgument.java56
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/TagArgument.java51
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/TextArgument.java33
-rw-r--r--src/main/java/me/shedaniel/rei/impl/search/TooltipArgument.java35
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java9
28 files changed, 752 insertions, 387 deletions
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index d8886e991..c9a5a45ba 100644
--- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -192,7 +192,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (packetContext, packetByteBuf) -> {
ItemStack stack = packetByteBuf.readItemStack();
String player = packetByteBuf.readString(32767);
- packetContext.getPlayer().addMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", SearchArgument.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false);
+ packetContext.getPlayer().addMessage(new LiteralText(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStack.create(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false);
});
ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
Screen currentScreen = MinecraftClient.getInstance().currentScreen;
diff --git a/src/main/java/me/shedaniel/rei/api/EntryStack.java b/src/main/java/me/shedaniel/rei/api/EntryStack.java
index 66c711b3d..9db7dca58 100644
--- a/src/main/java/me/shedaniel/rei/api/EntryStack.java
+++ b/src/main/java/me/shedaniel/rei/api/EntryStack.java
@@ -32,6 +32,7 @@ import me.shedaniel.rei.api.widgets.Tooltip;
import me.shedaniel.rei.impl.EmptyEntryStack;
import me.shedaniel.rei.impl.FluidEntryStack;
import me.shedaniel.rei.impl.ItemEntryStack;
+import me.shedaniel.rei.utils.CollectionUtils;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.fluid.Fluid;
@@ -40,7 +41,9 @@ import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.StringNbtReader;
+import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.registry.Registry;
@@ -54,7 +57,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
@SuppressWarnings("deprecation")
-public interface EntryStack {
+public interface EntryStack extends TextRepresentable {
static EntryStack empty() {
return EmptyEntryStack.EMPTY;
@@ -137,8 +140,14 @@ public interface EntryStack {
return copyFluidToItem(stack);
}
+ @Deprecated
+ @ApiStatus.ScheduledForRemoval
static EntryStack copyFluidToItem(EntryStack stack) {
- return FluidSupportProvider.INSTANCE.fluidToItem(stack);
+ Item bucketItem = stack.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ return EntryStack.create(bucketItem);
+ }
+ return EntryStack.empty();
}
@Deprecated
diff --git a/src/main/java/me/shedaniel/rei/api/TextRepresentable.java b/src/main/java/me/shedaniel/rei/api/TextRepresentable.java
new file mode 100644
index 000000000..fd058b0cc
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/api/TextRepresentable.java
@@ -0,0 +1,25 @@
+package me.shedaniel.rei.api;
+
+import me.shedaniel.math.impl.PointHelper;
+import me.shedaniel.rei.api.widgets.Tooltip;
+import net.minecraft.text.LiteralText;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.jetbrains.annotations.NotNull;
+
+public interface TextRepresentable {
+ @NotNull
+ default Text asFormattedText() {
+ if (this instanceof EntryStack) {
+ Tooltip tooltip = ((EntryStack) this).getTooltip(PointHelper.ofMouse());
+ if (tooltip != null && !tooltip.getText().isEmpty())
+ return tooltip.getText().get(0);
+ }
+ return new LiteralText("");
+ }
+
+ @NotNull
+ default Text asFormatStrippedText() {
+ return new LiteralText(Formatting.strip(asFormattedText().getString()));
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/api/TextTest.java b/src/main/java/me/shedaniel/rei/api/TextTest.java
new file mode 100644
index 000000000..0749aae62
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/api/TextTest.java
@@ -0,0 +1,13 @@
+package me.shedaniel.rei.api;
+
+import net.minecraft.text.LiteralText;
+import net.minecraft.text.MutableText;
+import net.minecraft.util.Formatting;
+
+public class TextTest {
+ public static void main(String[] args) {
+ MutableText text = new LiteralText("adaw").append("dawdwdaw").formatted(Formatting.RED);
+ System.out.println(text.getString());
+ System.out.println(text.getString());
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java b/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java
index 0356e887d..97d75d0d3 100644
--- a/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java
+++ b/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java
@@ -37,13 +37,19 @@ public interface FluidSupportProvider {
void registerFluidProvider(@NotNull FluidProvider provider);
+ @Deprecated
+ @ApiStatus.ScheduledForRemoval
@NotNull
- EntryStack fluidToItem(@NotNull EntryStack fluidStack);
+ default EntryStack fluidToItem(@NotNull EntryStack fluidStack) {
+ return EntryStack.empty();
+ }
@NotNull
EntryStack itemToFluid(@NotNull EntryStack itemStack);
interface FluidProvider {
+ @Deprecated
+ @ApiStatus.ScheduledForRemoval
@NotNull
default EntryStack fluidToItem(@NotNull EntryStack fluidStack) {
return EntryStack.empty();
diff --git a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
index 2f186c138..ef8d2a6ec 100644
--- a/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
+++ b/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java
@@ -135,7 +135,7 @@ public class OverlaySearchField extends TextFieldWidget {
addToHistory(getText());
setFocused(false);
return true;
- } else if (int_1 == 265) {
+ } else if (int_1 == 264) {
int i = history.indexOf(getText()) - 1;
if (i < -1 && getText().isEmpty())
i = history.size() - 1;
@@ -147,7 +147,7 @@ public class OverlaySearchField extends TextFieldWidget {
setText(history.get(i));
return true;
}
- } else if (int_1 == 264) {
+ } else if (int_1 == 265) {
int i = history.indexOf(getText()) + 1;
if (i > 0) {
setText(i < history.size() ? history.get(i) : "");
diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
index ed797d601..52efc96c3 100644
--- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
+++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java
@@ -342,10 +342,9 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen {
preWidgets.add(workingStationsBaseWidget = Widgets.createCategoryBase(new Rectangle(xx - 5, yy - 5, 15 + innerWidth * 16, 10 + actualHeight * 16)));
preWidgets.add(Widgets.createSlotBase(new Rectangle(xx - 1, yy - 1, innerWidth * 16 + 2, actualHeight * 16 + 2)));
int index = 0;
- List<Text> list = Collections.singletonList(new TranslatableText("text.rei.working_station").formatted(Formatting.YELLOW));
xx += (innerWidth - 1) * 16;
for (List<EntryStack> workingStation : workingStations) {
- preWidgets.add(new WorkstationSlotWidget(xx, yy, CollectionUtils.map(workingStation, stack -> stack.copy().setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> list))));
+ preWidgets.add(new WorkstationSlotWidget(xx, yy, workingStation));
index++;
yy += 16;
if (index >= hh) {
diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
index 79068c07b..39bb93746 100644
--- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
+++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java
@@ -41,7 +41,6 @@ import me.shedaniel.rei.gui.widget.Widget;
import me.shedaniel.rei.impl.ClientHelperImpl;
import me.shedaniel.rei.impl.InternalWidgets;
import me.shedaniel.rei.impl.ScreenHelper;
-import me.shedaniel.rei.utils.CollectionUtils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
@@ -51,15 +50,12 @@ import net.minecraft.client.util.NarratorManager;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.LiteralText;
-import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
-import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -171,9 +167,8 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen
widgets.add(Widgets.createCategoryBase(new Rectangle(xx - 5, bounds.y + bounds.height - 5, 10 + w * 16, 12 + h * 16)));
widgets.add(Widgets.createSlotBase(new Rectangle(xx - 1, yy - 1, 2 + w * 16, 2 + h * 16)));
int index = 0;
- List<Text> list = Collections.singletonList(new TranslatableText("text.rei.working_station").formatted(Formatting.YELLOW));
for (List<EntryStack> workingStation : workingStations) {
- widgets.add(new RecipeViewingScreen.WorkstationSlotWidget(xx, yy, CollectionUtils.map(workingStation, stack -> stack.copy().setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, s -> list))));
+ widgets.add(new RecipeViewingScreen.WorkstationSlotWidget(xx, yy, workingStation));
index++;
xx += 16;
if (index >= ww) {
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index be76074e1..4aee01ce9 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -46,6 +46,7 @@ import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
@@ -69,7 +70,7 @@ import java.util.stream.Collectors;
public class EntryListWidget extends WidgetWithBounds {
static final Supplier<Boolean> RENDER_ENCHANTMENT_GLINT = ConfigObject.getInstance()::doesRenderEntryEnchantmentGlint;
- static final Comparator<? super EntryStack> ENTRY_NAME_COMPARER = Comparator.comparing(SearchArgument::tryGetEntryStackName);
+ static final Comparator<? super EntryStack> ENTRY_NAME_COMPARER = Comparator.comparing(stack -> stack.asFormatStrippedText().getString());
static final Comparator<? super EntryStack> ENTRY_GROUP_COMPARER = Comparator.comparingInt(stack -> {
if (stack.getType() == EntryStack.Type.ITEM) {
ItemGroup group = stack.getItem().getGroup();
@@ -729,8 +730,12 @@ public class EntryListWidget extends WidgetWithBounds {
if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
EntryStack entry = getCurrentEntry().copy();
if (!entry.isEmpty()) {
- if (entry.getType() == EntryStack.Type.FLUID)
- entry = EntryStack.copyFluidToItem(entry);
+ if (entry.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = entry.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ entry = EntryStack.create(bucketItem);
+ }
+ }
if (entry.getType() == EntryStack.Type.ITEM)
entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
ClientHelper.getInstance().tryCheatingEntry(entry);
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
index bd7243cb6..b828a9eae 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
@@ -41,6 +41,7 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.Item;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.math.MathHelper;
import org.jetbrains.annotations.ApiStatus;
@@ -297,8 +298,12 @@ public class FavoritesListWidget extends WidgetWithBounds {
if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
EntryStack entry = getCurrentEntry().copy();
if (!entry.isEmpty()) {
- if (entry.getType() == EntryStack.Type.FLUID)
- entry = EntryStack.copyFluidToItem(entry);
+ if (entry.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = entry.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ entry = EntryStack.create(bucketItem);
+ }
+ }
if (entry.getType() == EntryStack.Type.ITEM)
entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
ClientHelper.getInstance().tryCheatingEntry(entry);
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
index 88896da40..868fa9ee7 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java
@@ -34,6 +34,7 @@ import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Tickable;
+import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Matrix4f;
import org.jetbrains.annotations.ApiStatus;
@@ -55,9 +56,9 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
public Function<String, String> stripInvalid;
protected int focusedTicks;
protected boolean editable;
- protected int field_2103;
- protected int cursorMax;
- protected int cursorMin;
+ protected int firstCharacterIndex;
+ protected int selectionStart;
+ protected int selectionEnd;
protected int editableColor;
protected int notEditableColor;
protected BiFunction<String, Integer, String> renderTextProvider;
@@ -65,9 +66,10 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
private String text;
private int maxLength;
private boolean hasBorder;
- private boolean field_2096;
+ private boolean focusUnlocked;
private boolean focused;
private boolean visible;
+ private boolean selecting;
private String suggestion;
private Consumer<String> changedListener;
private Predicate<String> textPredicate;
@@ -76,7 +78,7 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
this.text = "";
this.maxLength = 32;
this.hasBorder = true;
- this.field_2096 = true;
+ this.focusUnlocked = true;
this.editable = true;
this.editableColor = 14737632;
this.notEditableColor = 7368816;
@@ -111,7 +113,7 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
this.changedListener = biConsumer_1;
}
- public void method_1854(BiFunction<String, Integer, String> biFunction_1) {
+ public void setRenderTextProvider(BiFunction<String, Integer, String> biFunction_1) {
this.renderTextProvider = biFunction_1;
}
@@ -133,25 +135,25 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
}
this.onChanged(string_1);
- this.moveCursorToEnd();
+ this.setCursorToEnd();
}
}
public String getSelectedText() {
- int int_1 = Math.min(this.cursorMax, this.cursorMin);
- int int_2 = Math.max(this.cursorMax, this.cursorMin);
- return this.text.substring(int_1, int_2);
+ int i = Math.min(this.selectionStart, this.selectionEnd);
+ int j = Math.max(this.selectionStart, this.selectionEnd);
+ return this.text.substring(i, j);
}
- public void method_1890(Predicate<String> predicate_1) {
+ public void setTextPredicate(Predicate<String> predicate_1) {
this.textPredicate = predicate_1;
}
public void addText(String string_1) {
String string_2 = "";
String string_3 = stripInvalid.apply(string_1);
- int int_1 = Math.min(this.cursorMax, this.cursorMin);
- int int_2 = Math.max(this.cursorMax, this.cursorMin);
+ int int_1 = Math.min(this.selectionStart, this.selectionEnd);
+ int int_2 = Math.max(this.selectionStart, this.selectionEnd);
int int_3 = this.maxLength - this.text.length() - (int_1 - int_2);
if (!this.text.isEmpty()) {
string_2 = string_2 + this.text.substring(0, int_1);
@@ -172,8 +174,8 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
if (this.textPredicate.test(string_2)) {
this.text = string_2;
- this.setCursor(int_1 + int_5);
- this.method_1884(this.cursorMax);
+ this.setSelectionStart(int_1 + int_5);
+ this.setSelectionEnd(this.selectionStart);
this.onChanged(this.text);
}
}
@@ -185,119 +187,111 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
}
- private void method_16873(int int_1) {
+ private void erase(int int_1) {
if (Screen.hasControlDown()) {
- this.method_1877(int_1);
+ this.eraseWords(int_1);
} else {
- this.method_1878(int_1);
+ this.eraseCharacters(int_1);
}
-
}
- public void method_1877(int int_1) {
+ public void eraseWords(int wordOffset) {
if (!this.text.isEmpty()) {
- if (this.cursorMin != this.cursorMax) {
+ if (this.selectionEnd != this.selectionStart) {
this.addText("");
} else {
- this.method_1878(this.method_1853(int_1) - this.cursorMax);
+ this.eraseCharacters(this.getWordSkipPosition(wordOffset) - this.selectionStart);
}
}
}
- public void method_1878(int int_1) {
+ public void eraseCharacters(int characterOffset) {
if (!this.text.isEmpty()) {
- if (this.cursorMin != this.cursorMax) {
+ if (this.selectionEnd != this.selectionStart) {
this.addText("");
} else {
- boolean boolean_1 = int_1 < 0;
- int int_2 = boolean_1 ? this.cursorMax + int_1 : this.cursorMax;
- int int_3 = boolean_1 ? this.cursorMax : this.cursorMax + int_1;
- String string_1 = "";
- if (int_2 >= 0) {
- string_1 = this.text.substring(0, int_2);
- }
-
- if (int_3 < this.text.length()) {
- string_1 = string_1 + this.text.substring(int_3);
- }
-
- if (this.textPredicate.test(string_1)) {
- this.text = string_1;
- if (boolean_1) {
- this.moveCursor(int_1, true);
+ int i = this.getMovedCursorIndex(characterOffset);
+ int j = Math.min(i, this.selectionStart);
+ int k = Math.max(i, this.selectionStart);
+ if (j != k) {
+ String string = (new StringBuilder(this.text)).delete(j, k).toString();
+ if (this.textPredicate.test(string)) {
+ this.text = string;
+ this.setCursor(j);
}
-
- this.onChanged(this.text);
}
+ this.onChanged(this.text);
}
}
}
- public int method_1853(int int_1) {
- return this.method_1869(int_1, this.getCursor());
+ public int getWordSkipPosition(int int_1) {
+ return this.getWordSkipPosition(int_1, this.getCursor());
}
- public int method_1869(int int_1, int int_2) {
- return this.method_1864(int_1, int_2, true);
+ public int getWordSkipPosition(int int_1, int int_2) {
+ return this.getWordSkipPosition(int_1, int_2, true);
}
- public int method_1864(int int_1, int int_2, boolean boolean_1) {
- int int_3 = int_2;
- boolean boolean_2 = int_1 < 0;
- int int_4 = Math.abs(int_1);
+ public int getWordSkipPosition(int wordOffset, int cursorPosition, boolean skipOverSpaces) {
+ int i = cursorPosition;
+ boolean bl = wordOffset < 0;
+ int j = Math.abs(wordOffset);
- for (int int_5 = 0; int_5 < int_4; ++int_5) {
- if (!boolean_2) {
- int int_6 = this.text.length();
- int_3 = this.text.indexOf(32, int_3);
- if (int_3 == -1) {
- int_3 = int_6;
+ for (int k = 0; k < j; ++k) {
+ if (!bl) {
+ int l = this.text.length();
+ i = this.text.indexOf(32, i);
+ if (i == -1) {
+ i = l;
} else {
- while (boolean_1 && int_3 < int_6 && this.text.charAt(int_3) == ' ') {
- ++int_3;
+ while (skipOverSpaces && i < l && this.text.charAt(i) == ' ') {
+ ++i;
}
}
} else {
- while (boolean_1 && int_3 > 0 && this.text.charAt(int_3 - 1) == ' ') {
- --int_3;
+ while (skipOverSpaces && i > 0 && this.text.charAt(i - 1) == ' ') {
+ --i;
}
- while (int_3 > 0 && this.text.charAt(int_3 - 1) != ' ') {
- --int_3;
+ while (i > 0 && this.text.charAt(i - 1) != ' ') {
+ --i;
}
}
}
- return int_3;
+ return i;
}
- public void moveCursor(int int_1, boolean resetSelect) {
- this.moveCursorTo(this.cursorMax + int_1, resetSelect);
+ public void moveCursor(int int_1) {
+ this.setCursor(this.selectionStart + int_1);
}
- public void moveCursorTo(int int_1, boolean resetSelect) {
- this.setCursor(int_1);
- // if (!this.field_17037) {
- if (resetSelect) {
- this.method_1884(this.cursorMax);
+ private int getMovedCursorIndex(int i) {
+ return Util.moveCursor(this.text, this.selectionStart, i);
+ }
+
+ public void setCursor(int int_1) {
+ this.setSelectionStart(int_1);
+ if (!selecting) {
+ this.setSelectionEnd(this.selectionStart);
}
-
- this.onChanged(this.text);
}
- public void moveCursorToHead() {
- this.moveCursorTo(0, true);
+ public void setCursorToStart() {
+ this.setCursor(0);
}
- public void moveCursorToEnd() {
- this.moveCursorTo(this.text.length(), true);
+ public void setCursorToEnd() {
+ this.setCursor(this.text.length());
}
public boolean keyPressed(int int_1, int int_2, int int_3) {
if (this.isVisible() && this.isFocused()) {
+ this.selecting = Screen.hasShiftDown();
if (Screen.isSelectAll(int_1)) {
- this.moveCursorToEnd();
- this.method_1884(0);
+ this.setCursorToEnd();
+ this.setSelectionEnd(0);
return true;
} else if (Screen.isCopy(int_1)) {
minecraft.keyboard.setClipboard(this.getSelectedText());
@@ -319,7 +313,9 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
switch (int_1) {
case 259:
if (this.editable) {
- this.method_16873(-1);
+ this.selecting = false;
+ this.erase(-1);
+ this.selecting = Screen.hasShiftDown();
}
return true;
@@ -332,31 +328,33 @@ public class TextFieldWidget extends WidgetWithBounds implements Tickable {
return int_1 != 256;
case 261:
if (this.editable) {
- this.method_16873(1);
+ this.selecting = false;