package org.basex.gui.view.table; import static org.basex.gui.layout.BaseXKeys.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import org.basex.gui.GUIConstants; import org.basex.gui.layout.BaseXLayout; import org.basex.gui.layout.BaseXPanel; import org.basex.util.Performance; /** * This class allows simple text input for the table headers. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ final class TableInput implements Runnable { /** Input text. */ String text; /** Panel reference. */ private final BaseXPanel panel; /** Flashing cursor. */ private boolean flashing; /** Flashing cursor. */ private int pos; /** * Constructor. * @param p panel reference * @param t text */ TableInput(final BaseXPanel p, final String t) { panel = p; text = t; pos = text.length(); new Thread(this).start(); } /** * Stops the box input. */ void stop() { text = null; } /** * Paints the input box. * @param g graphics reference * @param x x position * @param y y position * @param w width * @param h height */ void paint(final Graphics g, final int x, final int y, final int w, final int h) { g.setColor(GUIConstants.color4); g.drawRect(x, y - 1, w - 1, h); g.setColor(Color.black); g.setFont(GUIConstants.font); g.drawString(text, x + 5, y + h - 7); final int xx = x + BaseXLayout.width(g, text.substring(0, pos)) + 5; if(flashing) g.drawLine(xx, y + 1, xx, y + h - 5); } /** * Reacts on key codes. * @param e key event */ void code(final KeyEvent e) { if(ENTER.is(e) || text == null) stop(); flashing = true; if(LINESTART.is(e)) { pos = 0; } else if(LINEEND.is(e)) { pos = text.length(); } else if(PREV.is(e)) { pos = Math.max(0, pos - 1); } else if(NEXT.is(e)) { pos = Math.min(text.length(), pos + 1); } else if(DELPREV.is(e)) { if(pos > 0) text = text.substring(0, pos - 1) + text.substring(pos--); } else if(DELNEXT.is(e)) { if(pos < text.length()) { text = text.substring(0, pos) + text.substring(pos + 1); } } } /** * Adds a character. * @param e key event * @return true if input was modified */ boolean add(final KeyEvent e) { // backspace/delete... if(DELNEXT.is(e) || DELPREV.is(e)) return true; // skip other control chars final char ch = e.getKeyChar(); if(ch < ' ') return false; flashing = true; text = text.substring(0, pos) + ch + text.substring(pos); ++pos; return true; } @Override public void run() { while(text != null) { flashing ^= true; panel.repaint(); Performance.sleep(500); } flashing = false; panel.repaint(); } }