/******************************************************************************* * Copyright (c) 2009 Tom Schindl and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tom Schindl - initial API and implementation *******************************************************************************/ package org.eclipse.nebula.snippets.grid.viewer; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.nebula.jface.gridviewer.GridTableViewer; import org.eclipse.nebula.jface.gridviewer.GridViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Creating a viewer where columns are dynamic * * @author Tom Schindl <tom.schindl@bestsolution.at> */ public class GridViewerSnippet7 { private static class Committer { private String name; private Date birthday; private int commits; private int bugs; public Committer(String name, Date birthday, int commits, int bugs) { this.name = name; this.birthday = birthday; this.commits = commits; this.bugs = bugs; } public String getName() { return name; } @SuppressWarnings("unused") public void setName(String name) { this.name = name; } @SuppressWarnings("unused") public int getCommits() { return commits; } @SuppressWarnings("unused") public void setCommits(int commits) { this.commits = commits; } @SuppressWarnings("unused") public int getBugs() { return bugs; } @SuppressWarnings("unused") public void setBugs(int bugs) { this.bugs = bugs; } @SuppressWarnings("unused") public Date getBirthday() { return birthday; } @SuppressWarnings("unused") public void setBirthday(Date birthday) { this.birthday = birthday; } } private static interface IMediator { public Object getValue(int index); public void setValue(int index, Object value); public Class<?> getType(int index); public String getPropertyName(); } private static class Mediator implements IMediator { private List<Object> domainObjects; private String propertyName; private PropertyDescriptor descriptor; public Mediator(List<?> domainObjects, String propertyName) { this.domainObjects = new ArrayList<Object>(domainObjects); this.propertyName = propertyName; BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(domainObjects.get(0) .getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo .getPropertyDescriptors(); for (int i = 0; i < propertyDescriptors.length; i++) { PropertyDescriptor descriptor = propertyDescriptors[i]; if (descriptor.getName().equals(propertyName)) { this.descriptor = descriptor; break; } } } catch (IntrospectionException e) { e.printStackTrace(); } } public Object getValue(int index) { try { if (domainObjects.size() > index) { return descriptor.getReadMethod().invoke( domainObjects.get(index), new Object[0]); } } catch (Exception e) { e.printStackTrace(); } return null; } public void setValue(int index, Object value) { try { if (domainObjects.size() > index) { descriptor.getWriteMethod().invoke( domainObjects.get(index), value); } } catch (Exception e) { e.printStackTrace(); } } public Class<?> getType(int index) { return descriptor.getPropertyType(); } public String getPropertyName() { return propertyName; } } private static class LabelProviderImpl extends ColumnLabelProvider { private int colIndex; public LabelProviderImpl(int colIndex) { this.colIndex = colIndex; } @Override public String getText(Object element) { IMediator m = (IMediator) element; if (m.getType(colIndex) == int.class) { return NumberFormat.getIntegerInstance().format( m.getValue(colIndex)); } else if (m.getType(colIndex) == Date.class) { return new SimpleDateFormat("yyyy-MM-dd").format( m.getValue(colIndex)); } return super.getText(element); } } private static class ContentProvider implements IStructuredContentProvider { private String[] attributes; private List<IMediator> mediators = new ArrayList<IMediator>(); public ContentProvider(String... attributes) { this.attributes = attributes; } public Object[] getElements(Object inputElement) { return mediators.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { mediators = new ArrayList<IMediator>(); if (newInput != null && newInput instanceof List<?>) { for (String attribute : attributes) { mediators.add(new Mediator((List<?>) newInput, attribute)); } } } } private static class EditingSupportImpl extends EditingSupport { private int colIndex; private TextCellEditor integerEditor; private TextCellEditor dateEditor; public EditingSupportImpl(ColumnViewer viewer, int colIndex) { super(viewer); this.colIndex = colIndex; this.integerEditor = new TextCellEditor((Composite) viewer .getControl(), SWT.NONE); ((Text) this.integerEditor.getControl()) .addVerifyListener(new VerifyListener() { public void verifyText(VerifyEvent e) { String string = e.text; char[] chars = new char[string.length()]; string.getChars(0, chars.length, chars, 0); for (int i = 0; i < chars.length; i++) { if (!('0' <= chars[i] && chars[i] <= '9')) { e.doit = false; return; } } } }); this.dateEditor = new TextCellEditor((Composite) viewer .getControl(), SWT.NONE); ((Text) this.dateEditor.getControl()) .addVerifyListener(new VerifyListener() { public void verifyText(VerifyEvent e) { String string = e.text; char[] chars = new char[string.length()]; string.getChars(0, chars.length, chars, 0); for (int i = 0; i < chars.length; i++) { if (!( ('0' <= chars[i] && chars[i] <= '9') || chars[i] == '-' ) ) { e.doit = false; return; } } } }); } @Override protected boolean canEdit(Object element) { return true; } @Override protected CellEditor getCellEditor(Object element) { IMediator m = (IMediator) element; if (m.getType(colIndex) == int.class) { return integerEditor; } else if (m.getType(colIndex) == Date.class) { return dateEditor; } return null; } @Override protected Object getValue(Object element) { IMediator m = (IMediator) element; if (m.getType(colIndex) == int.class) { return m.getValue(colIndex) + ""; } else if (m.getType(colIndex) == Date.class) { return new SimpleDateFormat("yyyy-MM-dd").format(m .getValue(colIndex)); } return null; } @Override protected void setValue(Object element, Object value) { IMediator m = (IMediator) element; if (m.getType(colIndex) == int.class) { try { m.setValue(colIndex, Integer.parseInt(value.toString())); } catch (NumberFormatException e) { e.printStackTrace(); } } else if (m.getType(colIndex) == Date.class) { try { m.setValue(colIndex, new SimpleDateFormat("yyyy-MM-dd") .parse(value.toString())); } catch (ParseException e) { e.printStackTrace(); } } getViewer().update(element, null); } } public static void main(String[] args) { try { final Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final ImageRegistry reg = new ImageRegistry(display); reg.put("ICON", ImageDescriptor.createFromFile( GridViewerSnippet6.class, "th_vertical.gif")); GridTableViewer v = new GridTableViewer(shell, SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); v.getGrid().setLinesVisible(true); v.getGrid().setHeaderVisible(true); v.setContentProvider(new ContentProvider("birthday", "commits", "bugs")); v.getGrid().setRowHeaderVisible(true); v.setRowHeaderLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { String propertyName = ((Mediator) element) .getPropertyName(); return propertyName; } }); List<Committer> committers = new ArrayList<Committer>(); committers.add(new Committer("Tom Schindl", new Date(), 10, 5)); committers .add(new Committer("Boris Bokowski", new Date(), 1000, 35)); int i = 0; for (Committer committer : committers) { GridViewerColumn column = new GridViewerColumn(v, SWT.NONE); column.setEditingSupport(new EditingSupportImpl(v, i)); column.setLabelProvider(new LabelProviderImpl(i)); column.getColumn().setText(committer.getName()); column.getColumn().setWidth(200); i++; } v.setInput(committers); shell.setSize(500, 200); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } catch (Exception e) { e.printStackTrace(); } } }