package sushi.application.pages.input.bpmn.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import sushi.application.components.table.model.AbstractDataProvider;
import sushi.bpmn.element.AbstractBPMNElement;
import sushi.bpmn.element.BPMNProcess;
/**
* This class is the provider for {@link BPMNProcess}es.
* @author micha
*/
public class ProcessModelProvider extends AbstractDataProvider implements IDataProvider<AbstractBPMNElement>, ISortableDataProvider<AbstractBPMNElement, String> {
private static final long serialVersionUID = 1L;
private BPMNProcess process;
private List<AbstractBPMNElement> elements;
private List<AbstractBPMNElement> selectedElements;
/**
* Constructor for providing {@link BPMNProcess}es.
*/
public ProcessModelProvider() {
elements = new ArrayList<AbstractBPMNElement>();
selectedElements = new ArrayList<AbstractBPMNElement>();
}
public ProcessModelProvider(BPMNProcess process) {
this.process = process;
elements = process.getBPMNElements();
selectedElements = new ArrayList<AbstractBPMNElement>();
}
@Override
public void detach() {
// events = null;
}
@Override
public Iterator<AbstractBPMNElement> iterator(long first, long count) {
List<AbstractBPMNElement> data = elements;
Collections.sort(data, new Comparator<AbstractBPMNElement>() {
public int compare(AbstractBPMNElement e1, AbstractBPMNElement e2) {
return (new Integer(e1.getID()).compareTo(e2.getID()));
}
});
return data.subList((int)first, (int)Math.min(first + count, data.size())).iterator();
}
@Override
public IModel<AbstractBPMNElement> model(AbstractBPMNElement element) {
return Model.of(element);
}
@Override
public long size() {
return elements.size();
}
public List<AbstractBPMNElement> getElements() {
return elements;
}
public List<AbstractBPMNElement> getSelectedElements(){
return selectedElements;
}
public void setElements(List<AbstractBPMNElement> elementList) {
elements = elementList;
}
@Override
public void selectEntry(int entryId) {
for (AbstractBPMNElement element : elements) {
if(element.getID() == entryId) {
selectedElements.add(element);
return;
}
}
}
@Override
public void deselectEntry(int entryId) {
for (AbstractBPMNElement element : elements) {
if(element.getID() == entryId) {
selectedElements.remove(element);
return;
}
}
}
@Override
public boolean isEntrySelected(int entryId) {
for (AbstractBPMNElement element : selectedElements) {
if(element.getID() == entryId) {
return true;
}
}
return false;
}
public void deleteSelectedEntries() {
for(AbstractBPMNElement element : selectedElements){
elements.remove(element);
element.remove();
}
}
public void selectAllEntries() {
for(AbstractBPMNElement element : elements){
if(!selectedElements.contains(element)){
selectedElements.add(element);
}
}
}
public void setProcessModel(BPMNProcess processModel) {
this.process = processModel;
if(this.process != null){
this.elements = this.process.getBPMNElementsWithOutSequenceFlows();
} else {
this.elements = new ArrayList<AbstractBPMNElement>();
}
this.selectedElements = new ArrayList<AbstractBPMNElement>();
}
@Override
public ISortState<String> getSortState() {
// TODO Auto-generated method stub
return null;
}
@Override
public Object getEntry(int entryId) {
for(AbstractBPMNElement element : elements){
if(element.getID() == entryId){
return element;
}
}
return null;
}
}