Spaces:
Build error
Build error
package net.minecraft.client.gui.components; | |
import java.util.Objects; | |
import java.util.function.BiFunction; | |
import java.util.function.Consumer; | |
import java.util.function.Predicate; | |
import javax.annotation.Nullable; | |
import net.minecraft.Util; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.gui.Font; | |
import net.minecraft.client.gui.GuiGraphics; | |
import net.minecraft.client.gui.narration.NarratedElementType; | |
import net.minecraft.client.gui.narration.NarrationElementOutput; | |
import net.minecraft.client.gui.screens.Screen; | |
import net.minecraft.client.renderer.RenderType; | |
import net.minecraft.client.sounds.SoundManager; | |
import net.minecraft.network.chat.Component; | |
import net.minecraft.network.chat.MutableComponent; | |
import net.minecraft.network.chat.Style; | |
import net.minecraft.resources.ResourceLocation; | |
import net.minecraft.util.FormattedCharSequence; | |
import net.minecraft.util.Mth; | |
import net.minecraft.util.StringUtil; | |
import net.minecraftforge.api.distmarker.Dist; | |
import net.minecraftforge.api.distmarker.OnlyIn; | |
public class EditBox extends AbstractWidget { | |
private static final WidgetSprites SPRITES = new WidgetSprites( | |
ResourceLocation.withDefaultNamespace("widget/text_field"), ResourceLocation.withDefaultNamespace("widget/text_field_highlighted") | |
); | |
public static final int BACKWARDS = -1; | |
public static final int FORWARDS = 1; | |
private static final int CURSOR_INSERT_WIDTH = 1; | |
private static final int CURSOR_INSERT_COLOR = -3092272; | |
private static final String CURSOR_APPEND_CHARACTER = "_"; | |
public static final int DEFAULT_TEXT_COLOR = 14737632; | |
private static final int CURSOR_BLINK_INTERVAL_MS = 300; | |
private final Font font; | |
private String value = ""; | |
private int maxLength = 32; | |
private boolean bordered = true; | |
private boolean canLoseFocus = true; | |
private boolean isEditable = true; | |
private int displayPos; | |
private int cursorPos; | |
private int highlightPos; | |
private int textColor = 14737632; | |
private int textColorUneditable = 7368816; | |
private String suggestion; | |
private Consumer<String> responder; | |
private Predicate<String> filter = Objects::nonNull; | |
private BiFunction<String, Integer, FormattedCharSequence> formatter = (p_94147_, p_94148_) -> FormattedCharSequence.forward(p_94147_, Style.EMPTY); | |
private Component hint; | |
private long focusedTime = Util.getMillis(); | |
public EditBox(Font p_299161_, int p_299570_, int p_297565_, Component p_300284_) { | |
this(p_299161_, 0, 0, p_299570_, p_297565_, p_300284_); | |
} | |
public EditBox(Font p_94114_, int p_94115_, int p_94116_, int p_94117_, int p_94118_, Component p_94119_) { | |
this(p_94114_, p_94115_, p_94116_, p_94117_, p_94118_, null, p_94119_); | |
} | |
public EditBox(Font p_94106_, int p_94107_, int p_94108_, int p_94109_, int p_94110_, EditBox p_94111_, Component p_94112_) { | |
super(p_94107_, p_94108_, p_94109_, p_94110_, p_94112_); | |
this.font = p_94106_; | |
if (p_94111_ != null) { | |
this.setValue(p_94111_.getValue()); | |
} | |
} | |
public void setResponder(Consumer<String> p_94152_) { | |
this.responder = p_94152_; | |
} | |
public void setFormatter(BiFunction<String, Integer, FormattedCharSequence> p_94150_) { | |
this.formatter = p_94150_; | |
} | |
protected MutableComponent createNarrationMessage() { | |
Component component = this.getMessage(); | |
return Component.translatable("gui.narrate.editBox", component, this.value); | |
} | |
public void setValue(String p_94145_) { | |
if (this.filter.test(p_94145_)) { | |
if (p_94145_.length() > this.maxLength) { | |
this.value = p_94145_.substring(0, this.maxLength); | |
} else { | |
this.value = p_94145_; | |
} | |
this.moveCursorToEnd(false); | |
this.setHighlightPos(this.cursorPos); | |
this.onValueChange(p_94145_); | |
} | |
} | |
public String getValue() { | |
return this.value; | |
} | |
public String getHighlighted() { | |
int i = Math.min(this.cursorPos, this.highlightPos); | |
int j = Math.max(this.cursorPos, this.highlightPos); | |
return this.value.substring(i, j); | |
} | |
public void setFilter(Predicate<String> p_94154_) { | |
this.filter = p_94154_; | |
} | |
public void insertText(String p_94165_) { | |
int i = Math.min(this.cursorPos, this.highlightPos); | |
int j = Math.max(this.cursorPos, this.highlightPos); | |
int k = this.maxLength - this.value.length() - (i - j); | |
if (k > 0) { | |
String s = StringUtil.filterText(p_94165_); | |
int l = s.length(); | |
if (k < l) { | |
if (Character.isHighSurrogate(s.charAt(k - 1))) { | |
k--; | |
} | |
s = s.substring(0, k); | |
l = k; | |
} | |
String s1 = new StringBuilder(this.value).replace(i, j, s).toString(); | |
if (this.filter.test(s1)) { | |
this.value = s1; | |
this.setCursorPosition(i + l); | |
this.setHighlightPos(this.cursorPos); | |
this.onValueChange(this.value); | |
} | |
} | |
} | |
private void onValueChange(String p_94175_) { | |
if (this.responder != null) { | |
this.responder.accept(p_94175_); | |
} | |
} | |
private void deleteText(int p_94218_) { | |
if (Screen.hasControlDown()) { | |
this.deleteWords(p_94218_); | |
} else { | |
this.deleteChars(p_94218_); | |
} | |
} | |
public void deleteWords(int p_94177_) { | |
if (!this.value.isEmpty()) { | |
if (this.highlightPos != this.cursorPos) { | |
this.insertText(""); | |
} else { | |
this.deleteCharsToPos(this.getWordPosition(p_94177_)); | |
} | |
} | |
} | |
public void deleteChars(int p_94181_) { | |
this.deleteCharsToPos(this.getCursorPos(p_94181_)); | |
} | |
public void deleteCharsToPos(int p_310763_) { | |
if (!this.value.isEmpty()) { | |
if (this.highlightPos != this.cursorPos) { | |
this.insertText(""); | |
} else { | |
int i = Math.min(p_310763_, this.cursorPos); | |
int j = Math.max(p_310763_, this.cursorPos); | |
if (i != j) { | |
String s = new StringBuilder(this.value).delete(i, j).toString(); | |
if (this.filter.test(s)) { | |
this.value = s; | |
this.moveCursorTo(i, false); | |
} | |
} | |
} | |
} | |
} | |
public int getWordPosition(int p_94185_) { | |
return this.getWordPosition(p_94185_, this.getCursorPosition()); | |
} | |
private int getWordPosition(int p_94129_, int p_94130_) { | |
return this.getWordPosition(p_94129_, p_94130_, true); | |
} | |
private int getWordPosition(int p_94141_, int p_94142_, boolean p_94143_) { | |
int i = p_94142_; | |
boolean flag = p_94141_ < 0; | |
int j = Math.abs(p_94141_); | |
for (int k = 0; k < j; k++) { | |
if (!flag) { | |
int l = this.value.length(); | |
i = this.value.indexOf(32, i); | |
if (i == -1) { | |
i = l; | |
} else { | |
while (p_94143_ && i < l && this.value.charAt(i) == ' ') { | |
i++; | |
} | |
} | |
} else { | |
while (p_94143_ && i > 0 && this.value.charAt(i - 1) == ' ') { | |
i--; | |
} | |
while (i > 0 && this.value.charAt(i - 1) != ' ') { | |
i--; | |
} | |
} | |
} | |
return i; | |
} | |
public void moveCursor(int p_94189_, boolean p_297286_) { | |
this.moveCursorTo(this.getCursorPos(p_94189_), p_297286_); | |
} | |
private int getCursorPos(int p_94221_) { | |
return Util.offsetByCodepoints(this.value, this.cursorPos, p_94221_); | |
} | |
public void moveCursorTo(int p_94193_, boolean p_300521_) { | |
this.setCursorPosition(p_94193_); | |
if (!p_300521_) { | |
this.setHighlightPos(this.cursorPos); | |
} | |
this.onValueChange(this.value); | |
} | |
public void setCursorPosition(int p_94197_) { | |
this.cursorPos = Mth.clamp(p_94197_, 0, this.value.length()); | |
this.scrollTo(this.cursorPos); | |
} | |
public void moveCursorToStart(boolean p_299543_) { | |
this.moveCursorTo(0, p_299543_); | |
} | |
public void moveCursorToEnd(boolean p_297711_) { | |
this.moveCursorTo(this.value.length(), p_297711_); | |
} | |
public boolean keyPressed(int p_94132_, int p_94133_, int p_94134_) { | |
if (this.isActive() && this.isFocused()) { | |
switch (p_94132_) { | |
case 259: | |
if (this.isEditable) { | |
this.deleteText(-1); | |
} | |
return true; | |
case 260: | |
case 264: | |
case 265: | |
case 266: | |
case 267: | |
default: | |
if (Screen.isSelectAll(p_94132_)) { | |
this.moveCursorToEnd(false); | |
this.setHighlightPos(0); | |
return true; | |
} else if (Screen.isCopy(p_94132_)) { | |
Minecraft.getInstance().keyboardHandler.setClipboard(this.getHighlighted()); | |
return true; | |
} else if (Screen.isPaste(p_94132_)) { | |
if (this.isEditable()) { | |
this.insertText(Minecraft.getInstance().keyboardHandler.getClipboard()); | |
} | |
return true; | |
} else { | |
if (Screen.isCut(p_94132_)) { | |
Minecraft.getInstance().keyboardHandler.setClipboard(this.getHighlighted()); | |
if (this.isEditable()) { | |
this.insertText(""); | |
} | |
return true; | |
} | |
return false; | |
} | |
case 261: | |
if (this.isEditable) { | |
this.deleteText(1); | |
} | |
return true; | |
case 262: | |
if (Screen.hasControlDown()) { | |
this.moveCursorTo(this.getWordPosition(1), Screen.hasShiftDown()); | |
} else { | |
this.moveCursor(1, Screen.hasShiftDown()); | |
} | |
return true; | |
case 263: | |
if (Screen.hasControlDown()) { | |
this.moveCursorTo(this.getWordPosition(-1), Screen.hasShiftDown()); | |
} else { | |
this.moveCursor(-1, Screen.hasShiftDown()); | |
} | |
return true; | |
case 268: | |
this.moveCursorToStart(Screen.hasShiftDown()); | |
return true; | |
case 269: | |
this.moveCursorToEnd(Screen.hasShiftDown()); | |
return true; | |
} | |
} else { | |
return false; | |
} | |
} | |
public boolean canConsumeInput() { | |
return this.isActive() && this.isFocused() && this.isEditable(); | |
} | |
public boolean charTyped(char p_94122_, int p_94123_) { | |
if (!this.canConsumeInput()) { | |
return false; | |
} else if (StringUtil.isAllowedChatCharacter(p_94122_)) { | |
if (this.isEditable) { | |
this.insertText(Character.toString(p_94122_)); | |
} | |
return true; | |
} else { | |
return false; | |
} | |
} | |
public void onClick(double p_279417_, double p_279437_) { | |
int i = Mth.floor(p_279417_) - this.getX(); | |
if (this.bordered) { | |
i -= 4; | |
} | |
String s = this.font.plainSubstrByWidth(this.value.substring(this.displayPos), this.getInnerWidth()); | |
this.moveCursorTo(this.font.plainSubstrByWidth(s, i).length() + this.displayPos, Screen.hasShiftDown()); | |
} | |
public void playDownSound(SoundManager p_279245_) { | |
} | |
public void renderWidget(GuiGraphics p_283252_, int p_281594_, int p_282100_, float p_283101_) { | |
if (this.isVisible()) { | |
if (this.isBordered()) { | |
ResourceLocation resourcelocation = SPRITES.get(this.isActive(), this.isFocused()); | |
p_283252_.blitSprite(RenderType::guiTextured, resourcelocation, this.getX(), this.getY(), this.getWidth(), this.getHeight()); | |
} | |
int l1 = this.isEditable ? this.textColor : this.textColorUneditable; | |
int i = this.cursorPos - this.displayPos; | |
String s = this.font.plainSubstrByWidth(this.value.substring(this.displayPos), this.getInnerWidth()); | |
boolean flag = i >= 0 && i <= s.length(); | |
boolean flag1 = this.isFocused() && (Util.getMillis() - this.focusedTime) / 300L % 2L == 0L && flag; | |
int j = this.bordered ? this.getX() + 4 : this.getX(); | |
int k = this.bordered ? this.getY() + (this.height - 8) / 2 : this.getY(); | |
int l = j; | |
int i1 = Mth.clamp(this.highlightPos - this.displayPos, 0, s.length()); | |
if (!s.isEmpty()) { | |
String s1 = flag ? s.substring(0, i) : s; | |
l = p_283252_.drawString(this.font, this.formatter.apply(s1, this.displayPos), j, k, l1); | |
} | |
boolean flag2 = this.cursorPos < this.value.length() || this.value.length() >= this.getMaxLength(); | |
int j1 = l; | |
if (!flag) { | |
j1 = i > 0 ? j + this.width : j; | |
} else if (flag2) { | |
j1 = l - 1; | |
l--; | |
} | |
if (!s.isEmpty() && flag && i < s.length()) { | |
p_283252_.drawString(this.font, this.formatter.apply(s.substring(i), this.cursorPos), l, k, l1); | |
} | |
if (this.hint != null && s.isEmpty() && !this.isFocused()) { | |
p_283252_.drawString(this.font, this.hint, l, k, l1); | |
} | |
if (!flag2 && this.suggestion != null) { | |
p_283252_.drawString(this.font, this.suggestion, j1 - 1, k, -8355712); | |
} | |
if (flag1) { | |
if (flag2) { | |
p_283252_.fill(RenderType.guiOverlay(), j1, k - 1, j1 + 1, k + 1 + 9, -3092272); | |
} else { | |
p_283252_.drawString(this.font, "_", j1, k, l1); | |
} | |
} | |
if (i1 != i) { | |
int k1 = j + this.font.width(s.substring(0, i1)); | |
this.renderHighlight(p_283252_, j1, k - 1, k1 - 1, k + 1 + 9); | |
} | |
} | |
} | |
private void renderHighlight(GuiGraphics p_281400_, int p_265338_, int p_265693_, int p_265618_, int p_265584_) { | |
if (p_265338_ < p_265618_) { | |
int i = p_265338_; | |
p_265338_ = p_265618_; | |
p_265618_ = i; | |
} | |
if (p_265693_ < p_265584_) { | |
int j = p_265693_; | |
p_265693_ = p_265584_; | |
p_265584_ = j; | |
} | |
if (p_265618_ > this.getX() + this.width) { | |
p_265618_ = this.getX() + this.width; | |
} | |
if (p_265338_ > this.getX() + this.width) { | |
p_265338_ = this.getX() + this.width; | |
} | |
p_281400_.fill(RenderType.guiTextHighlight(), p_265338_, p_265693_, p_265618_, p_265584_, -16776961); | |
} | |
public void setMaxLength(int p_94200_) { | |
this.maxLength = p_94200_; | |
if (this.value.length() > p_94200_) { | |
this.value = this.value.substring(0, p_94200_); | |
this.onValueChange(this.value); | |
} | |
} | |
private int getMaxLength() { | |
return this.maxLength; | |
} | |
public int getCursorPosition() { | |
return this.cursorPos; | |
} | |
public boolean isBordered() { | |
return this.bordered; | |
} | |
public void setBordered(boolean p_94183_) { | |
this.bordered = p_94183_; | |
} | |
public void setTextColor(int p_94203_) { | |
this.textColor = p_94203_; | |
} | |
public void setTextColorUneditable(int p_94206_) { | |
this.textColorUneditable = p_94206_; | |
} | |
public void setFocused(boolean p_265520_) { | |
if (this.canLoseFocus || p_265520_) { | |
super.setFocused(p_265520_); | |
if (p_265520_) { | |
this.focusedTime = Util.getMillis(); | |
} | |
} | |
} | |
private boolean isEditable() { | |
return this.isEditable; | |
} | |
public void setEditable(boolean p_94187_) { | |
this.isEditable = p_94187_; | |
} | |
public int getInnerWidth() { | |
return this.isBordered() ? this.width - 8 : this.width; | |
} | |
public void setHighlightPos(int p_94209_) { | |
this.highlightPos = Mth.clamp(p_94209_, 0, this.value.length()); | |
this.scrollTo(this.highlightPos); | |
} | |
private void scrollTo(int p_299591_) { | |
if (this.font != null) { | |
this.displayPos = Math.min(this.displayPos, this.value.length()); | |
int i = this.getInnerWidth(); | |
String s = this.font.plainSubstrByWidth(this.value.substring(this.displayPos), i); | |
int j = s.length() + this.displayPos; | |
if (p_299591_ == this.displayPos) { | |
this.displayPos = this.displayPos - this.font.plainSubstrByWidth(this.value, i, true).length(); | |
} | |
if (p_299591_ > j) { | |
this.displayPos += p_299591_ - j; | |
} else if (p_299591_ <= this.displayPos) { | |
this.displayPos = this.displayPos - (this.displayPos - p_299591_); | |
} | |
this.displayPos = Mth.clamp(this.displayPos, 0, this.value.length()); | |
} | |
} | |
public void setCanLoseFocus(boolean p_94191_) { | |
this.canLoseFocus = p_94191_; | |
} | |
public boolean isVisible() { | |
return this.visible; | |
} | |
public void setVisible(boolean p_94195_) { | |
this.visible = p_94195_; | |
} | |
public void setSuggestion( { String p_94168_) | |
this.suggestion = p_94168_; | |
} | |
public int getScreenX(int p_94212_) { | |
return p_94212_ > this.value.length() ? this.getX() : this.getX() + this.font.width(this.value.substring(0, p_94212_)); | |
} | |
public void updateWidgetNarration(NarrationElementOutput p_259237_) { | |
p_259237_.add(NarratedElementType.TITLE, this.createNarrationMessage()); | |
} | |
public void setHint(Component p_259584_) { | |
this.hint = p_259584_; | |
} | |
} |