package fr.lteconsulting.hexa.client.ui.tree;
import java.util.ArrayList;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import fr.lteconsulting.hexa.client.comm.HexaFramework;
import fr.lteconsulting.hexa.client.common.Pair;
import fr.lteconsulting.hexa.client.css.HexaCss;
import fr.lteconsulting.hexa.client.tools.HTMLStream;
import fr.lteconsulting.hexa.client.ui.widget.ImageButton;
import fr.lteconsulting.hexa.client.ui.widget.ListBoxDiscrete;
public class NodeWidget<NODE_DATA, LEAF_DATA> extends NodeWidgetBase<NODE_DATA, LEAF_DATA>
{
public interface INodeWidgetFactory<NODE_DATA, LEAF_DATA>
{
NodeWidget<NODE_DATA, LEAF_DATA> create();
}
interface Css extends HexaCss
{
static final Css CSS = GWT.create( Css.class );
String main();
}
ArrayList<Pair<NODE_DATA, String>> operators;
HTMLStream stream = new HTMLStream();
VerticalPanel panel = new VerticalPanel();
HorizontalPanel buttonBar = new HorizontalPanel();
ImageButton add = new ImageButton( HexaFramework.images.ellipsis(), "Add a new condition" );
ImageButton delete = new ImageButton( HexaFramework.images.delete(), "Delete from parent" );
ListBoxDiscrete<NODE_DATA> opsLb = new ListBoxDiscrete<NODE_DATA>( HexaFramework.images.dropdown(), HexaFramework.images.dropdown() );
INodeWidgetFactory<NODE_DATA, LEAF_DATA> nodeFactory;
public void addButton( Widget w )
{
w.getElement().getStyle().setDisplay( Display.NONE );
buttonBar.add( w );
}
public NodeWidget( ArrayList<Pair<NODE_DATA, String>> operators, XNodeWidget<NODE_DATA, LEAF_DATA> callback, INodeWidgetFactory<NODE_DATA, LEAF_DATA> nodeFactory, boolean fReadOnly )
{
super( callback );
this.nodeFactory = nodeFactory;
this.operators = operators;
boolean selected = false;
for( Pair<NODE_DATA, String> op : operators )
{
opsLb.addItem( op.last, op.first );
if( !selected )
opsLb.setSelected( op.first );
selected = true;
}
opsLb.setEnabled( !fReadOnly );
// build ui
stream.addInline( opsLb );
if( !fReadOnly )
stream.addRight( delete ).clFl();
stream.addDown( panel );
buttonBar.add( add );
if( !fReadOnly )
stream.addDown( buttonBar );
stream.setStylePrimaryName( Css.CSS.main() );
initWidget( stream );
updateUI();
add.addMouseOverHandler( new MouseOverHandler()
{
@Override
public void onMouseOver( MouseOverEvent event )
{
add.setResource( HexaFramework.images.add() );
int nb = buttonBar.getWidgetCount();
for( int i = 0; i < nb; i++ )
{
Widget w = buttonBar.getWidget( i );
if( w != add )
w.getElement().getStyle().clearDisplay();
}
}
} );
buttonBar.addDomHandler( new MouseOutHandler()
{
@Override
public void onMouseOut( MouseOutEvent event )
{
add.setResource( HexaFramework.images.ellipsis() );
int nb = buttonBar.getWidgetCount();
for( int i = 0; i < nb; i++ )
{
Widget w = buttonBar.getWidget( i );
if( w != add )
w.getElement().getStyle().setDisplay( Display.NONE );
}
}
}, MouseOutEvent.getType() );
delete.addClickHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
if( parent != null )
{
NodeWidget.this.callback.onWantDelete( parent, NodeWidget.this, delete );
// parent.removeChild( NodeWidget.this );
}
}
} );
add.addClickHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
beginNewChildProcess( add );
}
} );
}
public NodeWidget( boolean vue, ArrayList<Pair<NODE_DATA, String>> operators, XNodeWidget<NODE_DATA, LEAF_DATA> callback, INodeWidgetFactory<NODE_DATA, LEAF_DATA> nodeFactory )
{
super( callback );
this.nodeFactory = nodeFactory;
this.operators = operators;
boolean selected = false;
for( Pair<NODE_DATA, String> op : operators )
{
opsLb.addItem( op.last, op.first );
if( !selected )
opsLb.setSelected( op.first );
selected = true;
}
// build ui
stream.addInline( opsLb );
stream.addDown( panel );
stream.setStylePrimaryName( Css.CSS.main() );
initWidget( stream );
updateUI();
delete.setVisible( false );
add.setVisible( false );
}
@Override
public void setData( NODE_DATA data )
{
opsLb.setSelected( data );
}
@Override
public NODE_DATA getData()
{
return opsLb.getSelected();
}
@Override
public INodeWidget<NODE_DATA, LEAF_DATA> createEmptyNode()
{
return nodeFactory.create();
// return new NodeWidget<NODE_DATA, LEAF_DATA>( operators, callback );
}
private void updateUI()
{
if( children.size() < 2 )
{
panel.getElement().getStyle().setPaddingLeft( 0, Unit.PX );
opsLb.getElement().getStyle().setDisplay( Display.NONE );
delete.getElement().getStyle().setDisplay( Display.NONE );
}
else
{
panel.getElement().getStyle().setPaddingLeft( 10, Unit.PX );
opsLb.getElement().getStyle().setDisplay( Display.INLINE_BLOCK );
delete.getElement().getStyle().setDisplay( Display.INLINE_BLOCK );
}
}
@Override
void addChildWidget( IsWidget isWidget )
{
panel.add( isWidget );
updateUI();
}
@Override
void removeChildWidget( IsWidget isWidget )
{
panel.remove( isWidget );
updateUI();
}
@Override
void replaceChildWidget( IsWidget oldIsWidget, IsWidget newIsWidget )
{
int idx = panel.getWidgetIndex( oldIsWidget );
panel.remove( idx );
panel.insert( newIsWidget, idx );
}
}