package br.ufpr.c3sl.view.footer.paginator;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import br.ufpr.c3sl.util.Util;
import br.ufpr.c3sl.view.principal.JpCarrie;
/**
* CARRIE Framework
* class JpPaginator the paginator panel of CARRIE framework
* @author Diego Marczal
* @version Outubro 16, 2010
*/
@SuppressWarnings("serial")
public class JpPaginator extends JPanel {
private static final int MAX_SIZE_OF_ITEM_NAME = 35;
private JButton jbNext;
private JButton jbPrevious;
private JComboBox jcbList;
private ArrayList<String> toolTips;
private ArrayList<String> names;
private LinkedHashMap<String, JPanel> list = new LinkedHashMap<String, JPanel>();
private List<PaginatorListener> listeners;
public JpPaginator() {
inicializeVariables();
setListeners();
listeners = new ArrayList<PaginatorListener>();
}
private void inicializeVariables(){
list = new LinkedHashMap<String, JPanel>();
toolTips = new ArrayList<String>();
names = new ArrayList<String>();
jbPrevious = new JButton(Util.getImageIcon(getClass(), "backward_nav"));
this.add(jbPrevious);
jbNext = new JButton(Util.getImageIcon(getClass(), "forward_nav"));
this.add(jbNext);
jcbList = new JComboBox();
jcbList.setRenderer(new MyComboBoxRenderer());
this.add(jcbList);
}
private void setListeners(){
jbNext.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
moveAhead();
}
});
jbPrevious.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
moveBack();
}
});
jcbList.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
int index = cb.getSelectedIndex();
if (index >= 0){
String key = names.get(index);
JpCarrie.getInstance().updateMainPanel(list.get(key));
//br.ufpr.c3sl.condigital.app.model.PaginationChangeNotify.getInstance().changed(l.get(key));
}
}
});
}
private String createTootips(String s){
String toolTip = s;
if (s.length() > MAX_SIZE_OF_ITEM_NAME){
toolTip = s.substring(0, MAX_SIZE_OF_ITEM_NAME)+"...";
}
toolTips.add(toolTip);
names.add(s);
return toolTip;
}
/**
* add a panel to the paginator
* @param jPanel to be added
*/
public void addPanel(JPanel jPanel){
list.put(jPanel.getName(), jPanel);
jcbList.addItem(createTootips(jPanel.getName()));
}
/**
* move the paginator ahead
*/
public void moveAhead() {
int x = jcbList.getSelectedIndex();
if (++x < jcbList.getItemCount()){
jcbList.setSelectedIndex(x);
paginatorDispacher("AHEAD");
}
};
/**
* move the paginator back
*/
public void moveBack () {
int x = jcbList.getSelectedIndex();
if (x > 0 && x <= jcbList.getItemCount() ){
jcbList.setSelectedIndex(--x);
paginatorDispacher("BACK");
}
};
/**
* move the paginator to a determinate index
* @param index index of the panel
*/
public void moveToIndex(int index) {
if (index >= 0 && index < jcbList.getItemCount()){
jcbList.setSelectedIndex(index);
paginatorDispacher("TO:"+ index);
}
}
/**
* move the paginator to the last panel
*/
public void moveToLast() {
jcbList.setSelectedIndex(jcbList.getItemCount()-1);
paginatorDispacher("LAST");
}
/**
* getAllPanels
* @return all panels added at the CARRIE
*/
public Collection<JPanel> getAllPanels() {
return list.values();
}
//Listeners
public synchronized void addPaginatorListener(PaginatorListener listener) {
if(!listeners.contains(listener)) {
listeners.add(listener);
}
}
public synchronized void removePaginatorListener(PaginatorListener listener) {
listeners.remove(listener);
}
private void paginatorDispacher(Object object) {
PaginatorEvent<Object> evento = new PaginatorEvent<Object>(object);
for (PaginatorListener listener : getListenerClone()) {
listener.paginated(evento);
}
}
@SuppressWarnings("unchecked")
private List<PaginatorListener> getListenerClone(){
synchronized (this) {
// Clonar para evitar problemas de sincronização
// durante a propagação
return (List<PaginatorListener>) ((ArrayList<PaginatorListener>) listeners).clone();
}
}
private class MyComboBoxRenderer extends BasicComboBoxRenderer {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (list != null){
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
if (-1 < index) {
list.setToolTipText(toolTips.get(index));
}
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setFont(list.getFont());
}
setText((value == null) ? "" : value.toString());
return this;
}
}
}