You Need a proper KeyProvider for ValueListBox EntityProxyKeyProvider
  ----- Original Message ----- 
  From: Christien Lomax 
  To: [email protected] 
  Sent: Tuesday, April 12, 2011 6:59 PM
  Subject: How to use a ValueListBox with RequestFactory & Editor?


  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>


  -- 
  You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
  To post to this group, send email to [email protected].
  To unsubscribe from this group, send email to 
[email protected].
  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

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

Reply via email to