com.badlogic.gdx.scenes.scene2d.actors.Label.java Source code

Java tutorial

Introduction

Here is the source code for com.badlogic.gdx.scenes.scene2d.actors.Label.java

Source

/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.scenes.scene2d.actors;

import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.badlogic.gdx.graphics.g2d.BitmapFont.TextBounds;
import com.badlogic.gdx.graphics.g2d.BitmapFontCache;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Layout;

public class Label extends Actor implements Layout {
    public BitmapFontCache cache;
    public VAlignment valign = VAlignment.BOTTOM;
    public String text;
    public final TextBounds bounds = new TextBounds();

    private WrapType wrapType;
    private HAlignment halign;
    private float lastWidth = -1;

    public Label(String name, BitmapFont font) {
        super(name);
        cache = new BitmapFontCache(font);
    }

    public Label(String name, BitmapFont font, String text) {
        this(name, font);
        setText(text);
    }

    public void setText(String text) {
        this.text = text;
        wrapType = WrapType.singleLine;
        bounds.set(cache.setText(text, 0, cache.getFont().isFlipped() ? 0 : cache.getFont().getCapHeight()));
        width = bounds.width;
        height = bounds.height;
    }

    public void setMultiLineText(String text) {
        this.text = text;
        wrapType = WrapType.multiLine;
        bounds.set(cache.getFont().getMultiLineBounds(text));
        cache.setMultiLineText(text, 0, cache.getFont().isFlipped() ? 0 : bounds.height);
        width = bounds.width;
        height = bounds.height;
    }

    public void setWrappedText(String text, HAlignment halign) {
        this.text = text;
        this.halign = halign;
        wrapType = WrapType.wrapped;
        bounds.set(cache.getFont().getWrappedBounds(text, width));
        cache.setWrappedText(text, 0, cache.getFont().isFlipped() ? 0 : bounds.height, width, halign);
    }

    public void setFont(BitmapFont font) {
        cache = new BitmapFontCache(font);
        switch (wrapType) {
        case singleLine:
            setText(text);
            break;
        case multiLine:
            setMultiLineText(text);
            break;
        case wrapped:
            setWrappedText(text, halign);
            break;
        }
    }

    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        cache.setColor(color.r, color.g, color.b, color.a * parentAlpha);
        switch (valign) {
        case TOP:
            if (cache.getFont().isFlipped())
                cache.setPosition(x, y);
            else
                cache.setPosition(x, y + height - bounds.height);
            break;
        case CENTER:
            cache.setPosition(x, y + (height - bounds.height) / 2);
            break;
        case BOTTOM:
            if (cache.getFont().isFlipped())
                cache.setPosition(x, y + height - bounds.height);
            else
                cache.setPosition(x, y);
            break;
        }
        cache.draw(batch);
    }

    @Override
    public boolean touchDown(float x, float y, int pointer) {
        if (!touchable)
            return false;
        return x > 0 && y > 0 && x < width && y < height;
    }

    @Override
    public void touchUp(float x, float y, int pointer) {
    }

    @Override
    public void touchDragged(float x, float y, int pointer) {
    }

    @Override
    public Actor hit(float x, float y) {
        return x > 0 && y > 0 && x < width && y < height ? this : null;
    }

    public void layout() {
        if (wrapType == WrapType.wrapped && lastWidth != width)
            setWrappedText(text, halign);
        lastWidth = width;
    }

    public void invalidate() {
        lastWidth = -1;
    }

    public float getPrefWidth() {
        switch (wrapType) {
        case singleLine:
            return cache.getFont().getBounds(text).width * scaleX;
        case multiLine:
            return cache.getFont().getMultiLineBounds(text).width * scaleX;
        case wrapped:
        }
        return 0;
    }

    public float getPrefHeight() {
        switch (wrapType) {
        case singleLine:
            return cache.getFont().getBounds(text).height * scaleY;
        case multiLine:
            return cache.getFont().getMultiLineBounds(text).height * scaleY;
        case wrapped:
        }
        return 0;
    }

    public float getMinWidth() {
        return 0;
    }

    public float getMinHeight() {
        return 0;
    }

    public float getMaxWidth() {
        return 0;
    }

    public float getMaxHeight() {
        return 0;
    }

    static public enum VAlignment {
        TOP, CENTER, BOTTOM
    }

    static private enum WrapType {
        singleLine, multiLine, wrapped
    }
}