package org.gwtoolbox.widget.client.table.datagrid.selection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.gwtoolbox.widget.client.data.Record;
import org.gwtoolbox.widget.client.table.basic.BasicTable;
import org.gwtoolbox.widget.client.table.basic.selection.MultiRowSelection;
import org.gwtoolbox.widget.client.table.basic.selection.MultiRowSelectionModel;
import org.gwtoolbox.widget.client.table.datagrid.OldDataGrid;
/**
* @author Uri Boness
*/
public class MultiRecordSelectionModel implements MultiRecordSelection, RecordSelectionModel {
private OldDataGrid dataGrid;
private BasicTable table;
private MultiRowSelectionModel selectionModel;
private Collection<Listener> listeners = new ArrayList<Listener>();
private List<Record> selectedRecords = new ArrayList<Record>();
public void install(OldDataGrid dataGrid, BasicTable table) {
this.dataGrid = dataGrid;
this.table = table;
selectionModel = new MultiRowSelectionModel();
table.setSelectionModel(selectionModel);
selectionModel.addListener(new MultiRowSelectionModel.Listener() {
public void selectionCleared() {
selectedRecords.clear();
notifySelectionCleared();
}
public void rowSelected(int row, MultiRowSelection model) {
Record record = (Record) MultiRecordSelectionModel.this.table.getUserData(row, 0);
selectedRecords.add(record);
notifyRecordSelected(record);
}
public void rowUnselected(int row, MultiRowSelection model) {
Record record = (Record) MultiRecordSelectionModel.this.table.getUserData(row, 0);
selectedRecords.remove(record);
notifyRecordUnselected(record);
}
});
}
public void uninstall() {
table.clearSelectionModel();
listeners.clear();
dataGrid = null;
table = null;
selectionModel = null;
}
public RecordSelection getSelection() {
return this;
}
public List<Record> getSelectedRecords() {
return selectedRecords;
}
public void selectRecords(Record... records) {
int[] rows = recordsToRows(records);
selectionModel.selectRows(rows);
}
public void unselectRecords(Record... records) {
int[] rows = recordsToRows(records);
selectionModel.unselectRows(rows);
}
public boolean isRecordSelected(Record record) {
return selectedRecords.contains(record);
}
public void clear() {
selectionModel.clear();
}
public void addListener(Listener lisetener) {
listeners.add(lisetener);
}
public void removeListener(Listener listener) {
listeners.remove(listener);
}
public void clearListeners() {
listeners.clear();
}
//============================================== Helper Methods ====================================================
private int[] recordsToRows(Record... records) {
int[] rows = new int[records.length];
int i = 0;
for (int row = 0; row < table.getRowCount(); row++) {
if (table.isToolRow(row)) {
continue;
}
Record rowRecord = (Record) table.getUserData(row, 0);
for (Record record : records) {
if (record.equals(rowRecord)) {
rows[i++] = row;
break;
}
}
}
return rows;
}
private void notifySelectionCleared() {
for (Listener listener : listeners) {
listener.selectionCleared();
}
}
private void notifyRecordSelected(Record record) {
for (Listener listener : listeners) {
listener.recordSelected(record, this);
}
}
private void notifyRecordUnselected(Record record) {
for (Listener listener : listeners) {
listener.recordUnselected(record, this);
}
}
}