/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.tools.gui;
import lombok.Getter;
import lombok.Setter;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.Icon;
import javax.swing.JTextField;
import javax.swing.UIManager;
/**
* DOCUMENT ME!
*
* @author jruiz
* @version $Revision$, $Date$
*/
public class JSearchTextField extends JTextField {
//~ Static fields/initializers ---------------------------------------------
private static final int MARGIN_INNER_LEFT = 2;
private static final int MARGIN_INNER_RIGHT = 2;
//~ Instance fields --------------------------------------------------------
@Getter @Setter private String emptyText;
@Getter @Setter private Icon searchIcon;
@Getter @Setter private Icon abortIcon;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new JSearchTextField object.
*/
public JSearchTextField() {
super();
this.searchIcon = null;
this.emptyText = "";
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (searchIcon != null) {
final int mouseX = e.getX();
if (mouseX < (getMargin().left)) {
fireActionPerformed();
}
}
if (abortIcon != null) {
final int mouseX = e.getX();
if (mouseX > (getWidth() - getMargin().right)) {
setText("");
}
}
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(final MouseEvent e) {
if (searchIcon != null) {
final int mouseX = e.getX();
if (mouseX < (getMargin().left)) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
return;
}
}
if ((abortIcon != null) && !getText().isEmpty()) {
final int mouseX = e.getX();
if (mouseX > (getWidth() - getMargin().right)) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
return;
}
}
setCursor(new Cursor(Cursor.TEXT_CURSOR));
}
});
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent e) {
if (KeyEvent.VK_ESCAPE == e.getExtendedKeyCode()) {
setText("");
}
}
});
}
//~ Methods ----------------------------------------------------------------
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
final Insets margin = new Insets(2, 2, 2, 2);
if (this.searchIcon != null) {
final int iconWidth = searchIcon.getIconWidth();
final int iconHeight = searchIcon.getIconHeight();
final int iconX = margin.left;
final int iconY = (getHeight() - iconHeight) / 2;
searchIcon.paintIcon(this, g, iconX, iconY);
margin.left += iconWidth + MARGIN_INNER_LEFT;
}
if ((this.abortIcon != null) && !getText().isEmpty()) {
final int iconWidth = abortIcon.getIconWidth();
final int iconHeight = abortIcon.getIconHeight();
final int iconX = getWidth() - iconWidth - margin.right - MARGIN_INNER_RIGHT;
final int iconY = (getHeight() - iconHeight) / 2;
abortIcon.paintIcon(this, g, iconX, iconY);
margin.right += iconWidth + MARGIN_INNER_RIGHT;
}
setMargin(margin);
if ((getText() == null) || getText().isEmpty()) {
final Graphics2D g2d = (Graphics2D)g;
final Font font = g2d.getFont();
final Color color = g2d.getColor();
final int textHeight = g2d.getFontMetrics().getHeight();
final int textBottomX = ((getHeight() - textHeight) / 2) + textHeight - margin.bottom;
g2d.setFont(font.deriveFont(Font.ITALIC));
g2d.setColor(UIManager.getColor("textInactiveText"));
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.drawString(emptyText, getInsets().left, textBottomX);
g2d.setRenderingHints(g2d.getRenderingHints());
g2d.setFont(font);
g2d.setColor(color);
}
}
}