[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.rcp] [Jface] Problem on using validator in celleditor

Dear All,

I'm now going to write a "focus lose" validation to check my input in celleditor which value should not be "abc". I found there's a CellValidator function in CellEditor. Thus I get a try using it. However, I can't make it succeed. There's a NullPointer exception if I input value "abc" into it. Can someone kindly help that point out what's wrong in my program? Below is my snippet. Thanks

Best Rdgs
Ellis


Snippet Code ==============

package com.pervasive.test.ui;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DialogCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
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.FillLayout;
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.Item;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;

/**
* Example of editing inside of a table cell.
* * @author Shawn Spiars
* */
public class TableEditExample2 {


	private Table table;
	private TableViewer tableViewer;

	private final static String[] COLUMN_HEADINGS = { "Property", "Value",
			"Dialog" };

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

	}

	public TableEditExample2() {
		Display display = new Display();
		Shell shell = new Shell(display, SWT.SHELL_TRIM);
		shell.setText("Shawn Spiars' Table Edit Example");
		shell.setLayout(new FillLayout());

		createContents(shell);

		shell.setSize(400, 400);
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	protected Control createContents(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout(1, false);
		layout.verticalSpacing = 10;
		composite.setLayout(layout);
		GridData data = new GridData(GridData.FILL_BOTH);
		data.grabExcessHorizontalSpace = true;
		composite.setLayoutData(data);

		table = new Table(composite, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI
				| SWT.FULL_SELECTION);
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		data = new GridData(SWT.FILL, SWT.FILL, true, false);
		data.heightHint = 300;
		table.setLayoutData(data);

		tableViewer = new TableViewer(table);
		tableViewer.setUseHashlookup(false);
		tableViewer.setColumnProperties(COLUMN_HEADINGS);
		tableViewer.setContentProvider(new TableContentProvider());
		tableViewer.setLabelProvider(new TableLabelProvider());

		tableViewer.setComparer(new IElementComparer() {
			public boolean equals(Object a, Object b) {
				return a == b;
			}

			public int hashCode(Object element) {
				return System.identityHashCode(element);
			}
		});

		TableLayout tableLayout = new TableLayout();
		table.setLayout(tableLayout);

		tableLayout.addColumnData(new ColumnWeightData(10, 100, true));
		TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
		column.getColumn().setText(COLUMN_HEADINGS[0]);
		column.getColumn().setAlignment(SWT.LEFT);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				// TODO Auto-generated method stub
				return ((Row) element).getKey();
			}
		});
		column.setEditingSupport(new TableCellEditingSupport(tableViewer, 0));

		tableLayout.addColumnData(new ColumnWeightData(15, 200, true));
		column = new TableViewerColumn(tableViewer, SWT.NONE);
		column.getColumn().setText(COLUMN_HEADINGS[1]);
		column.getColumn().setAlignment(SWT.LEFT);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				// TODO Auto-generated method stub
				return ((Row) element).getValue();
			}
		});
		column.setEditingSupport(new TableCellEditingSupport(tableViewer, 1));

		tableLayout.addColumnData(new ColumnWeightData(15, 200, true));
		column = new TableViewerColumn(tableViewer, SWT.NONE);
		column.getColumn().setText(COLUMN_HEADINGS[2]);
		column.getColumn().setAlignment(SWT.LEFT);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				// TODO Auto-generated method stub
				return ((Row) element).getValue2();
			}
		});
		column.setEditingSupport(new TableCellEditingSupport(tableViewer, 2));

		Composite buttonComposite = new Composite(composite, SWT.NONE);
		FillLayout fillLayout = new FillLayout(SWT.HORIZONTAL);
		fillLayout.spacing = 10;
		buttonComposite.setLayout(fillLayout);

		Button addButton = new Button(buttonComposite, SWT.PUSH);
		addButton.setText("Add");
		addButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				Row row = new Row("", "", "");
				tableViewer.add(row);
				table.setTopIndex(table.getItemCount());
				table.select(table.getItemCount() - 1);
				tableViewer.editElement(row, 0);
			}
		});

		Button removeButton = new Button(buttonComposite, SWT.PUSH);
		removeButton.setText("Remove");
		removeButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				ISelection selection = tableViewer.getSelection();
				if (selection instanceof IStructuredSelection) {
					Iterator iterator = ((IStructuredSelection) selection)
							.iterator();
					while (iterator.hasNext()) {
						Object obj = iterator.next();
						tableViewer.remove(obj);
					}
				}
			}
		});

		return composite;
	}

	public class TableLabelProvider extends LabelProvider implements
			ITableLabelProvider {
		public Image getColumnImage(Object element, int columnIndex) {
			return null;
		}

		public String getColumnText(Object element, int columnIndex) {
			Row row = (Row) element;

			switch (columnIndex) {
			case 0:
				return row.getKey();
			case 1:
				return row.getValue();
			case 2:
				return row.getValue2();
			}

			return null;
		}

	}

	public class TableContentProvider implements IStructuredContentProvider {
		public Object[] getElements(Object parent) {
			List results = new ArrayList();
			if (parent instanceof ArrayList) {
				results = (ArrayList) parent;
			}
			return results.toArray();
		}

		public void dispose() {
		}

public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}


	}

	class TableCellEditingSupport extends EditingSupport {
		private CellEditor editor;
		private int column;

		public TableCellEditingSupport(ColumnViewer viewer, int column) {
			super(viewer);
			// TODO Auto-generated constructor stub
			editor = new TextCellEditor(((TableViewer) viewer).getTable());
			editor.setValidator(new ICellEditorValidator() {

				public String isValid(Object value) {
					// TODO Auto-generated method stub
					boolean isValid = false;

					if (!String.valueOf(value).equals(new String("abc")))
						isValid = true;

					return (isValid) ? null : "Value abc is not acceptable";

				}
			});

			this.column = column;
		}

		@Override
		protected boolean canEdit(Object element) {
			// TODO Auto-generated method stub
			return true;
		}

		@Override
		protected CellEditor getCellEditor(Object element) {
			// TODO Auto-generated method stub
			return editor;
		}

		@Override
		protected Object getValue(Object element) {
			// TODO Auto-generated method stub
			Object result = null;
			if (element instanceof Item) {
				element = ((Item) element).getData();
			}
			Row row = (Row) element;

			switch (column) {
			case 0:
				result = row.getKey();
				break;
			case 1:
				result = row.getValue();
				break;
			case 2:
				result = row.getValue2();
				break;
			}

			return result;
		}

		@Override
		protected void setValue(Object element, Object value) {
			// TODO Auto-generated method stub
			Row row = (Row) element;
			String v = (String) value;

			switch (column) {
			case 0:
				v = (String) value;
				if (v.length() > 0) {
					row.setKey(v);
				}
				break;

			case 1:
				v = (String) value;
				if (v.length() > 0) {
					row.setValue(v);
				}
				break;

			case 2:
				v = (String) value;
				if (v.length() > 0) {
					row.setValue2(v);
				}
				break;
			}

			getViewer().update(row, null);
		}

	}

	class TestDialog extends DialogCellEditor {

		public TestDialog(Composite parent) {
			super(parent);
		}

		@Override
		protected Object openDialogBox(Control cellEditorWindow) {
			// TODO Auto-generated method stub
			InputDialog dialog = new InputDialog(cellEditorWindow.getShell(),
					"test", "Please input a number", "1", null);
			if (dialog.open() == InputDialog.OK) {
				return dialog.getValue();
			}
			return "";
		}

	}

	private class Row {
		private String key;
		private String value;
		private String value2;

		public Row(String key, String value, String value2) {
			setKey(key);
			setValue(value);
			setValue(value2);
		}

		public void setKey(String key) {
			this.key = key;
		}

		public String getKey() {
			return key;
		}

		public void setValue(String value) {
			this.value = value;
		}

		public String getValue() {
			return value;
		}

		public String getValue2() {
			return value2;
		}

		public void setValue2(String value2) {
			this.value2 = value2;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + getOuterType().hashCode();
			result = prime * result + ((key == null) ? 0 : key.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Row other = (Row) obj;
			if (!getOuterType().equals(other.getOuterType()))
				return false;
			if (key == null) {
				if (other.key != null)
					return false;
			} else if (!key.equals(other.key))
				return false;
			return true;
		}

		private TableEditExample2 getOuterType() {
			return TableEditExample2.this;
		}

	}

}