com.lyndir.lanterna.view.TextView.java Source code

Java tutorial

Introduction

Here is the source code for com.lyndir.lanterna.view.TextView.java

Source

/*
 * Copyright 2010, Maarten Billemont
 *
 *   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.lyndir.lanterna.view;

import static com.lyndir.lhunath.opal.system.util.StringUtils.strf;

import com.google.common.base.Splitter;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.googlecode.lanterna.screen.Screen;
import com.googlecode.lanterna.terminal.Terminal;
import com.lyndir.lhunath.opal.system.util.ObjectUtils;
import java.util.Iterator;

/**
 * @author lhunath, 2013-07-21
 */
public class TextView extends View {

    public enum Crop {
        SHOW_FIRST, SHOW_LAST
    }

    private String text = "";
    private Crop textCrop = Crop.SHOW_LAST;
    private int textOffset;
    private Terminal.Color textColor;

    @Override
    protected void drawForeground(final Screen screen) {
        super.drawForeground(screen);

        FluentIterable<String> lines = FluentIterable.from(getTextLines());

        Box contentBox = getContentBoxOnScreen();
        int from = getTextOffset();
        switch (getTextCrop()) {

        case SHOW_FIRST:
            break;
        case SHOW_LAST:
            from = Math.max(0, lines.size() - 1 - contentBox.getSize().getHeight() - getTextOffset());
            break;
        }

        Iterator<String> linesIt = lines.skip(from).iterator();
        for (int row = contentBox.getTop(); linesIt.hasNext() && row <= contentBox.getBottom(); ++row)
            screen.putString(contentBox.getLeft(), row, linesIt.next(), getTextColor(), getBackgroundColor());

        if (getTextOffset() > 0) {
            String offsetText = String.format("%+d", getTextOffset());
            screen.putString(contentBox.getRight() - offsetText.length(), contentBox.getTop(), offsetText, //
                    getInfoTextColor(), getInfoBackgroundColor());
        }
    }

    private Iterable<String> getTextLines() {
        return Splitter.on(strf("%n")).split(getText());
    }

    public Terminal.Color getTextColor() {
        return ObjectUtils.ifNotNullElse(textColor, getTheme().textFg());
    }

    public void setTextColor(final Terminal.Color textColor) {
        this.textColor = textColor;
    }

    public Crop getTextCrop() {
        return textCrop;
    }

    public void setTextCrop(final Crop textCrop) {
        this.textCrop = textCrop;
    }

    public String getText() {
        return text;
    }

    public void setText(final String text) {
        this.text = text;

        // Update offset in case text lines shrank beyond the current offset.
        textOffset = Math.min(textOffset, Iterables.size(getTextLines()));
    }

    public void updateTextOffset(final int offsetDelta) {
        textOffset = Math.min(Math.max(0, textOffset + offsetDelta),
                Iterables.size(getTextLines()) - 1 - getContentBoxOnScreen().getSize().getHeight());
    }

    public int getTextOffset() {
        return textOffset;
    }
}