package org.sleuthkit.autopsy.corecomponents;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.text.*;
/**
* The TextPrompt class will display a prompt over top of a text component when
* the Document of the text field is empty. The Show property is used to
* determine the visibility of the prompt.
*
* The Font and foreground Color of the prompt will default to those properties
* of the parent text component. You are free to change the properties after
* class construction. From:
* https://tips4java.wordpress.com/2009/11/29/text-prompt/
*/
public final class TextPrompt extends JLabel
implements FocusListener, DocumentListener {
public enum Show {
ALWAYS,
FOCUS_GAINED,
FOCUS_LOST;
}
private JTextComponent component;
private Document document;
private Show show;
private boolean showPromptOnce;
private int focusLost;
public TextPrompt(String text, JTextComponent component) {
this(text, component, Show.ALWAYS);
}
public TextPrompt(String text, JTextComponent component, Show show) {
this.component = component;
setShow(show);
document = component.getDocument();
setText(text);
setFont(component.getFont());
setForeground(component.getForeground());
setBorder(new EmptyBorder(component.getInsets()));
setHorizontalAlignment(JLabel.LEADING);
component.addFocusListener(this);
document.addDocumentListener(this);
component.setLayout(new BorderLayout());
component.add(this);
checkForPrompt();
}
/**
* Convenience method to change the alpha value of the current foreground
* Color to the specifice value.
*
* @param alpha value in the range of 0 - 1.0.
*/
public void changeAlpha(float alpha) {
changeAlpha((int) (alpha * 255));
}
/**
* Convenience method to change the alpha value of the current foreground
* Color to the specifice value.
*
* @param alpha value in the range of 0 - 255.
*/
public void changeAlpha(int alpha) {
alpha = alpha > 255 ? 255 : alpha < 0 ? 0 : alpha;
Color foreground = getForeground();
int red = foreground.getRed();
int green = foreground.getGreen();
int blue = foreground.getBlue();
Color withAlpha = new Color(red, green, blue, alpha);
super.setForeground(withAlpha);
}
/**
* Convenience method to change the style of the current Font. The style
* values are found in the Font class. Common values might be: Font.BOLD,
* Font.ITALIC and Font.BOLD + Font.ITALIC.
*
* @param style value representing the the new style of the Font.
*/
public void changeStyle(int style) {
setFont(getFont().deriveFont(style));
}
/**
* Get the Show property
*
* @return the Show property.
*/
public Show getShow() {
return show;
}
/**
* Set the prompt Show property to control when the promt is shown. Valid
* values are:
*
* Show.AWLAYS (default) - always show the prompt Show.Focus_GAINED - show
* the prompt when the component gains focus (and hide the prompt when focus
* is lost) Show.Focus_LOST - show the prompt when the component loses focus
* (and hide the prompt when focus is gained)
*
* @param show a valid Show enum
*/
public void setShow(Show show) {
this.show = show;
}
/**
* Get the showPromptOnce property
*
* @return the showPromptOnce property.
*/
public boolean getShowPromptOnce() {
return showPromptOnce;
}
/**
* Show the prompt once. Once the component has gained/lost focus once, the
* prompt will not be shown again.
*
* @param showPromptOnce when true the prompt will only be shown once,
* otherwise it will be shown repeatedly.
*/
public void setShowPromptOnce(boolean showPromptOnce) {
this.showPromptOnce = showPromptOnce;
}
/**
* Check whether the prompt should be visible or not. The visibility will
* change on updates to the Document and on focus changes.
*/
private void checkForPrompt() {
// Text has been entered, remove the prompt
if (document.getLength() > 0) {
setVisible(false);
return;
}
// Prompt has already been shown once, remove it
if (showPromptOnce && focusLost > 0) {
setVisible(false);
return;
}
// Check the Show property and component focus to determine if the
// prompt should be displayed.
if (component.hasFocus()) {
if (show == Show.ALWAYS
|| show == Show.FOCUS_GAINED) {
setVisible(true);
} else {
setVisible(false);
}
} else {
if (show == Show.ALWAYS
|| show == Show.FOCUS_LOST) {
setVisible(true);
} else {
setVisible(false);
}
}
}
// Implement FocusListener
@Override
public void focusGained(FocusEvent e) {
checkForPrompt();
}
@Override
public void focusLost(FocusEvent e) {
focusLost++;
checkForPrompt();
}
// Implement DocumentListener
@Override
public void insertUpdate(DocumentEvent e) {
checkForPrompt();
}
@Override
public void removeUpdate(DocumentEvent e) {
checkForPrompt();
}
@Override
public void changedUpdate(DocumentEvent e) {
}
}