Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » Re: NPE upon the invocation of a TableViewer's #setInput() method
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #2909] Mon, 11 May 2009 15:00 Go to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
We should discuss on the jface-group.

Tom

Tom Schindl schrieb:
> Hi,
>
> It looks like the problem is that there's no label provider assigned to
> teh column. Does your table has columns, could you shows us your
> BackupLabelProvider?
>
> Tom
>
> Lars Bischoff schrieb:
>> Hello all,
>>
>> I am struggling with setting the input for a tableviewer. The following
>> snippet shows the way I try to do it.
>>
>> ----- snip -----
>> tableViewer= new TableViewer(table);
>> tableViewer.setContentProvider(new BackupContentProvider());
>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>
>> Backup[] backups = backupController.getBackupModel().getBackups();
>> tableViewer.setUseHashlookup(true);
>> tableViewer.setInput(backups);
>> ----- snap -----
>>
>> The only way it works is if my backups-array is null. Otherwise, I keep
>> getting the following exception:
>>
>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>> !MESSAGE Problems occurred when invoking code from plug-in:
>> "org.eclipse.jface".
>> !STACK 0
>> java.lang.NullPointerException
>> at
>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>
>> at
>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>
>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>> at
>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>
>> at
>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>
>> at
>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>
>> at
>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>
>> at
>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>> at
>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>
>> at
>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>> at
>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>
>> at org.eclipse.jface.window.Window.create(Window.java:431)
>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>> at
>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>> at com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>> at
>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>
>> at
>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>
>> at
>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>
>> at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>> at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>> at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>> at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>> at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>> at
>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>
>> at
>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>> at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>> at com.mhr.mt.core.Application.start(Application.java:25)
>> at
>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>
>> at
>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>
>> at
>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>
>> at
>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>
>> at
>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>
>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>> at java.lang.reflect.Method.invoke(Unknown Source)
>> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>
>> My ContentProvider is a usual ArrayContentProvider, since the value
>> which is passed to the #setInput() method is an array. However, I also
>> customized it by overriding the #getElements() method as follows:
>>
>> ----- snip -----
>> @Override
>> public Object[] getElements(Object input) {
>> Backup[] backups = (Backup[]) input;
>> return backups;
>> }
>> ----- snap -----
>>
>> Unfortunately the exception is still there. I have no idea whatever may
>> cause this problem, since I use a similar way to populate a tree by
>> means of a TreeViewer.
>>
>> Best regards,
>> Lars
>>
>>
>>
>>
>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #2944 is a reply to message #2909] Mon, 11 May 2009 15:12 Go to previous messageGo to next message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
Hello,

Yes, after my post I recognized that it fits better into the jface-group
than the swt-group.

My LabelProvider looks like the following:

----- snip -----
public class BackupLabelProvider extends LabelProvider implements
ITableLabelProvider {

@Override
public Image getColumnImage(Object element, int columnIndex) {
Image image = Icons.getBackup();
switch(columnIndex) {
case 0:
return image;

case 1:
return null;

case 2:
return null;
}
return null;
}

@Override
public String getColumnText(Object element, int columnIndex) {
Backup backup = (Backup) element;
switch(columnIndex) {
case 0:
return backup.getName();

case 1:
return backup.getDate();

case 2:
return backup.getTime();
}
return null;
}

}
----- snip -----



Tom Schindl schrieb:
> We should discuss on the jface-group.
>
> Tom
>
> Tom Schindl schrieb:
>> Hi,
>>
>> It looks like the problem is that there's no label provider assigned to
>> teh column. Does your table has columns, could you shows us your
>> BackupLabelProvider?
>>
>> Tom
>>
>> Lars Bischoff schrieb:
>>> Hello all,
>>>
>>> I am struggling with setting the input for a tableviewer. The following
>>> snippet shows the way I try to do it.
>>>
>>> ----- snip -----
>>> tableViewer= new TableViewer(table);
>>> tableViewer.setContentProvider(new BackupContentProvider());
>>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>>
>>> Backup[] backups = backupController.getBackupModel().getBackups();
>>> tableViewer.setUseHashlookup(true);
>>> tableViewer.setInput(backups);
>>> ----- snap -----
>>>
>>> The only way it works is if my backups-array is null. Otherwise, I keep
>>> getting the following exception:
>>>
>>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>>> !MESSAGE Problems occurred when invoking code from plug-in:
>>> "org.eclipse.jface".
>>> !STACK 0
>>> java.lang.NullPointerException
>>> at
>>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>>
>>> at
>>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>>
>>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>>> at
>>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>>
>>> at
>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>>
>>> at
>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>>
>>> at
>>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>>
>>> at
>>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>>> at
>>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>>
>>> at
>>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>>> at
>>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>>
>>> at org.eclipse.jface.window.Window.create(Window.java:431)
>>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>>> at
>>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>>> at com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>>> at
>>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>>
>>> at
>>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>>
>>> at
>>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>>
>>> at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>>> at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>>> at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>>> at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>>> at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>>> at
>>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>>
>>> at
>>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>>> at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>>> at com.mhr.mt.core.Application.start(Application.java:25)
>>> at
>>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>>
>>> at
>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>>
>>> at
>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>>
>>> at
>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>>
>>> at
>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>>
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>>
>>> My ContentProvider is a usual ArrayContentProvider, since the value
>>> which is passed to the #setInput() method is an array. However, I also
>>> customized it by overriding the #getElements() method as follows:
>>>
>>> ----- snip -----
>>> @Override
>>> public Object[] getElements(Object input) {
>>> Backup[] backups = (Backup[]) input;
>>> return backups;
>>> }
>>> ----- snap -----
>>>
>>> Unfortunately the exception is still there. I have no idea whatever may
>>> cause this problem, since I use a similar way to populate a tree by
>>> means of a TreeViewer.
>>>
>>> Best regards,
>>> Lars
>>>
>>>
>>>
>>>
>>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #2960 is a reply to message #2944] Mon, 11 May 2009 15:16 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi,

And where do you create the TableColumns? I guess we need a complete
snippet to reproduce. Currently it looks like a problem with our legacy
support when we introduced the the ColumnViewerLabelProvider-API.

Could you by chance create a complete standalone snippet we can run and
reproduce the problem locally?


Tom

Lars Bischoff schrieb:
> Hello,
>
> Yes, after my post I recognized that it fits better into the jface-group
> than the swt-group.
>
> My LabelProvider looks like the following:
>
> ----- snip -----
> public class BackupLabelProvider extends LabelProvider implements
> ITableLabelProvider {
>
> @Override
> public Image getColumnImage(Object element, int columnIndex) {
> Image image = Icons.getBackup();
> switch(columnIndex) {
> case 0:
> return image;
>
> case 1:
> return null;
>
> case 2:
> return null;
> }
> return null;
> }
>
> @Override
> public String getColumnText(Object element, int columnIndex) {
> Backup backup = (Backup) element;
> switch(columnIndex) {
> case 0:
> return backup.getName();
>
> case 1:
> return backup.getDate();
>
> case 2:
> return backup.getTime();
> }
> return null;
> }
>
> }
> ----- snip -----
>
>
>
> Tom Schindl schrieb:
>> We should discuss on the jface-group.
>>
>> Tom
>>
>> Tom Schindl schrieb:
>>> Hi,
>>>
>>> It looks like the problem is that there's no label provider assigned to
>>> teh column. Does your table has columns, could you shows us your
>>> BackupLabelProvider?
>>>
>>> Tom
>>>
>>> Lars Bischoff schrieb:
>>>> Hello all,
>>>>
>>>> I am struggling with setting the input for a tableviewer. The following
>>>> snippet shows the way I try to do it.
>>>>
>>>> ----- snip -----
>>>> tableViewer= new TableViewer(table);
>>>> tableViewer.setContentProvider(new BackupContentProvider());
>>>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>>>
>>>> Backup[] backups = backupController.getBackupModel().getBackups();
>>>> tableViewer.setUseHashlookup(true);
>>>> tableViewer.setInput(backups);
>>>> ----- snap -----
>>>>
>>>> The only way it works is if my backups-array is null. Otherwise, I keep
>>>> getting the following exception:
>>>>
>>>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>>>> !MESSAGE Problems occurred when invoking code from plug-in:
>>>> "org.eclipse.jface".
>>>> !STACK 0
>>>> java.lang.NullPointerException
>>>> at
>>>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>>>
>>>>
>>>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>>>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>>>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>>>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>>>> at
>>>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>>>>
>>>> at
>>>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>>>
>>>>
>>>> at
>>>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>>>>
>>>> at
>>>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>>>
>>>>
>>>> at org.eclipse.jface.window.Window.create(Window.java:431)
>>>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>>>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>>>> at
>>>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>>>>
>>>> at com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>>>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>>>> at
>>>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>>>
>>>>
>>>> at
>>>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>>>
>>>>
>>>> at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>>>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>>>> at
>>>> org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>>>> at
>>>> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>>>> at
>>>> org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>>>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>>>> at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>>>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>>>> at
>>>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>>>
>>>>
>>>> at
>>>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>>>>
>>>> at
>>>> org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>>>> at com.mhr.mt.core.Application.start(Application.java:25)
>>>> at
>>>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>>>
>>>>
>>>> at
>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>>>
>>>>
>>>> at
>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>>>
>>>>
>>>> at
>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>>>
>>>>
>>>> at
>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>>>
>>>>
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>>> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>>>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>>>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>>>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>>>
>>>> My ContentProvider is a usual ArrayContentProvider, since the value
>>>> which is passed to the #setInput() method is an array. However, I also
>>>> customized it by overriding the #getElements() method as follows:
>>>>
>>>> ----- snip -----
>>>> @Override
>>>> public Object[] getElements(Object input) {
>>>> Backup[] backups = (Backup[]) input;
>>>> return backups;
>>>> }
>>>> ----- snap -----
>>>>
>>>> Unfortunately the exception is still there. I have no idea whatever may
>>>> cause this problem, since I use a similar way to populate a tree by
>>>> means of a TreeViewer.
>>>>
>>>> Best regards,
>>>> Lars
>>>>
>>>>
>>>>
>>>>
>>>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #2996 is a reply to message #2960] Mon, 11 May 2009 15:53 Go to previous messageGo to next message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
Hi Tom,

as requested, enclosed please find the standalone snippet.

----- snap ----

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.forms.widgets.FormToolkit;

public class TestCase extends ApplicationWindow {

public TestCase() {
super(null);
this.setBlockOnOpen(true);
this.create();
this.open();
Display.getCurrent().dispose();
}

public static void main(String[] args) {
new TestCase();
}

protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(1, true));

Button show = new Button(composite, SWT.NONE);
show.setText("Show the problem :)");

final Shell shell = parent.getShell();

show.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent event) {
// Create and show the dialog
BackupDialog backupDialog = new BackupDialog(shell);
backupDialog.open();
}
});

parent.pack();
return composite;
}

}

class BackupDialog extends TitleAreaDialog {

private boolean backupIsSelected;

private TableViewer viewer;

public BackupDialog(Shell parentShell) {
super(parentShell);
this.create();
this.setTitle("Backups - Overview");
this.setMessage("Below is a list of all backups that you have made.");
// this.setTitleImage(Images.getBackupImage());
}

@Override
protected Control createDialogArea(Composite parent) {
FormToolkit toolkit = new FormToolkit(parent.getDisplay());

Composite container = toolkit.createComposite(parent);
GridLayout layout = new GridLayout(1, false);
container.setLayout(layout);
GridData containerGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL |
GridData.GRAB_VERTICAL);
container.setLayoutData(containerGridData);

Table table = toolkit.createTable(container, SWT.V_SCROLL | SWT.H_SCROLL
| SWT.FULL_SELECTION | SWT.SINGLE);
GridData tableGridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL |
GridData.GRAB_VERTICAL);
table.setLayoutData(tableGridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);

viewer = new TableViewer(table);
viewer.setContentProvider(new BackupContentProvider());
viewer.setLabelProvider(new BackupLabelProvider());

TableViewerColumn backupNameColumn = new TableViewerColumn(viewer,
SWT.NONE);
backupNameColumn.getColumn().setText("&Name");
backupNameColumn.getColumn().setWidth(240);

TableViewerColumn backupDateColumn = new TableViewerColumn(viewer,
SWT.NONE);
backupDateColumn.getColumn().setText("&Date");
backupDateColumn.getColumn().setWidth(80);

