PreeditEvent.java

net.minecraft.client.input.PreeditEvent

信息

  • 全限定名:net.minecraft.client.input.PreeditEvent
  • 类型:public record
  • 包:net.minecraft.client.input
  • 源码路径:src/main/java/net/minecraft/client/input/PreeditEvent.java
  • 起始行号:L17
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

构造器

public PreeditEvent(String fullText, int caretPosition, List<String> blocks, int focusedBlock) @ L18

  • 构造器名:PreeditEvent
  • 源码定位:L18
  • 修饰符:public

参数:

  • fullText: String
  • caretPosition: int
  • blocks: List
  • focusedBlock: int

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static PreeditEvent createFromCallback(int preeditSize, long preeditPtr, int blockCount, long blockSizesPtr, int focusedBlock, int caret) @ L26

  • 方法名:createFromCallback
  • 源码定位:L26
  • 返回类型:PreeditEvent
  • 修饰符:public static

参数:

  • preeditSize: int
  • preeditPtr: long
  • blockCount: int
  • blockSizesPtr: long
  • focusedBlock: int
  • caret: int

说明:

TODO

private static int[] readIntBuffer(int size, long ptr) @ L63

  • 方法名:readIntBuffer
  • 源码定位:L63
  • 返回类型:int[]
  • 修饰符:private static

参数:

  • size: int
  • ptr: long

说明:

TODO

public MutableComponent toFormattedText(Style focusedStyle) @ L70

  • 方法名:toFormattedText
  • 源码定位:L70
  • 返回类型:MutableComponent
  • 修饰符:public

参数:

  • focusedStyle: Style

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public record PreeditEvent(String fullText, int caretPosition, List<String> blocks, int focusedBlock) {
    public PreeditEvent(String fullText, int caretPosition, List<String> blocks, int focusedBlock) {
        Preconditions.checkElementIndex(focusedBlock, blocks.size());
        this.fullText = fullText;
        this.caretPosition = caretPosition;
        this.blocks = blocks;
        this.focusedBlock = focusedBlock;
    }
 
    public static @Nullable PreeditEvent createFromCallback(int preeditSize, long preeditPtr, int blockCount, long blockSizesPtr, int focusedBlock, int caret) {
        if (preeditSize == 0) {
            return null;
        } else {
            int[] codepoints = readIntBuffer(preeditSize, preeditPtr);
            int[] blockSizes = readIntBuffer(blockCount, blockSizesPtr);
            StringBuilder fullText = new StringBuilder();
            Builder<String> blocks = ImmutableList.builder();
            int offset = 0;
            int convertedCaret = 0;
 
            for (int blockSize : blockSizes) {
                StringBuilder blockBuilder = new StringBuilder();
 
                for (int i = 0; i < blockSize; i++) {
                    int codepoint = codepoints[offset];
                    if (offset == caret) {
                        convertedCaret = fullText.length() + blockBuilder.length();
                    }
 
                    blockBuilder.appendCodePoint(codepoint);
                    offset++;
                }
 
                String block = blockBuilder.toString();
                blocks.add(block);
                fullText.append(block);
            }
 
            if (offset == caret) {
                convertedCaret = fullText.length();
            }
 
            return new PreeditEvent(fullText.toString(), convertedCaret, blocks.build(), focusedBlock);
        }
    }
 
    private static int[] readIntBuffer(int size, long ptr) {
        IntBuffer buffer = MemoryUtil.memIntBuffer(ptr, size);
        int[] result = new int[size];
        buffer.get(result);
        return result;
    }
 
    public MutableComponent toFormattedText(Style focusedStyle) {
        int blockCount = this.blocks.size();
        if (blockCount == 1) {
            return Component.literal(this.blocks.getFirst()).withStyle(focusedStyle);
        } else {
            MutableComponent result = Component.empty();
 
            for (int i = 0; i < blockCount; i++) {
                MutableComponent part = Component.literal(this.blocks.get(i));
                if (i == this.focusedBlock) {
                    part.withStyle(focusedStyle);
                }
 
                result.append(part);
            }
 
            return result;
        }
    }
}

引用的其他类

  • Component

    • 引用位置: 方法调用
    • 关联成员: Component.empty(), Component.literal()
  • MutableComponent

    • 引用位置: 返回值
  • Style

    • 引用位置: 参数