package com.akjava.gwt.lib.client.widget.cell;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.lib.common.utils.ListUtils;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.FluentIterable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
/**
* single selection
* @author aki
*
* @param <T>
*/
public abstract class EasyCellTableObjects<T> {
protected List<T> datas=new ArrayList<T>();
protected SimpleCellTable<T> simpleCellTable;
protected SingleSelectionModel<T> selectionModel;
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
public SimpleCellTable<T> getSimpleCellTable() {
return simpleCellTable;
}
public void setSimpleCellTable(SimpleCellTable<T> simpleCellTable,boolean showPager) {
this.simpleCellTable = simpleCellTable;
}
public T getSelection(){
return selectionModel.getSelectedObject();
}
public boolean isSelected(){
return getSelection()!=null;
}
public Optional<Integer> getSelectedIndex(@Nullable T data){
if(data==null){
return Optional.absent();
}
int value=datas.indexOf(data);
if(value==-1){
return Optional.absent();
}
return Optional.of(value);
}
public Optional<Integer> getSelectedIndex(){
T data=getSelection();
if(data==null){
return Optional.absent();
}
int value=datas.indexOf(data);
if(value==-1){
return Optional.absent();
}
return Optional.of(value);
}
public abstract void onSelect(@Nullable T selection);
public void setSelected(T item,boolean selected){
selectionModel.setSelected(item, selected);
}
public SingleSelectionModel<T> getSelectionModel() {
return selectionModel;
}
public void setSelectionModel(SingleSelectionModel<T> selectionModel) {
this.selectionModel = selectionModel;
}
public EasyCellTableObjects(SimpleCellTable<T> simpleCellTable){
this(simpleCellTable,true);
}
public EasyCellTableObjects(SimpleCellTable<T> simpleCellTable, boolean showPager) {
this.simpleCellTable=simpleCellTable;
selectionModel=new SingleSelectionModel<T>();
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
onSelect(selectionModel.getSelectedObject());
}
});
simpleCellTable.setSelectionModel(selectionModel);
simpleCellTable.getPager().setVisible(showPager);
}
public void addItem(T data){
datas.add(data);
update();
}
public void insertItem(int index,T data){
datas.add(index,data);
update();
}
public void clearAllItems(){
unselect();
datas.clear();
update();
}
public void removeItem(T data){
selectionModel.setSelected(data, false);
datas.remove(data);
update();
}
public Optional<T> getItemAt(int index){
if(index>=0 && index<datas.size()){
return Optional.of(datas.get(index));
}
return Optional.absent();
}
public T removeItem(int index){
for(T data:getItemAt(index).asSet()){
selectionModel.setSelected(data, false);
datas.remove(data);
update();
return data;
}
return null;
}
/**
* @deprecated
* @param flush //no more flush support.
*/
public void update(boolean flush){
simpleCellTable.setData(datas,flush);
}
/*
* setData need update
*/
public void update(){
simpleCellTable.setData(datas);//no more flush support?
}
public void downItem(T object) {
if(datas.size()>1){
int index=datas.indexOf(object);
datas.remove(object);
datas.add(Math.min(index+1, datas.size()),object);
update(true);
}
}
public void upItem(T object) {
if(datas.size()>1){
int index=datas.indexOf(object);
datas.remove(object);
datas.add(Math.max(0, index-1),object);
update(true);
}
}
public void topItem(T object){
if(datas.size()<=1){//no need
return;
}
ListUtils.top(datas, object);
update();
}
public void bottomItem(T object){
if(datas.size()<=1){//no need
return;
}
ListUtils.bottom(datas, object);
update();
}
public Optional<T> getNext(T data) {
if(data==null){
return Optional.absent();
}
int index=datas.indexOf(data);
if(index==-1){
return Optional.absent();
}
if(index<datas.size()-1){
return Optional.of(datas.get(index+1));
}else{
return Optional.absent();
}
}
public Optional<T> getPrev(T data) {
if(data==null){
return Optional.absent();
}
int index=datas.indexOf(data);
if(index==-1){
return Optional.absent();
}
if(index>0){
return Optional.of(datas.get(index-1));
}else{
return Optional.absent();
}
}
public Optional<T> getFirst() {
if(datas.size()>0){
return Optional.of(datas.get(0));
}else{
return Optional.absent();
}
}
public Optional<T> getLast() {
if(datas.size()>0){
return Optional.of(datas.get(datas.size()-1));
}else{
return Optional.absent();
}
}
public <E> List<E> convertToList(Function<T,E> function){
return FluentIterable.from(datas).transform(function).toList();
}
public void unselect() {
T selection=getSelection();
if(selection!=null){
selectionModel.setSelected(selection, false);
}
}
public Column<T,T> generateUpDownActionColumn(String upLabel,String downLabel){
return new ActionCellGenerator<T>(){
@Override
public void executeAt(int index, T object) {
if(index==0){
EasyCellTableObjects.this.upItem(object);
}else if(index==1){
EasyCellTableObjects.this.downItem(object);
}
}}.generateColumn(upLabel, downLabel);
}
}