package fr.lteconsulting.hexa.client.ui.search;
import java.util.Collection;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import fr.lteconsulting.hexa.client.ui.widget.ListBoxDiscrete;
public class CriteriaSwitch extends Composite implements ICriteriaWidget
{
public interface Resources
{
ImageResource dropdown();
}
interface DefaultResources extends Resources, ClientBundle
{
@Override
@Source( "images/dropdown.png" )
ImageResource dropdown();
}
private static Resources defaultResources = null;
private Resources resources = null;
public interface XCriteriaSwitch
{
boolean getIsInline( ICriteriaMng mng );
}
XCriteriaSwitch callback;
private boolean fReadOnly;
ListBoxDiscrete<ICriteriaMng> lb;
SimplePanel spotHorizontal = new SimplePanel();
SimplePanel spotVertical = new SimplePanel();
ICriteriaWidget iCriteria = null;
public CriteriaSwitch( Collection<ICriteriaMng> criteriaMngs, XCriteriaSwitch callback, Resources resources, boolean fReadOnly )
{
this.fReadOnly = fReadOnly;
if( resources == null )
{
if( defaultResources == null )
defaultResources = GWT.create( DefaultResources.class );
this.resources = defaultResources;
}
else
{
this.resources = resources;
}
lb = new ListBoxDiscrete<ICriteriaMng>( this.resources.dropdown(), this.resources.dropdown() );
this.callback = callback;
HorizontalPanel panel = new HorizontalPanel();
panel.add( lb );
panel.setCellWidth( lb, "150px" );
panel.add( spotHorizontal );
VerticalPanel v = new VerticalPanel();
v.add( panel );
v.add( spotVertical );
initWidget( v );
for( ICriteriaMng mng : criteriaMngs )
lb.addItem( mng.getDisplayName(), mng );
lb.addChangeHandler( new ChangeHandler()
{
@Override
public void onChange( ChangeEvent event )
{
onSelChange();
}
} );
}
@Override
public JSONValue getValue()
{
if( iCriteria == null )
return null;
return iCriteria.getValue();
}
@Override
public void setValue( JSONValue json )
{
if( iCriteria == null )
return;
iCriteria.setValue( json );
}
public void setCriteriaMng( ICriteriaMng mng )
{
lb.setSelected( mng );
updateCriteria( mng, null );
}
public void setCriteriaMng( ICriteriaMng mng, ICriteriaWidget widget )
{
lb.setSelected( mng );
iCriteria = widget;
boolean fIsInline = callback.getIsInline( mng );
(fIsInline ? spotHorizontal : spotVertical).setWidget( iCriteria.asWidget() );
(fIsInline ? spotVertical : spotHorizontal).clear();
}
// the selection box value has changed
void onSelChange()
{
ICriteriaMng sel = lb.getSelected();
updateCriteria( sel, null );
}
void updateCriteria( ICriteriaMng mng, JSONValue json )
{
if( mng == null )
{
iCriteria = null;
spotHorizontal.clear();
spotVertical.clear();
return;
}
iCriteria = mng.createCriteriaWidget( json, fReadOnly );
// get the alignment
boolean fIsInline = callback.getIsInline( mng );
(fIsInline ? spotHorizontal : spotVertical).setWidget( iCriteria.asWidget() );
(fIsInline ? spotVertical : spotHorizontal).clear();
}
}