package name.abuchen.portfolio.ui.util.viewers; import java.util.ArrayList; import java.util.List; import name.abuchen.portfolio.ui.AbstractFinanceView; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerEditor; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; public abstract class ColumnEditingSupport { public interface ModificationListener { void onModified(Object element, Object newValue, Object oldValue); } public static class MarkDirtyListener implements ModificationListener { private final AbstractFinanceView view; public MarkDirtyListener(AbstractFinanceView view) { this.view = view; } @Override public void onModified(Object element, Object newValue, Object oldValue) { view.markDirty(); } } private List<ModificationListener> listeners; public CellEditor createEditor(Composite composite) { return new TextCellEditor(composite); } public boolean canEdit(Object element) { return true; } /** * Called before the editor for the given element is made visible */ public void prepareEditor(Object element) {} public abstract Object getValue(Object element) throws Exception; public abstract void setValue(Object element, Object value) throws Exception; public final ColumnEditingSupport addListener(ModificationListener listener) { if (listeners == null) listeners = new ArrayList<ModificationListener>(); listeners.add(listener); return this; } public final void attachTo(Column column) { column.setEditingSupport(this); } protected final void notify(Object element, Object newValue, Object oldValue) { if (listeners != null) { for (ModificationListener listener : listeners) listener.onModified(element, newValue, oldValue); } } public static void prepare(ColumnViewer viewer) { ColumnViewerEditorActivationStrategy activationStrategy = new ColumnViewerEditorActivationStrategy(viewer) { protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } }; int feature = ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION; if (viewer instanceof TableViewer) TableViewerEditor.create((TableViewer) viewer, null, activationStrategy, feature); else if (viewer instanceof TreeViewer) TreeViewerEditor.create((TreeViewer) viewer, activationStrategy, feature); } }