SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/components/TextComponent.java

438 lines
8.3 KiB
Java

package speiger.src.coreengine.rendering.gui.components;
import speiger.src.coreengine.math.misc.ColorUtils;
import speiger.src.coreengine.rendering.gui.GuiComponent;
import speiger.src.coreengine.rendering.gui.helper.Align;
import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox;
import speiger.src.coreengine.rendering.gui.renderer.FontRenderer;
import speiger.src.coreengine.rendering.gui.renderer.buffer.RenderBuffer;
import speiger.src.coreengine.rendering.gui.renderer.lexer.TextMetadata;
public class TextComponent extends GuiComponent
{
public static final int FLAG_STRIKE_THROUGH = 1 << 20;
public static final int FLAG_UNDERLINE = 1 << 21;
public static final int FLAG_BOLD = 1 << 22;
public static final int FLAG_FORMATTING = 1 << 23;
public static final int FLAG_FLIPPED = 1 << 24;
public static final int FLAG_LIMITED_WIDTH = 1 << 25;
public static final int FLAG_LIMITED_HEIGHT = 1 << 26;
public static final int FLAG_AUTO_SCALE = 1 << 27;
public static final int FLAG_SINGLE_LINE = 1 << 28;
FontRenderer font;
String text = "";
Align vertical = Align.CENTER;
Align horizontal = Align.CENTER;
int textColor = ColorUtils.WHITE;
Integer backGroundColor = null;
float italic = 0F;
float textScale = 1F;
RenderBuffer buffer;
float initialSize;
TextMetadata metadata = new TextMetadata(this);
public TextComponent()
{
super(0F, 0F, 0F, 0F);
setFlag(FLAG_FORMATTING | FLAG_LIMITED_WIDTH | FLAG_LIMITED_HEIGHT);
}
public TextComponent(String text)
{
this(0F, 0F, 0F, 0F, text);
}
public TextComponent(float x, float y, float width, float height)
{
super(x, y, width, height);
setFlag(FLAG_FORMATTING | FLAG_LIMITED_WIDTH | FLAG_LIMITED_HEIGHT);
}
public TextComponent(float x, float y, float width, float height, String text)
{
super(x, y, width, height);
setFlag(FLAG_FORMATTING | FLAG_LIMITED_WIDTH | FLAG_LIMITED_HEIGHT);
setText(text);
}
@Override
public void init()
{
addCloseListener(buffer = getRenderer().createBuffer());
if(font == null)
{
setFont(getGui().getFont());
}
initialSize = getBox().getWidth();
}
@Override
public boolean renderSelf(int mouseX, int mouseY, float particalTicks)
{
if(text.isEmpty())
{
return true;
}
float minX = getBox().getMinX();
float minY = getBox().getMinY();
getRenderer().translate(minX, minY).setActiveTexture(font.getTexture()).drawBuffers(buffer, getBox().getWidth(), getBox().getHeight()).translate(-minX, -minY);
return true;
}
@Override
public void calculateActualBounds(float[] area, boolean start)
{
if(start)
{
area[0] = Float.MAX_VALUE;
area[1] = Float.MAX_VALUE;
area[2] = Float.MIN_VALUE;
area[3] = Float.MIN_VALUE;
}
IGuiBox box = getBox();
area[0] = Math.min(area[0], box.getMinX() - metadata.getStartX());
area[1] = Math.min(area[1], box.getMinY() - metadata.getStartY());
area[2] = Math.max(area[2], (box.getMinX() - metadata.getStartX()) + metadata.getMaxWidth());
area[3] = Math.max(area[3], (box.getMinY() - metadata.getStartY()) + metadata.getMaxHeight());
for(GuiComponent comp : getChildren())
{
if(comp.isVisible()) comp.calculateActualBounds(area, false);
}
}
public RenderBuffer getBuffer()
{
return buffer;
}
@Override
protected void repaint()
{
metadata.clear();
if(font == null)
{
return;
}
font.updateText(this);
}
public TextComponent setTextScale(float textScale)
{
if(this.textScale != textScale)
{
this.textScale = textScale;
onChanged(true);
}
return this;
}
public TextMetadata getMetadata()
{
return metadata;
}
public final float getTextScale()
{
return textScale * getBox().getScale() * (isAutoScaling() ? getBox().getWidth() / initialSize : 1F);
}
public final float getRawTextScale()
{
return textScale * (isAutoScaling() ? getBox().getWidth() / initialSize : 1F);
}
public final float getWidth()
{
return getBox().getWidth() / getTextScale();
}
public final float getItalic()
{
return italic;
}
public final boolean isBold()
{
return isFlagSet(FLAG_BOLD);
}
public final boolean isStrikeThrough()
{
return isFlagSet(FLAG_STRIKE_THROUGH);
}
public final boolean isUnderlined()
{
return isFlagSet(FLAG_UNDERLINE);
}
public final boolean isFlipped()
{
return isFlagSet(FLAG_FLIPPED);
}
public final boolean isRenderingSpecial()
{
return isFlagSet(FLAG_FORMATTING);
}
public final boolean isWidthLimited()
{
return isFlagSet(FLAG_LIMITED_WIDTH);
}
public final boolean isHeightLimited()
{
return isFlagSet(FLAG_LIMITED_HEIGHT);
}
public final boolean isLimitedText()
{
return isFlagSet(FLAG_LIMITED_WIDTH | FLAG_LIMITED_HEIGHT);
}
public final boolean isAutoScaling()
{
return isFlagSet(FLAG_AUTO_SCALE);
}
public final boolean isForcedSingleLine()
{
return isFlagSet(FLAG_SINGLE_LINE);
}
public final int getTextColor()
{
return textColor;
}
public final Integer getBackgroundColor()
{
return backGroundColor;
}
@Override
public FontRenderer getFont()
{
return font;
}
public String getText()
{
return text;
}
public String getText(int min)
{
return text.substring(min);
}
public String getText(int min, int max)
{
return text.substring(min, max);
}
public int length()
{
return text.length();
}
public Align getVertical()
{
return vertical;
}
public Align getHorizontal()
{
return horizontal;
}
public final TextComponent bold(boolean value)
{
if(setFlag(FLAG_BOLD, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent strikethrough(boolean value)
{
if(!setFlag(FLAG_STRIKE_THROUGH, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent underline(boolean value)
{
if(!setFlag(FLAG_UNDERLINE, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent flipped(boolean value)
{
if(!setFlag(FLAG_FLIPPED, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent special(boolean value)
{
if(!setFlag(FLAG_FORMATTING, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent limit(boolean value)
{
if(!setFlag(FLAG_LIMITED_HEIGHT | FLAG_LIMITED_WIDTH, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent limitWidth(boolean value)
{
if(!setFlag(FLAG_LIMITED_WIDTH, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent limitHeight(boolean value)
{
if(!setFlag(FLAG_LIMITED_HEIGHT, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent autoScale(boolean value)
{
if(!setFlag(FLAG_AUTO_SCALE, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent singleLine(boolean value)
{
if(!setFlag(FLAG_SINGLE_LINE, value))
{
return this;
}
onChanged(true);
return this;
}
public final TextComponent italic(boolean value)
{
return italic(value ? 3F : 0F);
}
public final TextComponent italic(float value)
{
if(italic != value)
{
italic = value;
onChanged(true);
}
return this;
}
public TextComponent align(Align horizontal, Align vertical)
{
if(this.horizontal != horizontal || this.vertical != vertical)
{
this.horizontal = horizontal;
this.vertical = vertical;
onChanged(true);
}
return this;
}
public TextComponent horizontal(Align horizontal)
{
if(this.horizontal != horizontal)
{
this.horizontal = horizontal;
onChanged(true);
}
return this;
}
public TextComponent vertical(Align vertical)
{
if(this.vertical != vertical)
{
this.vertical = vertical;
onChanged(true);
}
return this;
}
public TextComponent setText(String text)
{
if(text == null) text = "null";
if(!this.text.equals(text))
{
this.text = text;
onChanged(true);
}
return this;
}
public TextComponent textColor(int color)
{
if(textColor != color)
{
textColor = color;
onChanged(true);
}
return this;
}
public TextComponent backgroundColor(int color)
{
if(backGroundColor != color)
{
backGroundColor = color;
onChanged(true);
}
return this;
}
public TextComponent setFont(FontRenderer font)
{
if(this.font != font)
{
this.font = font;
onChanged(true);
}
return this;
}
}