import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.Document;
import javax.accessibility.Accessible;
public class MatchBox extends JComponent implements MouseListener,
KeyListener,
ActionListener,
MouseMotionListener,
Accessible,
FocusListener
{
private JTextField textField = new JTextField();
private JTable table = new JTable();
private JScrollPane scrollPane = new JScrollPane(table);
private JPopupMenu popup = new JPopupMenu();
private JButton button = new JButton("Suche");
private Vector <Vector> rowData = new Vector <Vector>();
private Vector <String> columnNames = new Vector <String>();
private int coltToSelect = 0;
public MatchBox(int columns, int coltToSelect)
{
super();
setLayout(new FlowLayout(FlowLayout.TRAILING,0,0));
this.coltToSelect = coltToSelect;
textField.setColumns(columns);
textField.addKeyListener(this);
textField.addFocusListener(this);
ImageIcon suchenIcon = new ImageIcon("images/search.png");
button.setIcon(suchenIcon);
button.addActionListener(this);
button.setPreferredSize(new Dimension(button.getPreferredSize().width, textField.getPreferredSize().height -1));
table.setAutoscrolls(true);
table.addMouseListener(this);
table.addMouseMotionListener(this);
popup.add(scrollPane);
add(textField);
add(button);
textField.add(popup);
setVisible(true);
}
public void setDocument(Document doc)
{
if (doc != null)
{
doc.putProperty("filterNewlines", Boolean.TRUE);
}
textField.setDocument(doc);
}
public Dimension getPreferredSize()
{
return new Dimension(textField.getPreferredSize().width + button.getPreferredSize().width, button.getPreferredSize().height);
}
public String getText()
{
return textField.getText();
}
public void init(Vector<Vector> rowData, Vector<String> columnNames)
{
if (rowData != null)
{
this.rowData = rowData;
}
if (columnNames != null)
{
this.columnNames = columnNames;
}
textField.setText(null);
table.setModel(new DefaultTableModel(rowData, columnNames)
{
public boolean isCellEditable(int x, int y)
{
return false;
}
});
}
public void setPopupVisible (Boolean visible)
{
if(visible)
{
popup.setInvoker(textField);
popup.setLocation(getLocationOnScreen().x, getLocationOnScreen().y + textField.getSize().height);
popup.setPreferredSize(new Dimension(getSize().width, getSize().height * 5));
popup.setVisible(true);
}
else
{
popup.setVisible(false);
popup.setInvoker(null);
}
}
public Boolean isPopupVisible()
{
return popup.isVisible();
}
public void mousePressed(MouseEvent evt)
{
if (evt.getClickCount() == 2)
{
DefaultTableModel model = (DefaultTableModel) table.getModel();
textField.setText((String) model.getValueAt(table.getSelectedRow(),coltToSelect));
setPopupVisible(false);
}
textField.requestFocus();
}
public void mouseDragged(MouseEvent evt)
{
}
public void mouseMoved (MouseEvent evt)
{
table.setRowSelectionInterval(table.rowAtPoint(evt.getPoint()), table.rowAtPoint(evt.getPoint()));
}
public void mouseReleased(MouseEvent evt)
{
}
public void mouseEntered(MouseEvent evt)
{
}
public void mouseExited(MouseEvent evt)
{
}
public void mouseClicked(MouseEvent evt)
{
}
public void keyTyped(KeyEvent evt)
{
}
public void keyPressed(KeyEvent evt)
{
}
public void keyReleased(KeyEvent evt)
{
refreshMatchBox();
}
private void refreshMatchBox()
{
Vector <Vector> tempData = new Vector<Vector>();
for (int i = 0; i < rowData.size(); i++)
{
for (int j = 0; j < rowData.get(i).size(); j++)
{
if (rowData.get(i).get(j).toString().toLowerCase().contains(textField.getText().toLowerCase()))
{
tempData.add(rowData.get(i));
j = rowData.get(i).size();
}
}
}
table.setModel(new DefaultTableModel(tempData, columnNames)
{
public boolean isCellEditable(int x, int y)
{
return false;
}
});
textField.requestFocus();
}
public void actionPerformed(ActionEvent evt)
{
refreshMatchBox();
setPopupVisible(true);
textField.requestFocus();
}
public void setFont(Font font)
{
textField.setFont(font);
table.setFont(font);
table.setRowHeight(font.getSize());
button.setFont(font);
button.setPreferredSize(null);
button.setPreferredSize(new Dimension(button.getPreferredSize().width, textField.getPreferredSize().height -1));
revalidate();
}
public void focusLost(FocusEvent evt)
{
System.out.println(evt.getComponent());
if ((evt.getOppositeComponent() != textField) &&
(evt.getOppositeComponent() != button) &&
(evt.getOppositeComponent() != popup) &&
(evt.getOppositeComponent() != table) &&
(evt.getOppositeComponent() != getRootPane()))
{
evt.setSource(this);
super.processFocusEvent(evt);
}
}
public void focusGained(FocusEvent evt)
{
if ((evt.getComponent() != textField) ||
(evt.getComponent() != button) ||
(evt.getComponent() != popup) ||
(evt.getComponent() != table) ||
(evt.getComponent() != getRootPane()))
{
if ((evt.getOppositeComponent() != textField) &&
(evt.getOppositeComponent() != button) &&
(evt.getOppositeComponent() != popup) &&
(evt.getOppositeComponent() != table) &&
(evt.getOppositeComponent() != getRootPane()))
{
evt.setSource(this);
super.processFocusEvent(evt);
}
}
}
}