Home » Eclipse Projects » JFace » Tabletreeviewer scroll problem
| | | | | |
Re: Tabletreeviewer scroll problem [message #16423 is a reply to message #15723] |
Wed, 24 June 2009 16:41 |
byrebg Mising name Messages: 48 Registered: July 2009 |
Member |
|
|
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 17:20 |
byrebg Mising name Messages: 48 Registered: July 2009 |
Member |
|
|
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 19:11 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
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();
> }
> }
>
>
>
|
|
| | | | | | |
Goto Forum:
Current Time: Fri Sep 20 09:56:40 GMT 2024
Powered by FUDForum. Page generated in 0.05433 seconds
|