Java tutorial
/* * 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; } }