TextFieldHelper.java
net.minecraft.client.gui.font.TextFieldHelper
信息
- 全限定名:net.minecraft.client.gui.font.TextFieldHelper
- 类型:public class
- 包:net.minecraft.client.gui.font
- 源码路径:src/main/java/net/minecraft/client/gui/font/TextFieldHelper.java
- 起始行号:L17
- 职责:
TODO
字段/常量
-
getMessageFn- 类型:
Supplier<String> - 修饰符:
private final - 源码定位:
L18 - 说明:
TODO
- 类型:
-
setMessageFn- 类型:
Consumer<String> - 修饰符:
private final - 源码定位:
L19 - 说明:
TODO
- 类型:
-
getClipboardFn- 类型:
Supplier<String> - 修饰符:
private final - 源码定位:
L20 - 说明:
TODO
- 类型:
-
setClipboardFn- 类型:
Consumer<String> - 修饰符:
private final - 源码定位:
L21 - 说明:
TODO
- 类型:
-
stringValidator- 类型:
Predicate<String> - 修饰符:
private final - 源码定位:
L22 - 说明:
TODO
- 类型:
-
cursorPos- 类型:
int - 修饰符:
private - 源码定位:
L23 - 说明:
TODO
- 类型:
-
selectionPos- 类型:
int - 修饰符:
private - 源码定位:
L24 - 说明:
TODO
- 类型:
内部类/嵌套类型
net.minecraft.client.gui.font.TextFieldHelper.CursorStep- 类型:
enum - 修饰符:
public static - 源码定位:
L291 - 说明:
TODO
- 类型:
构造器
public TextFieldHelper(Supplier<String> getMessageFn, Consumer<String> setMessageFn, Supplier<String> getClipboardFn, Consumer<String> setClipboardFn, Predicate<String> stringValidator) @ L26
- 构造器名:TextFieldHelper
- 源码定位:L26
- 修饰符:public
参数:
- getMessageFn: Supplier
- setMessageFn: Consumer
- getClipboardFn: Supplier
- setClipboardFn: Consumer
- stringValidator: Predicate
说明:
TODO
方法
下面的方法块按源码顺序生成。
public static Supplier<String> createClipboardGetter(Minecraft minecraft) @ L41
- 方法名:createClipboardGetter
- 源码定位:L41
- 返回类型:Supplier
- 修饰符:public static
参数:
- minecraft: Minecraft
说明:
TODO
public static String getClipboardContents(Minecraft minecraft) @ L45
- 方法名:getClipboardContents
- 源码定位:L45
- 返回类型:String
- 修饰符:public static
参数:
- minecraft: Minecraft
说明:
TODO
public static Consumer<String> createClipboardSetter(Minecraft minecraft) @ L49
- 方法名:createClipboardSetter
- 源码定位:L49
- 返回类型:Consumer
- 修饰符:public static
参数:
- minecraft: Minecraft
说明:
TODO
public static void setClipboardContents(Minecraft minecraft, String text) @ L53
- 方法名:setClipboardContents
- 源码定位:L53
- 返回类型:void
- 修饰符:public static
参数:
- minecraft: Minecraft
- text: String
说明:
TODO
public boolean charTyped(CharacterEvent event) @ L57
- 方法名:charTyped
- 源码定位:L57
- 返回类型:boolean
- 修饰符:public
参数:
- event: CharacterEvent
说明:
TODO
public boolean keyPressed(KeyEvent event) @ L65
- 方法名:keyPressed
- 源码定位:L65
- 返回类型:boolean
- 修饰符:public
参数:
- event: KeyEvent
说明:
TODO
private int clampToMsgLength(int value) @ L113
- 方法名:clampToMsgLength
- 源码定位:L113
- 返回类型:int
- 修饰符:private
参数:
- value: int
说明:
TODO
private void insertText(String message, String text) @ L117
- 方法名:insertText
- 源码定位:L117
- 返回类型:void
- 修饰符:private
参数:
- message: String
- text: String
说明:
TODO
public void insertText(String text) @ L130
- 方法名:insertText
- 源码定位:L130
- 返回类型:void
- 修饰符:public
参数:
- text: String
说明:
TODO
private void resetSelectionIfNeeded(boolean selecting) @ L134
- 方法名:resetSelectionIfNeeded
- 源码定位:L134
- 返回类型:void
- 修饰符:private
参数:
- selecting: boolean
说明:
TODO
public void moveBy(int count, boolean selecting, TextFieldHelper.CursorStep scope) @ L140
- 方法名:moveBy
- 源码定位:L140
- 返回类型:void
- 修饰符:public
参数:
- count: int
- selecting: boolean
- scope: TextFieldHelper.CursorStep
说明:
TODO
public void moveByChars(int count) @ L150
- 方法名:moveByChars
- 源码定位:L150
- 返回类型:void
- 修饰符:public
参数:
- count: int
说明:
TODO
public void moveByChars(int count, boolean selecting) @ L154
- 方法名:moveByChars
- 源码定位:L154
- 返回类型:void
- 修饰符:public
参数:
- count: int
- selecting: boolean
说明:
TODO
public void moveByWords(int count) @ L159
- 方法名:moveByWords
- 源码定位:L159
- 返回类型:void
- 修饰符:public
参数:
- count: int
说明:
TODO
public void moveByWords(int count, boolean selecting) @ L163
- 方法名:moveByWords
- 源码定位:L163
- 返回类型:void
- 修饰符:public
参数:
- count: int
- selecting: boolean
说明:
TODO
public void removeFromCursor(int count, TextFieldHelper.CursorStep scope) @ L168
- 方法名:removeFromCursor
- 源码定位:L168
- 返回类型:void
- 修饰符:public
参数:
- count: int
- scope: TextFieldHelper.CursorStep
说明:
TODO
public void removeWordsFromCursor(int count) @ L178
- 方法名:removeWordsFromCursor
- 源码定位:L178
- 返回类型:void
- 修饰符:public
参数:
- count: int
说明:
TODO
public void removeCharsFromCursor(int count) @ L183
- 方法名:removeCharsFromCursor
- 源码定位:L183
- 返回类型:void
- 修饰符:public
参数:
- count: int
说明:
TODO
public void cut() @ L203
- 方法名:cut
- 源码定位:L203
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void paste() @ L209
- 方法名:paste
- 源码定位:L209
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void copy() @ L214
- 方法名:copy
- 源码定位:L214
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void selectAll() @ L218
- 方法名:selectAll
- 源码定位:L218
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
private String getSelected(String text) @ L223
- 方法名:getSelected
- 源码定位:L223
- 返回类型:String
- 修饰符:private
参数:
- text: String
说明:
TODO
private String deleteSelection(String message) @ L229
- 方法名:deleteSelection
- 源码定位:L229
- 返回类型:String
- 修饰符:private
参数:
- message: String
说明:
TODO
public void setCursorToStart() @ L241
- 方法名:setCursorToStart
- 源码定位:L241
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void setCursorToStart(boolean selecting) @ L245
- 方法名:setCursorToStart
- 源码定位:L245
- 返回类型:void
- 修饰符:public
参数:
- selecting: boolean
说明:
TODO
public void setCursorToEnd() @ L250
- 方法名:setCursorToEnd
- 源码定位:L250
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void setCursorToEnd(boolean selecting) @ L254
- 方法名:setCursorToEnd
- 源码定位:L254
- 返回类型:void
- 修饰符:public
参数:
- selecting: boolean
说明:
TODO
public int getCursorPos() @ L259
- 方法名:getCursorPos
- 源码定位:L259
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public void setCursorPos(int value) @ L263
- 方法名:setCursorPos
- 源码定位:L263
- 返回类型:void
- 修饰符:public
参数:
- value: int
说明:
TODO
public void setCursorPos(int value, boolean selecting) @ L267
- 方法名:setCursorPos
- 源码定位:L267
- 返回类型:void
- 修饰符:public
参数:
- value: int
- selecting: boolean
说明:
TODO
public int getSelectionPos() @ L272
- 方法名:getSelectionPos
- 源码定位:L272
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public void setSelectionPos(int value) @ L276
- 方法名:setSelectionPos
- 源码定位:L276
- 返回类型:void
- 修饰符:public
参数:
- value: int
说明:
TODO
public void setSelectionRange(int start, int end) @ L280
- 方法名:setSelectionRange
- 源码定位:L280
- 返回类型:void
- 修饰符:public
参数:
- start: int
- end: int
说明:
TODO
public boolean isSelecting() @ L286
- 方法名:isSelecting
- 源码定位:L286
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class TextFieldHelper {
private final Supplier<String> getMessageFn;
private final Consumer<String> setMessageFn;
private final Supplier<String> getClipboardFn;
private final Consumer<String> setClipboardFn;
private final Predicate<String> stringValidator;
private int cursorPos;
private int selectionPos;
public TextFieldHelper(
Supplier<String> getMessageFn,
Consumer<String> setMessageFn,
Supplier<String> getClipboardFn,
Consumer<String> setClipboardFn,
Predicate<String> stringValidator
) {
this.getMessageFn = getMessageFn;
this.setMessageFn = setMessageFn;
this.getClipboardFn = getClipboardFn;
this.setClipboardFn = setClipboardFn;
this.stringValidator = stringValidator;
this.setCursorToEnd();
}
public static Supplier<String> createClipboardGetter(Minecraft minecraft) {
return () -> getClipboardContents(minecraft);
}
public static String getClipboardContents(Minecraft minecraft) {
return ChatFormatting.stripFormatting(minecraft.keyboardHandler.getClipboard().replaceAll("\\r", ""));
}
public static Consumer<String> createClipboardSetter(Minecraft minecraft) {
return text -> setClipboardContents(minecraft, text);
}
public static void setClipboardContents(Minecraft minecraft, String text) {
minecraft.keyboardHandler.setClipboard(text);
}
public boolean charTyped(CharacterEvent event) {
if (event.isAllowedChatCharacter()) {
this.insertText(this.getMessageFn.get(), event.codepointAsString());
}
return true;
}
public boolean keyPressed(KeyEvent event) {
if (event.isSelectAll()) {
this.selectAll();
return true;
} else if (event.isCopy()) {
this.copy();
return true;
} else if (event.isPaste()) {
this.paste();
return true;
} else if (event.isCut()) {
this.cut();
return true;
} else {
TextFieldHelper.CursorStep cursorStep = event.hasControlDownWithQuirk() ? TextFieldHelper.CursorStep.WORD : TextFieldHelper.CursorStep.CHARACTER;
if (event.key() == 259) {
this.removeFromCursor(-1, cursorStep);
return true;
} else {
if (event.key() == 261) {
this.removeFromCursor(1, cursorStep);
} else {
if (event.isLeft()) {
this.moveBy(-1, event.hasShiftDown(), cursorStep);
return true;
}
if (event.isRight()) {
this.moveBy(1, event.hasShiftDown(), cursorStep);
return true;
}
if (event.key() == 268) {
this.setCursorToStart(event.hasShiftDown());
return true;
}
if (event.key() == 269) {
this.setCursorToEnd(event.hasShiftDown());
return true;
}
}
return false;
}
}
}
private int clampToMsgLength(int value) {
return Mth.clamp(value, 0, this.getMessageFn.get().length());
}
private void insertText(String message, String text) {
if (this.selectionPos != this.cursorPos) {
message = this.deleteSelection(message);
}
this.cursorPos = Mth.clamp(this.cursorPos, 0, message.length());
String newPageText = new StringBuilder(message).insert(this.cursorPos, text).toString();
if (this.stringValidator.test(newPageText)) {
this.setMessageFn.accept(newPageText);
this.selectionPos = this.cursorPos = Math.min(newPageText.length(), this.cursorPos + text.length());
}
}
public void insertText(String text) {
this.insertText(this.getMessageFn.get(), text);
}
private void resetSelectionIfNeeded(boolean selecting) {
if (!selecting) {
this.selectionPos = this.cursorPos;
}
}
public void moveBy(int count, boolean selecting, TextFieldHelper.CursorStep scope) {
switch (scope) {
case CHARACTER:
this.moveByChars(count, selecting);
break;
case WORD:
this.moveByWords(count, selecting);
}
}
public void moveByChars(int count) {
this.moveByChars(count, false);
}
public void moveByChars(int count, boolean selecting) {
this.cursorPos = Util.offsetByCodepoints(this.getMessageFn.get(), this.cursorPos, count);
this.resetSelectionIfNeeded(selecting);
}
public void moveByWords(int count) {
this.moveByWords(count, false);
}
public void moveByWords(int count, boolean selecting) {
this.cursorPos = StringSplitter.getWordPosition(this.getMessageFn.get(), count, this.cursorPos, true);
this.resetSelectionIfNeeded(selecting);
}
public void removeFromCursor(int count, TextFieldHelper.CursorStep scope) {
switch (scope) {
case CHARACTER:
this.removeCharsFromCursor(count);
break;
case WORD:
this.removeWordsFromCursor(count);
}
}
public void removeWordsFromCursor(int count) {
int wordPosition = StringSplitter.getWordPosition(this.getMessageFn.get(), count, this.cursorPos, true);
this.removeCharsFromCursor(wordPosition - this.cursorPos);
}
public void removeCharsFromCursor(int count) {
String message = this.getMessageFn.get();
if (!message.isEmpty()) {
String newMessage;
if (this.selectionPos != this.cursorPos) {
newMessage = this.deleteSelection(message);
} else {
int otherPos = Util.offsetByCodepoints(message, this.cursorPos, count);
int start = Math.min(otherPos, this.cursorPos);
int end = Math.max(otherPos, this.cursorPos);
newMessage = new StringBuilder(message).delete(start, end).toString();
if (count < 0) {
this.selectionPos = this.cursorPos = start;
}
}
this.setMessageFn.accept(newMessage);
}
}
public void cut() {
String message = this.getMessageFn.get();
this.setClipboardFn.accept(this.getSelected(message));
this.setMessageFn.accept(this.deleteSelection(message));
}
public void paste() {
this.insertText(this.getMessageFn.get(), this.getClipboardFn.get());
this.selectionPos = this.cursorPos;
}
public void copy() {
this.setClipboardFn.accept(this.getSelected(this.getMessageFn.get()));
}
public void selectAll() {
this.selectionPos = 0;
this.cursorPos = this.getMessageFn.get().length();
}
private String getSelected(String text) {
int startIndex = Math.min(this.cursorPos, this.selectionPos);
int endIndex = Math.max(this.cursorPos, this.selectionPos);
return text.substring(startIndex, endIndex);
}
private String deleteSelection(String message) {
if (this.selectionPos == this.cursorPos) {
return message;
} else {
int startIndex = Math.min(this.cursorPos, this.selectionPos);
int endIndex = Math.max(this.cursorPos, this.selectionPos);
String updatedText = message.substring(0, startIndex) + message.substring(endIndex);
this.selectionPos = this.cursorPos = startIndex;
return updatedText;
}
}
public void setCursorToStart() {
this.setCursorToStart(false);
}
public void setCursorToStart(boolean selecting) {
this.cursorPos = 0;
this.resetSelectionIfNeeded(selecting);
}
public void setCursorToEnd() {
this.setCursorToEnd(false);
}
public void setCursorToEnd(boolean selecting) {
this.cursorPos = this.getMessageFn.get().length();
this.resetSelectionIfNeeded(selecting);
}
public int getCursorPos() {
return this.cursorPos;
}
public void setCursorPos(int value) {
this.setCursorPos(value, true);
}
public void setCursorPos(int value, boolean selecting) {
this.cursorPos = this.clampToMsgLength(value);
this.resetSelectionIfNeeded(selecting);
}
public int getSelectionPos() {
return this.selectionPos;
}
public void setSelectionPos(int value) {
this.selectionPos = this.clampToMsgLength(value);
}
public void setSelectionRange(int start, int end) {
int maxSize = this.getMessageFn.get().length();
this.cursorPos = Mth.clamp(start, 0, maxSize);
this.selectionPos = Mth.clamp(end, 0, maxSize);
}
public boolean isSelecting() {
return this.cursorPos != this.selectionPos;
}
@OnlyIn(Dist.CLIENT)
public static enum CursorStep {
CHARACTER,
WORD;
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
ChatFormatting.stripFormatting()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StringSplitter.getWordPosition()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.clamp()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.offsetByCodepoints()
- 引用位置: