package fr.lteconsulting.hexa.client.ui.tree;
import java.util.ArrayList;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.UIObject;
public abstract class NodeWidgetBase<NODE_DATA, LEAF_DATA> extends Composite implements INodeWidget<NODE_DATA, LEAF_DATA>
{
NODE_DATA data = null;
XNodeWidget<NODE_DATA, LEAF_DATA> callback;
INodeWidget<NODE_DATA, LEAF_DATA> parent;
ArrayList<TreeWidget<NODE_DATA, LEAF_DATA>> children = new ArrayList<TreeWidget<NODE_DATA, LEAF_DATA>>();
abstract void addChildWidget( IsWidget isWidget );
abstract void removeChildWidget( IsWidget isWidget );
abstract void replaceChildWidget( IsWidget oldIsWidget, IsWidget newIsWidget );
public NodeWidgetBase( XNodeWidget<NODE_DATA, LEAF_DATA> callback )
{
this.callback = callback;
}
public ArrayList<TreeWidget<NODE_DATA, LEAF_DATA>> getChildren()
{
return children;
}
public void beginNewChildProcess( UIObject uiObject )
{
callback.onWantAdd( this, uiObject );
}
public void addChild( TreeWidget<NODE_DATA, LEAF_DATA> treeWidget )
{
children.add( treeWidget );
treeWidget.setParent( this );
addChildWidget( treeWidget );
}
public void removeChild( TreeWidget<NODE_DATA, LEAF_DATA> child )
{
children.remove( child );
child.setParent( null );
if( children.size() == 0 && parent != null )
{
parent.removeChild( this );
removeChildWidget( child );
return;
}
// we have only one children, so we are of no use
if( children.size() == 1 && parent != null )
{
parent.replaceChild( this, children.get( 0 ) );
removeChildWidget( child );
return;
}
removeChildWidget( child );
}
public void replaceChild( TreeWidget<NODE_DATA, LEAF_DATA> child, TreeWidget<NODE_DATA, LEAF_DATA> newChild )
{
int curIdx = children.indexOf( child );
children.set( curIdx, newChild );
child.setParent( null );
newChild.setParent( this );
replaceChildWidget( child, newChild );
}
public void setParent( INodeWidget<NODE_DATA, LEAF_DATA> parent )
{
this.parent = parent;
}
public ILeafWidget<NODE_DATA, LEAF_DATA> isLeaf()
{
return null;
}
public INodeWidget<NODE_DATA, LEAF_DATA> isNode()
{
return this;
}
@Override
public void childWantsAdd( UIObject uiObject )
{
callback.onWantAdd( this, uiObject );
}
public void setData( NODE_DATA data )
{
this.data = data;
}
public NODE_DATA getData()
{
return data;
}
}