2025-11-24 22:52:51 +03:00

120 lines
4.9 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.jspecify.annotations.Nullable
*/
package net.minecraft.client.gui.components;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.gui.ActiveTextCollector;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.TextAlignment;
import net.minecraft.locale.Language;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
import net.minecraft.util.FormattedCharSequence;
import org.jspecify.annotations.Nullable;
public interface MultiLineLabel {
public static final MultiLineLabel EMPTY = new MultiLineLabel(){
@Override
public int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output) {
return topY;
}
@Override
public int getLineCount() {
return 0;
}
@Override
public int getWidth() {
return 0;
}
};
public static MultiLineLabel create(Font font, Component ... messages) {
return MultiLineLabel.create(font, Integer.MAX_VALUE, Integer.MAX_VALUE, messages);
}
public static MultiLineLabel create(Font font, int maxWidth, Component ... messages) {
return MultiLineLabel.create(font, maxWidth, Integer.MAX_VALUE, messages);
}
public static MultiLineLabel create(Font font, Component message, int maxWidth) {
return MultiLineLabel.create(font, maxWidth, Integer.MAX_VALUE, message);
}
public static MultiLineLabel create(final Font font, final int maxWidth, final int maxLines, final Component ... messages) {
if (messages.length == 0) {
return EMPTY;
}
return new MultiLineLabel(){
private @Nullable List<TextAndWidth> cachedTextAndWidth;
private @Nullable Language splitWithLanguage;
@Override
public int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output) {
int y = topY;
for (TextAndWidth splitLine : this.getSplitMessage()) {
int leftX = align.calculateLeft(anchorX, splitLine.width);
output.accept(leftX, y, splitLine.text);
y += lineHeight;
}
return y;
}
private List<TextAndWidth> getSplitMessage() {
Language currentLanguage = Language.getInstance();
if (this.cachedTextAndWidth != null && currentLanguage == this.splitWithLanguage) {
return this.cachedTextAndWidth;
}
this.splitWithLanguage = currentLanguage;
ArrayList<FormattedText> splitMessage = new ArrayList<FormattedText>();
for (Component message : messages) {
splitMessage.addAll(font.splitIgnoringLanguage(message, maxWidth));
}
this.cachedTextAndWidth = new ArrayList<TextAndWidth>();
int actualMaxLines = Math.min(splitMessage.size(), maxLines);
List linesToAdd = splitMessage.subList(0, actualMaxLines);
for (int i = 0; i < linesToAdd.size(); ++i) {
FormattedText formattedText = (FormattedText)linesToAdd.get(i);
FormattedCharSequence formattedCharSequence = Language.getInstance().getVisualOrder(formattedText);
if (i == linesToAdd.size() - 1 && actualMaxLines == maxLines && actualMaxLines != splitMessage.size()) {
FormattedText clippedText = font.substrByWidth(formattedText, font.width(formattedText) - font.width(CommonComponents.ELLIPSIS));
FormattedText withEllipsis = FormattedText.composite(clippedText, CommonComponents.ELLIPSIS.copy().withStyle(messages[messages.length - 1].getStyle()));
this.cachedTextAndWidth.add(new TextAndWidth(Language.getInstance().getVisualOrder(withEllipsis), font.width(withEllipsis)));
continue;
}
this.cachedTextAndWidth.add(new TextAndWidth(formattedCharSequence, font.width(formattedCharSequence)));
}
return this.cachedTextAndWidth;
}
@Override
public int getLineCount() {
return this.getSplitMessage().size();
}
@Override
public int getWidth() {
return Math.min(maxWidth, this.getSplitMessage().stream().mapToInt(TextAndWidth::width).max().orElse(0));
}
};
}
public int visitLines(TextAlignment var1, int var2, int var3, int var4, ActiveTextCollector var5);
public int getLineCount();
public int getWidth();
public record TextAndWidth(FormattedCharSequence text, int width) {
}
}