package org.pokenet.client.ui.base;
import java.util.ArrayList;
import java.util.List;
import mdes.slick.sui.Button;
import mdes.slick.sui.Container;
import mdes.slick.sui.Frame;
import mdes.slick.sui.Label;
import mdes.slick.sui.event.ActionEvent;
import mdes.slick.sui.event.ActionListener;
import mdes.slick.sui.event.MouseAdapter;
import mdes.slick.sui.event.MouseEvent;
import mdes.slick.sui.skin.simple.SimpleArrowButton;
import org.newdawn.slick.Color;
import org.newdawn.slick.gui.GUIContext;
import org.pokenet.client.GameClient;
/**
* Combo box
* @author ZombieBear
*
*/
@SuppressWarnings("deprecation")
public class ComboBox extends Container{
private List<String> m_elements;
private Label m_item;
private Button m_arrow;
private String m_selected;
private ItemSelector m_itemSelector;
private ComboBox m_this;
/**
* Default Constructor
*/
public ComboBox(){
m_this = this;
m_elements = new ArrayList<String>();
m_arrow = new SimpleArrowButton(SimpleArrowButton.DOWN);
m_arrow.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (m_itemSelector == null) {
m_itemSelector = new ItemSelector(m_this, 6, m_elements.toArray(new String
[m_elements.size()]), (int)getWidth(), (int)m_arrow.getWidth());
m_itemSelector.setLocation(getAbsoluteX(), getAbsoluteY() - 5);
getDisplay().add(m_itemSelector);
} else {
m_itemSelector.destroy();
m_itemSelector = null;
}
}
});
m_item = new Label("");
add(m_arrow);
add(m_item);
}
@Override
public void setSize(float width, float height){
super.setSize(width, height);
m_arrow.setSize(getHeight(), getHeight());
m_arrow.setLocation(getWidth() - m_arrow.getWidth(), 0);
}
/**
* Sets the selected item
* @param item
*/
public void setSelected(String item){
m_item.setText(item);
m_item.pack();
m_item.addMouseListener(new MouseAdapter(){
@Override
public void mouseEntered(MouseEvent e) {
super.mouseEntered(e);
m_item.setForeground(Color.blue);
}
@Override
public void mouseExited(MouseEvent e) {
super.mouseExited(e);
m_item.setForeground(getForeground());
}
@Override
public void mousePressed(MouseEvent e){
if (m_itemSelector == null){
m_itemSelector = new ItemSelector(m_this, 5, m_elements.toArray(new String[m_elements.size()]),
(int)getWidth(), (int)m_arrow.getWidth());
m_itemSelector.setLocation(getAbsoluteX(), getAbsoluteY() - 5);
getDisplay().add(m_itemSelector);
} else {
m_itemSelector.destroy();
m_itemSelector = null;
}
}
});
m_selected = item;
}
/**
* Enables or disables the ComboBox
* @param enabled
*/
public void setEnabled(boolean enabled){
m_arrow.setEnabled(enabled);
}
/**
* Gets the selected item
* @return the selected item
*/
public String getSelected(){
return m_selected;
}
/**
* Returns the selected item's index
* @return the selected item's index
*/
public int getSelectedIndex() {
return m_elements.indexOf(m_selected);
}
/**
* Returns true if an item is being selected
* @return true if an item is being selected
*/
public boolean isSelecting() {
return m_itemSelector != null;
}
/**
* Adds an element
* @param element
*/
public void addElement(String element){
m_elements.add(element);
if (m_item.getText() == ""){
setSelected(element);
}
}
@Override
public void update(GUIContext container, int delta){
super.update(container, delta);
if (m_itemSelector != null && m_itemSelector.isChoiceMade()){
setSelected(m_itemSelector.getSelected());
m_itemSelector.destroy();
m_itemSelector = null;
}
}
@Override
public void setForeground(Color c){
super.setForeground(c);
try{
m_item.setForeground(c);
} catch (NullPointerException e) {}
}
}
/**
* Item selector for combo boxes
* @author ZombieBear
*
*/
class ItemSelector extends Frame{
Label[] m_shownItems;
String[] m_items;
Button m_up, m_down;
int m_amountShown, m_index, m_selected, m_width;
private boolean m_choiceMade = false;
ComboBox m_parent;
/**
* Default Constructor
* @param parent
* @param shown
* @param items
* @param width
* @param buttonWidth
*/
@SuppressWarnings("deprecation")
public ItemSelector(ComboBox parent,
int shown,
String[] items,
int width,
int buttonWidth){
m_parent = parent;
m_amountShown = shown;
m_items = items;
m_width = width;
m_index = 0;
setSize(width, m_amountShown * 20);
m_shownItems = new Label[m_amountShown];
for (int i = 0; i < m_amountShown; i++){
m_shownItems[i] = new Label();
}
m_up = new SimpleArrowButton(SimpleArrowButton.FACE_UP);
m_up.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
scroll(-1);
}
});
m_up.setEnabled(false);
m_up.setSize(buttonWidth, buttonWidth);
m_up.setLocation(width - buttonWidth, 0);
m_down = new SimpleArrowButton(SimpleArrowButton.FACE_DOWN);
if (m_items.length <= m_amountShown)
m_down.setEnabled(false);
m_down.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
scroll(1);
}
});
m_down.setSize(buttonWidth, buttonWidth);
m_down.setLocation((float)width - buttonWidth, (float)(m_amountShown * 20 - 2.5 * buttonWidth));
scroll(0);
m_up.setZIndex(10);
m_down.setZIndex(9);
ensureZOrder();
getContentPane().add(m_up);
getContentPane().add(m_down);
getTitleBar().setVisible(false);
setVisible(true);
setResizable(false);
setAlwaysOnTop(true);
}
/**
* Returns the selected item
* @return the selected item
*/
public String getSelected(){
return m_items[m_selected];
}
/**
* Scrolls according to the index modifier
* @param indexMod
*/
public void scroll(int indexMod){
int y = -15;
m_index += indexMod;
if (m_index == 0)
m_up.setEnabled(false);
else
m_up.setEnabled(true);
if (m_index + m_amountShown >= m_items.length)
m_down.setEnabled(false);
else
m_down.setEnabled(true);
for (int i = 0; i < m_amountShown; i++){
final int j = i;
if (m_shownItems[i] != null){
getContentPane().remove(m_shownItems[i]);
m_shownItems[i] = null;
}
try{
m_shownItems[i] = new Label(m_items[i + m_index]);
} catch (Exception e) {
m_shownItems[i] = new Label();
}
m_shownItems[i].pack();
m_shownItems[i].addMouseListener(new MouseAdapter(){
@Override
public void mouseEntered(MouseEvent e) {
super.mouseEntered(e);
m_shownItems[j].setForeground(Color.blue);
}
@Override
public void mouseExited(MouseEvent e) {
super.mouseExited(e);
m_shownItems[j].setForeground(getForeground());
}
@Override
public void mouseReleased(MouseEvent e){
m_selected = j + m_index;
m_choiceMade = true;
}
});
getContentPane().add(m_shownItems[i]);
y += 15;
m_shownItems[i].setLocation(2, y);
}
}
/**
* Returns true if a choice was made
* @return true if a choice was made
*/
public boolean isChoiceMade(){
return m_choiceMade;
}
@Override
public void update(GUIContext container, int delta){
super.update(container, delta);
if (!m_parent.getParent().getParent().isVisible()){
destroy();
}
}
/**
* Destroys the item selector
*/
public void destroy(){
GameClient.getInstance().getDisplay().remove(this);
}
}