package com.akjava.gwt.lib.client.widget.cell;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.Converter;
import com.google.common.base.Objects;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
public abstract class ListEditorGenerator<T> {
private EasyCellTableObjects<T> easyCells;
public EasyCellTableObjects<T> getEasyCells() {
return easyCells;
}
private Button updateButton;
private Button newButton;
private Button removeButton;
private Button addButton;
private Label infoLabel;
public VerticalPanel generatePanel(final SimpleCellTable<T> cellTable,final Converter<List<T>,String> converter,final Editor<T> editor,@SuppressWarnings("rawtypes") final SimpleBeanEditorDriver driver,Map<String,String> labelMaps,final ValueControler valueControler){
//check nulls
final SimpleBeanEditorDriver<T,Editor<? super T>> castdriver=driver;
if(labelMaps==null){
labelMaps=new HashMap<String, String>();
}
VerticalPanel panel=new VerticalPanel();
panel.add(cellTable);
easyCells = new EasyCellTableObjects<T>(cellTable
) {
@Override
public void onSelect(T selection) {
if(selection!=null){
castdriver.edit(selection);
//baseFormantEditor.setVisible(true);
updateButton.setEnabled(true);
removeButton.setEnabled(true);
newButton.setEnabled(true);
addButton.setEnabled(false);
onEditMode();
}else{
//baseFormantEditor.setVisible(false);
updateButton.setEnabled(false);
removeButton.setEnabled(false);
newButton.setEnabled(false);
addButton.setEnabled(true);
onAddMode();
}
}
};
castdriver.initialize(editor);
castdriver.edit(createNewData());
//some case no need value store
if(valueControler!=null){
String baseText=valueControler.getValue();
//some case no need convert
if(converter!=null){
easyCells.setDatas(converter.reverse().convert(baseText));
easyCells.update();
}
}
HorizontalPanel buttons=new HorizontalPanel();
buttons.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
panel.add(buttons);
newButton = new Button(Objects.firstNonNull(labelMaps.get("new"),"New"),new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
easyCells.unselect();
castdriver.edit(createNewData());
}
});
buttons.add(newButton);
newButton.setEnabled(false);
addButton = new Button(Objects.firstNonNull(labelMaps.get("add"),"Add"),new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
T data=castdriver.flush();
easyCells.addItem(data);
castdriver.edit(createNewData());
updateValue(converter,valueControler,easyCells.getDatas());
}
});
buttons.add(addButton);
addButton.setEnabled(true);
updateButton = new Button(Objects.firstNonNull(labelMaps.get("update"),"Update"),new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
driver.flush();
easyCells.update(true);
updateValue(converter,valueControler,easyCells.getDatas());
}
});
updateButton.setEnabled(false);
buttons.add(updateButton);
removeButton = new Button(Objects.firstNonNull(labelMaps.get("remove"),"Remove"),new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(easyCells.getSelection()!=null){
easyCells.removeItem(easyCells.getSelection());
castdriver.edit(createNewData());
updateValue(converter,valueControler,easyCells.getDatas());
}
}
});
buttons.add(removeButton);
removeButton.setEnabled(false);
infoLabel = new Label();
infoLabel.setStylePrimaryName("listedit_infolabel");
buttons.add(infoLabel);
//panel.add(editor);
//add editor by yourself
return panel;
}
private void updateValue(final Converter<List<T>,String> converter,final ValueControler valueControler,List<T> values){
if(converter!=null && valueControler!=null){
valueControler.setValue(converter.convert(values));
}
onUpdateData();
}
/**
* for enable/disable outside buttons
*/
public void onUpdateData(){
}
public void onEditMode(){
infoLabel.setText("Editing selection");
}
public void onAddMode(){
infoLabel.setText("");
}
//should i move to ?
public abstract T createNewData();
/**
* need when data load or store usually use for html5 storage
* @author aki
*
*/
public static interface ValueControler{
public void setValue(String value);
public String getValue();
}
}