Skip to main content



      Home
Home » Eclipse Projects » JFace » DialogCellEditor and Navigation
DialogCellEditor and Navigation [message #22176] Tue, 21 July 2009 04:47 Go to next message
Eclipse UserFriend
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 05:01 Go to previous messageGo to next message
Eclipse UserFriend
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 07:39 Go to previous messageGo to next message
Eclipse UserFriend
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 08:18 Go to previous message
Eclipse UserFriend
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: Thu May 08 09:42:42 EDT 2025

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

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

Back to the top