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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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++); } }
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.
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
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
Partager