/*******************************************************************************
* 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.view;
import com.dragome.examples.crudgrid.model.Column;
import com.dragome.examples.crudgrid.model.CrudGrid;
import com.dragome.examples.crudgrid.model.Item;
import com.dragome.forms.bindings.builders.ComponentBuilder;
import com.dragome.forms.bindings.builders.Order;
import com.dragome.guia.GuiaServiceLocator;
import com.dragome.guia.components.VisualComboBoxImpl;
import com.dragome.guia.components.VisualPanelImpl;
import com.dragome.guia.components.interfaces.VisualButton;
import com.dragome.guia.components.interfaces.VisualLabel;
import com.dragome.guia.components.interfaces.VisualPanel;
import com.dragome.guia.components.interfaces.VisualTextField;
import com.dragome.templates.TemplateLayout;
import com.dragome.templates.interfaces.Template;
public class CrudGridComponent extends VisualPanelImpl
{
private Class<?> entityType;
private CrudGrid crudGrid;
private ComponentBuilder componentBuilder;
public CrudGridComponent(Template template, Class<?> entityType)
{
this.entityType= entityType;
Template clonedTemplate= GuiaServiceLocator.getInstance().getTemplateHandler().clone(template);
initLayout(new TemplateLayout(clonedTemplate));
}
public void setParent(VisualPanel parent)
{
super.setParent(parent);
crudGrid= new CrudGrid(entityType);
componentBuilder= new ComponentBuilder(this);
componentBuilder.bindTemplate("loading").as(VisualLabel.class).showWhen(crudGrid::isLoading).build();
buildFilter();
buildHeader();
buildAddSection();
buildObjects();
}
private void buildFilter()
{
componentBuilder.bindTemplate("filter").as(VisualTextField.class).toProperty(crudGrid::getFilter, crudGrid::setFilter).build();
componentBuilder.bindTemplate("remove-filter").as(VisualLabel.class).disableWhen(() -> crudGrid.getFilter().length() == 0).onClick(v -> crudGrid.setFilter("")).build();
}
private void buildHeader()
{
componentBuilder.bindTemplate("add-mode-toggler").as(VisualLabel.class).onClick(v -> crudGrid.toggleAddMode()).styleWith("glyphicon-minus", "glyphicon-plus").accordingTo(() -> crudGrid.isAddMode()).build();
componentBuilder.bindTemplate("table-header").as(VisualPanel.class).toList(crudGrid.getColumns()).repeat((column, builder) -> {
builder.onClick(() -> crudGrid.setOrderColumn(column)).build();
builder.styleWith(column.getStyleName()).when(() -> true);
builder.bindTemplate("column-name").as(VisualLabel.class).to(() -> column.getName()).build();
builder.bindTemplate("order-icon").as(VisualLabel.class).styleWith("glyphicon-sort-by-alphabet", "glyphicon-sort-by-alphabet-alt").accordingTo(() -> crudGrid.getOrderColumn().getOrder().equals(Order.ASC)).showWhen(() -> crudGrid.getOrderColumn() == column).build();
});
}
private void buildAddSection()
{
componentBuilder.bindTemplate("add-section").as(VisualPanel.class).showWhen(crudGrid::isAddMode).buildChildren(childrenBuilder -> {
childrenBuilder.bindTemplate("save-button").as(VisualButton.class).onClick(() -> crudGrid.addObject()).build();
childrenBuilder.bindTemplate("remove-button").as(VisualButton.class).onClick(() -> crudGrid.toggleAddMode()).build();
childrenBuilder.bindTemplate("columns").as(VisualPanel.class).toList(crudGrid.getColumns()).repeat((column, builder) -> {
builder.switchWith(() -> !column.isLookup()).buildChildren(columnBuilder -> {
columnBuilder.bindTemplate("input").switchDefaultCase((caseBuilder) -> caseBuilder.as(VisualTextField.class).toProperty(() -> crudGrid.getItem().getObject(), column.getName()).disableWhen(() -> column.isAutoincrement()).build());
columnBuilder.bindTemplate("select").switchCase(() -> false, (caseBuilder) -> caseBuilder.to(new VisualComboBoxImpl<>(crudGrid.getLookupData(column.getLookupEntityType()))).toProperty(() -> crudGrid.getItem().getObject(), column.getName()).showWhen(() -> column.isLookup()).build());
});
});
});
}
private void buildObjects()
{
componentBuilder.bindTemplate("objects").as(VisualPanel.class).toListProperty(crudGrid::getItems).orderBy(crudGrid.getColumnValueGetter(), () -> crudGrid.getOrderColumn().getOrder()).filter(crudGrid::getFilterTester).repeat((item, itemBuilder) -> {
buildToolbar(item, itemBuilder);
buildColumns(item, itemBuilder);
});
}
private void buildToolbar(Item item, ComponentBuilder itemBuilder)
{
itemBuilder.bindTemplate("toolbar").as(VisualPanel.class).switchWith(() -> !item.isEditMode()).buildChildren(toolbarChildrenBuilder -> {
toolbarChildrenBuilder.bindTemplate("view-mode").switchDefaultCase((caseBuilder) -> {
return caseBuilder.as(VisualPanel.class).buildChildren(childrenBuilder -> {
childrenBuilder.bindTemplate("edit").as(VisualLabel.class).onClick(() -> crudGrid.toggleEditMode(item)).build();
childrenBuilder.bindTemplate("trash").as(VisualLabel.class).onClick(() -> crudGrid.deleteObject(item)).build();
}).build();
});
toolbarChildrenBuilder.bindTemplate("edit-mode").switchCase(() -> false, (caseBuilder) -> {
return caseBuilder.as(VisualPanel.class).buildChildren(childrenBuilder -> {
childrenBuilder.bindTemplate("save").as(VisualLabel.class).onClick(() -> crudGrid.updateObject(item).toggleEditMode(item)).build();
childrenBuilder.bindTemplate("remove").as(VisualLabel.class).onClick(() -> crudGrid.toggleEditMode(item)).build();
}).build();
});
});
}
private void buildColumns(Item item, ComponentBuilder itemBuilder)
{
itemBuilder.bindTemplate("columns").as(VisualPanel.class).toList(crudGrid.getColumns()).repeat((column, columnBuilder) -> {
columnBuilder.switchWith(() -> item.isEditMode()).buildChildren(columnChildrenBuilder -> {
buildViewMode(item, column, columnChildrenBuilder);
buildEditMode(item, column, columnChildrenBuilder);
});
});
}
private void buildEditMode(Item item, Column column, ComponentBuilder columnChildrenBuilder)
{
columnChildrenBuilder.bindTemplate("edit-mode").switchCase(() -> true, (caseBuilder) -> {
return caseBuilder.as(VisualPanel.class).switchWith(() -> !column.isLookup()).buildChildren(viewModePanelBuilder -> {
viewModePanelBuilder.bindTemplate("input").switchDefaultCase((lookupCaseBuilder) -> lookupCaseBuilder.as(VisualTextField.class).toProperty(item.getObject(), column.getName()).disableWhen(() -> column.isAutoincrement()).build());
viewModePanelBuilder.bindTemplate("select").switchCase(() -> false, (lookupCaseBuilder) -> lookupCaseBuilder.to(new VisualComboBoxImpl<>(crudGrid.getLookupData(column.getLookupEntityType()))).toProperty(item.getObject(), column.getName()).disableWhen(() -> column.isAutoincrement()).build());
}).build();
});
}
private void buildViewMode(Item item, Column column, ComponentBuilder columnChildrenBuilder)
{
columnChildrenBuilder.bindTemplate("view-mode").switchDefaultCase((caseBuilder) -> {
return caseBuilder.as(VisualPanel.class).onClick(() -> crudGrid.toggleEditMode(item)).switchWith(() -> column.isLookup()).buildChildren(editModePanelBuilder -> {
editModePanelBuilder.bindTemplate("not-lookup").switchDefaultCase((lookupCaseBuilder) -> lookupCaseBuilder.as(VisualLabel.class).toProperty(item.getObject(), column.getName()).build());
editModePanelBuilder.bindTemplate("lookup").switchCase(() -> false, (lookupCaseBuilder) -> lookupCaseBuilder.as(VisualLabel.class).toProperty(item.getObject(), column.getName()).build());
}).build();
});
}
}