Thank you Thomas, The column gave me opportunity to easily ~cheat, to make it work without rewriting whole Cell classes( private members)
Your problem is that you're not calling the cell's render() when the value > is null (in this case, getValue() is not called so your default value is > not really needed), so when the CellTable tries to set the focus back to > the cell by calling the Column's Cell's resetFocus, the Cell (an > EditTextCell here) doesn't find back its element (because it looks at > something that it didn't generate) and ends up calling focus() on the wrong > object. > Thanks for that! (default value was used as initial value for DatePickerCell when real value is null, also was used to show InputField if text value was null). As I wrote, this solution works fine without SingleSelectionModel. But I agree that probably best would be to fork Cells and code desired behaviour but with my current GWT knowledge- it shurely wouldn't be contributed as patch :D. As a temporary solution I switched to CellList with DateBox but it isn't even half pretty as CellTable so... I have to go deeper into Cells internals. PS. Sorry for delay, I wasn't notified abt. your reply W dniu piątek, 30 listopada 2012 12:07:08 UTC+1 użytkownik Thomas Broyer napisał: > > > > On Thursday, November 29, 2012 1:54:38 PM UTC+1, Piotr Kopeć wrote: >> >> Hi All >> As workaround for editing NULL values in CellTable i've extended Column >> > > Why? That's the job of cells, not columns. If a cell doesn't allow editing > a 'null', then extend/fork that cell instead; or give it a non-null value. > This is exactly what the workarounds at > https://code.google.com/p/google-web-toolkit/issues/detail?id=5791 are > doing. > > >> All works nice till use of SingleSelectionModel >> With selection model editing null values goes random, some values can be >> edited, some not, after few tries selection model stops responding >> Related exception stack trace below: >> >> [ERROR] com.google.gwt.core.client.JavaScriptException: (TypeError) >>> @com.google.gwt.dom.client.Element::focus()([]): this.focus is not a >>> function >>> [ERROR] at >>> com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:249) >>> [ERROR] at >>> com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136) >>> [ERROR] at >>> com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:570) >>> [ERROR] at >>> com.google.gwt.dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:298) >>> [ERROR] at >>> com.google.gwt.dev.shell.JavaScriptHost.invokeNativeVoid(JavaScriptHost.java:107) >>> [ERROR] at com.google.gwt.dom.client.Element$.focus$(Element.java) >>> [ERROR] at >>> com.google.gwt.cell.client.EditTextCell.resetFocus(EditTextCell.java:240) >>> [ERROR] at >>> com.google.gwt.cell.client.EditTextCell.resetFocus(EditTextCell.java:1) >>> >> > >> [ERROR] at >>> com.google.gwt.user.cellview.client.AbstractCellTable.resetFocusOnCellImpl(AbstractCellTable.java:2575) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.AbstractCellTable.resetFocusOnCell(AbstractCellTable.java:2193) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.AbstractHasData$View$1.execute(AbstractHasData.java:290) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.CellBasedWidgetImpl.resetFocus(CellBasedWidgetImpl.java:102) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.AbstractHasData$View.resetFocus(AbstractHasData.java:287) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.HasDataPresenter.resolvePendingState(HasDataPresenter.java:1374) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.HasDataPresenter.access$3(HasDataPresenter.java:1062) >>> [ERROR] at >>> com.google.gwt.user.cellview.client.HasDataPresenter$2.execute(HasDataPresenter.java:984) >>> [ERROR] at >>> com.google.gwt.core.client.impl.SchedulerImpl$Task$.executeScheduled$(SchedulerImpl.java:50) >>> [ERROR] at >>> com.google.gwt.core.client.impl.SchedulerImpl.runScheduledTasks(SchedulerImpl.java:228) >>> [ERROR] at >>> com.google.gwt.core.client.impl.SchedulerImpl.flushFinallyCommands(SchedulerImpl.java:327) >>> [ERROR] at com.google.gwt.core.client.impl.Impl.exit(Impl.java:266) >>> [ERROR] at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:257) >>> [ERROR] at sun.reflect.GeneratedMethodAccessor286.invoke(Unknown >>> Source) >>> [ERROR] at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> [ERROR] at java.lang.reflect.Method.invoke(Method.java:601) >>> [ERROR] at >>> com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) >>> [ERROR] at >>> com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) >>> [ERROR] at >>> com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) >>> [ERROR] at >>> com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) >>> [ERROR] at >>> com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) >>> [ERROR] at >>> com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) >>> [ERROR] at java.lang.Thread.run(Thread.java:722) >>> >> >> Example class for reproducing exception below: >> >>> public class GwtBugTest0 { >>> >>> // Entity >>> class Man { >>> String name; >>> Date birth; >>> } >>> >>> // column that renders [NONE] for null and is updater, also gives >>> initial value for updater >>> abstract class NoneColumn<T, V> extends Column<T, V> implements >>> FieldUpdater<T, V> { >>> V def; >>> >>> public NoneColumn(Cell<V> cell, V def) { >>> super(cell); >>> this.def = def; >>> setFieldUpdater(this); >>> } >>> >>> @Override >>> public V getValue(T object) { >>> V ret = getRawValue(object); >>> return ret == null ? def : ret; >>> } >>> >>> @Override >>> public void render(Context context, T object, SafeHtmlBuilder >>> sb) { >>> if (getRawValue(object) == null) >>> sb.appendHtmlConstant("[NONE]"); >>> else >>> super.render(context, object, sb); >>> } >>> >> > Your problem is that you're not calling the cell's render() when the value > is null (in this case, getValue() is not called so your default value is > not really needed), so when the CellTable tries to set the focus back to > the cell by calling the Column's Cell's resetFocus, the Cell (an > EditTextCell here) doesn't find back its element (because it looks at > something that it didn't generate) and ends up calling focus() on the wrong > object. > > Remove that render() override, and instead move that code into your own > cell. Either extend EditTextCell or wrap it in your own cell, and handle > resetFocus accordingly. It might be easier to fork and patch EditTextcell > though (and contribute the patch back for inclusion in GWT proper) > -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/CLaVjfbHtrwJ. 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.
