Home » Eclipse Projects » JFace » Tabletreeviewer scroll problem
Tabletreeviewer scroll problem [message #15578] |
Wed, 24 June 2009 08:26  |
Eclipse User |
|
|
|
Hello,
I am having a problem with the TableTreeViewer's scrolling behaviour in
jface. The problem scenario is as below
I have created a tabletreeviewer with cell editors in it. The cell editing
works all fine except for those cells which is half visible within my
table. i.e if my cell editor needs scrolling of the table for it to be
completely visible, then the auto scrolling takes place and the cell
editing is taken to the next rows same celleditor. Any further user event
sets the correct value to the correct cell.
This issue is happening with a tableviewer as well, but the cell focus is
brought back to the desired cell within very less time.
Thanks in advance for help.
Regards,
BYG
|
|
| | | | | |
Re: Tabletreeviewer scroll problem [message #16423 is a reply to message #15723] |
Wed, 24 June 2009 12:41   |
Eclipse User |
|
|
|
Hi Tom,
Please follow below steps to reproduce my problem in the snippet below.
1)Expand all the items in the tree
2)Scroll the viewer such that some row is semi visible.
3)Click and start editing the semi visible cell
4)The focus is onto the next row <Problem>
package org.eclipse.jface.snippets.viewers;
import java.util.ArrayList;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableTreeViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
/**
* A simple TreeViewer to demonstrate usage
*
* @author Tom Schindl <tom.schindl@bestsolution.at>
*
*/
public class Snippet032TableTreeViewer {
private class MyContentProvider implements ITreeContentProvider {
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.IStructuredContentProvider#getElem ents(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return ((MyModel) inputElement).child.toArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.IContentProvider#inputChanged(org. eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object
newInput) {
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#getChildren(j ava.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
return getElements(parentElement);
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#getParent(jav a.lang.Object)
*/
public Object getParent(Object element) {
if (element == null) {
return null;
}
return ((MyModel) element).parent;
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(j ava.lang.Object)
*/
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;
}
public String toString() {
String rv = "Item ";
if (parent != null) {
rv = parent.toString() + ".";
}
rv += counter;
return rv;
}
}
public class MyLabelProvider extends LabelProvider implements
ITableLabelProvider, ITableFontProvider, ITableColorProvider {
FontRegistry registry = new FontRegistry();
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
return "Column " + columnIndex + " => " + element.toString();
}
public Font getFont(Object element, int columnIndex) {
if (((MyModel) element).counter % 2 == 0) {
return registry.getBold(Display.getCurrent().getSystemFont()
.getFontData()[0].getName());
}
return null;
}
public Color getBackground(Object element, int columnIndex) {
if (((MyModel) element).counter % 2 == 0) {
return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
}
return null;
}
public Color getForeground(Object element, int columnIndex) {
if (((MyModel) element).counter % 2 == 1) {
return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
}
return null;
}
}
private class MyModifier implements ICellModifier {
private TableTreeViewer v;
public MyModifier(TableTreeViewer v) {
this.v = v;
}
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
return ((MyModel)element).counter + "";
}
public void modify(Object element, String property, Object value) {
((MyModel)((Item)element).getData()).counter =
Integer.parseInt(value.toString());
v.update(((Item)element).getData(), null);
}
}
public Snippet032TableTreeViewer(Shell shell) {
final TableTreeViewer v = new TableTreeViewer(shell, SWT.FULL_SELECTION);
TableColumn column = new
TableColumn(v.getTableTree().getTable(),SWT.NONE);
column.setWidth(200);
column.setText("Column 1");
column = new TableColumn(v.getTableTree().getTable(),SWT.NONE);
column.setWidth(200);
column.setText("Column 2");
v.getTableTree().getTable().setHeaderVisible(true);
v.getTableTree().getTable().setLinesVisible(true);
v.setCellEditors(new CellEditor[] { new
TextCellEditor(v.getTableTree().getTable()), new
TextCellEditor(v.getTableTree().getTable()) });
v.setColumnProperties(new String[] { "column1", "column2" });
v.setCellModifier(new MyModifier(v));
v.setLabelProvider(new MyLabelProvider());
v.setContentProvider(new MyContentProvider());
v.setInput(createModel());
}
private MyModel createModel() {
MyModel root = new MyModel(0, null);
root.counter = 0;
MyModel tmp;
for (int i = 1; i < 10; i++) {
tmp = new MyModel(i, root);
root.child.add(tmp);
for (int j = 1; j < i; j++) {
tmp.child.add(new MyModel(j, tmp));
}
}
return root;
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new Snippet032TableTreeViewer(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
|
|
Re: Tabletreeviewer scroll problem [message #16442 is a reply to message #16423] |
Wed, 24 June 2009 13:20   |
Eclipse User |
|
|
|
Hi Tom,
Same is the case with TreeViewer as well
import java.util.ArrayList;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ITableLabelProvider;
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.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
/**
* A simple TreeViewer to demonstrate usage of inline editing
*
* @author Tom Schindl <tom.schindl@bestsolution.at>
*
*/
public class Snippet038TreeViewerInlinelEditingOldAPI {
private class MyContentProvider implements ITreeContentProvider {
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.IStructuredContentProvider#getElem ents(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return ((MyModel) inputElement).child.toArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.IContentProvider#inputChanged(org. eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object
newInput) {
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#getChildren(j ava.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
return getElements(parentElement);
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#getParent(jav a.lang.Object)
*/
public Object getParent(Object element) {
if (element == null) {
return null;
}
return ((MyModel) element).parent;
}
/*
* (non-Javadoc)
*
* @see
org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(j ava.lang.Object)
*/
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;
}
public String toString() {
String rv = "Item ";
if (parent != null) {
rv = parent.toString() + ".";
}
rv += counter;
return rv;
}
}
public class MyLabelProvider extends LabelProvider implements
ITableLabelProvider {
FontRegistry registry = new FontRegistry();
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
return "Column " + columnIndex + " => " + element.toString();
}
}
public Snippet038TreeViewerInlinelEditingOldAPI(Shell shell) {
final TreeViewer v = new TreeViewer(shell,SWT.FULL_SELECTION);
addTableListener(v.getTree());
TreeColumn column = new TreeColumn(v.getTree(),SWT.NONE);
column.setWidth(200);
column.setText("Column 1");
column = new TreeColumn(v.getTree(),SWT.NONE);
column.setWidth(200);
column.setText("Column 2");
v.setCellEditors(new CellEditor[]{new TextCellEditor(v.getTree()), new
TextCellEditor(v.getTree())});
v.setColumnProperties(new String[]{"col1","col2"});
v.setCellModifier(new ICellModifier() {
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
return ((MyModel)element).counter+"";
}
public void modify(Object element, String property, Object value) {
((MyModel)((TreeItem)element).getData()).counter =
Integer.parseInt(value.toString());
v.update(((TreeItem)element).getData(), null);
}
});
v.setLabelProvider(new MyLabelProvider());
v.setContentProvider(new MyContentProvider());
v.setInput(createModel());
}
private void addTableListener(Tree tree) {
try {
/*
* NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
* Therefore, it is critical for performance that these methods be as
* efficient as possible.
*/
Listener paintListener = new Listener() {
public void handleEvent(Event event) {
try {
switch (event.type) {
case SWT.MeasureItem: {
TreeItem item = (TreeItem) event.item;
String text = getText(item, event.index);
Point size = event.gc.textExtent(text);
event.width = size.x;
event.height =Math.max(25,Math.max(event.height, size.y));
break;
}
case SWT.PaintItem: {
TreeItem item = (TreeItem) event.item;
String text = getText(item, event.index);
Image img=null;
Point size = event.gc.textExtent(text);
int offset2 = event.index == 0 ? Math.max(0,
(event.height - size.y) / 2) : 0;
if(event.index==0)
{
event.gc.drawText(text, event.x+20, event.y + offset2, true);
img=item.getImage();
event.gc.drawImage(img,event.x, event.y + offset2);
}
else
event.gc.drawText(text, event.x, event.y + offset2, true);
break;
}
case SWT.EraseItem: {
event.detail &= ~SWT.FOREGROUND;
break;
}
}
} catch (Exception e) {
}
}
String getText(TreeItem item, int column) {
String text = item.getText(column);
return text;
}
};
tree.addListener(SWT.MeasureItem, paintListener);
tree.addListener(SWT.PaintItem, paintListener);
tree.addListener(SWT.EraseItem, paintListener);
} catch (RuntimeException e) {
Logger.INSTANCE.log(Activator.PLUGIN_ID,e.getMessage(), e);
}
}
private MyModel createModel() {
MyModel root = new MyModel(0, null);
root.counter = 0;
MyModel tmp;
for (int i = 1; i < 10; i++) {
tmp = new MyModel(i, root);
root.child.add(tmp);
for (int j = 1; j < i; j++) {
tmp.child.add(new MyModel(j, tmp));
}
}
return root;
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new Snippet038TreeViewerInlinelEditingOldAPI(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
|
|
Re: Tabletreeviewer scroll problem [message #16460 is a reply to message #16423] |
Wed, 24 June 2009 15:11   |
Eclipse User |
|
|
|
Hi,
Which OS? Can you show me a screen shot. I just ran the stuff on
OS-Cocoa and didn't see a problem or maybe I didn't spotted it because
I'm unsure what I should look after.
Tom
byrebg schrieb:
> Hi Tom,
>
> Please follow below steps to reproduce my problem in the snippet below.
>
> 1)Expand all the items in the tree
> 2)Scroll the viewer such that some row is semi visible.
> 3)Click and start editing the semi visible cell
> 4)The focus is onto the next row <Problem>
>
> package org.eclipse.jface.snippets.viewers;
>
> import java.util.ArrayList;
>
> import org.eclipse.jface.resource.FontRegistry;
> import org.eclipse.jface.viewers.CellEditor;
> import org.eclipse.jface.viewers.ICellModifier;
> import org.eclipse.jface.viewers.ITableColorProvider;
> import org.eclipse.jface.viewers.ITableFontProvider;
> import org.eclipse.jface.viewers.ITableLabelProvider;
> import org.eclipse.jface.viewers.ITreeContentProvider;
> import org.eclipse.jface.viewers.LabelProvider;
> import org.eclipse.jface.viewers.TableTreeViewer;
> import org.eclipse.jface.viewers.TextCellEditor;
> import org.eclipse.jface.viewers.Viewer;
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.graphics.Color;
> import org.eclipse.swt.graphics.Font;
> import org.eclipse.swt.graphics.Image;
> import org.eclipse.swt.layout.FillLayout;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Item;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.TableColumn;
>
> /**
> * A simple TreeViewer to demonstrate usage
> * * @author Tom Schindl <tom.schindl@bestsolution.at>
> * */
> public class Snippet032TableTreeViewer {
> private class MyContentProvider implements ITreeContentProvider {
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.IStructuredContentProvider#getElem ents(java.lang.Object)
>
> */
> public Object[] getElements(Object inputElement) {
> return ((MyModel) inputElement).child.toArray();
> }
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.IContentProvider#dispose()
> */
> public void dispose() {
>
> }
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.IContentProvider#inputChanged(org. eclipse.jface.viewers.Viewer,
>
> * java.lang.Object, java.lang.Object)
> */
> public void inputChanged(Viewer viewer, Object oldInput, Object
> newInput) {
>
> }
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.ITreeContentProvider#getChildren(j ava.lang.Object)
>
> */
> public Object[] getChildren(Object parentElement) {
> return getElements(parentElement);
> }
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.ITreeContentProvider#getParent(jav a.lang.Object)
> */
> public Object getParent(Object element) {
> if (element == null) {
> return null;
> }
>
> return ((MyModel) element).parent;
> }
>
> /*
> * (non-Javadoc)
> * * @see
> org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(j ava.lang.Object)
>
> */
> 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;
> }
>
> public String toString() {
> String rv = "Item ";
> if (parent != null) {
> rv = parent.toString() + ".";
> }
>
> rv += counter;
>
> return rv;
> }
> }
>
> public class MyLabelProvider extends LabelProvider implements
> ITableLabelProvider, ITableFontProvider, ITableColorProvider {
> FontRegistry registry = new FontRegistry();
>
> public Image getColumnImage(Object element, int columnIndex) {
> return null;
> }
>
> public String getColumnText(Object element, int columnIndex) {
> return "Column " + columnIndex + " => " + element.toString();
> }
>
> public Font getFont(Object element, int columnIndex) {
> if (((MyModel) element).counter % 2 == 0) {
> return
> registry.getBold(Display.getCurrent().getSystemFont()
> .getFontData()[0].getName());
> }
> return null;
> }
>
> public Color getBackground(Object element, int columnIndex) {
> if (((MyModel) element).counter % 2 == 0) {
> return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
> }
> return null;
> }
>
> public Color getForeground(Object element, int columnIndex) {
> if (((MyModel) element).counter % 2 == 1) {
> return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
> }
> return null;
> }
>
> }
>
> private class MyModifier implements ICellModifier {
> private TableTreeViewer v;
>
> public MyModifier(TableTreeViewer v) {
> this.v = v;
> }
>
> public boolean canModify(Object element, String property) {
> return true;
> }
>
> public Object getValue(Object element, String property) {
> return ((MyModel)element).counter + "";
> }
>
> public void modify(Object element, String property, Object value) {
> ((MyModel)((Item)element).getData()).counter =
> Integer.parseInt(value.toString());
> v.update(((Item)element).getData(), null);
> }
>
> }
>
> public Snippet032TableTreeViewer(Shell shell) {
> final TableTreeViewer v = new TableTreeViewer(shell,
> SWT.FULL_SELECTION);
>
> TableColumn column = new
> TableColumn(v.getTableTree().getTable(),SWT.NONE);
> column.setWidth(200);
> column.setText("Column 1");
>
> column = new TableColumn(v.getTableTree().getTable(),SWT.NONE);
> column.setWidth(200);
> column.setText("Column 2");
>
> v.getTableTree().getTable().setHeaderVisible(true);
> v.getTableTree().getTable().setLinesVisible(true);
>
> v.setCellEditors(new CellEditor[] { new
> TextCellEditor(v.getTableTree().getTable()), new
> TextCellEditor(v.getTableTree().getTable()) });
> v.setColumnProperties(new String[] { "column1", "column2" });
> v.setCellModifier(new MyModifier(v));
>
> v.setLabelProvider(new MyLabelProvider());
> v.setContentProvider(new MyContentProvider());
> v.setInput(createModel());
> }
>
> private MyModel createModel() {
>
> MyModel root = new MyModel(0, null);
> root.counter = 0;
>
> MyModel tmp;
> for (int i = 1; i < 10; i++) {
> tmp = new MyModel(i, root);
> root.child.add(tmp);
> for (int j = 1; j < i; j++) {
> tmp.child.add(new MyModel(j, tmp));
> }
> }
>
> return root;
> }
>
> public static void main(String[] args) {
> Display display = new Display();
> Shell shell = new Shell(display);
> shell.setLayout(new FillLayout());
> new Snippet032TableTreeViewer(shell);
> shell.open();
>
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch())
> display.sleep();
> }
>
> display.dispose();
> }
> }
>
>
>
|
|
| | | | | |
Re: Tabletreeviewer scroll problem [message #477809 is a reply to message #352567] |
Thu, 06 August 2009 02:24  |
Eclipse User |
|
|
|
The mismatch in the desired editable row and the currently being modified
row can be easily detected in your modifier class.
You can get the current selection from the viewer and you can always make
a check in any of the modifier methods, canModify(...) for example.
An example is as below
public boolean canModify(Object element, String property) {
ISelection selection = myViewer.getSelection();
Object obj = ((IStructuredSelection) selection) .getFirstElement();
if(!element.equals(obj))
{
//Your Code for handling the situation here
}
...
Regards,
Bhat
|
|
|
Goto Forum:
Current Time: Mon Jul 14 04:54:49 EDT 2025
Powered by FUDForum. Page generated in 1.42861 seconds
|