TableViewerColumn backupTimeColumn = new TableViewerColumn(viewer,
SWT.NONE);
backupTimeColumn.getColumn().setText("&Time");
backupTimeColumn.getColumn().setWidth(80);

BackupController backupController = BackupController.getInstance();
backupController.setTableViewer(viewer);
backupController.addPropertyChangeListener();
Backup[] backups = backupController.getBackupModel().getBackups();

viewer.setUseHashlookup(true);
viewer.setInput(backups);

return container;
}

@Override
protected void okPressed() {
if(backupIsSelected)
this.close();
}

@Override
protected void createButtonsForButtonBar(Composite parent) {
this.createButton(parent, IDialogConstants.OK_ID,
IDialogConstants.OK_LABEL, false);
this.createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, true);
}

}

class BackupContentProvider implements IStructuredContentProvider {

@Override
public Object[] getElements(Object input) {
Backup[] backups = (Backup[]) input;
return backups;
}

@Override
public void dispose() {
}

@Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}

}

class BackupLabelProvider extends LabelProvider implements
ITableLabelProvider {

@Override
public Image getColumnImage(Object element, int columnIndex) {
// Image image = Icons.getBackup();
switch(columnIndex) {
case 0:
// return image;
return null;

case 1:
return null;

case 2:
return null;
}
return null;
}

@Override
public String getColumnText(Object element, int columnIndex) {
Backup backup = (Backup) element;
switch(columnIndex) {
case 0:
return backup.getName();

case 1:
return backup.getDate();

case 2:
return backup.getTime();
}
return null;
}

}

class BackupModel {

private List<Backup> backups;

private PropertyChangeSupport propertyChangeSupport;

private static final String ADD = "add";

private static final String REMOVE = "remove";

public BackupModel() {
backups = new ArrayList<Backup>();
propertyChangeSupport = new PropertyChangeSupport(this);
}

public void populateBackupModel(Backup[] backupArray) {
if(backups == null) {
backups = new ArrayList<Backup>();
}
if(backupArray == null) {
return;
}
else {
for(Backup backup : backupArray) {
addBackup(backup);
}
}
}

public void addBackup(Backup backup) {
backups.add(backup);
propertyChangeSupport.firePropertyChange(ADD, null, backup);
}

public void removeBackup(Backup backup) {
backups.remove(backup);
propertyChangeSupport.firePropertyChange(REMOVE, backup, null);
}

public void removeBackup(String name) {
for(Backup backup : backups) {
if(backup.getName().equals(name)) {
backups.remove(backup);
propertyChangeSupport.firePropertyChange(REMOVE, backup, null);
}
}
}

public void clearBackupModel() {
backups.clear();
}

public Backup[] getBackups() {
return backups.toArray(new Backup[backups.size()]);
}

public void addPropertyChangeListener(PropertyChangeListener
propertyChangeListener) {
propertyChangeSupport.addPropertyChangeListener(propertyChan geListener);
}

public void removePropertyChangeListener(PropertyChangeListener
propertyChangeListener) {

propertyChangeSupport.removePropertyChangeListener(propertyC hangeListener);
}

}

class Backup {

private String name;

private String date;

private String time;

public Backup() {
super();
}

public Backup(String name, String date, String time) {
this.name = name;
this.date = date;
this.time = time;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public String getDate() {
return this.date;
}

public void setDate(String date) {
this.date = date;
}

public String getTime() {
return this.time;
}

public void setTime(String time) {
this.time = time;
}

}

class BackupController {

private static BackupController backupController;

private BackupModel backupModel;

private TableViewer tableViewer;

private Backup[] backups;

private PropertyChangeListener propertyChangeListener;

private BackupController() {
super();
backupModel = new BackupModel();
backups = getBackups();
backupModel.populateBackupModel(backups);
}

public void setBackupModel(BackupModel backupModel) {
this.backupModel = backupModel;
}

public BackupModel getBackupModel() {
return backupModel;
}

public void setTableViewer(TableViewer tableViewer) {
this.tableViewer = tableViewer;
}

public TableViewer getTableViewer() {
return tableViewer;
}

public void addBackup(Backup backup) {
// currently unused
}

public void removeBackup(Backup backup) {
// currently unused
}

private Backup[] getBackups() {
Backup[] backups = new Backup[10];
Backup backup = null;
for(int i = 0; i < 10; i++) {
backup = new Backup(String.valueOf(Math.random()),
String.valueOf(Math.random()),
String.valueOf(Math.random()));
backups[i] = backup;
}
return backups;
}

public void clear() {
// currently unused
}

public void refresh() {
// currently unused
}

public void removeAll() {
// currently unused
}

public void addPropertyChangeListener() {
propertyChangeListener = new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
tableViewer.refresh(null, false);
}

};
backupModel.addPropertyChangeListener(propertyChangeListener );
}

public void removePropertyChangeListener() {
backupModel.removePropertyChangeListener(propertyChangeListe ner);
}

public static BackupController getInstance() {
if(backupController == null) {
backupController = new BackupController();
}
return backupController;
}

}

----- snap ----

Thanks a lot for your help and best regards,
Lars



Tom Schindl schrieb:
> Hi,
>
> And where do you create the TableColumns? I guess we need a complete
> snippet to reproduce. Currently it looks like a problem with our legacy
> support when we introduced the the ColumnViewerLabelProvider-API.
>
> Could you by chance create a complete standalone snippet we can run and
> reproduce the problem locally?
>
>
> Tom
>
> Lars Bischoff schrieb:
>> Hello,
>>
>> Yes, after my post I recognized that it fits better into the jface-group
>> than the swt-group.
>>
>> My LabelProvider looks like the following:
>>
>> ----- snip -----
>> public class BackupLabelProvider extends LabelProvider implements
>> ITableLabelProvider {
>>
>> @Override
>> public Image getColumnImage(Object element, int columnIndex) {
>> Image image = Icons.getBackup();
>> switch(columnIndex) {
>> case 0:
>> return image;
>>
>> case 1:
>> return null;
>>
>> case 2:
>> return null;
>> }
>> return null;
>> }
>>
>> @Override
>> public String getColumnText(Object element, int columnIndex) {
>> Backup backup = (Backup) element;
>> switch(columnIndex) {
>> case 0:
>> return backup.getName();
>>
>> case 1:
>> return backup.getDate();
>>
>> case 2:
>> return backup.getTime();
>> }
>> return null;
>> }
>>
>> }
>> ----- snip -----
>>
>>
>>
>> Tom Schindl schrieb:
>>> We should discuss on the jface-group.
>>>
>>> Tom
>>>
>>> Tom Schindl schrieb:
>>>> Hi,
>>>>
>>>> It looks like the problem is that there's no label provider assigned to
>>>> teh column. Does your table has columns, could you shows us your
>>>> BackupLabelProvider?
>>>>
>>>> Tom
>>>>
>>>> Lars Bischoff schrieb:
>>>>> Hello all,
>>>>>
>>>>> I am struggling with setting the input for a tableviewer. The following
>>>>> snippet shows the way I try to do it.
>>>>>
>>>>> ----- snip -----
>>>>> tableViewer= new TableViewer(table);
>>>>> tableViewer.setContentProvider(new BackupContentProvider());
>>>>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>>>>
>>>>> Backup[] backups = backupController.getBackupModel().getBackups();
>>>>> tableViewer.setUseHashlookup(true);
>>>>> tableViewer.setInput(backups);
>>>>> ----- snap -----
>>>>>
>>>>> The only way it works is if my backups-array is null. Otherwise, I keep
>>>>> getting the following exception:
>>>>>
>>>>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>>>>> !MESSAGE Problems occurred when invoking code from plug-in:
>>>>> "org.eclipse.jface".
>>>>> !STACK 0
>>>>> java.lang.NullPointerException
>>>>> at
>>>>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>>>>
>>>>>
>>>>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>>>>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>>>>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>>>>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>>>>> at
>>>>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>>>>>
>>>>> at
>>>>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>>>>
>>>>>
>>>>> at
>>>>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>>>>>
>>>>> at
>>>>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>>>>
>>>>>
>>>>> at org.eclipse.jface.window.Window.create(Window.java:431)
>>>>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>>>>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>>>>> at
>>>>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>>>>>
>>>>> at com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>>>>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>>>>> at
>>>>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>>>>
>>>>>
>>>>> at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>>>>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>>>>> at
>>>>> org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>>>>> at
>>>>> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>>>>> at
>>>>> org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>>>>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>>>>> at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>>>>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>>>>> at
>>>>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>>>>>
>>>>> at
>>>>> org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>>>>> at com.mhr.mt.core.Application.start(Application.java:25)
>>>>> at
>>>>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>>>>
>>>>>
>>>>> at
>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>>>>
>>>>>
>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>>>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>>>> at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>>>>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>>>>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>>>>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>>>>
>>>>> My ContentProvider is a usual ArrayContentProvider, since the value
>>>>> which is passed to the #setInput() method is an array. However, I also
>>>>> customized it by overriding the #getElements() method as follows:
>>>>>
>>>>> ----- snip -----
>>>>> @Override
>>>>> public Object[] getElements(Object input) {
>>>>> Backup[] backups = (Backup[]) input;
>>>>> return backups;
>>>>> }
>>>>> ----- snap -----
>>>>>
>>>>> Unfortunately the exception is still there. I have no idea whatever may
>>>>> cause this problem, since I use a similar way to populate a tree by
>>>>> means of a TreeViewer.
>>>>>
>>>>> Best regards,
>>>>> Lars
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #3016 is a reply to message #2996] Mon, 11 May 2009 16:23 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi Lars,

Ok. I see the problem! You are mixing pre 3.3 and post 3.3-API.

Solution 1 (pre 3.3-API)
------------------------
- Call viewer.setLabelProvider()
- Create SWT-TableColumn-Instances

Solution 2 (post 3.3 API):
--------------------------
- Don't call viewer.setLabelProvider() anymore
- Set ColumnLabelProvider to every TableViewerColumn

I'd go with solution 2 because it gives you access to many many new
features like e.g. Tooltips, ... .

As a note I think JFace could handle your way of setting up as well but
the first time frame we are able to fix this is in 3.6 because the risk
to introduce a regression at this point in the release cycle is too high
(and we never intended to allow mixing old and new API so we need to
discuss if we want to handle it)

Tom

