/*
* Copyright 2014-2015 Cel Skeggs
*
* This file is part of the CCRE, the Common Chicken Runtime Engine.
*
* The CCRE is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* The CCRE is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the CCRE. If not, see <http://www.gnu.org/licenses/>.
*/
package ccre.frc.components;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Iterator;
import java.util.LinkedList;
import ccre.frc.DeviceComponent;
import ccre.frc.Rendering;
/**
* A component displaying multiple lines of text. The text can be changed
* dynamically. The label will have white text by default.
*
* @author skeggsc
*/
public class TextBoxComponent extends DeviceComponent {
private final LinkedList<String> lines = new LinkedList<String>();
private Color color = Color.WHITE;
/**
* Create a new empty TextComponent.
*/
public TextBoxComponent() {
}
/**
* Change the color of the text to the given color.
*
* @param newColor the new color to display the text as.
*/
public void setColor(Color newColor) {
color = newColor;
repaint();
}
/**
* Add the specified line to the text box.
*
* @param line the new line to display.
*/
public void addLine(String line) {
synchronized (lines) {
lines.addFirst(line);
}
repaint();
}
/**
* Remove all displayed text.
*/
public void clearLines() {
synchronized (lines) {
lines.clear();
}
repaint();
}
@Override
public int render(Graphics2D g, int width, int height, FontMetrics fontMetrics, int mouseX, int mouseY, int lastShift) {
g.setColor(color);
g.setFont(Rendering.console);
synchronized (lines) {
int y = height - g.getFontMetrics().getDescent();
Iterator<String> iterator = lines.iterator();
while (iterator.hasNext()) {
String line = iterator.next();
g.drawString(line, lastShift, y);
y -= g.getFontMetrics().getHeight();
if (y < -g.getFontMetrics().getHeight()) {
// get rid of any excess lines
iterator.remove();
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
break;
}
}
}
hitzone = new Rectangle(lastShift, 0, width, height);
return width;
}
}