/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Flemming N. Larsen
* - Initial API and implementation
*******************************************************************************/
package net.sf.robocode.ui;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import net.sf.robocode.util.AlphanumericComparator;
/**
* A JList containing JCheckBox items.
*
* @author Flemming N. Larsen (original)
*/
@SuppressWarnings("serial")
public class CheckList extends JList {
private DefaultListModel model;
public CheckList() {
super();
initialize();
}
private void initialize() {
model = new DefaultListModel();
setModel(model);
// Use a CheckListRenderer (see below) to renderer list cells
setCellRenderer(new CheckListRenderer());
// Add a mouse listener to handle changing selection
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
JList list = (JList) event.getSource();
// Get index of item clicked
int index = list.locationToIndex(event.getPoint());
if (index >= 0) {
if (event.getClickCount() == 2) {
CheckListItem item = (CheckListItem) model.getElementAt(index);
// Toggle selected state
item.setSelected(!item.isSelected());
// Repaint cell
list.repaint(list.getCellBounds(index, index));
}
}
}
});
}
public void clear() {
model.clear();
}
public int getLength() {
return model.getSize();
}
public String get(int index) {
return ((CheckListItem) model.getElementAt(index)).toString();
}
public void add(String label) {
model.addElement(new CheckListItem(label));
}
public void remove(int index) {
model.remove(index);
}
public boolean contains(String label) {
if (label == null) {
return false;
}
for (int i = 0; i < model.getSize(); i++) {
CheckListItem item = (CheckListItem) model.getElementAt(i);
if (label.equals(item.toString())) {
return true;
}
}
return false;
}
public void sort() {
int size = model.getSize();
if (size > 0) {
CheckListItem[] items = new CheckListItem[size];
model.copyInto(items);
Arrays.sort(items);
for (int i = 0; i < items.length; i++) {
model.setElementAt(items[i], i);
}
}
}
public void setChecked(String label, boolean isChecked) {
if (label != null) {
for (int i = 0; i < model.getSize(); i++) {
CheckListItem item = (CheckListItem) model.getElementAt(i);
if (label.equals(item.toString())) {
item.setSelected(isChecked);
break;
}
}
}
}
public Collection<String> getUnchecked() {
Collection<String> unchecked = new HashSet<String>();
for (int i = 0; i < model.getSize(); i++) {
CheckListItem item = (CheckListItem) model.getElementAt(i);
if (!item.isSelected()) {
unchecked.add(item.toString());
}
}
return unchecked;
}
public Collection<String> getAll() {
Collection<String> all = new HashSet<String>();
for (int i = 0; i < model.getSize(); i++) {
CheckListItem item = (CheckListItem) model.getElementAt(i);
all.add(item.toString());
}
return all;
}
}
/**
* Represents items in the list that can be selected.
*/
class CheckListItem implements Cloneable, Comparable<CheckListItem> {
private String label;
private boolean isSelected = true;
public CheckListItem(String label) {
this.label = label;
}
private CheckListItem(CheckListItem item) {
label = item.label;
isSelected = item.isSelected;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
// Must be here
public String toString() {
return label;
}
// Must be here (for sorting)
public Object clone() {
return new CheckListItem(this);
}
// Must be here (for sorting)
public int compareTo(CheckListItem item) {
return new AlphanumericComparator().compare(label, item.label);
}
}
/**
* CheckListRenderer handles rendering cells in the list using a check box.
*/
@SuppressWarnings("serial")
class CheckListRenderer extends JCheckBox implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
setEnabled(list.isEnabled());
setSelected(((CheckListItem) value).isSelected());
setFont(list.getFont());
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setText(value.toString());
return this;
}
}