Lars Bischoff schrieb:
> Hi Tom,
>
> as requested, enclosed please find the standalone snippet.
>
> ----- snap ----
>
> import java.beans.PropertyChangeEvent;
> import java.beans.PropertyChangeListener;
> import java.beans.PropertyChangeSupport;
> import java.util.ArrayList;
> import java.util.List;
>
> import org.eclipse.jface.dialogs.IDialogConstants;
> import org.eclipse.jface.dialogs.TitleAreaDialog;
> import org.eclipse.jface.viewers.IStructuredContentProvider;
> import org.eclipse.jface.viewers.ITableLabelProvider;
> import org.eclipse.jface.viewers.LabelProvider;
> import org.eclipse.jface.viewers.TableViewer;
> import org.eclipse.jface.viewers.TableViewerColumn;
> import org.eclipse.jface.viewers.Viewer;
> import org.eclipse.jface.window.ApplicationWindow;
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.events.SelectionAdapter;
> import org.eclipse.swt.events.SelectionEvent;
> import org.eclipse.swt.graphics.Image;
> import org.eclipse.swt.layout.GridData;
> import org.eclipse.swt.layout.GridLayout;
> import org.eclipse.swt.widgets.Button;
> import org.eclipse.swt.widgets.Composite;
> import org.eclipse.swt.widgets.Control;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.Table;
> import org.eclipse.ui.forms.widgets.FormToolkit;
>
> public class TestCase extends ApplicationWindow {
>
> public TestCase() {
> super(null);
> this.setBlockOnOpen(true);
> this.create();
> this.open();
> Display.getCurrent().dispose();
> }
>
> public static void main(String[] args) {
> new TestCase();
> }
>
> protected Control createContents(Composite parent) {
> Composite composite = new Composite(parent, SWT.NONE);
> composite.setLayout(new GridLayout(1, true));
>
> Button show = new Button(composite, SWT.NONE);
> show.setText("Show the problem :)");
>
> final Shell shell = parent.getShell();
>
> show.addSelectionListener(new SelectionAdapter() {
>
> public void widgetSelected(SelectionEvent event) {
> // Create and show the dialog
> BackupDialog backupDialog = new BackupDialog(shell);
> backupDialog.open();
> }
> });
>
> parent.pack();
> return composite;
> }
>
> }
>
> class BackupDialog extends TitleAreaDialog {
>
> private boolean backupIsSelected;
>
> private TableViewer viewer;
>
> public BackupDialog(Shell parentShell) {
> super(parentShell);
> this.create();
> this.setTitle("Backups - Overview");
> this.setMessage("Below is a list of all backups that you have
> made.");
> // this.setTitleImage(Images.getBackupImage());
> }
>
> @Override
> protected Control createDialogArea(Composite parent) {
> FormToolkit toolkit = new FormToolkit(parent.getDisplay());
>
> Composite container = toolkit.createComposite(parent);
> GridLayout layout = new GridLayout(1, false);
> container.setLayout(layout);
> GridData containerGridData = new
> GridData(GridData.HORIZONTAL_ALIGN_FILL
> | GridData.VERTICAL_ALIGN_FILL |
> GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
> container.setLayoutData(containerGridData);
>
> Table table = toolkit.createTable(container, SWT.V_SCROLL |
> SWT.H_SCROLL
> | SWT.FULL_SELECTION | SWT.SINGLE);
> GridData tableGridData = new
> GridData(GridData.HORIZONTAL_ALIGN_FILL
> | GridData.VERTICAL_ALIGN_FILL |
> GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
> table.setLayoutData(tableGridData);
> table.setLinesVisible(true);
> table.setHeaderVisible(true);
>
> viewer = new TableViewer(table);
> viewer.setContentProvider(new BackupContentProvider());
> viewer.setLabelProvider(new BackupLabelProvider());
>
> TableViewerColumn backupNameColumn = new
> TableViewerColumn(viewer, SWT.NONE);
> backupNameColumn.getColumn().setText("&Name");
> backupNameColumn.getColumn().setWidth(240);
>
> TableViewerColumn backupDateColumn = new
> TableViewerColumn(viewer, SWT.NONE);
> backupDateColumn.getColumn().setText("&Date");
> backupDateColumn.getColumn().setWidth(80);
>
> TableViewerColumn backupTimeColumn = new
> TableViewerColumn(viewer, SWT.NONE);
> backupTimeColumn.getColumn().setText("&Time");
> backupTimeColumn.getColumn().setWidth(80);
>
> BackupController backupController = BackupController.getInstance();
> backupController.setTableViewer(viewer);
> backupController.addPropertyChangeListener();
> Backup[] backups = backupController.getBackupModel().getBackups();
>
> viewer.setUseHashlookup(true);
> viewer.setInput(backups);
>
> return container;
> }
>
> @Override
> protected void okPressed() {
> if(backupIsSelected)
> this.close();
> }
>
> @Override
> protected void createButtonsForButtonBar(Composite parent) {
> this.createButton(parent, IDialogConstants.OK_ID,
> IDialogConstants.OK_LABEL, false);
> this.createButton(parent, IDialogConstants.CANCEL_ID,
> IDialogConstants.CANCEL_LABEL, true);
> }
>
> }
>
> class BackupContentProvider implements IStructuredContentProvider {
>
> @Override
> public Object[] getElements(Object input) {
> Backup[] backups = (Backup[]) input;
> return backups;
> }
>
> @Override
> public void dispose() {
> }
>
> @Override
> public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
> }
>
> }
>
> class BackupLabelProvider extends LabelProvider implements
> ITableLabelProvider {
>
> @Override
> public Image getColumnImage(Object element, int columnIndex) {
> // Image image = Icons.getBackup();
> switch(columnIndex) {
> case 0:
> // return image;
> return null;
>
> case 1:
> return null;
>
> case 2:
> return null;
> }
> return null;
> }
>
> @Override
> public String getColumnText(Object element, int columnIndex) {
> Backup backup = (Backup) element;
> switch(columnIndex) {
> case 0:
> return backup.getName();
>
> case 1:
> return backup.getDate();
>
> case 2:
> return backup.getTime();
> }
> return null;
> }
>
> }
>
> class BackupModel {
>
> private List<Backup> backups;
>
> private PropertyChangeSupport propertyChangeSupport;
>
> private static final String ADD = "add";
>
> private static final String REMOVE = "remove";
>
> public BackupModel() {
> backups = new ArrayList<Backup>();
> propertyChangeSupport = new PropertyChangeSupport(this);
> }
>
> public void populateBackupModel(Backup[] backupArray) {
> if(backups == null) {
> backups = new ArrayList<Backup>();
> }
> if(backupArray == null) {
> return;
> }
> else {
> for(Backup backup : backupArray) {
> addBackup(backup);
> }
> }
> }
>
> public void addBackup(Backup backup) {
> backups.add(backup);
> propertyChangeSupport.firePropertyChange(ADD, null, backup);
> }
>
> public void removeBackup(Backup backup) {
> backups.remove(backup);
> propertyChangeSupport.firePropertyChange(REMOVE, backup, null);
> }
>
> public void removeBackup(String name) {
> for(Backup backup : backups) {
> if(backup.getName().equals(name)) {
> backups.remove(backup);
> propertyChangeSupport.firePropertyChange(REMOVE, backup,
> null);
> }
> }
> }
>
> public void clearBackupModel() {
> backups.clear();
> }
>
> public Backup[] getBackups() {
> return backups.toArray(new Backup[backups.size()]);
> }
>
> public void addPropertyChangeListener(PropertyChangeListener
> propertyChangeListener) {
>
> propertyChangeSupport.addPropertyChangeListener(propertyChan geListener);
> }
>
> public void removePropertyChangeListener(PropertyChangeListener
> propertyChangeListener) {
>
> propertyChangeSupport.removePropertyChangeListener(propertyC hangeListener);
> }
>
> }
>
> class Backup {
>
> private String name;
>
> private String date;
>
> private String time;
>
> public Backup() {
> super();
> }
>
> public Backup(String name, String date, String time) {
> this.name = name;
> this.date = date;
> this.time = time;
> }
>
> public String getName() {
> return this.name;
> }
>
> public void setName(String name) {
> this.name = name;
> }
>
> public String getDate() {
> return this.date;
> }
>
> public void setDate(String date) {
> this.date = date;
> }
>
> public String getTime() {
> return this.time;
> }
>
> public void setTime(String time) {
> this.time = time;
> }
>
> }
>
> class BackupController {
>
> private static BackupController backupController;
>
> private BackupModel backupModel;
>
> private TableViewer tableViewer;
>
> private Backup[] backups;
>
> private PropertyChangeListener propertyChangeListener;
>
> private BackupController() {
> super();
> backupModel = new BackupModel();
> backups = getBackups();
> backupModel.populateBackupModel(backups);
> }
>
> public void setBackupModel(BackupModel backupModel) {
> this.backupModel = backupModel;
> }
>
> public BackupModel getBackupModel() {
> return backupModel;
> }
>
> public void setTableViewer(TableViewer tableViewer) {
> this.tableViewer = tableViewer;
> }
>
> public TableViewer getTableViewer() {
> return tableViewer;
> }
>
> public void addBackup(Backup backup) {
> // currently unused
> }
>
> public void removeBackup(Backup backup) {
> // currently unused
> }
>
> private Backup[] getBackups() {
> Backup[] backups = new Backup[10];
> Backup backup = null;
> for(int i = 0; i < 10; i++) {
> backup = new Backup(String.valueOf(Math.random()),
> String.valueOf(Math.random()),
> String.valueOf(Math.random()));
> backups[i] = backup;
> }
> return backups;
> }
>
> public void clear() {
> // currently unused
> }
>
> public void refresh() {
> // currently unused
> }
>
> public void removeAll() {
> // currently unused
> }
>
> public void addPropertyChangeListener() {
> propertyChangeListener = new PropertyChangeListener() {
>
> @Override
> public void propertyChange(PropertyChangeEvent evt) {
> tableViewer.refresh(null, false);
> }
>
> };
> backupModel.addPropertyChangeListener(propertyChangeListener );
> }
>
> public void removePropertyChangeListener() {
> backupModel.removePropertyChangeListener(propertyChangeListe ner);
> }
>
> public static BackupController getInstance() {
> if(backupController == null) {
> backupController = new BackupController();
> }
> return backupController;
> }
>
> }
>
> ----- snap ----
>
> Thanks a lot for your help and best regards,
> Lars
>
>
>
> Tom Schindl schrieb:
>> Hi,
>>
>> And where do you create the TableColumns? I guess we need a complete
>> snippet to reproduce. Currently it looks like a problem with our legacy
>> support when we introduced the the ColumnViewerLabelProvider-API.
>>
>> Could you by chance create a complete standalone snippet we can run and
>> reproduce the problem locally?
>>
>>
>> Tom
>>
>> Lars Bischoff schrieb:
>>> Hello,
>>>
>>> Yes, after my post I recognized that it fits better into the jface-group
>>> than the swt-group.
>>>
>>> My LabelProvider looks like the following:
>>>
>>> ----- snip -----
>>> public class BackupLabelProvider extends LabelProvider implements
>>> ITableLabelProvider {
>>>
>>> @Override
>>> public Image getColumnImage(Object element, int columnIndex) {
>>> Image image = Icons.getBackup();
>>> switch(columnIndex) {
>>> case 0:
>>> return image;
>>>
>>> case 1:
>>> return null;
>>>
>>> case 2:
>>> return null;
>>> }
>>> return null;
>>> }
>>>
>>> @Override
>>> public String getColumnText(Object element, int columnIndex) {
>>> Backup backup = (Backup) element;
>>> switch(columnIndex) {
>>> case 0:
>>> return backup.getName();
>>>
>>> case 1:
>>> return backup.getDate();
>>>
>>> case 2:
>>> return backup.getTime();
>>> }
>>> return null;
>>> }
>>>
>>> }
>>> ----- snip -----
>>>
>>>
>>>
>>> Tom Schindl schrieb:
>>>> We should discuss on the jface-group.
>>>>
>>>> Tom
>>>>
>>>> Tom Schindl schrieb:
>>>>> Hi,
>>>>>
>>>>> It looks like the problem is that there's no label provider
>>>>> assigned to
>>>>> teh column. Does your table has columns, could you shows us your
>>>>> BackupLabelProvider?
>>>>>
>>>>> Tom
>>>>>
>>>>> Lars Bischoff schrieb:
>>>>>> Hello all,
>>>>>>
>>>>>> I am struggling with setting the input for a tableviewer. The
>>>>>> following
>>>>>> snippet shows the way I try to do it.
>>>>>>
>>>>>> ----- snip -----
>>>>>> tableViewer= new TableViewer(table);
>>>>>> tableViewer.setContentProvider(new BackupContentProvider());
>>>>>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>>>>>
>>>>>> Backup[] backups = backupController.getBackupModel().getBackups();
>>>>>> tableViewer.setUseHashlookup(true);
>>>>>> tableViewer.setInput(backups);
>>>>>> ----- snap -----
>>>>>>
>>>>>> The only way it works is if my backups-array is null. Otherwise, I
>>>>>> keep
>>>>>> getting the following exception:
>>>>>>
>>>>>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>>>>>> !MESSAGE Problems occurred when invoking code from plug-in:
>>>>>> "org.eclipse.jface".
>>>>>> !STACK 0
>>>>>> java.lang.NullPointerException
>>>>>> at
>>>>>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>>>>>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>>>>>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>>>>>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>>>>>> at
>>>>>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at org.eclipse.jface.window.Window.create(Window.java:431)
>>>>>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>>>>>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>>>>>> at
>>>>>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>>>>>>
>>>>>>
>>>>>> at
>>>>>> com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>>>>>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>>>>>> at
>>>>>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>>>>>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>>>>>> at
>>>>>> org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>>>>>> at
>>>>>> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>>>>>> at
>>>>>> org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>>>>>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>>>>>> at
>>>>>> org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>>>>>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>>>>>> at
>>>>>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>>>>>> at com.mhr.mt.core.Application.start(Application.java:25)
>>>>>> at
>>>>>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at
>>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>>>>>
>>>>>>
>>>>>>
>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>>>>> Source)
>>>>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>>>>> at
>>>>>> org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>>>>>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>>>>>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>>>>>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>>>>>
>>>>>> My ContentProvider is a usual ArrayContentProvider, since the value
>>>>>> which is passed to the #setInput() method is an array. However, I
>>>>>> also
>>>>>> customized it by overriding the #getElements() method as follows:
>>>>>>
>>>>>> ----- snip -----
>>>>>> @Override
>>>>>> public Object[] getElements(Object input) {
>>>>>> Backup[] backups = (Backup[]) input;
>>>>>> return backups;
>>>>>> }
>>>>>> ----- snap -----
>>>>>>
>>>>>> Unfortunately the exception is still there. I have no idea
>>>>>> whatever may
>>>>>> cause this problem, since I use a similar way to populate a tree by
>>>>>> means of a TreeViewer.
>>>>>>
>>>>>> Best regards,
>>>>>> Lars
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #3047 is a reply to message #3016] Mon, 11 May 2009 20:01 Go to previous messageGo to next message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
Hi Tom,

thanks a lot. I took solution no. 2 and it works great now :)

