Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » Problem using other than arrow keys for navigating TreeViewer
Problem using other than arrow keys for navigating TreeViewer [message #501446] Wed, 02 December 2009 11:49
Marco mvmsoft is currently offline Marco mvmsoftFriend
Messages: 14
Registered: July 2009
Location: Germany
Junior Member
We need a tree viewer navigating to next line on CR using 3.3+ API (tested on 3.4.1 and 3.5SR1. Overriding the CellNavigationStrategy seems to set the focus cell to the correct location, but since tree selection is not changed, it seems to be reset on the next getFocus() call. I guess the CellNavigationStrategy never works for up/down; trying left/right works.

This is a derivation of Snippet26 to show the problem; start it, expand some items, place focus on first cell, then press CR or 'd'; nothing happens. pressing arrow down works.

Any idea for a workaround ?

Thanks

Marco

/*********************************************************** ********************
* Copyright (c) 2006, 2007 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.jface.snippets.viewers;

import java.util.ArrayList;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellNavigationStrategy;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrate gy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ITreeContentProvider;
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.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;

/**
* A simple TreeViewer to demonstrate usage
*
* @author Tom Schindl <tom.schindl@bestsolution.at>
*/
public class Snippet026TreeViewerTabEditingCR
{
public Snippet026TreeViewerTabEditingCR(final Shell shell)
{
Button b = new Button(shell, SWT.PUSH);
b.setText("Remove column");
final TreeViewer v = new TreeViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
v.getTree().setLinesVisible(true);
v.getTree().setHeaderVisible(true);
b.addSelectionListener(new SelectionListener()
{

public void widgetDefaultSelected(SelectionEvent e)
{

}

public void widgetSelected(SelectionEvent e)
{
v.getTree().getColumn(1).dispose();
}

});

TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(v,
new FocusCellOwnerDrawHighlighter(v), new CellNavigationStrategy()
{
@Override
public boolean isNavigationEvent(ColumnViewer viewer, Event event)
{
if (event.keyCode == SWT.CR || event.character == 'd')
{
return true;
}
return super.isNavigationEvent(viewer, event);
}

@Override
public ViewerCell findSelectedCell(ColumnViewer viewer,
ViewerCell currentSelectedCell, Event event)
{
if (event.keyCode == SWT.CR || event.character == 'd')
{
if (currentSelectedCell != null)
{
return currentSelectedCell.getNeighbor(ViewerCell.ABOVE, false);
}
}
return super.findSelectedCell(viewer, currentSelectedCell, event);
}

@Override
public boolean shouldCancelEvent(ColumnViewer viewer, Event event)
{
return event.keyCode == SWT.CR || event.character == 'd'
|| super.shouldCancelEvent(viewer, event);
}
});
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
v)
{
@Override
protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event)
{
return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTI ON
|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
}
};

TreeViewerEditor.create(v, focusCellManager, actSupport,
ColumnViewerEditor.TABBING_HORIZONTAL
| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
| ColumnViewerEditor.TABBING_VERTICAL
| ColumnViewerEditor.KEYBOARD_ACTIVATION);

final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());

TreeViewerColumn column = new TreeViewerColumn(v, SWT.NONE);
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
column.getColumn().setText("Column 1");
column.setLabelProvider(new ColumnLabelProvider()
{

@Override
public String getText(Object element)
{
return "Column 1 => " + element.toString();
}

});
column.setEditingSupport(new EditingSupport(v)
{
@Override
protected boolean canEdit(Object element)
{
return false;
}

@Override
protected CellEditor getCellEditor(Object element)
{
return textCellEditor;
}

@Override
protected Object getValue(Object element)
{
return ((MyModel) element).counter + "";
}

@Override
protected void setValue(Object element, Object value)
{
((MyModel) element).counter = Integer.parseInt(value.toString());
v.update(element, null);
}
});

column = new TreeViewerColumn(v, SWT.NONE);
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
column.getColumn().setText("Column 2");
column.setLabelProvider(new ColumnLabelProvider()
{

@Override
public String getText(Object element)
{
return "Column 2 => " + element.toString();
}

});
column.setEditingSupport(new EditingSupport(v)
{
@Override
protected boolean canEdit(Object element)
{
return true;
}

@Override
protected CellEditor getCellEditor(Object element)
{
return textCellEditor;
}

@Override
protected Object getValue(Object element)
{
return ((MyModel) element).counter + "";
}

@Override
protected void setValue(Object element, Object value)
{
((MyModel) element).counter = Integer.parseInt(value.toString());
v.update(element, null);
}
});

column = new TreeViewerColumn(v, SWT.NONE);
column.getColumn().setWidth(200);
column.getColumn().setMoveable(true);
column.getColumn().setText("Column 3");
column.setLabelProvider(new ColumnLabelProvider()
{

@Override
public String getText(Object element)
{
return "Column 3 => " + element.toString();
}

});
column.setEditingSupport(new EditingSupport(v)
{
@Override
protected boolean canEdit(Object element)
{
return true;
}

@Override
protected CellEditor getCellEditor(Object element)
{
return textCellEditor;
}

@Override
protected Object getValue(Object element)
{
return ((MyModel) element).counter + "";
}

@Override
protected void setValue(Object element, Object value)
{
((MyModel) element).counter = Integer.parseInt(value.toString());
v.update(element, null);
}
});

v.setContentProvider(new MyContentProvider());

v.setInput(createModel());
}

private MyModel createModel()
{

MyModel root = new MyModel(0, null);
root.counter = 0;

MyModel tmp;
MyModel subItem;
for (int i = 1; i < 10; i++)
{
tmp = new MyModel(i, root);
root.child.add(tmp);
for (int j = 1; j < i; j++)
{
subItem = new MyModel(j, tmp);
subItem.child.add(new MyModel(j * 100, subItem));
tmp.child.add(subItem);
}
}

return root;
}

public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new Snippet026TreeViewerTabEditingCR(shell);
shell.open();

while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}

display.dispose();
}

private class MyContentProvider implements ITreeContentProvider
{

public Object[] getElements(Object inputElement)
{
return ((MyModel) inputElement).child.toArray();
}

public void dispose()
{
}

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

public Object[] getChildren(Object parentElement)
{
return getElements(parentElement);
}

public Object getParent(Object element)
{
if (element == null)
{
return null;
}
return ((MyModel) element).parent;
}

public boolean hasChildren(Object element)
{
return ((MyModel) element).child.size() > 0;
}

}

public class MyModel
{
public MyModel parent;

public ArrayList child = new ArrayList();

public int counter;

public MyModel(int counter, MyModel parent)
{
this.parent = parent;
this.counter = counter;
}

@Override
public String toString()
{
String rv = "Item ";
if (parent != null)
{
rv = parent.toString() + ".";
}

rv += counter;

return rv;
}
}

}
Previous Topic:TreeViewer with columns
Next Topic:[Databinding] validation with dynamic OCL expression
Goto Forum:
  


Current Time: Fri Mar 29 07:43:16 GMT 2024

Powered by FUDForum. Page generated in 0.02893 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top