package de.tutorials;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class JFaceTreeViewerExample extends ApplicationWindow {
public JFaceTreeViewerExample(Shell parentShell) {
super(parentShell);
setBlockOnOpen(true);
open();
}
protected Control createContents(Composite parent) {
final TreeViewer treeViewer = createTreeVewer(parent);
treeViewer.setInput(initModel());
return super.createContents(parent);
}
private TreeViewer createTreeVewer(Composite parent) {
final TreeViewer treeViewer = new TreeViewer(parent);
treeViewer.setContentProvider(new DefaultTreeContentProvider());
treeViewer.setLabelProvider(new LabelProvider());
treeViewer.getTree().setLinesVisible(true);
treeViewer.getTree().setHeaderVisible(true);
TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
treeViewer, new FocusCellOwnerDrawHighlighter(treeViewer));
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
treeViewer) {
protected boolean isEditorActivationEvent(
ColumnViewerEditorActivationEvent event) {
return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
}
};
TreeViewerEditor.create(treeViewer, focusCellManager, actSupport,
ColumnViewerEditor.TABBING_HORIZONTAL
| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
| ColumnViewerEditor.TABBING_VERTICAL
| ColumnViewerEditor.KEYBOARD_ACTIVATION);
final TextCellEditor textCellEditor = new TextCellEditor(treeViewer
.getTree());
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.NONE);
column.getColumn().setWidth(300);
column.getColumn().setMoveable(true);
column.getColumn().setText("Name");
column.setLabelProvider(new ColumnLabelProvider());
column.setEditingSupport(new EditingSupport(treeViewer) {
protected boolean canEdit(Object element) {
return true;
}
protected CellEditor getCellEditor(Object element) {
return textCellEditor;
}
protected Object getValue(Object element) {
if (element instanceof Named) {
return ((Named) element).getName();
}
return element.toString();
}
protected void setValue(Object element, Object value) {
if (element instanceof Named) {
((Named) element).setName(String.valueOf(value));
}
treeViewer.update(element, null);
}
});
treeViewer.getTree().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.F2) {
// TODO find right column...
treeViewer.editElement(((IStructuredSelection) treeViewer
.getSelection()).getFirstElement(), 0);
}
}
});
return treeViewer;
}
static class DefaultTreeContentProvider implements ITreeContentProvider {
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element == null)
return false;
if (element instanceof Disc) {
return !((Disc) element).getTracks().isEmpty();
}
return false;
}
final static Object[] EMPTY = new Object[0];
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof List) {
return ((List) parentElement).toArray();
} else if (parentElement instanceof Disc) {
return ((Disc) parentElement).getTracks().toArray();
}
return EMPTY;
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private List<Disc> initModel() {
List<Disc> compactDiscs = new ArrayList<Disc>();
for (int i = 0; i < 3; i++) {
Disc compactDisc = new Disc("cd name " + i);
for (int j = 0; j < 10; j++) {
Track t = new Track("track " + j, j * j, compactDisc);
compactDisc.addTrack(t);
}
compactDiscs.add(compactDisc);
}
return compactDiscs;
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
new JFaceTreeViewerExample(shell);
}
static interface Named {
String getName();
void setName(String name);
}
static class Disc implements Named {
String name;
List<Track> tracks;
public Disc(String name) {
this.name = name;
tracks = new ArrayList<Track>();
}
public boolean addTrack(Track o) {
return tracks.add(o);
}
public List<Track> getTracks() {
return tracks;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
static class Track implements Named {
private String name;
private int length; // in seconds
private Disc associatedCompactDisc;
public Track(String name, int length, Disc associatedCompactDisc) {
this.associatedCompactDisc = associatedCompactDisc;
this.length = length;
this.name = name;
}
public Disc getAssociatedCompactDisc() {
return associatedCompactDisc;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
}