/Lars


Tom Schindl schrieb:
> Hi Lars,
>
> Ok. I see the problem! You are mixing pre 3.3 and post 3.3-API.
>
> Solution 1 (pre 3.3-API)
> ------------------------
> - Call viewer.setLabelProvider()
> - Create SWT-TableColumn-Instances
>
> Solution 2 (post 3.3 API):
> --------------------------
> - Don't call viewer.setLabelProvider() anymore
> - Set ColumnLabelProvider to every TableViewerColumn
>
> I'd go with solution 2 because it gives you access to many many new
> features like e.g. Tooltips, ... .
>
> As a note I think JFace could handle your way of setting up as well but
> the first time frame we are able to fix this is in 3.6 because the risk
> to introduce a regression at this point in the release cycle is too high
> (and we never intended to allow mixing old and new API so we need to
> discuss if we want to handle it)
>
> Tom
>
> Lars Bischoff schrieb:
>> Hi Tom,
>>
>> as requested, enclosed please find the standalone snippet.
>>
>> ----- snap ----
>>
>> import java.beans.PropertyChangeEvent;
>> import java.beans.PropertyChangeListener;
>> import java.beans.PropertyChangeSupport;
>> import java.util.ArrayList;
>> import java.util.List;
>>
>> import org.eclipse.jface.dialogs.IDialogConstants;
>> import org.eclipse.jface.dialogs.TitleAreaDialog;
>> import org.eclipse.jface.viewers.IStructuredContentProvider;
>> import org.eclipse.jface.viewers.ITableLabelProvider;
>> import org.eclipse.jface.viewers.LabelProvider;
>> import org.eclipse.jface.viewers.TableViewer;
>> import org.eclipse.jface.viewers.TableViewerColumn;
>> import org.eclipse.jface.viewers.Viewer;
>> import org.eclipse.jface.window.ApplicationWindow;
>> import org.eclipse.swt.SWT;
>> import org.eclipse.swt.events.SelectionAdapter;
>> import org.eclipse.swt.events.SelectionEvent;
>> import org.eclipse.swt.graphics.Image;
>> import org.eclipse.swt.layout.GridData;
>> import org.eclipse.swt.layout.GridLayout;
>> import org.eclipse.swt.widgets.Button;
>> import org.eclipse.swt.widgets.Composite;
>> import org.eclipse.swt.widgets.Control;
>> import org.eclipse.swt.widgets.Display;
>> import org.eclipse.swt.widgets.Shell;
>> import org.eclipse.swt.widgets.Table;
>> import org.eclipse.ui.forms.widgets.FormToolkit;
>>
>> public class TestCase extends ApplicationWindow {
>>
>> public TestCase() {
>> super(null);
>> this.setBlockOnOpen(true);
>> this.create();
>> this.open();
>> Display.getCurrent().dispose();
>> }
>>
>> public static void main(String[] args) {
>> new TestCase();
>> }
>>
>> protected Control createContents(Composite parent) {
>> Composite composite = new Composite(parent, SWT.NONE);
>> composite.setLayout(new GridLayout(1, true));
>>
>> Button show = new Button(composite, SWT.NONE);
>> show.setText("Show the problem :)");
>>
>> final Shell shell = parent.getShell();
>>
>> show.addSelectionListener(new SelectionAdapter() {
>>
>> public void widgetSelected(SelectionEvent event) {
>> // Create and show the dialog
>> BackupDialog backupDialog = new BackupDialog(shell);
>> backupDialog.open();
>> }
>> });
>>
>> parent.pack();
>> return composite;
>> }
>>
>> }
>>
>> class BackupDialog extends TitleAreaDialog {
>>
>> private boolean backupIsSelected;
>>
>> private TableViewer viewer;
>>
>> public BackupDialog(Shell parentShell) {
>> super(parentShell);
>> this.create();
>> this.setTitle("Backups - Overview");
>> this.setMessage("Below is a list of all backups that you have
>> made.");
>> // this.setTitleImage(Images.getBackupImage());
>> }
>>
>> @Override
>> protected Control createDialogArea(Composite parent) {
>> FormToolkit toolkit = new FormToolkit(parent.getDisplay());
>>
>> Composite container = toolkit.createComposite(parent);
>> GridLayout layout = new GridLayout(1, false);
>> container.setLayout(layout);
>> GridData containerGridData = new
>> GridData(GridData.HORIZONTAL_ALIGN_FILL
>> | GridData.VERTICAL_ALIGN_FILL |
>> GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
>> container.setLayoutData(containerGridData);
>>
>> Table table = toolkit.createTable(container, SWT.V_SCROLL |
>> SWT.H_SCROLL
>> | SWT.FULL_SELECTION | SWT.SINGLE);
>> GridData tableGridData = new
>> GridData(GridData.HORIZONTAL_ALIGN_FILL
>> | GridData.VERTICAL_ALIGN_FILL |
>> GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
>> table.setLayoutData(tableGridData);
>> table.setLinesVisible(true);
>> table.setHeaderVisible(true);
>>
>> viewer = new TableViewer(table);
>> viewer.setContentProvider(new BackupContentProvider());
>> viewer.setLabelProvider(new BackupLabelProvider());
>>
>> TableViewerColumn backupNameColumn = new
>> TableViewerColumn(viewer, SWT.NONE);
>> backupNameColumn.getColumn().setText("&Name");
>> backupNameColumn.getColumn().setWidth(240);
>>
>> TableViewerColumn backupDateColumn = new
>> TableViewerColumn(viewer, SWT.NONE);
>> backupDateColumn.getColumn().setText("&Date");
>> backupDateColumn.getColumn().setWidth(80);
>>
>> TableViewerColumn backupTimeColumn = new
>> TableViewerColumn(viewer, SWT.NONE);
>> backupTimeColumn.getColumn().setText("&Time");
>> backupTimeColumn.getColumn().setWidth(80);
>>
>> BackupController backupController = BackupController.getInstance();
>> backupController.setTableViewer(viewer);
>> backupController.addPropertyChangeListener();
>> Backup[] backups = backupController.getBackupModel().getBackups();
>>
>> viewer.setUseHashlookup(true);
>> viewer.setInput(backups);
>>
>> return container;
>> }
>>
>> @Override
>> protected void okPressed() {
>> if(backupIsSelected)
>> this.close();
>> }
>>
>> @Override
>> protected void createButtonsForButtonBar(Composite parent) {
>> this.createButton(parent, IDialogConstants.OK_ID,
>> IDialogConstants.OK_LABEL, false);
>> this.createButton(parent, IDialogConstants.CANCEL_ID,
>> IDialogConstants.CANCEL_LABEL, true);
>> }
>>
>> }
>>
>> class BackupContentProvider implements IStructuredContentProvider {
>>
>> @Override
>> public Object[] getElements(Object input) {
>> Backup[] backups = (Backup[]) input;
>> return backups;
>> }
>>
>> @Override
>> public void dispose() {
>> }
>>
>> @Override
>> public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
>> }
>>
>> }
>>
>> class BackupLabelProvider extends LabelProvider implements
>> ITableLabelProvider {
>>
>> @Override
>> public Image getColumnImage(Object element, int columnIndex) {
>> // Image image = Icons.getBackup();
>> switch(columnIndex) {
>> case 0:
>> // return image;
>> return null;
>>
>> case 1:
>> return null;
>>
>> case 2:
>> return null;
>> }
>> return null;
>> }
>>
>> @Override
>> public String getColumnText(Object element, int columnIndex) {
>> Backup backup = (Backup) element;
>> switch(columnIndex) {
>> case 0:
>> return backup.getName();
>>
>> case 1:
>> return backup.getDate();
>>
>> case 2:
>> return backup.getTime();
>> }
>> return null;
>> }
>>
>> }
>>
>> class BackupModel {
>>
>> private List<Backup> backups;
>>
>> private PropertyChangeSupport propertyChangeSupport;
>>
>> private static final String ADD = "add";
>>
>> private static final String REMOVE = "remove";
>>
>> public BackupModel() {
>> backups = new ArrayList<Backup>();
>> propertyChangeSupport = new PropertyChangeSupport(this);
>> }
>>
>> public void populateBackupModel(Backup[] backupArray) {
>> if(backups == null) {
>> backups = new ArrayList<Backup>();
>> }
>> if(backupArray == null) {
>> return;
>> }
>> else {
>> for(Backup backup : backupArray) {
>> addBackup(backup);
>> }
>> }
>> }
>>
>> public void addBackup(Backup backup) {
>> backups.add(backup);
>> propertyChangeSupport.firePropertyChange(ADD, null, backup);
>> }
>>
>> public void removeBackup(Backup backup) {
>> backups.remove(backup);
>> propertyChangeSupport.firePropertyChange(REMOVE, backup, null);
>> }
>>
>> public void removeBackup(String name) {
>> for(Backup backup : backups) {
>> if(backup.getName().equals(name)) {
>> backups.remove(backup);
>> propertyChangeSupport.firePropertyChange(REMOVE, backup,
>> null);
>> }
>> }
>> }
>>
>> public void clearBackupModel() {
>> backups.clear();
>> }
>>
>> public Backup[] getBackups() {
>> return backups.toArray(new Backup[backups.size()]);
>> }
>>
>> public void addPropertyChangeListener(PropertyChangeListener
>> propertyChangeListener) {
>>
>> propertyChangeSupport.addPropertyChangeListener(propertyChan geListener);
>> }
>>
>> public void removePropertyChangeListener(PropertyChangeListener
>> propertyChangeListener) {
>>
>> propertyChangeSupport.removePropertyChangeListener(propertyC hangeListener);
>> }
>>
>> }
>>
>> class Backup {
>>
>> private String name;
>>
>> private String date;
>>
>> private String time;
>>
>> public Backup() {
>> super();
>> }
>>
>> public Backup(String name, String date, String time) {
>> this.name = name;
>> this.date = date;
>> this.time = time;
>> }
>>
>> public String getName() {
>> return this.name;
>> }
>>
>> public void setName(String name) {
>> this.name = name;
>> }
>>
>> public String getDate() {
>> return this.date;
>> }
>>
>> public void setDate(String date) {
>> this.date = date;
>> }
>>
>> public String getTime() {
>> return this.time;
>> }
>>
>> public void setTime(String time) {
>> this.time = time;
>> }
>>
>> }
>>
>> class BackupController {
>>
>> private static BackupController backupController;
>>
>> private BackupModel backupModel;
>>
>> private TableViewer tableViewer;
>>
>> private Backup[] backups;
>>
>> private PropertyChangeListener propertyChangeListener;
>>
>> private BackupController() {
>> super();
>> backupModel = new BackupModel();
>> backups = getBackups();
>> backupModel.populateBackupModel(backups);
>> }
>>
>> public void setBackupModel(BackupModel backupModel) {
>> this.backupModel = backupModel;
>> }
>>
>> public BackupModel getBackupModel() {
>> return backupModel;
>> }
>>
>> public void setTableViewer(TableViewer tableViewer) {
>> this.tableViewer = tableViewer;
>> }
>>
>> public TableViewer getTableViewer() {
>> return tableViewer;
>> }
>>
>> public void addBackup(Backup backup) {
>> // currently unused
>> }
>>
>> public void removeBackup(Backup backup) {
>> // currently unused
>> }
>>
>> private Backup[] getBackups() {
>> Backup[] backups = new Backup[10];
>> Backup backup = null;
>> for(int i = 0; i < 10; i++) {
>> backup = new Backup(String.valueOf(Math.random()),
>> String.valueOf(Math.random()),
>> String.valueOf(Math.random()));
>> backups[i] = backup;
>> }
>> return backups;
>> }
>>
>> public void clear() {
>> // currently unused
>> }
>>
>> public void refresh() {
>> // currently unused
>> }
>>
>> public void removeAll() {
>> // currently unused
>> }
>>
>> public void addPropertyChangeListener() {
>> propertyChangeListener = new PropertyChangeListener() {
>>
>> @Override
>> public void propertyChange(PropertyChangeEvent evt) {
>> tableViewer.refresh(null, false);
>> }
>>
>> };
>> backupModel.addPropertyChangeListener(propertyChangeListener );
>> }
>>
>> public void removePropertyChangeListener() {
>> backupModel.removePropertyChangeListener(propertyChangeListe ner);
>> }
>>
>> public static BackupController getInstance() {
>> if(backupController == null) {
>> backupController = new BackupController();
>> }
>> return backupController;
>> }
>>
>> }
>>
>> ----- snap ----
>>
>> Thanks a lot for your help and best regards,
>> Lars
>>
>>
>>
>> Tom Schindl schrieb:
>>> Hi,
>>>
>>> And where do you create the TableColumns? I guess we need a complete
>>> snippet to reproduce. Currently it looks like a problem with our legacy
>>> support when we introduced the the ColumnViewerLabelProvider-API.
>>>
>>> Could you by chance create a complete standalone snippet we can run and
>>> reproduce the problem locally?
>>>
>>>
>>> Tom
>>>
>>> Lars Bischoff schrieb:
>>>> Hello,
>>>>
>>>> Yes, after my post I recognized that it fits better into the jface-group
>>>> than the swt-group.
>>>>
>>>> My LabelProvider looks like the following:
>>>>
>>>> ----- snip -----
>>>> public class BackupLabelProvider extends LabelProvider implements
>>>> ITableLabelProvider {
>>>>
>>>> @Override
>>>> public Image getColumnImage(Object element, int columnIndex) {
>>>> Image image = Icons.getBackup();
>>>> switch(columnIndex) {
>>>> case 0:
>>>> return image;
>>>>
>>>> case 1:
>>>> return null;
>>>>
>>>> case 2:
>>>> return null;
>>>> }
>>>> return null;
>>>> }
>>>>
>>>> @Override
>>>> public String getColumnText(Object element, int columnIndex) {
>>>> Backup backup = (Backup) element;
>>>> switch(columnIndex) {
>>>> case 0:
>>>> return backup.getName();
>>>>
>>>> case 1:
>>>> return backup.getDate();
>>>>
>>>> case 2:
>>>> return backup.getTime();
>>>> }
>>>> return null;
>>>> }
>>>>
>>>> }
>>>> ----- snip -----
>>>>
>>>>
>>>>
>>>> Tom Schindl schrieb:
>>>>> We should discuss on the jface-group.
>>>>>
>>>>> Tom
>>>>>
>>>>> Tom Schindl schrieb:
>>>>>> Hi,
>>>>>>
>>>>>> It looks like the problem is that there's no label provider
>>>>>> assigned to
>>>>>> teh column. Does your table has columns, could you shows us your
>>>>>> BackupLabelProvider?
>>>>>>
>>>>>> Tom
>>>>>>
>>>>>> Lars Bischoff schrieb:
>>>>>>> Hello all,
>>>>>>>
>>>>>>> I am struggling with setting the input for a tableviewer. The
>>>>>>> following
>>>>>>> snippet shows the way I try to do it.
>>>>>>>
>>>>>>> ----- snip -----
>>>>>>> tableViewer= new TableViewer(table);
>>>>>>> tableViewer.setContentProvider(new BackupContentProvider());
>>>>>>> tableViewer.setLabelProvider(new BackupLabelProvider());
>>>>>>>
>>>>>>> Backup[] backups = backupController.getBackupModel().getBackups();
>>>>>>> tableViewer.setUseHashlookup(true);
>>>>>>> tableViewer.setInput(backups);
>>>>>>> ----- snap -----
>>>>>>>
>>>>>>> The only way it works is if my backups-array is null. Otherwise, I
>>>>>>> keep
>>>>>>> getting the following exception:
>>>>>>>
>>>>>>> !ENTRY org.eclipse.jface 4 2 2009-05-11 16:22:58.648
>>>>>>> !MESSAGE Problems occurred when invoking code from plug-in:
>>>>>>> "org.eclipse.jface".
>>>>>>> !STACK 0
>>>>>>> java.lang.NullPointerException
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn. java:145)
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(A bstractTableViewer.java:399)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRun nable.run(StructuredViewer.java:481)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
>>>>>>> at org.eclipse.core.runtime.Platform.run(Platform.java:888)
>>>>>>> at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
>>>>>>> at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:17 5)
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.StructuredViewer.updateItem(Struct uredViewer.java:2111)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.createItem(Abs tractTableViewer.java:277)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres hAll(AbstractTableViewer.java:757)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:649)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.internalRefres h(AbstractTableViewer.java:636)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer$2.run(Abstract TableViewer.java:592)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1392)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.StructuredViewer.preservingSelecti on(StructuredViewer.java:1353)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.AbstractTableViewer.inputChanged(A bstractTableViewer.java:590)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.ContentViewer.setInput(ContentView er.java:274)
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.viewers.StructuredViewer.setInput(Structur edViewer.java:1634)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> com.mhr.mt.ui.dialog.BackupDialog.createDialogArea(BackupDia log.java:99)
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.dialogs.TitleAreaDialog.createContents(Tit leAreaDialog.java:147)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at org.eclipse.jface.window.Window.create(Window.java:431)
>>>>>>> at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1088)
>>>>>>> at com.mhr.mt.ui.dialog.BackupDialog.<init>(BackupDialog.java:35)
>>>>>>> at
>>>>>>> com.mhr.mt.ui.action.DatabaseAction.recoverDatabase(Database Action.java:92)
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> com.mhr.mt.ui.action.DatabaseAction.run(DatabaseAction.java: 48)
>>>>>>> at org.eclipse.jface.action.Action.runWithEvent(Action.java:498 )
>>>>>>> at
>>>>>>> org.eclipse.jface.action.ActionContributionItem.handleWidget Selection(ActionContributionItem.java:584)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.action.ActionContributionItem.access$2(Act ionContributionItem.java:501)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.jface.action.ActionContributionItem$6.handleEven t(ActionContributionItem.java:452)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java :84)
>>>>>>> at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
>>>>>>> at
>>>>>>> org.eclipse.swt.widgets.Display.runDeferredEvents(Display.ja va:3880)
>>>>>>> at
>>>>>>> org.eclipse.swt.widgets.Display.readAndDispatch(Display.java :3473)
>>>>>>> at
>>>>>>> org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.jav a:2393)
>>>>>>> at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2357)
>>>>>>> at
>>>>>>> org.eclipse.ui.internal.Workbench.access$4(Workbench.java:22 09)
>>>>>>> at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:499)
>>>>>>> at
>>>>>>> org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:332)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Work bench.java:492)
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.j ava:149)
>>>>>>> at com.mhr.mt.core.Application.start(Application.java:25)
>>>>>>> at
>>>>>>> org.eclipse.equinox.internal.app.EclipseAppHandle.run(Eclips eAppHandle.java:194)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .runApplication(EclipseAppLauncher.java:110)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher .start(EclipseAppLauncher.java:79)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:368)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at
>>>>>>> org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseS tarter.java:179)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>>>>>>> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
>>>>>>> Source)
>>>>>>> at java.lang.reflect.Method.invoke(Unknown Source)
>>>>>>> at
>>>>>>> org.eclipse.equinox.launcher.Main.invokeFramework(Main.java: 556)
>>>>>>> at org.eclipse.equinox.launcher.Main.basicRun(Main.java:511)
>>>>>>> at org.eclipse.equinox.launcher.Main.run(Main.java:1284)
>>>>>>> at org.eclipse.equinox.launcher.Main.main(Main.java:1260)
>>>>>>>
>>>>>>> My ContentProvider is a usual ArrayContentProvider, since the value
>>>>>>> which is passed to the #setInput() method is an array. However, I
>>>>>>> also
>>>>>>> customized it by overriding the #getElements() method as follows:
>>>>>>>
>>>>>>> ----- snip -----
>>>>>>> @Override
>>>>>>> public Object[] getElements(Object input) {
>>>>>>> Backup[] backups = (Backup[]) input;
>>>>>>> return backups;
>>>>>>> }
>>>>>>> ----- snap -----
>>>>>>>
>>>>>>> Unfortunately the exception is still there. I have no idea
>>>>>>> whatever may
>>>>>>> cause this problem, since I use a similar way to populate a tree by
>>>>>>> means of a TreeViewer.
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Lars
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #3060 is a reply to message #3047] Tue, 12 May 2009 09:31 Go to previous messageGo to next message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
Hmm it seems that I cheered to early... :-$

