How to use a ValueListBox with RequestFactory & Editor?

678 views
Skip to first unread message

Christien Lomax

unread,
Apr 12, 2011, 12:59:21 PM4/12/11
to google-we...@googlegroups.com
I can't seem to find a single example of how to integrate a ListBox or ValueListBox with an Editor.

I've put an VLB in my editor, and it sets the value, but if I add any values to the VLB, it just tacks them onto the end (So I'll have two of the same items in the list, one added by the editor, and the other added by me when I add the VLB's acceptableValues.)

A UI has a list of "MyProxy" (which is a Thing), when a user clicks on a "thing", the editor is shown (via the workflow).  The
item is retrieved and shown in the editor.  The editor needs to load the list of MySubProxy (SubThings) and set the selected item as provided by the MyProxy (Thing) object.

Instead, the edit correctly sets all teh values, but appends the acceptable values (List<MySubProxy>) to the list which already contains the value set by the MyProxy object.

Does anyone have an example of this working that they can share, or can you point out what I'm doing wrong (code below)?

eg: (obviously, I've changes the names of the things to protect my organization's model.. and added "..." where code exists but is not needed for the example)

MyEditor.ui.xml
<ui:UiBinder ...>
  <g:TextBox ui:Field="name"/>
  <g:ValueListBox ui:field="mylist"/>
</ui:UiBinder>

MyEditor.java
public class MyEditor extends Composite implements Editor<IMyProxy>
{
  interface Binder extends UiBinder<Widget,
MyEditor>
  {
  }

  @UiField
  public TextBox name;
  @UiField(provided=true)
  public ValueListBox<
IMySubProxy> listBox = new ValueListBox<IMySubProxy>(new ProxyRenderer<IMySubProxy>(null)
  {
    @Override
    public String render(
IMySubProxy object)
    {
      return object == null ? null : object.getName();
    }
  });
   
  public
MyEditor ()
  {
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
    MyApp.getRequestFactory().myRequest().listThings(0, 10).fire(new Receiver<List<
IMySubProxy>>()
    {
      @Override
      public void onSuccess(List<
IMySubProxy> response)
      {
       
listBox.setAcceptableValues(response);
      }
    });
  }
}

IMyProxy.java
@ProxyFor(value = Thing.class, locator = MyThingGwtAdapter.class)
public interface IMyProxy extends EntityProxy
{
  abstract Long getKey();
  abstract String getName();
  abstract IMySubProxy getSubThing();
}

IMySubProxy.java
@ProxyFor(value = SubThing.class, locator = MySubThingGwtAdapter.class)
public interface IMySubProxy extends EntityProxy
{
  abstract Long getKey();
  abstract String getName();
}


MyWorkflow.java
public class MyWorkflow
{
  interface Binder extends UiBinder<DialogBox, MyWorkflow>
  {
    Binder BINDER = GWT.create(Binder.class);
  }
 
  interface Driver extends RequestFactoryEditorDriver<IMyProxy, MyEditor>
  {
  }
 
  public static void register(ECMEventBus eventBus, final MyRequestFactory requestFactory)
  {
    eventBus.addHandler(MyEditEvent.TYPE, new MyEditEvent.Handler()
    {
      public void startEdit(IMyProxy proxy, RequestContext requestContext)
      {
        new MyWorkflow(requestFactory, proxy).edit(requestContext);
      }
    });
  }
 
  @UiField
  DialogBox dialog;
 
  @UiField(provided = true)
  MyEditor editor;
 
  private Driver driver;
  private IMyProxy proxy;
  private final MyRequestFactory requestFactory;
 
  private MyWorkflow(MyRequestFactory requestFactory, IMyProxy proxy)
  {
    this.requestFactory = requestFactory;
    this.proxy = proxy;
    editor = new MyEditor();
    Binder.BINDER.createAndBindUi(this);
  }
 
  @UiHandler("cancel")
  void onCancel(ClickEvent event)
  {
    dialog.hide();
  }
 
  @UiHandler("save")
  void onSave(ClickEvent event)
  {
    RequestContext context = driver.flush();
    if (driver.hasErrors())
    {
      dialog.setText("Errors detected locally");
      return;
    }
    context.fire(new Receiver<Void>()
    {
      ...
    });
  }
 
  private void edit(RequestContext requestContext)
  {
    driver = GWT.create(Driver.class);
    driver.initialize(requestFactory, editor);
    if (requestContext == null)
    {
      fetchAndEdit();
      return;
    }
    driver.edit(proxy, requestContext);
  }
 
  private void fetchAndEdit()
  {
    Request<IMyProxy> fetchRequest = requestFactory.find(proxy.stableId());
    fetchRequest.with(driver.getPaths());
    fetchRequest.to(new Receiver<IMyProxy>()
    {
      @Override
      public void onSuccess(IMyProxy proxy)
      {
        MyWorkflow.this.proxy = proxy;
        IThingRequest context = requestFactory.thingRequest();
        edit(context);
        context.saveThing(proxy);
      }
    }).fire();
  }
}


