Skip to content

Instantly share code, notes, and snippets.

@aliakhtar
Created March 15, 2014 15:00
Show Gist options
  • Select an option

  • Save aliakhtar/9568597 to your computer and use it in GitHub Desktop.

Select an option

Save aliakhtar/9568597 to your computer and use it in GitHub Desktop.
public class CrudEditor<M extends ModelDTO> extends Composite
implements EditsItem<M>
{
private RendererProvider rendererFactory = new CrudFieldRenderer();
//Cannot use FormField<?> here as it gives an error when trying to add values to the map.
// Using LinkedHashMap for preserving order of insertion and rendering.
private final Map<String, Renders> renderMap
= new LinkedHashMap<>();
private final Map<String, FormField<?>> fields = new HashMap<>();
private final FlowPanel container;
private boolean isRendered = false;
public CrudEditor()
{
container = new FlowPanel();
container.setStyleName("form-horizontal form-bordered form-row-stripped");
initWidget(container);
}
public CrudEditor<M> setFieldRenderer(RendererProvider renderer)
{
this.rendererFactory = renderer;
return this;
}
public <T> CrudEditor<M> addField(String name, String label, HasValue<T> field)
{
FormField<T> formField = FormFieldMaker.make(field);
Renders newRenderer = this.rendererFactory.create(label, formField);
addField(name, formField, newRenderer);
return this;
}
public <T> CrudEditor<M> addField(String name, FormField<?> field, Renders renderer)
{
renderMap.put(name, renderer);
fields.put(name, field);
return this;
}
public CrudEditor<M> addTextbox(String name, String label)
{
addField(name, label, new TextBox() );
return this;
}
public CrudEditor<M> addTextarea(String name, String label)
{
TextArea t = new TextArea();
t.setVisibleLines( Crud.DEFAULT_TEXTAREA_LINES);
t.setCharacterWidth(Crud.DEFAULT_TEXTAREA_WIDTH);
addField(name, label, t);
return this;
}
/**
* Crud.DEFAULT_TEXTAREA_LINES / DEFAULT_TEXTAREA_WIDTH may be used here if necessary
*/
public CrudEditor<M> addTextarea(String name, String label, int width, int lineCount)
{
TextArea t = new TextArea();
t.setVisibleLines(lineCount);
t.setCharacterWidth(width);
//In the template, setting the cols on textarea doesn't seem to have any effect, so its
//necessary to set the width directly in order to make it wider:
t.getElement().getStyle().setWidth( width * 1.5, Style.Unit.PX );
addField(name, label, t );
return this;
}
public <T> CrudEditor<M> addBootstrapSwitch(String name, String label, BootstrapSwitch<T> bsSwitch)
{
FormField<T> field = FormFieldMaker.make(bsSwitch);
CrudFieldRenderer<FormField<T>> renderer = new CrudFieldRenderer<>(label, field);
renderer.setControlStyle("");
addField(name, field, renderer);
return this;
}
public CrudEditor<M> addDateTimePicker(String name, String label)
{
DateTimePicker picker = new DateTimePicker();
addField(name, label, picker);
return this;
}
public CrudEditor<M> addDatePicker(String name, String label)
{
DatePicker picker = new DatePicker();
addField(name, label, picker);
return this;
}
public <T extends HasId> EditsItem<M> addSelect(String name, String label, List<T> options)
{
UiSelect<T> select = new UiSelect<>();
select.addItems(options);
addField(name, label, select);
return this;
}
public boolean isRendered()
{
return isRendered;
}
private CrudEditor<M> render()
{
for (Renders renderer : renderMap.values() )
{
if (renderer.isRendered() )
continue;
renderer.render();
container.add(renderer);
}
isRendered = true;
return this;
}
public String getValue(String name)
{
try
{
return (String) fields.get(name).getValue();
}
catch (Exception e)
{
return "";
}
}
public Long getLong(String name)
{
try
{
return (Long) fields.get(name).getValue();
}
catch (Exception e)
{
return Long.valueOf(0);
}
}
public Integer getInt(String name)
{
try
{
return (Integer) fields.get(name).getValue();
}
catch (Exception e)
{
return Integer.valueOf(0);
}
}
public <T> T getValue(String name, Class<T> type)
{
try
{
return (T) fields.get(name).getValue();
}
catch (Exception e)
{
return null;
}
}
@Override
public EditsItem<M> add()
{
render();
return this;
}
@Override
public EditsItem<M> edit(long id)
{
render();
return this;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment