package org.basex.gui.layout;
import static org.basex.gui.layout.BaseXKeys.*;
import java.awt.Window;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;
import org.basex.gui.layout.BaseXLayout.DropHandler;
/**
* Project specific text field implementation.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public class BaseXTextField extends JTextField {
/** Default width of text fields. */
public static final int DWIDTH = 350;
/** Last input. */
String last = "";
/** Text area to search in. */
BaseXEditor area;
/**
* Constructor.
* @param win parent window
*/
public BaseXTextField(final Window win) {
this(null, win);
}
/**
* Constructor.
* @param txt input text
* @param win parent window
*/
public BaseXTextField(final String txt, final Window win) {
BaseXLayout.setWidth(this, DWIDTH);
BaseXLayout.addInteraction(this, win);
if(txt != null) {
setText(txt);
selectAll();
}
addFocusListener(new FocusAdapter() {
@Override
public void focusGained(final FocusEvent e) {
if(area != null) selectAll();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(final MouseEvent e) {
BaseXLayout.focus(e.getComponent());
}
});
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent e) {
if(UNDOSTEP.is(e) || REDOSTEP.is(e)) {
final String t = getText();
setText(last);
last = t;
}
if(area == null) return;
final String text = getText();
final boolean enter = ENTER.is(e);
if(ESCAPE.is(e) || enter && text.isEmpty()) {
area.requestFocusInWindow();
} else if(enter || FINDNEXT.is(e) || FINDPREV.is(e) ||
FINDNEXT2.is(e) || FINDPREV2.is(e)) {
area.find(text, FINDPREV.is(e) || FINDPREV2.is(e) || e.isShiftDown());
}
}
@Override
public void keyReleased(final KeyEvent e) {
if(area == null) return;
final String text = getText();
final char ch = e.getKeyChar();
if(!control(e) && Character.isDefined(ch) && !ENTER.is(e))
area.find(text, false);
repaint();
}
});
setDragEnabled(true);
BaseXLayout.addDrop(this, new DropHandler() {
@Override
public void drop(final Object object) {
replaceSelection(object.toString());
}
});
}
/**
* Activates search functionality to the text field.
* @param a text area to search
*/
public final void setSearch(final BaseXEditor a) {
area = a;
BaseXLayout.setWidth(this, 120);
}
@Override
public void setText(final String txt) {
last = txt;
super.setText(txt);
}
}