I have implemented now a delete button where i can delete backups (=
rows) from the table. Before posting here, I asked Google, etc. but I
only found solutions for problems I don't have :-)

Changes to my model work quite fine, the PropertyChangeListener becomes
invoked and afterwards the ContentProvider (#getElements()) as well as
the ColumnLabelProvider are invoked too. However, the UI does not
update. The only way it updates is if I close the modal dialog and
reopen it, but this is not the way it is ought to be.

Best regards,
Lars
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #4093 is a reply to message #3060] Tue, 12 May 2009 09:44 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi,

Without code you execute I can't say anything. When making structural
changes you are supposed to call refresh() and or viewer.remove(Object).
In case of remove the viewer will remove the item from the control (it
leaves you model unchanged) and in case of refresh() it rebuilds the
viewer completely from the stuff it gets from the content-provider.

Tom

Lars Bischoff schrieb:
> Hmm it seems that I cheered to early... :-$
>
> I have implemented now a delete button where i can delete backups (=
> rows) from the table. Before posting here, I asked Google, etc. but I
> only found solutions for problems I don't have :-)
>
> Changes to my model work quite fine, the PropertyChangeListener becomes
> invoked and afterwards the ContentProvider (#getElements()) as well as
> the ColumnLabelProvider are invoked too. However, the UI does not
> update. The only way it updates is if I close the modal dialog and
> reopen it, but this is not the way it is ought to be.
>
> Best regards,
> Lars
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #4219 is a reply to message #4093] Wed, 13 May 2009 07:31 Go to previous messageGo to next message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
This is a multi-part message in MIME format.
--------------040600050605050102020006
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hello Tom,

I created now a test-case. Since it has approximately 500 rows, I
attached it as file.

/Lars



Tom Schindl schrieb:
> Hi,
>
> Without code you execute I can't say anything. When making structural
> changes you are supposed to call refresh() and or viewer.remove(Object).
> In case of remove the viewer will remove the item from the control (it
> leaves you model unchanged) and in case of refresh() it rebuilds the
> viewer completely from the stuff it gets from the content-provider.
>
> Tom
>
> Lars Bischoff schrieb:
>> Hmm it seems that I cheered to early... :-$
>>
>> I have implemented now a delete button where i can delete backups (=
>> rows) from the table. Before posting here, I asked Google, etc. but I
>> only found solutions for problems I don't have :-)
>>
>> Changes to my model work quite fine, the PropertyChangeListener becomes
>> invoked and afterwards the ContentProvider (#getElements()) as well as
>> the ColumnLabelProvider are invoked too. However, the UI does not
>> update. The only way it updates is if I close the modal dialog and
>> reopen it, but this is not the way it is ought to be.
>>
>> Best regards,
>> Lars


--------------040600050605050102020006
Content-Type: text/plain;
name="TestCase.java"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="TestCase.java"

aW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsNCmltcG9y dCBqYXZhLmJl
YW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7DQppbXBvcnQgamF2YS5iZWFu cy5Qcm9wZXJ0
eUNoYW5nZVN1cHBvcnQ7DQppbXBvcnQgamF2YS5pby5GaWxlOw0KaW1wb3J0 IGphdmEudXRp
bC5BcnJheUxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoNCmltcG9y dCBvcmcuZWNs
aXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7DQppbXBvcnQg b3JnLmVjbGlw
c2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7DQppbXBvcnQgb3Jn LmVjbGlwc2Uu
amZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOw0KaW1wb3J0IG9y Zy5lY2xpcHNl
LmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCmlt cG9ydCBvcmcu
ZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3Zp ZGVyOw0KaW1w
b3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxl Y3Rpb247DQpp
bXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFu Z2VkRXZlbnQ7
DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdl cjsNCmltcG9y
dCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1u Ow0KaW1wb3J0
IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KaW1wb3J0IG9y Zy5lY2xpcHNl
LmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsNCmltcG9ydCBvcmcu ZWNsaXBzZS5z
d3QuU1dUOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0 aW9uQWRhcHRl
cjsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2 ZW50Ow0KaW1w
b3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7 DQppbXBvcnQg
b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KaW1wb3J0IG9yZy5l Y2xpcHNlLnN3
dC5sYXlvdXQuR3JpZERhdGE7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lmxh eW91dC5Hcmlk
TGF5b3V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRv bjsNCmltcG9y
dCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQppbXBvcnQg b3JnLmVjbGlw
c2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5z d3Qud2lkZ2V0
cy5EaXNwbGF5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNo ZWxsOw0KaW1w
b3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOw0KaW1wb3J0IG9y Zy5lY2xpcHNl
LnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7DQoNCnB1YmxpYyBjbGFz cyBUZXN0Q2Fz
ZSBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93IHsNCg0KCXB1YmxpYyBUZXN0 Q2FzZSgpIHsN
CgkJc3VwZXIobnVsbCk7DQoJCXRoaXMuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7 DQoJCXRoaXMu
Y3JlYXRlKCk7DQoJCXRoaXMub3BlbigpOw0KCQlEaXNwbGF5LmdldEN1cnJl bnQoKS5kaXNw
b3NlKCk7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5n W10gYXJncykg
ew0KCQluZXcgVGVzdENhc2UoKTsNCgl9DQoNCglwcm90ZWN0ZWQgQ29udHJv bCBjcmVhdGVD
b250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQoJCUNvbXBvc2l0ZSBjb21w b3NpdGUgPSBu
ZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KCQljb21wb3NpdGUu c2V0TGF5b3V0
KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsNCg0KCQlCdXR0b24gc2hvdyA9 IG5ldyBCdXR0
b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7DQoJCXNob3cuc2V0VGV4dCgiU2hv dyB0aGUgcHJv
YmxlbSA6KSIpOw0KDQoJCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50Lmdl dFNoZWxsKCk7
DQoNCgkJc2hvdy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9u QWRhcHRlcigp
IHsNCg0KCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9u RXZlbnQgZXZl
bnQpIHsNCgkJCQkvLyBDcmVhdGUgYW5kIHNob3cgdGhlIGRpYWxvZw0KCQkJ CUJhY2t1cERp
YWxvZyBiYWNrdXBEaWFsb2cgPSBuZXcgQmFja3VwRGlhbG9nKHNoZWxsKTsN CgkJCQliYWNr
dXBEaWFsb2cub3BlbigpOw0KCQkJfQ0KCQl9KTsNCg0KCQlwYXJlbnQucGFj aygpOw0KCQly
ZXR1cm4gY29tcG9zaXRlOw0KCX0NCg0KfQ0KDQpjbGFzcyBCYWNrdXBEaWFs b2cgZXh0ZW5k
cyBUaXRsZUFyZWFEaWFsb2cgew0KDQoJcHJpdmF0ZSBib29sZWFuIGJhY2t1 cElzU2VsZWN0
ZWQ7DQoNCglwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsNCg0KCXB1Ymxp YyBCYWNrdXBE
aWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsNCgkJc3VwZXIocGFyZW50U2hl bGwpOw0KCQl0
aGlzLmNyZWF0ZSgpOw0KCQl0aGlzLnNldFRpdGxlKCJCYWNrdXBzIC0gT3Zl cnZpZXciKTsN
CgkJdGhpcy5zZXRNZXNzYWdlKCJCZWxvdyBpcyBhIGxpc3Qgb2YgYWxsIGJh Y2t1cHMgdGhh
dCB5b3UgaGF2ZSBtYWRlLiIpOw0KCQkvLyB0aGlzLnNldFRpdGxlSW1hZ2Uo SW1hZ2VzLmdl
dEJhY2t1cEltYWdlKCkpOw0KCX0NCg0KCUBPdmVycmlkZQ0KCXByb3RlY3Rl ZCBDb250cm9s
IGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgew0KCQlGb3Jt VG9vbGtpdCB0
b29sa2l0ID0gbmV3IEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkp Ow0KDQoJCUNv
bXBvc2l0ZSBjb250YWluZXIgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShw YXJlbnQpOw0K
CQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNl KTsNCgkJY29u
dGFpbmVyLnNldExheW91dChsYXlvdXQpOw0KCQlHcmlkRGF0YSBjb250YWlu ZXJHcmlkRGF0
YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJ TEwNCgkJCQl8
IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFC X0hPUklaT05U
QUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsNCgkJY29udGFpbmVyLnNl dExheW91dERh
dGEoY29udGFpbmVyR3JpZERhdGEpOw0KDQoJCVRhYmxlIHRhYmxlID0gdG9v bGtpdC5jcmVh
dGVUYWJsZShjb250YWluZXIsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9M TA0KCQkJCXwg
U1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlNJTkdMRSk7DQoJCUdyaWREYXRh IHRhYmxlR3Jp
ZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElH Tl9GSUxMDQoJ
CQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEu R1JBQl9IT1JJ
Wk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7DQoJCXRhYmxlLnNl dExheW91dERh
dGEodGFibGVHcmlkRGF0YSk7DQoJCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0 cnVlKTsNCgkJ
dGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCg0KCQl2aWV3ZXIgPSBu ZXcgVGFibGVW
aWV3ZXIodGFibGUpOw0KCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5l dyBCYWNrdXBE
aWFsb2dDb250ZW50UHJvdmlkZXIoKSk7DQoNCgkJVGFibGVWaWV3ZXJDb2x1 bW4gYmFja3Vw
TmFtZUNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbih2aWV3ZXIsIFNX VC5OT05FKTsN
CgkJYmFja3VwTmFtZUNvbHVtbi5nZXRDb2x1bW4oKS5zZXRUZXh0KCImTmFt ZSIpOw0KCQli
YWNrdXBOYW1lQ29sdW1uLmdldENvbHVtbigpLnNldFdpZHRoKDI0MCk7DQoJ CWJhY2t1cE5h
bWVDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQmFja3VwRGlhbG9nQ29s dW1uTGFiZWxQ
cm92aWRlcigwKSk7DQoNCgkJVGFibGVWaWV3ZXJDb2x1bW4gYmFja3VwRGF0 ZUNvbHVtbiA9
IG5ldyBUYWJsZVZpZXdlckNvbHVtbih2aWV3ZXIsIFNXVC5OT05FKTsNCgkJ YmFja3VwRGF0
ZUNvbHVtbi5nZXRDb2x1bW4oKS5zZXRUZXh0KCImRGF0ZSIpOw0KCQliYWNr dXBEYXRlQ29s
dW1uLmdldENvbHVtbigpLnNldFdpZHRoKDgwKTsNCgkJYmFja3VwRGF0ZUNv bHVtbi5zZXRM
YWJlbFByb3ZpZGVyKG5ldyBCYWNrdXBEaWFsb2dDb2x1bW5MYWJlbFByb3Zp ZGVyKDEpKTsN
Cg0KCQlUYWJsZVZpZXdlckNvbHVtbiBiYWNrdXBUaW1lQ29sdW1uID0gbmV3 IFRhYmxlVmll
d2VyQ29sdW1uKHZpZXdlciwgU1dULk5PTkUpOw0KCQliYWNrdXBUaW1lQ29s dW1uLmdldENv
bHVtbigpLnNldFRleHQoIiZUaW1lIik7DQoJCWJhY2t1cFRpbWVDb2x1bW4u Z2V0Q29sdW1u
KCkuc2V0V2lkdGgoODApOw0KCQliYWNrdXBUaW1lQ29sdW1uLnNldExhYmVs UHJvdmlkZXIo
bmV3IEJhY2t1cERpYWxvZ0NvbHVtbkxhYmVsUHJvdmlkZXIoMikpOw0KDQoJ CUJhY2t1cENv
bnRyb2xsZXIgYmFja3VwQ29udHJvbGxlciA9IEJhY2t1cENvbnRyb2xsZXIu Z2V0SW5zdGFu
Y2UoKTsNCgkJYmFja3VwQ29udHJvbGxlci5zZXRUYWJsZVZpZXdlcih2aWV3 ZXIpOw0KCQli
YWNrdXBDb250cm9sbGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsN CgkJQmFja3Vw
W10gYmFja3VwcyA9IGJhY2t1cENvbnRyb2xsZXIuZ2V0QmFja3VwTW9kZWwo KS5nZXRCYWNr
dXBzKCk7DQoNCgkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5l cihuZXcgSVNl
bGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCg0KCQkJQE92ZXJyaWRlDQoJ CQlwdWJsaWMg
dm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBz Y2UpIHsNCgkJ
CQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVy ZWRTZWxlY3Rp
b24pIHNjZS5nZXRTZWxlY3Rpb24oKTsNCgkJCQlpZihzZWxlY3Rpb24gPT0g bnVsbCkgew0K
CQkJCQliYWNrdXBJc1NlbGVjdGVkID0gZmFsc2U7DQoJCQkJfQ0KCQkJCWVs c2Ugew0KCQkJ
CQlCYWNrdXAgYmFja3VwID0gKEJhY2t1cCkgc2VsZWN0aW9uLmdldEZpcnN0 RWxlbWVudCgp
Ow0KCQkJCQlWYXJpYWJsZXNTdG9yZS5zZXRCYWNrdXBTY3JpcHQoYmFja3Vw LmdldE5hbWUo
KSk7DQoJCQkJCWJhY2t1cElzU2VsZWN0ZWQgPSB0cnVlOw0KCQkJCX0NCgkJ CX0NCgkJfSk7
DQoNCgkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7DQoJCXZpZXdl ci5zZXRJbnB1
dChiYWNrdXBzKTsNCg0KCQlyZXR1cm4gY29udGFpbmVyOw0KCX0NCg0KCUBP dmVycmlkZQ0K
CXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsNCgkJaWYoYmFja3VwSXNT ZWxlY3RlZCkN
CgkJCXRoaXMuY2xvc2UoKTsNCgkJLy8gZWxzZQ0KCQkvLyB0aGlzLnNldEVy cm9yTWVzc2Fn
ZSgiUGxlYXNlIHNlbGVjdCBhIGJhY2t1cCIpOw0KCX0NCg0KCUBPdmVycmlk ZQ0KCXByb3Rl
Y3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRl IHBhcmVudCkg
ew0KCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIDEyMzQ1Njc4OSwgIkRl bGV0ZSIsIGZh
bHNlKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcigNCgkJCQluZXcgQmFja3VwTGlz dGVuZXIoMTIz
NDU2Nzg5KSk7DQoJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgMTQ3ODUy MzY5LCAiRGVs
ZXRlIGFsbCIsIGZhbHNlKS5hZGRTZWxlY3Rpb25MaXN0ZW5lcigNCgkJCQlu ZXcgQmFja3Vw
TGlzdGVuZXIoMTQ3ODUyMzY5KSk7DQoJCXRoaXMuY3JlYXRlQnV0dG9uKHBh cmVudCwgSURp
YWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJF TCwgZmFsc2Up
Ow0KCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFu dHMuQ0FOQ0VM
X0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgdHJ1ZSk7DQoN Cgl9DQp9DQoN
CmNsYXNzIEJhY2t1cERpYWxvZ0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRz IElTdHJ1Y3R1
cmVkQ29udGVudFByb3ZpZGVyIHsNCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyBP YmplY3RbXSBn
ZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsNCgkJQmFja3VwW10gYmFja3Vw cyA9IChCYWNr
dXBbXSkgaW5wdXQ7DQoJCXJldHVybiBiYWNrdXBzOw0KCX0NCg0KCUBPdmVy cmlkZQ0KCXB1
YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQoJCUJhY2t1cENvbnRyb2xsZXIuZ2V0 SW5zdGFuY2Uo
KS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7DQoJCUJhY2t1cENv bnRyb2xsZXIu
Z2V0SW5zdGFuY2UoKS5jbGVhcigpOw0KCQlCYWNrdXBDb250cm9sbGVyLmdl dEluc3RhbmNl
KCkucmVmcmVzaCgpOw0KCX0NCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lk IGlucHV0Q2hh
bmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSB7 DQoJfQ0KDQp9
DQoNCmNsYXNzIEJhY2t1cERpYWxvZ0NvbHVtbkxhYmVsUHJvdmlkZXIgZXh0 ZW5kcyBDb2x1
bW5MYWJlbFByb3ZpZGVyIHsNCg0KCXByaXZhdGUgaW50IGNvbHVtbkluZGV4 Ow0KDQoJcHVi
bGljIEJhY2t1cERpYWxvZ0NvbHVtbkxhYmVsUHJvdmlkZXIoaW50IGNvbHVt bkluZGV4KSB7
DQoJCXN1cGVyKCk7DQoJCXRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRl eDsNCgl9DQoN
CglAT3ZlcnJpZGUNCglwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVs ZW1lbnQpIHsN
CgkJLy8gSW1hZ2UgaW1hZ2UgPSBJY29ucy5nZXRCYWNrdXAoKTsNCgkJc3dp dGNoKGNvbHVt
bkluZGV4KSB7DQoJCQljYXNlIDA6DQoJCQkJLy8gcmV0dXJuIGltYWdlOw0K CQkJCXJldHVy
biBudWxsOw0KDQoJCQljYXNlIDE6DQoJCQkJcmV0dXJuIG51bGw7DQoNCgkJ CWNhc2UgMjoN
CgkJCQlyZXR1cm4gbnVsbDsNCgkJfQ0KCQlyZXR1cm4gbnVsbDsNCgl9DQoN CglAT3ZlcnJp
ZGUNCglwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsN CgkJQmFja3Vw
IGJhY2t1cCA9IChCYWNrdXApIGVsZW1lbnQ7DQoJCXN3aXRjaChjb2x1bW5J bmRleCkgew0K
CQkJY2FzZSAwOg0KCQkJCXJldHVybiBiYWNrdXAuZ2V0TmFtZSgpOw0KDQoJ CQljYXNlIDE6
DQoJCQkJcmV0dXJuIGJhY2t1cC5nZXREYXRlKCk7DQoNCgkJCWNhc2UgMjoN CgkJCQlyZXR1
cm4gYmFja3VwLmdldFRpbWUoKTsNCgkJfQ0KCQlyZXR1cm4gbnVsbDsNCgl9 DQoNCn0NCg0K
Y2xhc3MgQmFja3VwTW9kZWwgew0KDQoJcHJpdmF0ZSBMaXN0PEJhY2t1cD4g YmFja3VwczsN
Cg0KCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hh bmdlU3VwcG9y
dDsNCg0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRk IjsNCg0KCXBy
aXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsN Cg0KCXB1Ymxp
YyBCYWNrdXBNb2RlbCgpIHsNCgkJYmFja3VwcyA9IG5ldyBBcnJheUxpc3Q8 QmFja3VwPigp
Ow0KCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFu Z2VTdXBwb3J0
KHRoaXMpOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHBvcHVsYXRlQmFja3VwTW9k ZWwoQmFja3Vw
W10gYmFja3VwQXJyYXkpIHsNCgkJaWYoYmFja3VwcyA9PSBudWxsKSB7DQoJ CQliYWNrdXBz
ID0gbmV3IEFycmF5TGlzdDxCYWNrdXA+KCk7DQoJCX0NCgkJaWYoYmFja3Vw QXJyYXkgPT0g
bnVsbCkgew0KCQkJcmV0dXJuOw0KCQl9DQoJCWVsc2Ugew0KCQkJZm9yKEJh Y2t1cCBiYWNr
dXAgOiBiYWNrdXBBcnJheSkgew0KCQkJCWFkZEJhY2t1cChiYWNrdXApOw0K CQkJfQ0KCQl9
DQoJfQ0KDQoJcHVibGljIHZvaWQgYWRkQmFja3VwKEJhY2t1cCBiYWNrdXAp IHsNCgkJYmFj
a3Vwcy5hZGQoYmFja3VwKTsNCgkJcHJvcGVydHlDaGFuZ2VTdXBwb3J0LmZp cmVQcm9wZXJ0
eUNoYW5nZShBREQsIG51bGwsIGJhY2t1cCk7DQoJfQ0KDQoJcHVibGljIHZv aWQgcmVtb3Zl
QmFja3VwKEJhY2t1cCBiYWNrdXApIHsNCgkJYmFja3Vwcy5yZW1vdmUoYmFj a3VwKTsNCgkJ
cHJvcGVydHlDaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZShSRU1P VkUsIGJhY2t1
cCwgbnVsbCk7DQoJfQ0KDQoJcHVibGljIHZvaWQgY2xlYXJCYWNrdXBNb2Rl bCgpIHsNCgkJ
YmFja3Vwcy5jbGVhcigpOw0KCX0NCg0KCXB1YmxpYyBCYWNrdXBbXSBnZXRC YWNrdXBzKCkg
ew0KCQlyZXR1cm4gYmFja3Vwcy50b0FycmF5KG5ldyBCYWNrdXBbYmFja3Vw cy5zaXplKCld
KTsNCgl9DQoNCglwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3Rl bmVyKFByb3Bl
cnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgew0K CQlwcm9wZXJ0
eUNoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9w ZXJ0eUNoYW5n
ZUxpc3RlbmVyKTsNCgl9DQoNCglwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0 eUNoYW5nZUxp
c3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VM aXN0ZW5lcikg
ew0KCQlwcm9wZXJ0eUNoYW5nZVN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFu Z2VMaXN0ZW5l
cihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsNCgl9DQoNCn0NCg0KY2xhc3Mg QmFja3VwIHsN
Cg0KCXByaXZhdGUgU3RyaW5nIG5hbWU7DQoNCglwcml2YXRlIFN0cmluZyBk YXRlOw0KDQoJ
cHJpdmF0ZSBTdHJpbmcgdGltZTsNCg0KCXB1YmxpYyBCYWNrdXAoKSB7DQoJ CXN1cGVyKCk7
DQoJfQ0KDQoJcHVibGljIEJhY2t1cChTdHJpbmcgbmFtZSwgU3RyaW5nIGRh dGUsIFN0cmlu
ZyB0aW1lKSB7DQoJCXRoaXMubmFtZSA9IG5hbWU7DQoJCXRoaXMuZGF0ZSA9 IGRhdGU7DQoJ
CXRoaXMudGltZSA9IHRpbWU7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRO YW1lKCkgew0K
CQlyZXR1cm4gdGhpcy5uYW1lOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNldE5h bWUoU3RyaW5n
IG5hbWUpIHsNCgkJdGhpcy5uYW1lID0gbmFtZTsNCgl9DQoNCglwdWJsaWMg U3RyaW5nIGdl
dERhdGUoKSB7DQoJCXJldHVybiB0aGlzLmRhdGU7DQoJfQ0KDQoJcHVibGlj IHZvaWQgc2V0
RGF0ZShTdHJpbmcgZGF0ZSkgew0KCQl0aGlzLmRhdGUgPSBkYXRlOw0KCX0N Cg0KCXB1Ymxp
YyBTdHJpbmcgZ2V0VGltZSgpIHsNCgkJcmV0dXJuIHRoaXMudGltZTsNCgl9 DQoNCglwdWJs
aWMgdm9pZCBzZXRUaW1lKFN0cmluZyB0aW1lKSB7DQoJCXRoaXMudGltZSA9 IHRpbWU7DQoJ
fQ0KDQp9DQoNCmNsYXNzIEJhY2t1cENvbnRyb2xsZXIgew0KDQoJcHJpdmF0 ZSBzdGF0aWMg
QmFja3VwQ29udHJvbGxlciBiYWNrdXBDb250cm9sbGVyOw0KDQoJcHJpdmF0 ZSBCYWNrdXBN
b2RlbCBiYWNrdXBNb2RlbDsNCg0KCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFi bGVWaWV3ZXI7
DQoNCglwcml2YXRlIEJhY2t1cFtdIGJhY2t1cHM7DQoNCglwcml2YXRlIFBy b3BlcnR5Q2hh
bmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsNCg0KCXByaXZh dGUgc3RhdGlj
IGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgICI7DQoNCglwcml2YXRlIEJhY2t1 cENvbnRyb2xs
ZXIoKSB7DQoJCXN1cGVyKCk7DQoJCWJhY2t1cE1vZGVsID0gbmV3IEJhY2t1 cE1vZGVsKCk7
DQoJCWJhY2t1cHMgPSBnZXRCYWNrdXBzKCk7DQoJCWJhY2t1cE1vZGVsLnBv cHVsYXRlQmFj
a3VwTW9kZWwoYmFja3Vwcyk7DQoJfQ0KDQoJcHVibGljIHZvaWQgc2V0QmFj a3VwTW9kZWwo
QmFja3VwTW9kZWwgYmFja3VwTW9kZWwpIHsNCgkJdGhpcy5iYWNrdXBNb2Rl bCA9IGJhY2t1
cE1vZGVsOw0KCX0NCg0KCXB1YmxpYyBCYWNrdXBNb2RlbCBnZXRCYWNrdXBN b2RlbCgpIHsN
CgkJcmV0dXJuIGJhY2t1cE1vZGVsOw0KCX0NCg0KCXB1YmxpYyB2b2lkIHNl dFRhYmxlVmll
d2VyKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7DQoJCXRoaXMudGFibGVW aWV3ZXIgPSB0
YWJsZVZpZXdlcjsNCgl9DQoNCglwdWJsaWMgVGFibGVWaWV3ZXIgZ2V0VGFi bGVWaWV3ZXIo
KSB7DQoJCXJldHVybiB0YWJsZVZpZXdlcjsNCgl9DQoNCglwdWJsaWMgdm9p ZCByZW1vdmVC
YWNrdXAoU3RyaW5nIGJhY2t1cE5hbWUpIHsNCgkJZm9yKEJhY2t1cCBiYWNr dXAgOiBiYWNr
dXBzKSB7DQoJCQlTdHJpbmcgdGVtcEJhY2t1cE5hbWUgPSBiYWNrdXAuZ2V0 TmFtZSgpLnRy
aW0oKTsNCgkJCWlmKHRlbXBCYWNrdXBOYW1lLmVxdWFscyhiYWNrdXBOYW1l KSkgew0KCQkJ
CWJhY2t1cE1vZGVsLnJlbW92ZUJhY2t1cChiYWNrdXApOw0KCQkJCWJyZWFr Ow0KCQkJfQ0K
CQl9DQoJfQ0KDQoJcHJpdmF0ZSBCYWNrdXBbXSBnZXRCYWNrdXBzKCkgew0K CQkvLyBCYWNr
dXBbXSB0ZW1wQmFja3VwcyA9IG51bGw7DQoJCS8vIFN0cmluZyBwYXRoID0g VmFyaWFibGVz
U3RvcmUuZ2V0QmFja3VwRm9sZGVyTG9jYXRpb24oKTsNCgkJLy8gRmlsZSBm b2xkZXIgPSBu
ZXcgRmlsZShwYXRoKTsNCgkJLy8gRmlsZVtdIGZpbGVzID0gZm9sZGVyLmxp c3RGaWxlcygp
Ow0KCQkvLyBpZihmaWxlcyA9PSBudWxsKSB7DQoJCS8vIHJldHVybiBudWxs Ow0KCQkvLyB9
DQoJCS8vIGlmKGJhY2t1cHMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPT0g YmFja3Vwcy5s
ZW5ndGgpIHsNCgkJLy8gcmV0dXJuIGJhY2t1cHM7DQoJCS8vIH0NCgkJLy8g ZWxzZSB7DQoJ
CS8vIHRlbXBCYWNrdXBzID0gbmV3IEJhY2t1cFtmaWxlcy5sZW5ndGhdOw0K CQkvLyBEYXRl
IGRhdGUgPSBuZXcgRGF0ZSgpOw0KCQkvLyBGb3JtYXQgZGF0ZUZvcm1hdHRl ciA9IG5ldyBT
aW1wbGVEYXRlRm9ybWF0KCJkZC5NTS55eSIpOw0KCQkvLyBGb3JtYXQgdGlt ZUZvcm1hdHRl
ciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzcyIpOw0KCQkvLyBm b3IoaW50IGkg
PSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsNCgkJLy8gRmlsZSBmaWxl ID0gZmlsZXNb
aV07DQoJCS8vIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7DQoJCS8v IGRhdGUuc2V0
VGltZShmaWxlLmxhc3RNb2RpZmllZCgpKTsNCgkJLy8gQmFja3VwIGJhY2t1 cCA9IG5ldyBC
YWNrdXAoU1BBQ0UgKyBuYW1lLCBkYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRl KSwNCgkJLy8g
dGltZUZvcm1hdHRlcg0KCQkvLyAuZm9ybWF0KGRhdGUpKTsNCgkJLy8gdGVt cEJhY2t1cHNb
aV0gPSBiYWNrdXA7DQoJCS8vIH0NCgkJLy8gfQ0KCQlCYWNrdXBbXSB0ZW1w QmFja3VwcyA9
IG5ldyBCYWNrdXBbNV07DQoJCUJhY2t1cCBiYWNrdXAgPSBudWxsOw0KCQlm b3IoaW50IGkg
PSAwOyBpIDwgNTsgaSsrKSB7DQoJCQliYWNrdXAgPSBuZXcgQmFja3VwKFN0 cmluZy52YWx1
ZU9mKE1hdGgucmFuZG9tKCkpLCBTdHJpbmcudmFsdWVPZihNYXRoLnJhbmRv bSgpKSwNCgkJ
CQkJU3RyaW5nLnZhbHVlT2YoTWF0aC5yYW5kb20oKSkpOw0KCQkJdGVtcEJh Y2t1cHNbaV0g
PSBiYWNrdXA7DQoJCX0NCgkJcmV0dXJuIHRlbXBCYWNrdXBzOw0KCX0NCg0K CXB1YmxpYyB2
b2lkIGNsZWFyKCkgew0KCQliYWNrdXBNb2RlbC5jbGVhckJhY2t1cE1vZGVs KCk7DQoJfQ0K
DQoJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsNCgkJYmFja3VwcyA9IGdldEJh Y2t1cHMoKTsN
CgkJYmFja3VwTW9kZWwucG9wdWxhdGVCYWNrdXBNb2RlbChiYWNrdXBzKTsN Cgl9DQoNCglw
dWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7DQoJfQ0KDQoJcHVibGljIHZvaWQg YWRkUHJvcGVy
dHlDaGFuZ2VMaXN0ZW5lcigpIHsNCgkJcHJvcGVydHlDaGFuZ2VMaXN0ZW5l ciA9IG5ldyBQ
cm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgew0KDQoJCQlAT3ZlcnJpZGUNCgkJ CXB1YmxpYyB2
b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7 DQoJCQkJdGFi
bGVWaWV3ZXIucmVmcmVzaChudWxsLCBmYWxzZSk7DQoJCQkJU3lzdGVtLm91 dC5wcmludGxu
KCIjcHJvcGVydHlDaGFuZ2UoKSBpbnZva2VkIik7DQoJCQl9DQoNCgkJfTsN CgkJYmFja3Vw
TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5n ZUxpc3RlbmVy
KTsNCgl9DQoNCglwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxp c3RlbmVyKCkg
ew0KCQliYWNrdXBNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVy KHByb3BlcnR5
Q2hhbmdlTGlzdGVuZXIpOw0KCX0NCg0KCXB1YmxpYyBzdGF0aWMgQmFja3Vw Q29udHJvbGxl
ciBnZXRJbnN0YW5jZSgpIHsNCgkJaWYoYmFja3VwQ29udHJvbGxlciA9PSBu dWxsKSB7DQoJ
CQliYWNrdXBDb250cm9sbGVyID0gbmV3IEJhY2t1cENvbnRyb2xsZXIoKTsN CgkJfQ0KCQly
ZXR1cm4gYmFja3VwQ29udHJvbGxlcjsNCgl9DQoNCn0NCg0KY2xhc3MgQmFj a3VwTGlzdGVu
ZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7DQoNCglwcml2YXRl IGludCBidXR0
b25JZDsNCg0KCXB1YmxpYyBCYWNrdXBMaXN0ZW5lcihpbnQgYnV0dG9uSWQp IHsNCgkJc3Vw
ZXIoKTsNCgkJdGhpcy5idXR0b25JZCA9IGJ1dHRvbklkOw0KCX0NCg0KCUBP dmVycmlkZQ0K
CXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25F dmVudCBlKSB7
DQoJfQ0KDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0 ZWQoU2VsZWN0
aW9uRXZlbnQgZSkgew0KCQlTdHJpbmcgcGF0aCA9ICIiOw0KCQlzd2l0Y2go YnV0dG9uSWQp
IHsNCgkJCWNhc2UgMTIzNDU2Nzg5Og0KCQkJCXBhdGggPSBWYXJpYWJsZXNT dG9yZS5nZXRC
YWNrdXBTY3JpcHQoKTsNCgkJCQkvLyBpZihwYXRoID09IG51bGwgfHwgcGF0 aC5pc0VtcHR5
KCkpIHsNCgkJCQkvLyBicmVhazsNCgkJCQkvLyB9DQoJCQkJRmlsZSBmaWxl ID0gbmV3IEZp
bGUocGF0aCk7DQoJCQkJQmFja3VwQ29udHJvbGxlci5nZXRJbnN0YW5jZSgp LnJlbW92ZUJh
Y2t1cChmaWxlLmdldE5hbWUoKSk7DQoJCQkJLy8gYm9vbGVhbiB3YXNEZWxl dGVkID0gZmls
ZS5kZWxldGUoKTsNCgkJCQkvLyBpZih3YXNEZWxldGVkKSB7DQoJCQkJLy8g U3RhdHVzTWFu
YWdlci5nZXRJbnN0YW5jZSgpLnNldFN0YXR1cygiQmFja3VwIHN1Y2Nlc3Nm dWxseSBkZWxl
dGVkIiwNCgkJCQkvLyBmYWxzZSk7DQoJCQkJLy8gfQ0KCQkJCS8vIGVsc2Ug ew0KCQkJCS8v
IFN0YXR1c01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRTdGF0dXMoDQoJCQkJ Ly8gIkVycm9y
IHdoaWxlIGRlbGV0aW5nIHRoZSBzcGVjaWZpZWQgYmFja3VwIiwgdHJ1ZSk7 DQoJCQkJLy8g
fQ0KCQkJCWJyZWFrOw0KDQoJCQljYXNlIDE0Nzg1MjM2OToNCgkJCQkvLyBO b3QgaW1wbGVt
ZW50ZWQgeWV0DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQoNCn0NCg0KYWJzdHJh Y3QgY2xhc3Mg
VmFyaWFibGVzU3RvcmUgew0KDQoJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJh Y2t1cFNjcmlw
dDsNCg0KCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCYWNrdXBTY3JpcHQoU3Ry aW5nIGJhY2t1
cFNjcmlwdCkgew0KCQlWYXJpYWJsZXNTdG9yZS5iYWNrdXBTY3JpcHQgPSBi YWNrdXBTY3Jp
cHQ7DQoJfQ0KDQoJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFja3VwU2Ny aXB0KCkgew0K
CQlyZXR1cm4gYmFja3VwU2NyaXB0Ow0KCX0NCg0KfQ==
--------------040600050605050102020006--
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #4290 is a reply to message #4219] Wed, 13 May 2009 07:59 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Hi,

Ok there are multiple problems:

a) The most import is that you are passing a copy of your backups to the
viewer

Backup[] backups = backupController.getBackupModel().getBackups();

// ....

viewer.setInput(backups);


You are passing an array instance as the input when removing an item you
are not modifying the array you just passed in but it origin!

You should fix this with:

viewer.setInput(backupController.getBackupModel());

and rewrite your BackupDialogContentProvider:

public Object[] getElements(Object input) {
return ((BackupModel)input).getBackups();
}


b) Your selection check is wrong - you need to check for empty

> public void selectionChanged(SelectionChangedEvent sce) {
> IStructuredSelection selection = (IStructuredSelection) sce.getSelection();
> if(selection.isEmpty()) {
> backupIsSelected = false;
> }
> else {
> Backup backup = (Backup) selection.getFirstElement();
> VariablesStore.setBackupScript(backup.getName());
> backupIsSelected = true;
> }
> }


c) Your refresh code is not making sense:

