Final evaluation of JFace project on Google Summer of Code 2014

Hi everyone,

It has been a while since my last post entry. We had a lot of work to do to move our project to an acceptable state. In this post, I would like to give you an overview of the project and introduce you to the new changes.

We noticed that many client codes had to perform explicit casts when dealing with JFace Viewers and its related components (e.g. Providers, Selectors, and Editors). The issue of manipulating raw types is the possibility of throwing a ClassCastException to the user at runtime. By adding Generics support, we ensure that the Java compiler will perform type check and expose any improper cast at compiling time.

The major change was to add a generic type about the object to be hold, just like a regular class from Java Collections (e.g. List). Consider the following example:

  • Selection

Previously, we would return a selected content like this:

IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
MyModel obj = (MyModel) sel.getFirstElement();

Now the IStructuredSelection class contains information about what type of object it is holding, so the cast becomes unnecessary:

// There is a better way to get the concrete selection
// I’m using the old style (see this post)
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
MyModel obj = sel.getFirstElement();

In addition to the object type, Viewers have to know how the elements are organized. For instance, a given class A to be displayed in a ListViewer is organized as a List of objects A. Therefore, all JFace viewers support this information through 2 generic types: E (the type of the element) and I (the type of the input):

final ListViewer<MyModel, List> v =
new ListViewer<MyModel, List>(shell, SWT.H_SCROLL | SWT.V_SCROLL);

v.setLabelProvider(new LabelProvider());
v.setContentProvider(ArrayContentProvider.getInstance(MyModel.class));
v.setInput(createModel());

private List createModel() {
List elements = new ArrayList();
for (int i = 0; i < 10; i++) {
elements.add(new MyModel(i));
}
return elements;
}

There are several classes supporting Generics, including Viewer, ContentViewer, StructuredViewer, AbstractListViewer, ColumnViewer, ComboViewer, ListViewer, AbstractTableViewer, AbstractTreeViewer, TableViewer, CheckboxTableViewer, AbstractTreeViewer, TreeViewer, CheckboxTreeViewer, IContentProvider, ILazyContentProvider, ILazyTreeContentProvider, ILazyTreePathContentProvider, IStructuredContentProvider, ArrayContentProvider, LabelProvider, BaseLabelProvider, IBaseLavelProvider, ILabelDecorator, IViewerLabelProvider, ILabelProvider, IStructuredSelection, ITreeSelection, StructuredSelection, and many other components from JFace.

By now, all tests are working and we have all JFace snippets updated. However, there are several Eclipse Viewers that should be updated to use the new JFace API.

Java collections and arrays do not mix very well, maybe in the future we will think about another version of JFace to work only with Java collection. Now, our priority is to make the new JFace API available to the Eclipse main repository.

Contributing to Eclipse was a valuable experience, so you are welcome to to join us too!

About Jeanderson Candido

I'm currently undergrad in Computer Science at Federal University of Campina Grande (UFCG), Brazil. Since My first year, I've been involved in researches related to Software Engineering. I was visiting student at Walsh University, USA for a year (2012-2013) and research assistant at PLASMA (University of Massachusetts, USA) during the 2013 Summer. Nowadays I'm a contributor of the Eclipse project and research assistant at Software Productivity Group (SPG at UFCG).
This entry was posted in Eclipse, Jeanderson Candido and tagged , , . Bookmark the permalink.