private void init() { // The AsyncBeanManager API works in both synchronous and asynchronous IOC mode AsyncBeanManager bm = IOC.getAsyncBeanManager(); // In the case that this method is executed before the first call has successfully processed all // of its callbacks, we must cancel those uncompleted callbacks in flight to prevent duplicate // data in the ListWidget. for (WidgetCreationalCallback callback : callbacks) { callback.discard(); } callbacks.clear(); pendingCallbacks = 0; // clean up the old widgets before we add new ones (this will eventually become a feature of the // framework: ERRAI-375) Iterator<Widget> it = panel.iterator(); while (it.hasNext()) { bm.destroyBean(it.next()); it.remove(); } if (items == null) return; pendingCallbacks = items.size(); AsyncBeanDef<W> itemBeanDef = bm.lookupBean(getItemWidgetType()); for (final M item : items) { final WidgetCreationalCallback callback = new WidgetCreationalCallback(item); callbacks.add(callback); itemBeanDef.newInstance(callback); } }
private void addWidget(final M m) { // This call is always synchronous, since the list can only be manipulated after // onItemsRendered was called. At that point the code of a potential split point must have // already been downloaded. AsyncBeanDef<W> itemBeanDef = IOC.getAsyncBeanManager().lookupBean(getItemWidgetType()); itemBeanDef.getInstance( new CreationalCallback<W>() { @Override public void callback(W widget) { widget.setModel(m); panel.add(widget); } }); }