> public void propertyChange(PropertyChangeEvent evt) {
> tableViewer.refresh();
> System.out.println("#propertyChange() invoked");
> }

Tom

Lars Bischoff schrieb:
> Hello Tom,
>
> I created now a test-case. Since it has approximately 500 rows, I
> attached it as file.
>
> /Lars
>
>
>
> Tom Schindl schrieb:
>> Hi,
>>
>> Without code you execute I can't say anything. When making structural
>> changes you are supposed to call refresh() and or viewer.remove(Object).
>> In case of remove the viewer will remove the item from the control (it
>> leaves you model unchanged) and in case of refresh() it rebuilds the
>> viewer completely from the stuff it gets from the content-provider.
>>
>> Tom
>>
>> Lars Bischoff schrieb:
>>> Hmm it seems that I cheered to early... :-$
>>>
>>> I have implemented now a delete button where i can delete backups (=
>>> rows) from the table. Before posting here, I asked Google, etc. but I
>>> only found solutions for problems I don't have :-)
>>>
>>> Changes to my model work quite fine, the PropertyChangeListener becomes
>>> invoked and afterwards the ContentProvider (#getElements()) as well as
>>> the ColumnLabelProvider are invoked too. However, the UI does not
>>> update. The only way it updates is if I close the modal dialog and
>>> reopen it, but this is not the way it is ought to be.
>>>
>>> Best regards,
>>> Lars
>
Re: NPE upon the invocation of a TableViewer's #setInput() method [message #4358 is a reply to message #4290] Wed, 13 May 2009 08:32 Go to previous message
Lars Bischoff is currently offline Lars BischoffFriend
Messages: 13
Registered: July 2009
Junior Member
Thanks a lot, that did the trick!
I derived the code basically from my Navigator-Tree, which obviously
caused some problems.

Best regards,
Lars



Tom Schindl schrieb:
> Hi,
>
> Ok there are multiple problems:
>
> a) The most import is that you are passing a copy of your backups to the
> viewer
>
> Backup[] backups = backupController.getBackupModel().getBackups();
>
> // ....
>
> viewer.setInput(backups);
>
>
> You are passing an array instance as the input when removing an item you
> are not modifying the array you just passed in but it origin!
>
> You should fix this with:
>
> viewer.setInput(backupController.getBackupModel());
>
> and rewrite your BackupDialogContentProvider:
>
> public Object[] getElements(Object input) {
> return ((BackupModel)input).getBackups();
> }
>
>
> b) Your selection check is wrong - you need to check for empty
>
>> public void selectionChanged(SelectionChangedEvent sce) {
>> IStructuredSelection selection = (IStructuredSelection) sce.getSelection();
>> if(selection.isEmpty()) {
>> backupIsSelected = false;
>> }
>> else {
>> Backup backup = (Backup) selection.getFirstElement();
>> VariablesStore.setBackupScript(backup.getName());
>> backupIsSelected = true;
>> }
>> }
>
>
> c) Your refresh code is not making sense:
>
>> public void propertyChange(PropertyChangeEvent evt) {
>> tableViewer.refresh();
>> System.out.println("#propertyChange() invoked");
>> }
>
> Tom
>
> Lars Bischoff schrieb:
>> Hello Tom,
>>
>> I created now a test-case. Since it has approximately 500 rows, I
>> attached it as file.
>>
>> /Lars
>>
>>
>>
>> Tom Schindl schrieb:
>>> Hi,
>>>
>>> Without code you execute I can't say anything. When making structural
>>> changes you are supposed to call refresh() and or viewer.remove(Object).
>>> In case of remove the viewer will remove the item from the control (it
>>> leaves you model unchanged) and in case of refresh() it rebuilds the
>>> viewer completely from the stuff it gets from the content-provider.
>>>
>>> Tom
>>>
>>> Lars Bischoff schrieb:
>>>> Hmm it seems that I cheered to early... :-$
>>>>
>>>> I have implemented now a delete button where i can delete backups (=
>>>> rows) from the table. Before posting here, I asked Google, etc. but I
>>>> only found solutions for problems I don't have :-)
>>>>
>>>> Changes to my model work quite fine, the PropertyChangeListener becomes
>>>> invoked and afterwards the ContentProvider (#getElements()) as well as
>>>> the ColumnLabelProvider are invoked too. However, the UI does not
>>>> update. The only way it updates is if I close the modal dialog and
>>>> reopen it, but this is not the way it is ought to be.
>>>>
>>>> Best regards,
>>>> Lars
Previous Topic:TableLayout and resize column
Next Topic:Re: Jump into first cell of Table
Goto Forum:
  


Current Time: Thu Mar 28 18:25:08 GMT 2024

Powered by FUDForum. Page generated in 0.04584 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top