package fr.opensagres.mongodb.ide.ui.viewers.editor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ControlEditor; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; public abstract class ControlEditorColumnLabelProvider<Parent extends Composite, I extends Item, CE extends ControlEditor, Editor extends Control> extends ColumnLabelProvider { private static final String KEY = ControlEditorColumnLabelProvider.class .getName(); @Override public void update(ViewerCell cell) { I item = (I) cell.getItem(); Parent parent = getParent(item); if (parent != null) { int columnIndex = cell.getColumnIndex(); String key = new StringBuilder("_ControlEditorColumnLabelProvider") .append(columnIndex).toString(); // Create control editor CE controlEditor = (CE) item.getData(key); if (controlEditor == null) { controlEditor = createControlEditor(parent, cell.getElement()); if (controlEditor != null) { item.setData(key, controlEditor); // Create editor Editor editor = createEditor(parent, item, cell.getColumnIndex(), cell.getElement(), cell); if (editor != null) { updateControlEditor(controlEditor, editor, item, cell.getColumnIndex()); } } } else { updateEditor((Editor) controlEditor.getEditor(), cell.getElement()); } } super.update(cell); } protected abstract void updateEditor(Editor editor, Object element); protected abstract void updateControlEditor(CE controlEditor, Editor editor, I item, int columnIndex); protected abstract Parent getParent(I item); protected CE createControlEditor(Parent parent, Object element) { if (hasControlEditor(element)) { return doCreateControlEditor(parent, element); } return null; } protected abstract boolean hasControlEditor(Object element); protected abstract CE doCreateControlEditor(Parent parent, Object element); protected abstract Editor createEditor(Parent parent, I item, int columnIndex, Object element, ViewerCell cell); }