package fr.lteconsulting.hexa.client.ui.treetable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import com.google.gwt.user.client.Timer; public class TreeTableElemMng<T> { public interface TreeTableElemMngCallback<T> { int getElementIdentifier( T element ); } TreeTableElemMngCallback<T> callback; HashMap<Integer, Row> elements = new HashMap<Integer, Row>(); HashMap<Integer, Integer> versions = new HashMap<Integer, Integer>(); int currentVersion = 0; ArrayList<Row> elementsAdded = new ArrayList<Row>(); ArrayList<Integer> elementsToRemove = new ArrayList<Integer>(); TreeTable table = null; Timer timer = new Timer() { @Override public void run() { if( elementsToRemove.size() > 0 ) { int toRemove = elementsToRemove.remove( 0 ); _remove( toRemove ); timer.schedule( 10 ); } } }; public TreeTableElemMng( TreeTable table, TreeTableElemMngCallback<T> callback ) { this.table = table; this.callback = callback; } public Row addOrUpdateItemInCurrentVersion( T element, Row parentItem ) { int identifier = callback.getElementIdentifier( element ); versions.put( identifier, currentVersion ); Row item = elements.get( identifier ); if( item != null ) return item; item = table.addRow( parentItem ); elements.put( identifier, item ); item.highLite(); return item; } public void deleteItemInCurrentVersion( T element, TreeTable table ) { int identifier = callback.getElementIdentifier( element ); versions.remove( identifier ); Row item = elements.get( identifier ); if( item == null ) return; item.remove(); } public Row getItem( T element, Row parentItem ) { int identifier = callback.getElementIdentifier( element ); versions.put( identifier, currentVersion + 1 ); Row item = elements.get( identifier ); if( item != null ) return item; item = table.addRow( parentItem ); elements.put( identifier, item ); elementsAdded.add( item ); return item; } public Row remove( T element ) { int identifier = callback.getElementIdentifier( element ); return _remove( identifier ); } public Row remove( int elementIdentifier ) { return _remove( elementIdentifier ); } public Row _remove( int identifier ) { versions.remove( identifier ); Row item = elements.get( identifier ); if( item == null ) return null; elements.remove( identifier ); item.remove(); return item; } public void commitVersion() { currentVersion++; boolean fRearm = false; for( Iterator<Entry<Integer, Integer>> it = versions.entrySet().iterator(); it.hasNext(); ) { Entry<Integer, Integer> entry = it.next(); if( entry.getValue() < currentVersion ) { fRearm = true; elementsToRemove.add( entry.getKey() ); } } if( fRearm || elementsAdded.size() > 0 ) timer.schedule( 10 ); } }