package org.chartsy.stockscanpro.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
/**
*
* @author Viorel
*/
public class ExchangePopup extends JPopupMenu
{
private JCheckList list;
public ExchangePopup()
{
setBackground(Color.WHITE);
loadUIElements();
addKeyListener(new ExchangePopupKeyListener());
}
private void loadUIElements()
{
list = new JCheckList();
JScrollPane scrollPane = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
add(scrollPane);
}
public @Override void show(Component invoker, int x, int y)
{
if (list.getModel().getSize() < 1)
return;
super.show(invoker, x, y);
requestFocusInWindow();
}
public Object[] getSelectedItems()
{
return list.getSelectedValues();
}
public int getSelectedExchanges()
{
return list.getSelectedItems();
}
public void setExchangeListener(JLabel label)
{
list.setExchangeListener(label);
}
public void select()
{
if (list.getModel().getSize() < 1)
return;
int index = list.getSelectedIndex();
JCheckList.CheckableItem item = (JCheckList.CheckableItem) list.getSelectedValue();
item.setSelected(!item.isSelected());
list.repaint(list.getCellBounds(index, index));
}
public void moveDown()
{
if (list.getModel().getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.min(list.getModel().getSize() - 1, oldIndex + 1);
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
public void moveUp()
{
if (list.getModel().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 (list.getModel().getSize() < 1)
return;
list.setSelectionInterval(0, 0);
list.scrollRectToVisible(list.getCellBounds(0, 0));
}
public void moveEnd()
{
if (list.getModel().getSize() < 1)
return;
int endIndex = list.getModel().getSize() - 1;
list.setSelectionInterval(endIndex, endIndex);
list.scrollRectToVisible(list.getCellBounds(endIndex, endIndex));
}
public void movePageUp()
{
if (list.getModel().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 (list.getModel().getSize() < 1)
return;
int oldIndex = list.getSelectedIndex();
int newIndex = Math.min(list.getModel().getSize() - 1, oldIndex + Math.max(0, list.getVisibleRowCount() - 1));
list.setSelectionInterval(newIndex, newIndex);
list.scrollRectToVisible(list.getCellBounds(newIndex, newIndex));
}
private class ExchangePopupKeyListener extends KeyAdapter
{
public @Override void keyPressed(KeyEvent e)
{
if (e.isConsumed())
return;
if (ExchangePopup.this.isVisible())
{
switch (e.getKeyCode())
{
case KeyEvent.VK_UP:
moveUp();
e.consume();
break;
case KeyEvent.VK_DOWN:
moveDown();
e.consume();
break;
case KeyEvent.VK_PAGE_UP:
movePageUp();
e.consume();
break;
case KeyEvent.VK_PAGE_DOWN:
movePageDown();
e.consume();
break;
case KeyEvent.VK_END:
moveEnd();
e.consume();
break;
case KeyEvent.VK_HOME:
moveStart();
e.consume();
break;
case KeyEvent.VK_ENTER:
select();
e.consume();
break;
}
}
}
}
}