package de.javasoft.synthetica.democenter.examples.jycheckboxlist;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import de.javasoft.swing.JYCheckBoxList;

/**
 * Simple JYCheckBoxList demo.  
 */
@SuppressWarnings("serial")
public class SimpleJYCheckBoxList extends JFrame
{
  private JYCheckBoxList list;  
  
  public SimpleJYCheckBoxList()
  {
    super("Simple JYCheckBoxList Demo");
    
//@highlight
    list = new JYCheckBoxList(new Object[]{"Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7"});
    //enable check box selection by item click
    //list.setCheckBoxSelectableByItemClick(true);
    //select checkBoxes
    list.setSelectedCheckBoxIndices(new int[]{1,2,3,5});
    //select first item
    list.getSelectionModel().addSelectionInterval(0, 0);
//@/highlight

    add(new JScrollPane(list));        
    add(createOutputPanel(), BorderLayout.SOUTH);
    ((JComponent)getContentPane()).setBorder(new EmptyBorder(10,10,10,10));

    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    pack();
    setLocationRelativeTo(null);        //center
    setVisible(true);
  }

  private JPanel createOutputPanel()
  {
    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));

    p.add(Box.createVerticalStrut(10));
    
    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
    buttonPanel.setAlignmentX(Component.LEFT_ALIGNMENT);

    JButton button = new JButton("List selected items");
    buttonPanel.add(button);
    buttonPanel.add(Box.createHorizontalStrut(10));

    JButton clearButton = new JButton(new AbstractAction("Clear checkBox items"){
      public void actionPerformed(ActionEvent evt)
      {
//@highlight
        list.clearCheckBoxSelection();
//@/highlight
      }      
    });
    buttonPanel.add(clearButton);
    buttonPanel.add(Box.createHorizontalStrut(10));
    
    JCheckBox checkBox = new JCheckBox(new AbstractAction("TriState enabled"){
      public void actionPerformed(ActionEvent evt)
      {
//@highlight
        AbstractButton b = (AbstractButton)evt.getSource();
        list.setCheckBoxSelectionModel(new JYCheckBoxList.CheckBoxSelectionModel(list, b.isSelected()));
        //use OptionalCheckBoxSelectionModel for different checkbox selection order: unchecked-checked-halfSelected 
        //list.setCheckBoxSelectionModel(new JYCheckBoxList.OptionalCheckBoxSelectionModel(list, b.isSelected()));
        list.setSelectedCheckBoxIndices(1,3,4);
        list.setHalfSelectedCheckBoxIndices(5,6);
//@/highlight
        list.repaint();
      }
    });
    buttonPanel.add(checkBox);
    
    p.add(buttonPanel);

    p.add(Box.createVerticalStrut(10));
    
    final JTextArea ta = new JTextArea(5, 50);
    ta.setEditable(false);
    ta.setFocusable(false);
    JScrollPane scroller = new JScrollPane(ta); 
    scroller.setAlignmentX(Component.LEFT_ALIGNMENT);      
    p.add(scroller);
    
    button.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent evt)
      {
//@highlight
        StringBuilder sb = new StringBuilder();
        sb.append("Selected: ");
        for (int index : list.getSelectedCheckBoxIndices())
        {  
          sb.append(list.getModel().getElementAt(index).toString());          
          sb.append(", ");
        }
        if (sb.charAt(sb.length()-2) == ',')
          sb.delete(sb.length()-2, sb.length());

        if (list.getCheckBoxSelectionModel().hasTriStateSupport())
        {  
          sb.append("\nHalfSelected: ");
          for (int index : list.getHalfSelectedCheckBoxIndices())
          {  
            sb.append(list.getModel().getElementAt(index).toString());          
            sb.append(", ");
          }
          if (sb.charAt(sb.length()-2) == ',')
            sb.delete(sb.length()-2, sb.length());
        }        
        ta.setText(sb.toString());
//@/highlight
      }
    });
    return p;
  }
    
  /**
   * Static main method for application startup. 
   */
  public static void main(String[] args)
  {
    EventQueue.invokeLater(new Runnable()
    {
      public void run()
      {
        try
        {
          UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel");
          new SimpleJYCheckBoxList();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }  
}
