/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.binder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelStringProvider;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.DataView;
import com.extjs.gxt.ui.client.widget.DataViewItem;
import com.extjs.gxt.ui.client.widget.ListView;
/**
* A <code>StoreBinder</code> implementation for <code>DataView</code>.
*
* @param <M> the model type
*
* @deprecated @link {@link ListView}
*/
public class DataViewBinder<M extends ModelData> extends StoreBinder<ListStore<M>, DataView, M> {
private DataView view;
private ListStore<M> store;
/**
* Creates a new data view binder.
*
* @param view the data view
* @param store the list store
*/
public DataViewBinder(DataView view, ListStore<M> store) {
super(store, view);
this.view = view;
this.store = store;
}
@Override
public Component findItem(M model) {
for (DataViewItem item : view.getItems()) {
if (store.getModelComparer().equals(item.<M>getModel(), model)) {
return item;
}
}
return null;
}
/**
* Returns the binder's store.
*
* @return the store
*/
public ListStore<M> getStore() {
return store;
}
/**
* Returns the data view.
*
* @return this view
*/
public DataView getView() {
return view;
}
@Override
protected void createAll() {
view.removeAll();
for (M m : store.getModels()) {
view.add(createItem(m));
}
}
protected DataViewItem createItem(M model) {
Map<String, Object> values = model.getProperties();
if (view.getTemplate() != null && view.getTemplate().getStringProvider() != null) {
ModelStringProvider<ModelData> provider = view.getTemplate().getStringProvider();
for (String s : values.keySet()) {
String val = provider.getStringValue(model, s);
if (val != null) {
values.put(s, val);
}
}
}
DataViewItem item = new DataViewItem(values);
setModel(item, model);
return item;
}
@Override
protected List<M> getSelectionFromComponent() {
List<M> selection = new ArrayList<M>();
List<DataViewItem> sel = view.getSelectedItems();
for (DataViewItem item : sel) {
selection.add(item.<M>getModel());
}
return selection;
}
@Override
protected void onAdd(StoreEvent<M> se) {
List<M> models = se.getModels();
for (int i = models.size() - 1; i >= 0; i--) {
view.insert(createItem(models.get(i)), se.getIndex());
}
}
@Override
protected void onDataChanged(StoreEvent<M> se) {
createAll();
}
@Override
protected void onFilter(StoreEvent<M> se) {
if (store.isFiltered()) {
for (DataViewItem item : view.getItems()) {
M m = item.<M>getModel();
item.setVisible(store.contains(m));
}
} else {
for (DataViewItem item : view.getItems()) {
item.setVisible(true);
}
}
}
@Override
protected void onRemove(StoreEvent<M> se) {
DataViewItem item = (DataViewItem) findItem((M) se.getModel());
if (item != null) {
view.remove(item);
}
}
@Override
protected void onSort(StoreEvent<M> se) {
if (view.getItemCount() > 0) {
El parent = view.getItem(0).el().getParent();
int count = store.getCount();
for (int i = 0; i < count; i++) {
M m = store.getAt(i);
DataViewItem item = (DataViewItem) findItem(m);
parent.dom.appendChild(item.getElement());
}
}
}
@Override
protected void onUpdate(StoreEvent<M> se) {
if (se.getModel() != null) {
update(se.getModel());
}
}
@Override
protected void removeAll() {
view.removeAll();
}
@Override
protected void setSelectionFromProvider(List<M> selection) {
List<DataViewItem> sel = new ArrayList<DataViewItem>();
for (M m : selection) {
DataViewItem item = (DataViewItem) findItem(m);
if (item != null) {
sel.add(item);
}
}
view.setSelectedItems(sel);
}
@Override
protected void update(M model) {
DataViewItem item = (DataViewItem) findItem(model);
if (item != null) {
int idx = store.indexOf(model);
view.remove(item);
view.insert(createItem(model), idx);
}
}
}