[CellTree] Effacer le dernier élément d'une CellTree
Apres multiple essaie je n'ai pas trouve de solution a mon probleme avec le CellTree. La version de GWT: 2.3
Voici un code simplifier de mon model.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
public class CellTreeModel implements TreeViewModel {
private ListDataProvider<String> listDataProvider = new ListDataProvider<String>();
private static int TEST_NUMBER = 0;
public CellTreeModel() {
listDataProvider.setList(new ArrayList<String>());
add();
add();
add();
add();
}
@Override
public <T> NodeInfo<?> getNodeInfo(T value) {
if (value == null) {
List<HasCell<String, ?>> hasCells = new ArrayList<HasCell<String, ?>>();
hasCells.add(new HasCell<String, String>() {
@Override
public Cell<String> getCell() {
return new ButtonCell();
}
@Override
public FieldUpdater<String, String> getFieldUpdater() {
return new FieldUpdater<String, String>() {
@Override
public void update(int index, final String text, String value) {
delete(text);
}
};
}
@Override
public String getValue(String node) {
return "DELETE";
}
});
hasCells.add(new HasCell<String, String>() {
TextCell linkData = new TextCell();
@Override
public Cell<String> getCell() {
return linkData;
}
@Override
public FieldUpdater<String, String> getFieldUpdater() {
return null;
}
@Override
public String getValue(String text) {
return text;
}
});
return new DefaultNodeInfo<String>(listDataProvider, new CompositeCell(hasCells));
}
return null;
}
@Override
public boolean isLeaf(Object value) {
return value instanceof String;
}
public void delete(final String text) {
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
if (text != null && listDataProvider.getList().contains(text)) {
listDataProvider.getList().remove(text);
}
listDataProvider.refresh();
}
});
}
public void add() {
listDataProvider.getList().add("TEST" + TEST_NUMBER++);
}
} |
Ce model va gérer le dataProvider, dans ce cas si il n'y a qu'un seul niveau constituer d'un TextCell (TESTx) et d'un ButtonCell qui va effacer le niveau courant.
Sous Chrome et FF, ceci fonctionne parfaitement. Malheureusement sous IE8 ceci génère une exception (JavaScriptException) dans le cas ou on efface le dernier element du niveau.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
ERROR: Uncaught exception escaped. com.google.gwt.core.client.JavaScriptException: (TypeError): 'firstChild' is null or not an object
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:237)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:132)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.dom.client.DOMImpl.getFirstChildElement(DOMImpl.java)
at com.google.gwt.dom.client.Element$.getFirstChildElement$(Element.java:241)
at com.google.gwt.user.cellview.client.CellTreeNodeView.getCellParent(CellTreeNodeView.java:665)
at com.google.gwt.user.cellview.client.CellTreeNodeView.getCellParent(CellTreeNodeView.java:1044)
at com.google.gwt.user.cellview.client.CellTreeNodeView.setKeyboardSelected(CellTreeNodeView.java:1239)
at com.google.gwt.user.cellview.client.CellTree.keyboardSelect(CellTree.java:867)
at com.google.gwt.user.cellview.client.CellTreeNodeView$NodeCellList$View.loadChildState(CellTreeNodeView.java:345)
at com.google.gwt.user.cellview.client.CellTreeNodeView$NodeCellList$View.replaceAllChildren(CellTreeNodeView.java:215)
at com.google.gwt.user.cellview.client.HasDataPresenter.resolvePendingState(HasDataPresenter.java:1360)
at com.google.gwt.user.cellview.client.HasDataPresenter.access$3(HasDataPresenter.java:1117)
at com.google.gwt.user.cellview.client.HasDataPresenter$2.execute(HasDataPresenter.java:1042)
at com.google.gwt.core.client.impl.SchedulerImpl$Task$.executeScheduled$(SchedulerImpl.java:50)
at com.google.gwt.core.client.impl.SchedulerImpl.runScheduledTasks(SchedulerImpl.java:229)
at com.google.gwt.core.client.impl.SchedulerImpl.flushFinallyCommands(SchedulerImpl.java:328)
at com.google.gwt.core.client.impl.Impl.exit(Impl.java:238)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:229)
at sun.reflect.GeneratedMethodAccessor165.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:167)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
at java.lang.Thread.run(Thread.java:662) |
J'ai déjà ouvert un ticket sur http://code.google.com/p/google-web-...detail?id=6677, malheureusement ils ne semblent pas s'y intéresser :calim2:
Si qq'un a déjà été confronté a ce soucis et a trouvé une solution, je suis preneur. Ou si qq'un voit dans ce code une erreur de conception, je suis preneur aussi de toute suggestion.
Merci