MyWorkflow.ui.xml
<ui:UiBinder ...>
    <g:DialogBox ui:field="dialog" modal="true">
        <g:caption>a caption</g:caption>
        <g:HTMLPanel ui:field="contents">
            <dt:MyEditor ui:field="editor" />
            <div>
                <g:Button ui:field="cancel">Cancel</g:Button>
                <g:Button ui:field="save">Save</g:Button>
            </div>
        </g:HTMLPanel>
    </g:DialogBox>
</ui:UiBinder>

Ahingsaka

unread,
Apr 13, 2011, 9:34:29 AM4/13/11
to Google Web Toolkit
You have to instanciate your ValueListBox with the second parameter
"ProvidesKey" and implement the getKey() method.
Your code should look something like this :

@UiField(provided = true)
public ValueListBox<IMySubProxy> listBox = new
ValueListBox<IMySubProxy>(new ProxyRenderer<IMySubProxy>(null) {
@Override
public String render(IMySubProxy object) {
return object == null ? null : object.getName();
}

}, new SimpleKeyProvider<IMySubProxy>() {

@Override
public Object getKey(IMySubProxy item) {
return item == null ? null : object.getName();
}
});




On 12 avr, 18:59, Christien Lomax <thecatwhispe...@gmail.com> wrote:
> I can't seem to find a single example of how to integrate a ListBox or
> ValueListBox with an Editor.
>
> I've put an VLB in my editor, and it sets the value, but if I add any values
> to the VLB, it just tacks them onto the end (So I'll have two of the same
> items in the list, one added by the editor, and the other added by me when I
> add the VLB's acceptableValues.)
>
> A UI has a list of "MyProxy" (which is a Thing), when a user clicks on a
> "thing", the editor is shown (via the workflow).  The
> item is retrieved and shown in the editor.  The editor needs to load the
> list of MySubProxy (SubThings) and set the selected item as provided by the
> MyProxy (Thing) object.
>
> Instead, the edit correctly sets all teh values, but appends the acceptable
> values (List<MySubProxy>) to the list which already contains the value set
> by the MyProxy object.
>
> Does anyone have an example of this working that they can share, or can you
> point out what I'm doing wrong (code below)?
>
> eg: (obviously, I've changes the names of the things to protect my
> organization's model.. and added "..." where code exists but is not needed
> for the example)
>
> *MyEditor.ui.xml*
> <ui:UiBinder ...>
>   <g:TextBox ui:Field="name"/>
>   <g:ValueListBox ui:field="mylist"/>
> </ui:UiBinder>
>
> *MyEditor.java*
> public class MyEditor extends Composite implements Editor<IMyProxy>
> {
>   interface Binder extends UiBinder<Widget, MyEditor>
>   {
>   }
>
>   @UiField
>   public TextBox name;
>   @UiField(provided=true)
>   public ValueListBox<IMySubProxy> listBox = new ValueListBox<IMySubProxy>(
> new ProxyRenderer<IMySubProxy>(null)
>   {
>     @Override
>     public String render(IMySubProxy object)
>     {
>       return object == null ? null : object.getName();
>     }
>   });
>
>   public MyEditor ()
>   {
>     initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
>     MyApp.getRequestFactory().myRequest().listThings(0, 10).fire(new
> Receiver<List<IMySubProxy>>()
>     {
>       @Override
>       public void onSuccess(List<IMySubProxy> response)
>       {
>         listBox.setAcceptableValues(response);
>       }
>     });
>   }
>
> }
>
> *IMyProxy.java*
> @ProxyFor(value = Thing.class, locator = MyThingGwtAdapter.class)
> public interface IMyProxy extends EntityProxy
> {
>   abstract Long getKey();
>   abstract String getName();
>   abstract IMySubProxy getSubThing();
>
> }
>
> *IMySubProxy.java*
> @ProxyFor(value = SubThing.class, locator = MySubThingGwtAdapter.class)
> public interface IMySubProxy extends EntityProxy
> {
>   abstract Long getKey();
>   abstract String getName();
>
> }
>
> *MyWorkflow.java*
> *MyWorkflow.ui.xml*

Metronome & Basic

unread,
Apr 13, 2011, 11:53:42 AM4/13/11
to google-we...@googlegroups.com
You Need a proper KeyProvider for ValueListBox EntityProxyKeyProvider
MyWorkflow.ui..xml

<ui:UiBinder ...>
    <g:DialogBox ui:field="dialog" modal="true">
        <g:caption>a caption</g:caption>
        <g:HTMLPanel ui:field="contents">
            <dt:MyEditor ui:field="editor" />
            <div>
                <g:Button ui:field="cancel">Cancel</g:Button>
                <g:Button ui:field="save">Save</g:Button>
            </div>
        </g:HTMLPanel>
    </g:DialogBox>
</ui:UiBinder>

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-we...@googlegroups.com.
To unsubscribe from this group, send email to google-web-tool...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.



Aucun virus trouvé dans ce message.
Analyse effectuée par AVG - www.avg.fr
Version: 10.0.1209 / Base de données virale: 1500/3568 - Date: 12/04/2011

Reply all
Reply to author
Forward
0 new messages