package fr.lteconsulting.hexa.client.ui.treetable; import java.util.HashMap; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Widget; import fr.lteconsulting.hexa.client.comm.HexaFramework; import fr.lteconsulting.hexa.client.interfaces.IAsyncCallback; import fr.lteconsulting.hexa.client.interfaces.IHasIntegerId; import fr.lteconsulting.hexa.client.tableobserver.XTableListen; import fr.lteconsulting.hexa.client.ui.miracle.Printer; import fr.lteconsulting.hexa.client.ui.tools.ColumnsSet; import fr.lteconsulting.hexa.client.ui.tools.IColumn; import fr.lteconsulting.hexa.client.ui.tools.IEditor; import fr.lteconsulting.hexa.client.ui.treetable.TreeTableEditorManager.TreeTableEditorManagerCallback; import fr.lteconsulting.hexa.client.ui.treetable.TreeTableElemMng.TreeTableElemMngCallback; import fr.lteconsulting.hexa.client.ui.widget.ImageButton; import fr.lteconsulting.hexa.client.ui.widget.ImageTextButton; public abstract class TreeTableCollectionMng<T extends IHasIntegerId> implements IAsyncCallback<List<T>>, TreeTableElemMngCallback<T>, TreeTableEditorManagerCallback, ClickHandler { //@Deprecated public abstract void reload(); public abstract void onWantAdd(); public abstract void onWantDelete( T record ); public abstract void initColumns( ColumnsSet<T> columns ); @SuppressWarnings( "unused" ) private String addButtonTitle; @SuppressWarnings( "unused" ) private String deleteButtonTitle; private final TreeTable table = new TreeTable( HexaFramework.images != null ? HexaFramework.images.treeMinus() : null, HexaFramework.images != null ? HexaFramework.images.treePlus() : null ); private final TreeTableElemMng<T> tableMng = new TreeTableElemMng<T>( table, this ); private final ColumnsSet<T> columns = new ColumnsSet<T>(); private final TreeTableEditorManager tableEd = new TreeTableEditorManager(); HashMap<Row, T> records = new HashMap<Row, T>(); ImageTextButton addButton; public TreeTableCollectionMng() { this( null, null ); } public TreeTableCollectionMng( String addButtonTitle, final String deleteButtonTitle ) { this.addButtonTitle = addButtonTitle; this.deleteButtonTitle = deleteButtonTitle; if( addButtonTitle != null ) { addButton = new ImageTextButton( HexaFramework.images != null ? HexaFramework.images.add() : null, addButtonTitle ); addButton.addClickHandler( this ); } initColumns( columns ); if( deleteButtonTitle != null ) { columns.addColumn( new IColumn<T>() { @Override public void fillCell( Printer printer, final T record ) { ImageButton im = new ImageButton( HexaFramework.images.delete(), deleteButtonTitle ); im.addClickHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { onWantDelete( record ); } } ); printer.setWidget( im ); } @Override public String getTitle() { return "Delete"; } @Override public IEditor editCell( T record ) { return null; } } ); } columns.setHeaders( table ); tableEd.setTable( table, this ); } public TreeTable getTable() { return table; } public Widget getAddButton() { return addButton; } public void addOrUpdateElemInCurrentVersion( T elem ) { Row item = tableMng.addOrUpdateItemInCurrentVersion( elem, null ); records.put( item, elem ); columns.fillRow( item, elem ); } public void deleteElemInCurrentVersion( T elem ) { tableMng.deleteItemInCurrentVersion( elem, table ); } @Override public final int getElementIdentifier( T record ) { return record.getId(); } @Override public void onSuccess( List<T> result ) { records.clear(); for( T c : result ) addElem( c ); tableMng.commitVersion(); } private final XTableListen<T> dataPlug = new XTableListen<T>() { @Override public void deleted( int recordId, T oldRecord ) { remElem( recordId ); } @Override public void updated( T record ) { addElem( record ); } @Override public void updatedField( String fieldName, T record ) { addElem( record ); } @Override public void wholeTable( Iterable<T> data ) { records.clear(); for( T c : data ) addElem( c ); tableMng.commitVersion(); } @Override public void clearAll() { records.clear(); tableMng.commitVersion(); } }; public XTableListen<T> getDataPlug() { return dataPlug; }; private void addElem( T elem ) { Row item = tableMng.getItem( elem, null ); records.put( item, elem ); columns.fillRow( item, elem ); } private void remElem( int elemId ) { Row item = tableMng.remove( elemId ); records.remove( item ); } @Override public IEditor editCell( Row row, int column ) { T record = records.get( row ); return columns.editCell( column, record ); } @Override public void onTouchCellContent( Row row, int column ) { T record = records.get( row ); if( record == null ) { GWT.log( "NULL RECORD IN TreeTableCollectionMng for onTouchCellContent", null ); row.setText( column, "EMPTY" ); return; } columns.fillCell( column, row, record ); } @Override public void onClick( ClickEvent event ) { onWantAdd(); } }