Home » Eclipse Projects » JFace » DialogCellEditor and Navigation 
| DialogCellEditor and Navigation [message #22176] | 
Tue, 21 July 2009 04:47   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
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    | 
 
Eclipse User  | 
 | 
 | 
   | 
 
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 #22297 is a reply to message #22261] | 
Tue, 21 July 2009 08:18   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
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
 |  
 |  
  |   
Goto Forum:
 
 Current Time: Mon Nov 03 19:41:18 EST 2025 
 Powered by  FUDForum. Page generated in 0.04389 seconds  
 |