package org.rr.commons.swing.components.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.rr.commons.swing.components.event.ListCheckListener;
import org.rr.commons.swing.components.event.ListEvent;
import org.rr.commons.utils.ListUtils;
public class DefaultJRCheckBoxComboBoxModel<E> implements JRCheckBoxComboBoxModel<E> {
private Set<Integer> checks = new HashSet<>();
private List<E> values;
private List<String> labels;
private List<ListCheckListener<E>> listeners = new ArrayList<ListCheckListener<E>>();
public DefaultJRCheckBoxComboBoxModel(List<E> values, List<String> labels) {
this.values = values;
this.labels = labels;
if(this.labels == null) {
this.labels = new ArrayList<>();
}
}
@Override
public int getSize() {
return values.size();
}
@Override
public boolean isChecked(int index) {
Integer value = Integer.valueOf(index);
return checks.contains(value);
}
@Override
public String getLabel(int index) {
return ListUtils.get(labels, index);
}
@Override
public void setChecked(int index, boolean checked) {
Integer value = Integer.valueOf(index);
if (checked) {
checks.add(value);
fireListCheckListenerAdded(getValueAt(index));
} else {
checks.remove(value);
fireListCheckListenerRemoved(getValueAt(index));
}
return;
}
@Override
public E getValueAt(int index) {
return values.get(index);
}
public int getCheckCount() {
return checks.size();
}
public List<E> getCheckedValues() {
ArrayList<E> result = new ArrayList<>(checks.size());
for (Integer check : checks) {
result.add(getValueAt(check.intValue()));
}
return result;
}
public Set<Integer> getCheckedIndices() {
return checks;
}
public void addListCheckListener(ListCheckListener<E> listCheckListener) {
listeners.add(listCheckListener);
}
private void fireListCheckListenerAdded(E value) {
for (ListCheckListener<E> listener : listeners) {
ListEvent<E> listEvent = new ListEvent<>(this, Collections.singletonList(value));
listener.addCheck(listEvent);
}
}
private void fireListCheckListenerRemoved(E value) {
for (ListCheckListener<E> listener : listeners) {
ListEvent<E> listEvent = new ListEvent<>(this, Collections.singletonList(value));
listener.removeCheck(listEvent);
}
}
@Override
public void addCheck(E toCheck) {
for (int i = 0; i < values.size(); i++) {
if(toCheck == values.get(i)) {
setChecked(i, true);
break;
}
}
}
}