package org.chartsy.main.utils;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import org.chartsy.main.data.StockNode;
/**
*
* @author viorel.gheba
*/
public class AutocompletePopup extends JPopupMenu
{
private JTextField txtSymbol;
private JList list;
private DefaultListModel model;
private Point position;
public AutocompletePopup(JTextField textField)
{
setBackground(Color.WHITE);
txtSymbol = textField;
model = new DefaultListModel();
position = new Point(0, 0);
loadUIElements();
setEventManagement();
}
private void loadUIElements()
{
HtmlRendererImpl renderer = new HtmlRendererImpl();
list = new JList(model)
{
public @Override boolean isOpaque()
{ return true; }
public @Override int getVisibleRowCount()
{ return Math.min(model.getSize(), 20); }
};
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setBackground(Color.WHITE);
list.setCellRenderer(renderer);
JScrollPane scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
add(scrollPane);
}
private void setEventManagement()
{
list.addKeyListener(new WordMenuKeyListener());
list.addMouseListener(new WordMenuMouseListener());
}
public boolean hasSelected()
{
Object obj = list.getSelectedValue();
return obj != null;
}
public void onSelected()
{
Object obj = list.getSelectedValue();
if (obj != null)
{
StockNode node = (StockNode) obj;
String symbol = node.getSymbol();
txtSymbol.setText(symbol);
}
}
public void display(Point point)
{
position = point;
Point p = txtSymbol.getLocationOnScreen();
setLocation(new Point(p.x + point.x, p.y + point.y));
setVisible(true);
}
public void move()
{
if (position != null)
{
Point p = txtSymbol.getLocationOnScreen();
setLocation(new Point(p.x + position.x, p.y + position.y));
}
}
public void setWords(StockNode[] words)
{
model.clear();
if ((words == null) || (words.length == 0))
{
setVisible(false);
return;
}
for (int i = 0; i < words.length; i++)
{
model.addElement(words[i]);
}
pack();
pack();
}
public void moveDown()
{
if (model.getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.min(model.getSize() - 1, oldIndex + 1);
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
public void moveUp()
{
if (model.getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.max(0, oldIndex - 1);
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
public void moveStart()
{
if (model.getSize() < 1)
return;
list.setSelectionInterval(0, 0);
list.scrollRectToVisible(list.getCellBounds(0, 0));
}
public void moveEnd()
{
if (model.getSize() < 1)
return;
int endIndex = model.getSize() - 1;
list.setSelectionInterval(endIndex, endIndex);
list.scrollRectToVisible(list.getCellBounds(endIndex, endIndex));
}
public void movePageUp()
{
if (model.getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.max(0, oldIndex - Math.max(0, list.getVisibleRowCount() - 1));
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
public void movePageDown()
{
if (model.getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.min(model.getSize() - 1, oldIndex + Math.max(0, list.getVisibleRowCount() - 1));
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
private class WordMenuKeyListener extends KeyAdapter
{
public @Override void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{ onSelected(); }
}
}
private class WordMenuMouseListener extends MouseAdapter
{
public @Override void mouseClicked(MouseEvent e)
{
if ((e.getButton() == MouseEvent.BUTTON1))
{ onSelected(); }
}
}
}