/*******************************************************************************
* Copyright (c) 2011-2014 Fernando Petrola
*
* This file is part of Dragome SDK.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
******************************************************************************/
package com.dragome.examples.crudgrid.model;
import java.util.ArrayList;
import java.util.List;
import com.dragome.examples.crudgrid.services.EntitiesProviderService;
import com.dragome.forms.bindings.builders.Getter;
import com.dragome.forms.bindings.builders.ObservableList;
import com.dragome.forms.bindings.builders.Order;
import com.dragome.forms.bindings.builders.Tester;
import com.dragome.services.ServiceLocator;
public class CrudGrid
{
private boolean loading= true;
private String filter= "";
private boolean addMode;
private List<Item> objects;
private Item item;
private List<Column> columns;
private Tester<Item> filterTester= updateFilterTester();
private Column orderColumn;
private EntitiesProviderService entitiesProviderService= ServiceLocator.getInstance().getServiceFactory().createSyncService(EntitiesProviderService.class);
private Class<?> entityType;
public CrudGrid(Class<?> entityType)
{
this.entityType= entityType;
List<Identifiable> all= entitiesProviderService.getAll((Class) entityType);
List<Item> result= new ArrayList<Item>();
for (Identifiable object : all)
result.add(new ItemImpl(object));
objects= new ObservableList<Item>(result);
columns= new ObservableList<Column>(entitiesProviderService.getColumnsFor(entityType));
item= initItem();
orderColumn= columns.get(0);
setLoading(false);
}
public void addObject()
{
getItems().add(item);
Identifiable added= entitiesProviderService.add(item.getObject());
item.getObject().setId(added.getId());
toggleAddMode();
}
public void deleteObject(Item item)
{
objects.remove(item);
entitiesProviderService.delete(item.getObject());
}
public List<Column> getColumns()
{
return columns;
}
public String getFilter()
{
return filter;
}
public Tester<Item> getFilterTester()
{
return filterTester;
}
public Item getItem()
{
return item;
}
public List<Item> getItems()
{
return objects;
}
public List<Object> getLookupData(Class<?> lookupEntityType)
{
if (lookupEntityType == null)
return new ArrayList<Object>();
else
return entitiesProviderService.getAll((Class) lookupEntityType);
}
public Column getOrderColumn()
{
return orderColumn;
}
private ItemImpl initItem()
{
Identifiable classInstance= (Identifiable) ServiceLocator.getInstance().getReflectionService().createClassInstance(entityType);
return new ItemImpl(classInstance);
}
public boolean isAddMode()
{
return addMode;
}
public boolean isLoading()
{
return loading;
}
public void setAddMode(boolean addMode)
{
this.addMode= addMode;
}
public void setFilter(String filter)
{
this.filter= filter;
setFilterTester(updateFilterTester());
}
public void setFilterTester(Tester<Item> filterTester)
{
this.filterTester= filterTester;
setItems(getItems());
}
public void setItem(Item item)
{
this.item= item;
}
public void setLoading(boolean loading)
{
this.loading= loading;
}
public void setItems(List<Item> objects)
{
this.objects= objects;
}
public void setOrderColumn(Column column)
{
if (this.orderColumn == column)
this.orderColumn.setOrder(this.orderColumn.getOrder() == Order.ASC ? Order.DESC : Order.ASC);
else
this.orderColumn= column;
setItems(getItems());
}
public void toggleAddMode()
{
setAddMode(!isAddMode());
setItem(initItem());
}
public void toggleEditMode(Item item)
{
item.setEditMode(!item.isEditMode());
}
private Tester<Item> updateFilterTester()
{
return new Tester<Item>()
{
public boolean test(Item t)
{
String serialize= ServiceLocator.getInstance().getSerializationService().serialize(t);
return serialize.contains(filter);
}
};
}
public CrudGrid updateObject(Item item)
{
entitiesProviderService.update(item.getObject());
return this;
}
public Getter<Item, Comparable<?>> getColumnValueGetter()
{
return new Getter<Item, Comparable<?>>()
{
public Comparable<?> get(Item obj)
{
return (Comparable<?>) ServiceLocator.getInstance().getReflectionService().getPropertyValue(obj.getObject(), getOrderColumn().getName());
}
};
}
}