package fr.lteconsulting.hexa.client.ui.widget; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import fr.lteconsulting.hexa.client.comm.GenericJSO; import fr.lteconsulting.hexa.client.comm.HexaFramework; import fr.lteconsulting.hexa.client.tools.HierarchySet.IHierarchyLevel; import fr.lteconsulting.hexa.client.ui.Styles; import fr.lteconsulting.hexa.client.ui.dialog.MyPopupPanel; import fr.lteconsulting.hexa.client.ui.treetable.Row; import fr.lteconsulting.hexa.client.ui.treetable.TreeTable; import fr.lteconsulting.hexa.client.ui.treetable.event.TableCellClickEvent.TableCellClickHandler; public class HierarchyHeaderControl<T> extends Composite implements ClickHandler { public interface HierarchyHeaderControlCallback<T> { public void onHierarchyHeaderControlChange( List<IHierarchyLevel<T>> levels ); } HierarchyHeaderControlCallback<T> callback = null; HorizontalPanel currentListPanel = new HorizontalPanel(); ImageButton addLevel = null; ArrayList<IHierarchyLevel<T>> levels = new ArrayList<IHierarchyLevel<T>>(); ArrayList<IHierarchyLevel<T>> currentLevels = new ArrayList<IHierarchyLevel<T>>(); public HierarchyHeaderControl() { HorizontalPanel panel = new HorizontalPanel(); panel.add( currentListPanel ); addLevel = new ImageButton( HexaFramework.images.addPlus(), "Add a level to this hierachy" ); addLevel.addClickHandler( this ); panel.add( addLevel ); initWidget( panel ); addStyleName( Styles.CSS.commentPanel() ); } public void setCallback( HierarchyHeaderControlCallback<T> callback ) { this.callback = callback; } public void add( IHierarchyLevel<T> level ) { levels.add( level ); _RefreshAll(); } public void clearAll() { levels.clear(); currentLevels.clear(); addLevel.setVisible( true ); currentListPanel.clear(); _RefreshAll(); } public ArrayList<IHierarchyLevel<T>> getLevels() { return currentLevels; } public JSONValue getLevelsJson() { JSONArray arr = new JSONArray(); int i = 0; for( IHierarchyLevel<T> level : currentLevels ) { arr.set( i, new JSONString( level.getName() ) ); i++; } return arr; } private IHierarchyLevel<T> findLevelIndex( String name ) { for( int i = 0; i < levels.size(); i++ ) if( levels.get( i ).getName().equals( name ) ) return levels.get( i ); return null; } public void setLevelsString( GenericJSO jso ) { currentLevels.clear(); _RefreshAll(); JsArrayString levels = jso.getAsArrayOfString(); for( int i = 0; i < levels.length(); i++ ) { String levelName = levels.get( i ); IHierarchyLevel<T> level = findLevelIndex( levelName ); addLevel( level ); } } private void _RefreshAll() { currentListPanel.clear(); } @Override public void onClick( ClickEvent event ) { final MyPopupPanel popup = new MyPopupPanel( true, true ); popup.setStylePrimaryName( "ArnoPopupPanel" ); popup.showRelativeTo( addLevel ); TreeTable table = new TreeTable(); table.setHeader( 0, "Choose a level" ); for( int i = 0; i < levels.size(); i++ ) { if( currentLevels.contains( levels.get( i ) ) ) continue; Row item = table.addRow( null ); item.setText( 0, levels.get( i ).getName() ); item.setDataObject( levels.get( i ) ); } popup.setWidget( table ); table.addTableCellClickHandler( new TableCellClickHandler() { @Override public void onTableCellClick( Row item, int column, ClickEvent event ) { @SuppressWarnings( "unchecked" ) IHierarchyLevel<T> level = (IHierarchyLevel<T>) (item.getDataObject()); addLevel( level ); _signalChange(); popup.hide(); } } ); } private void addLevel( final IHierarchyLevel<T> level ) { if( level == null ) return; final ImageTextButton im = new ImageTextButton( HexaFramework.images.delete(), level.getName() ); im.addClickHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { _onLevelClick( level, im ); } } ); currentListPanel.add( im ); currentLevels.add( level ); if( currentLevels.size() == levels.size() ) addLevel.setVisible( false ); _signalChange(); } private void _onLevelClick( IHierarchyLevel<T> level, ImageTextButton button ) { addLevel.setVisible( true ); currentListPanel.remove( button ); currentLevels.remove( level ); _signalChange(); } private void _signalChange() { if( callback == null ) return; ArrayList<IHierarchyLevel<T>> cur = getLevels(); callback.onHierarchyHeaderControlChange( cur ); } }