/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package javax.swing;

import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;

public class CheckBoxList extends JList {

   protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
   protected boolean[] seleccionados = null;

   public CheckBoxList() {
      setCellRenderer(new CellRenderer());
      addMouseListener(new MouseAdapter() {

         public void mousePressed(MouseEvent e) {
            int index = locationToIndex(e.getPoint());
            if (index != -1) {
               JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
               seleccionados[index] = !seleccionados[index];
               checkbox.setSelected(seleccionados[index]);
               repaint();
            }
         }
      });
      this.addKeyListener(new KeyAdapter() {

         public void keyPressed(KeyEvent e) {
            if (e.getKeyChar() == ' ' || e.getKeyChar() == 'x') {
               int index = getSelectedIndex();
               if (index >= 0) {
                  JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
                  seleccionados[index] = !seleccionados[index];
                  checkbox.setSelected(seleccionados[index]);
                  repaint();
               }
            }
         }
      });
      setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
   }

   public void setModel(ListModel model) {
      if (!(model.getElementAt(0) instanceof JCheckBox)) {
         return;
      }
      super.setModel(model);
   }

   public void setListData(Object[] listData) {
      JCheckBox[] datos = new JCheckBox[listData.length];
      for (int i = 0; i < listData.length; i++) {
         datos[i] = new JCheckBox((String) listData[i]);
      }
      seleccionados = new boolean[listData.length];
      super.setListData(datos);
   }

   public void setChecked(int n, boolean check) {
      seleccionados[n] = check;
      repaint();
   }

   public boolean getChecked(int n) {
      return seleccionados[n];
   }

   protected class CellRenderer implements ListCellRenderer {

      public Component getListCellRendererComponent(JList list, Object value, int index,
              boolean isSelected, boolean cellHasFocus) {
         JCheckBox checkbox = (JCheckBox) value;
         checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground());
         checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground());
         checkbox.setSelected(seleccionados[index]);
         checkbox.setFont(getFont());
         checkbox.setFocusPainted(false);
         checkbox.setBorderPainted(true);
         checkbox.setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
         return checkbox;
      }
   }
}
