RSS

Search Engine

Friday, July 2, 2010

Content and Label Provider

Create the following label and content provider for your JFace viewers.

   
package de.vogella.dnd.jface.viewers;

import java.util.List;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;

import de.vogella.dnd.jface.model.Todo;

public class TableContentProvider implements IStructuredContentProvider {

@Override
public Object[] getElements(Object inputElement) {
List list = (List) inputElement;
return list.toArray();
}

@Override
public void dispose() {

}

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

}

   
package de.vogella.dnd.jface.viewers;

import java.util.List;

import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

public class TreeContentProvider implements ITreeContentProvider {

@Override
public Object[] getChildren(Object parentElement) {
return null;
}

@Override
public Object getParent(Object element) {
return null;
}

@Override
public boolean hasChildren(Object element) {
return false;
}

@Override
public Object[] getElements(Object inputElement) {
List list = (List) inputElement;
return list.toArray();
}

@Override
public void dispose() {

}

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

}

   
package de.vogella.dnd.jface.viewers;

import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;

import de.vogella.dnd.jface.model.Todo;

public class TableLabelProvider extends BaseLabelProvider implements
ITableLabelProvider {

@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}

@Override
public String getColumnText(Object element, int columnIndex) {
Todo todo = (Todo) element;
switch (columnIndex) {
case 0:
return todo.getShortDescription();
case 1:
return todo.getLongDescription();
}
return "Not supported";
}

}

   
package de.vogella.dnd.jface.viewers;

import org.eclipse.jface.viewers.LabelProvider;


public class TreeLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
String s = (String) element;
return s;
}

}

Drag Listener and Drop Listener

Create the following Drop and Drag listener which will be later assigned to the views.

   
package de.vogella.dnd.jface.dnd;

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.TextTransfer;

import de.vogella.dnd.jface.model.Todo;
public class MyDragListener implements DragSourceListener {

private final TableViewer viewer;

public MyDragListener(TableViewer viewer) {
this.viewer = viewer;
}

@Override
public void dragFinished(DragSourceEvent event) {
System.out.println("Finshed Drag");
}

@Override
public void dragSetData(DragSourceEvent event) {
// Here you do the convertion to the type which is expected.
IStructuredSelection selection = (IStructuredSelection) viewer
.getSelection();
Todo firstElement = (Todo) selection.getFirstElement();

if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = firstElement.getShortDescription() + " " + firstElement.getLongDescription();
}

}

@Override
public void dragStart(DragSourceEvent event) {
System.out.println("Start Drag");
}

}

   
package de.vogella.dnd.jface.dnd;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;

import de.vogella.dnd.jface.model.ContentProviderTree;

public class MyDropListener extends ViewerDropAdapter {

private final Viewer viewer;

public MyDropListener(Viewer viewer) {
super(viewer);
this.viewer = viewer;
}

@Override
public void drop(DropTargetEvent event) {
int location = this.determineLocation(event);
String target = (String) determineTarget(event);
String translatedLocation ="";
switch (location){
case 1 :
translatedLocation = "Dropped before the target ";
break;
case 2 :
translatedLocation = "Dropped after the target ";
break;
case 3 :
translatedLocation = "Dropped on the target ";
break;
case 4 :
translatedLocation = "Dropped into nothing ";
break;
}
System.out.println(translatedLocation);
System.out.println("The drop was done on the element: " + target );
super.drop(event);
}

// This method performs the actual drop
// We simply add the String we receive to the model and trigger a refresh of the
// viewer by calling its setInput method.
@Override
public boolean performDrop(Object data) {
ContentProviderTree.INSTANCE.getModel().add( data.toString());
viewer.setInput(ContentProviderTree.INSTANCE.getModel());
return false;
}

@Override
public boolean validateDrop(Object target, int operation,
TransferData transferType) {
return true;

}



}

Views

Adjust your views. The first view will show a table and will allow that elements will be dragged from it. The second view accepts drops.

   
package de.vogella.dnd.jface.view;

import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

import de.vogella.dnd.jface.dnd.MyDragListener;
import de.vogella.dnd.jface.model.ContentProvider;
import de.vogella.dnd.jface.viewers.TableContentProvider;
import de.vogella.dnd.jface.viewers.TableLabelProvider;

public class TableView extends ViewPart {


@Override
public void createPartControl(Composite parent) {
TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
int operations = DND.DROP_COPY| DND.DROP_MOVE;
Transfer[] transferTypes = new Transfer[]{TextTransfer.getInstance()};
viewer.addDragSupport(operations, transferTypes , new MyDragListener(viewer));
viewer.setContentProvider(new TableContentProvider());
viewer.setLabelProvider(new TableLabelProvider());
viewer.setInput(ContentProvider.INSTANCE.getModel());
}

@Override
public void setFocus() {

}

}

   
package de.vogella.dnd.jface.view;

import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

import de.vogella.dnd.jface.dnd.MyDropListener;
import de.vogella.dnd.jface.model.ContentProviderTree;
import de.vogella.dnd.jface.viewers.TreeContentProvider;
import de.vogella.dnd.jface.viewers.TreeLabelProvider;

public class TreeView extends ViewPart {

@Override
public void createPartControl(Composite parent) {
TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
int operations = DND.DROP_COPY | DND.DROP_MOVE;
Transfer[] transferTypes = new Transfer[]{TextTransfer.getInstance()};
viewer.addDropSupport(operations, transferTypes, new MyDropListener(viewer));
viewer.setContentProvider(new TreeContentProvider());
viewer.setLabelProvider(new TreeLabelProvider());
viewer.setInput(ContentProviderTree.INSTANCE.getModel());
}

@Override
public void setFocus() {
}


}

Thank you

Thank you for practicing with this tutorial.

I maintain this tutorial in my private time. If you like the information please help me by donating or by recommending this tutorial to other people.

Thursday, July 1, 2010

Eclipse Plugin and RCP internationalization

1.1. Externalize strings - Multi Languages

The following describes the Eclipse way of replacing strings and how to select them.

Create a new RCP project "MultiLanguage". See Eclipse RCP tutorial for details. Use "RCP application with a view" as template.

Change the View.java to the following.

    
package multilanguage;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
public static final String ID = "MultiLanguage.view";


public void createPartControl(Composite parent) {
Label label = new Label(parent, SWT.BORDER);
label.setText("This is a hardcoded text");
}

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

Right mouse-click on the source code. Select Source -> Externalize Strings. Select the strings which should be externalized

Press finished. As a result a class Message.java is created which contains static member variables which can be used in the coding as String replacements. The message.properties contain the real strings.

1.2. Select the message.properties file

Copy message.properties to message_de.properties or message_en.properties to support different strings for different languages.

Thank you

Thank you for practicing with this tutorial.

I maintain this tutorial in my private time. If you like the information please help me by donating or by recommending this tutorial to other people.

Wednesday, June 30, 2010

Overview

The Eclipse Jobs API provides background capabilities to Eclipse with can also be used in Eclipse RCP.

The important parts of the Job API are:

  • JobManager - Schedules the jobs

  • Job - The individual task to perform

  • IProgresMonitor - UI for Job information

Using the Jobs API in Eclipse RCP is the same as in Eclipse plug-in development therefore I just give a small example. Check the appendix for a general introduction to the Eclipse Jobs API.