package org.jabref.gui.util.component;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextArea;
import javax.swing.UIManager;
/**
* A text area which displays a predefined text the same way as {@link JTextFieldWithPlaceholder} does.
*/
public class JTextAreaWithPlaceholder extends JTextArea implements KeyListener {
private final String textWhenNotFocused;
public JTextAreaWithPlaceholder() {
this("");
}
/**
* Additionally to {@link JTextAreaWithPlaceholder#JTextAreaWithPlaceholder(String)}
* this also sets the initial text of the text field component.
*
* @param content as the text of the textfield
* @param placeholder as the placeholder of the textfield
*/
public JTextAreaWithPlaceholder(String content, String placeholder) {
this(placeholder);
setText(content);
}
/**
* This will create a {@link JTextArea} with a placeholder text. The placeholder
* will always be displayed if the text of the {@link JTextArea} is empty.
*
* @param placeholder as the placeholder of the textarea
*/
public JTextAreaWithPlaceholder(String placeholder) {
super();
this.setEditable(true);
this.setText("");
this.textWhenNotFocused = placeholder;
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
if (this.getText().isEmpty()) {
Font prev = graphics.getFont();
Color prevColor = graphics.getColor();
graphics.setColor(UIManager.getColor("textInactiveText"));
int textHeight = graphics.getFontMetrics().getHeight();
int x = this.getInsets().left;
Graphics2D g2d = (Graphics2D) graphics;
RenderingHints hints = g2d.getRenderingHints();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.drawString(textWhenNotFocused, x, textHeight + this.getInsets().top);
g2d.setRenderingHints(hints);
graphics.setFont(prev);
graphics.setColor(prevColor);
}
}
@Override
public void keyTyped(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
@Override
public void keyPressed(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
}