Hi,
I have a problem with the columns of a table. I wrote an RCP-Application
and get a NullPointerException when closing this Application. Here is
the Code I wrote, followed by the Stacktrace of the Exception:
public class PartDetailsPage implements IDetailsPage {
String[] units = UnitLoader.getInstance().getUnitsAsString();
protected static final Logger log =
Logger.getLogger(PartDetailsPage.class);
class PartsContentProvider implements IStructuredContentProvider {
protected final Logger log = Logger
.getLogger(PartsContentProvider.class);
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Part) {
Part part = (Part)inputElement;
Object[] returnObjectArray =
part.getIngredients().toArray();
return returnObjectArray;
}
log.error("getElements returns with null!");
return new Object[0];
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object
newInput) {
viewer.refresh();
}
}
class PartsLabelProvider extends LabelProvider implements
ITableLabelProvider {
protected final Logger log =
Logger.getLogger(PartsLabelProvider.class);
public Image getColumnImage(Object element, int columnIndex) {
Image returnImage = null;
switch (columnIndex) {
case 0: returnImage = returnImage =
CorePlugin.getDefault().getImage(
CorePlugin.IMG_FOOD);
break;
}
return returnImage;
}
public String getColumnText(Object element, int columnIndex) {
if (!(element instanceof Ingredient)) return "";
Ingredient ing = (Ingredient)element;
String returnString = "";
switch (columnIndex) {
case 0: returnString = ing.getAmount(); break;
case 1: returnString = ing.getUnit().getId(); break;
case 2: returnString =
ing.getFood().getFood().toString(ing.getAmount());
}
return returnString;
}
}
class IngredientCellModifier implements ICellModifier {
public boolean canModify(Object element, String property) {
if (element instanceof Ingredient) {
int index =
Arrays.asList(ingredientViewer.getColumnProperties())
.indexOf(property);
switch (index) {
case 0:
return true;
case 1:
return true;
case 2:
return false;
}
}
if (element instanceof String) return true;
return false;
}
public Object getValue(Object element, String property) {
if (element instanceof Ingredient) {
Ingredient ing = (Ingredient) element;
int index =
Arrays.asList(ingredientViewer.getColumnProperties())
.indexOf(property);
switch (index) {
case 0:
return ing.getAmount();
case 1:
for (int i =0; i<units.length; i++ ) {
if (units[i].equals(ing.getUnit().getId()))
return new Integer(i);
}
return new Integer(0);
case 2:
return
ing.getFood().getFood().toString(ing.getAmount());
}
}
return null;
}
public void modify(Object element, String property, Object value) {
Ingredient ing = (Ingredient) ((TableItem) element)
.getData();
int index =
Arrays.asList(ingredientViewer.getColumnProperties())
.indexOf(property);
SimpleDateFormat sdf = new SimpleDateFormat(Messages
.getString("dateFormat")); //$NON-NLS-1$
switch (index) {
case 0:
ing.setAmount(value.toString());
break;
case 1:
ing.setUnit(UnitLoader.getInstance().loadUnit(units[((Integer)value).intValue()]));
break;
case 2: break;
}
ingredientViewer.refresh(true);
}
}
private IManagedForm mform;
private Part input;
private TableViewer ingredientViewer;
private Text steps;
public PartDetailsPage() {
super();
}
public void createContents(final Composite parent) {
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = 5;
layout.marginWidth = 5;
parent.setLayout(layout);
FormToolkit toolkit = mform.getToolkit();
final Section s1 = toolkit.createSection(parent, Section.EXPANDED |
Section.COMPACT | Section.TWISTIE);
s1.marginWidth = 10;
s1.marginHeight = 10;
s1.setText("Ingredients");
s1.setDescription("Insert all the properties for one part of the
recipe");
s1.addExpansionListener(new IExpansionListener() {
public void expansionStateChanging(ExpansionEvent e) {
}
public void expansionStateChanged(ExpansionEvent e) {
if (!(s1.isExpanded())) {
parent.pack();
}
}
});
GridData gd = new GridData(GridData.FILL_BOTH);
s1.setLayoutData(gd);
toolkit.createCompositeSeparator(s1);
Composite client = toolkit.createComposite(s1);
GridLayout glayout = new GridLayout(2,false);
glayout.marginWidth = glayout.marginHeight = 5;
glayout.verticalSpacing=5;
glayout.numColumns = 2;
client.setLayout(glayout);
Table t = toolkit.createTable(client,SWT.SINGLE | SWT.FULL_SELECTION);
gd = new GridData(GridData.FILL_BOTH);
gd.horizontalIndent=2;
gd.heightHint = 20;
gd.widthHint = 100;
t.setLayoutData(gd);
t.setHeaderVisible(true);
t.setLinesVisible(true);
Button b = toolkit.createButton(client,
Messages.getString("PartsBlock.add"), SWT.PUSH); //$NON-NLS-1$
gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
b.setLayoutData(gd);
TableColumn amountTc = new TableColumn(t, SWT.RIGHT, 0);
amountTc.setText(Messages.getString("PartDetails.amount"));
//$NON-NLS-1$
amountTc.setWidth(50);
TableColumn unitTc = new TableColumn(t, SWT.LEFT, 1);
unitTc.setText(Messages.getString("PartDetails.unit"));
//$NON-NLS-1$
unitTc.setWidth(70);
TableColumn foodTc = new TableColumn(t, SWT.LEFT, 2);
foodTc.setText(Messages.getString("PartDetails.food"));
//$NON-NLS-1$
foodTc.setWidth(200);
TextCellEditor ce1 = new TextCellEditor(t);
ComboBoxCellEditor ce2 = new
ComboBoxCellEditor(t,UnitLoader.getInstance().getUnitsAsString(),SWT.DROP_DOWN|SWT.READ_ONLY);
IngredientDialogCellEditor ce3 = new IngredientDialogCellEditor(t);
ingredientViewer = new TableViewer(t);
ingredientViewer.setContentProvider(new PartsContentProvider());
ingredientViewer.setColumnProperties(new String[]
{"amount","unit","food"});
ingredientViewer.setLabelProvider(new PartsLabelProvider());
ingredientViewer.setCellEditors(new CellEditor[] { ce1, ce2, ce3
});
ingredientViewer.setCellModifier(new IngredientCellModifier());
toolkit.paintBordersFor(s1);
toolkit.paintBordersFor(client);
s1.setClient(client);
final Section s2 = toolkit.createSection(parent, Section.EXPANDED|
Section.COMPACT | Section.TWISTIE);
s2.marginWidth = 10;
s2.setText("Steps");
s2.setDescription("Insert all the properties for one part of the
recipe");
s2.addExpansionListener(new IExpansionListener() {
public void expansionStateChanging(ExpansionEvent e) {
}
public void expansionStateChanged(ExpansionEvent e) {
if (!(s2.isExpanded())) {
parent.pack();
}
}
});
gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 1;
s2.setLayoutData(gd);
toolkit.createCompositeSeparator(s2);
Composite client2 = toolkit.createComposite(s2);
GridLayout glayout2 = new GridLayout();
glayout2.marginWidth = glayout2.marginHeight = 5;
glayout2.numColumns = 2;
client2.setLayout(glayout2);
gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan=2;
steps = toolkit.createText(client2,"",SWT.MULTI | SWT.WRAP);
steps.setData(FormToolkit.KEY_DRAW_BORDER,
FormToolkit.TREE_BORDER);
steps.setLayoutData(gd);
toolkit.paintBordersFor(client2);
toolkit.paintBordersFor(s2);
s2.setClient(client2);
}
public void initialize(IManagedForm form) {
mform=form;
}
public void dispose() {
}
public boolean isDirty() {
return false;
}
public void commit(boolean onSave) {
}
public boolean setFormInput(Object input) {
return false;
}
public void setFocus() {
}
public boolean isStale() {
return false;
}
public void refresh() {
}
public void selectionChanged(IFormPart part, ISelection selection) {
IStructuredSelection ssel = (IStructuredSelection)selection;
if (ssel.size()==1) {
Part input = (Part)ssel.getFirstElement();
ingredientViewer.setInput(input);
steps.setText(getStepsAsString(input));
}
}
protected String getStepsAsString(Part part) {
String temp="";
log.debug("Amount of Steps: "+part.getSteps().size());
Iterator it = part.getSteps().iterator();
while (it.hasNext()) {
Step step = (Step)it.next();
log.debug("Step.text() = "+step.getText());
temp+=step.getText()+"\n\n";
}
return temp;
}
}
!ENTRY org.eclipse.ui.workbench 4 2 2005-07-27 22:31:39.656
!MESSAGE Problems occurred when invoking code from plug-in:
"org.eclipse.ui.workbench".
!STACK 0
java.lang.NullPointerException
at org.eclipse.swt.widgets.Table.releaseWidget(Table.java:1705)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Widget.releaseResources(Widget.java:720)
at
org.eclipse.swt.widgets.Composite.releaseChildren(Composite.java:588)
at org.eclipse.swt.widgets.Composite.releaseWidget(Composite.java:593)
at org.eclipse.swt.widgets.Canvas.releaseWidget(Canvas.java:117)
at
org.eclipse.swt.widgets.Decorations.releaseWidget(Decorations.java:782)
at org.eclipse.swt.widgets.Shell.releaseWidget(Shell.java:868)
at org.eclipse.swt.widgets.Widget.dispose(Widget.java:382)
at org.eclipse.swt.widgets.Decorations.dispose(Decorations.java:441)
at org.eclipse.swt.widgets.Shell.dispose(Shell.java:499)
at org.eclipse.jface.window.Window.close(Window.java:321)
at
org.eclipse.jface.window.ApplicationWindow.close(ApplicationWindow.java:291)
at
org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1403)
at
org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:646)
at
org.eclipse.ui.internal.WorkbenchWindow.access$0(WorkbenchWindow.java:627)
at
org.eclipse.ui.internal.WorkbenchWindow$2.run(WorkbenchWindow.java:728)
at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
at
org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:726)
at org.eclipse.jface.window.WindowManager.close(WindowManager.java:108)
at org.eclipse.ui.internal.Workbench$11.run(Workbench.java:588)
at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
at org.eclipse.core.runtime.Platform.run(Platform.java:783)
at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:585)
at org.eclipse.ui.internal.Workbench.access$8(Workbench.java:522)
at org.eclipse.ui.internal.Workbench$13.run(Workbench.java:713)
at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
at org.eclipse.ui.internal.Workbench.close(Workbench.java:711)
at org.eclipse.ui.internal.Workbench.close(Workbench.java:686)
at
org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:643)
at
org.eclipse.ui.internal.WorkbenchWindow.access$0(WorkbenchWindow.java:627)
at
org.eclipse.ui.internal.WorkbenchWindow$2.run(WorkbenchWindow.java:728)
at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
at
org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:726)
at
org.eclipse.jface.window.Window.handleShellCloseEvent(Window.java:727)
at org.eclipse.jface.window.Window$3.shellClosed(Window.java:674)
at
org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:159)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:867)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:852)
at
org.eclipse.swt.widgets.Decorations.closeWidget(Decorations.java:257)
at org.eclipse.swt.widgets.Decorations.WM_CLOSE(Decorations.java:1649)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3040)
at
org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1582)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:3706)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1651)
at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:410)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3123)
at
org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1582)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:3706)
at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)
at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1651)
at org.eclipse.swt.widgets.Shell.callWindowProc(Shell.java:410)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:3123)
at
org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1582)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:3706)
at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:1656)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2711)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1699)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1663)
at
org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:367)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
at de.beecook.core.BeeCookApplication.run(BeeCookApplication.java:39)
at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:226)
at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:376)
at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:163)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334)
at org.eclipse.core.launcher.Main.basicRun(Main.java:278)
at org.eclipse.core.launcher.Main.run(Main.java:973)
at org.eclipse.core.launcher.Main.main(Main.java:948)