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

    • 引用位置: 方法调用
    • 关联成员: ChatFormatting.stripFormatting()
  • Minecraft

    • 引用位置: 参数
  • StringSplitter

    • 引用位置: 方法调用
    • 关联成员: StringSplitter.getWordPosition()
  • CharacterEvent

    • 引用位置: 参数
  • KeyEvent

    • 引用位置: 参数
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.clamp()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.offsetByCodepoints()