Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » DialogCellEditor and Navigation
DialogCellEditor and Navigation [message #22176] Tue, 21 July 2009 08:47 Go to next message
Murthy Bhat is currently offline Murthy BhatFriend
Messages: 159
Registered: July 2009
Senior Member
Hello,

I am having a treeviewer with cell editors in the editors. I have used
ColumnViewerEditorActivationStrategy to enable the activation of my editor
on certain user events.

Navigation events like 'TAB' work as expected for TextCellEditor and
Combobox editor but not for any editor that extends DialogCellEditor.

Could anyone please help me out,as to where the problem exactly is ?

Thanks,
Bhat
Re: DialogCellEditor and Navigation [message #22220 is a reply to message #22176] Tue, 21 July 2009 09:01 Go to previous messageGo to next message
Murthy Bhat is currently offline Murthy BhatFriend
Messages: 159
Registered: July 2009
Senior Member
Here is a runnable code snippet. The tabbing(Navigation via TAB) works
fine if I use any other editor other than the DialogCellEditor created at
line 174.

import java.util.ArrayList;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrate gy;
import org.eclipse.jface.viewers.DialogCellEditor;
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.TreeViewerEditor;
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.Composite;
import org.eclipse.swt.widgets.Control;
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);

ColumnViewerEditorActivationStrategy actSupport = new
ColumnViewerEditorActivationStrategy(
v) {
protected boolean isEditorActivationEvent(
ColumnViewerEditorActivationEvent event) {
return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
|| event.eventType ==
ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTI ON
|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
&& event.keyCode == SWT.CR)
|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
}
};


int navigation = ColumnViewerEditor.TABBING_HORIZONTAL
| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
| ColumnViewerEditor.TABBING_VERTICAL
| ColumnViewerEditor.KEYBOARD_ACTIVATION;

TreeViewerEditor.create(v, actSupport,navigation);

//v.getTree().setCellSelectionEnabled(true);

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");

MyDialogEditor dlgEditor = new MyDialogEditor(v.getTree());
v.setCellEditors(new CellEditor[]{dlgEditor,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) {
e.printStackTrace();
}



}

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();
}

public class MyDialogEditor extends DialogCellEditor
{
public MyDialogEditor(Composite parent) {
super(parent);
}

@Override
protected Object openDialogBox(Control cellEditorWindow) {
MessageDialog.openWarning(cellEditorWindow.getShell(), "Title",
"Message");
return 0;
}

}
}

Thanks,
Bhat
Re: DialogCellEditor and Navigation [message #22261 is a reply to message #22176] Tue, 21 July 2009 11:39 Go to previous messageGo to next message
Thomas Schindl is currently offline Thomas SchindlFriend
Messages: 6651
Registered: July 2009
Senior Member
Bhat schrieb:
> Hello,
>
> I am having a treeviewer with cell editors in the editors. I have used
> ColumnViewerEditorActivationStrategy to enable the activation of my
> editor on certain user events.
> Navigation events like 'TAB' work as expected for TextCellEditor and
> Combobox editor but not for any editor that extends DialogCellEditor.
> Could anyone please help me out,as to where the problem exactly is ?
>
> Thanks,
> Bhat
>
https://bugs.eclipse.org/bugs/show_bug.cgi?id=193081
Re: DialogCellEditor and Navigation [message #22297 is a reply to message #22261] Tue, 21 July 2009 12:18 Go to previous message
Murthy Bhat is currently offline Murthy BhatFriend
Messages: 159
Registered: July 2009
Senior Member
Thanks a lot. My problem is now solved.

As suggested by the fix in the bug report, by extending the
DialogCellEditor and overriding the createButton method, the limitation
can be resolved.

protected Button createButton(final Composite parent) {
Button result = new Button(parent, SWT.DOWN);
result.setText("...");
result.addListener(SWT.Traverse,new Listener() {
public void handleEvent(Event e) {
parent.notifyListeners(SWT.Traverse, e);
}
});
return result;

}

Thanks,
Bhat
Previous Topic:Remove an action from a context menu in my editor
Next Topic:Section gets larger when expand
Goto Forum:
  


Current Time: Sat Apr 20 06:05:53 GMT 2024

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

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

Back to the top