RSS

Search Engine

Thursday, July 15, 2010

Adapters

5.1. Overview

Adapters help to display information about objects in view without having to adjust the existing views. In this example we will create a small view which allows to select objects and use the properties view to display them.

Adapters are used on several places for example you can use an adapter to display your data in the outline view.

5.2. Example

We will simple use an adapter to show our data in the property view. Create a new plugin project "de.vogella.plugin.adapter". Use the "Plug-in with a view" template with the following settings.

Add the dependency "org.eclipse.ui.views" in tab dependencies of plugin.xml.

Create the following data model and change the

    
package de.vogella.plugin.adapter.model;

public class Todo {
private String summary;
private String description;
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}

}

To displays its values in the property view, add the extension point "org.eclipse.core.runtime.adapters" to your project. The data of the extension point should be like the following.

    
point="org.eclipse.core.runtime.adapters">
adaptableType="de.vogella.plugin.adapter.model.Todo"
class="de.vogella.plugin.adapter.TodoAdapterFactory">
type="org.eclipse.ui.views.properties.IPropertySource2">




Implement the factory and the IPropertySourceAdapter.

    
package de.vogella.plugin.adapter;

import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.IPropertySource2;

import de.vogella.plugin.adapter.model.Todo;

public class TodoAdapterFactory implements IAdapterFactory {

@Override
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adapterType== IPropertySource.class && adaptableObject instanceof Todo){
return new TodoPropertySource((Todo) adaptableObject);
}
return null;
}

@Override
public Class[] getAdapterList() {
return new Class[] { IPropertySource2.class };
}

}

    
package de.vogella.plugin.adapter;

import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

import de.vogella.plugin.adapter.model.Todo;

public class TodoPropertySource implements IPropertySource {

private final Todo todo;

public TodoPropertySource(Todo todo) {
this.todo = todo;
}


@Override
public boolean isPropertySet(Object id) {
return false;
}

@Override
public Object getEditableValue() {
return this;
}

@Override
public IPropertyDescriptor[] getPropertyDescriptors() {

return new IPropertyDescriptor[] {
new TextPropertyDescriptor("summary", "Summary"),
new TextPropertyDescriptor("description", "Description") };
}

@Override
public Object getPropertyValue(Object id) {
if (id.equals("summary")) {
return todo.getSummary();
}
if (id.equals("description")) {
return todo.getDescription();
}
return null;
}

@Override
public void resetPropertyValue(Object id) {

}

@Override
public void setPropertyValue(Object id, Object value) {
String s = (String) value;
if (id.equals("summary")) {
todo.setSummary(s);
}
if (id.equals("description")) {
todo.setDescription(s);
}
}

}

Also change the code of SampleView.java to the following.

    
package de.vogella.plugin.adapter.views;

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.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import de.vogella.plugin.adapter.model.Todo;


public class SampleView extends ViewPart {
public static final String ID = "de.vogella.plugin.adapter.views.SampleView";

private TableViewer viewer;

class ViewContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}

public void dispose() {
}

public Object[] getElements(Object parent) {
Todo[] todos = new Todo[2];
Todo todo = new Todo();
todo.setSummary("First Todo");
todo.setDescription("A very good description");
todos[0] = todo;
todo = new Todo();
todo.setSummary("Second Todo");
todo.setDescription("Second super description");
todos[1] = todo;
return todos;
}
}

class ViewLabelProvider extends LabelProvider implements
ITableLabelProvider {
public String getColumnText(Object obj, int index) {
Todo todo = (Todo) obj;
return todo.getSummary();
}

public Image getColumnImage(Object obj, int index) {
return getImage(obj);
}

public Image getImage(Object obj) {
return PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJ_ELEMENT);
}
}

/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
getSite().setSelectionProvider(viewer);
viewer.setInput(getViewSite());

}

/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
}

If you run your workbench and open your View via Windows -> Show View -> Others -> Sample Category -> Sample View and the property view you should be able to view your data.

0 comments:

Post a Comment