package net.enilink.komma.edit.ui.properties.internal.parts; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import net.enilink.komma.edit.domain.IEditingDomain; import net.enilink.komma.edit.properties.EditingHelper; import net.enilink.komma.edit.properties.EditingHelper.Type; import net.enilink.komma.edit.ui.celleditor.PropertyCellEditingSupport; import net.enilink.komma.em.concepts.IProperty; import net.enilink.komma.core.IStatement; import net.enilink.komma.core.Statement; class ValueEditingSupport extends PropertyCellEditingSupport { private IEditingDomain editingDomain; private boolean createNew; public ValueEditingSupport(TreeViewer viewer) { this(viewer, EditingHelper.Type.VALUE); } public ValueEditingSupport(final TreeViewer viewer, EditingHelper.Type type) { super(viewer, type, (type == Type.VALUE ? SWT.MULTI | SWT.WRAP | SWT.V_SCROLL : SWT.SINGLE)); } @Override protected boolean canEdit(Object element) { if (element instanceof StatementNode && ((StatementNode) element).isInverse()) { return false; } boolean expandedNode = element instanceof PropertyNode && ((AbstractTreeViewer) getViewer()).getExpandedState(element); createNew = expandedNode || element instanceof PropertyNode && (((PropertyNode) element).isCreateNewStatementOnEdit() || ((PropertyNode) element) .isIncomplete()); if (type == EditingHelper.Type.PROPERTY && expandedNode) { return false; } return super.canEdit(element); } @Override protected CellEditor getCellEditor(Object element) { if (createNew) { ((PropertyNode) unwrap(element)).setCreateNewStatementOnEdit(true); getViewer().update(element, null); } return super.getCellEditor(element); } @Override protected IEditingDomain getEditingDomain() { return editingDomain; } public void setEditingDomain(IEditingDomain editingDomain) { this.editingDomain = editingDomain; } @Override protected IStatement getStatement(Object element) { if (createNew) { return new Statement(((PropertyNode) element).getResource(), ((PropertyNode) element).getProperty(), null); } return ((StatementNode) element).getStatement(); } @Override protected void editorClosed(Object element) { if (createNew) { // ensure that initial state is restored ((PropertyNode) element).setCreateNewStatementOnEdit(false); getViewer().update(element, null); } } @Override protected void setProperty(Object element, IProperty property) { final PropertyNode node = (PropertyNode) element; node.setProperty(property); getViewer().update(node, null); getViewer().getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { // TODO find a more generic way to // do this getViewer().editElement(node, 1); } }); ((PropertyTreeContentProvider) getViewer().getContentProvider()) .registerPropertyNode(node); } @Override protected void setEditStatus(Object element, IStatus status, Object value) { StatementNode node = (StatementNode) element; node.setStatus(status); node.setEditorValue(status.isOK() ? null : value); // a new value was directly added to the property node if (status.isOK() && node instanceof PropertyNode) { ((PropertyNode) node).refreshChildren(); } getViewer().refresh(node); } @Override protected Object getValue(Object element) { Object value = ((StatementNode) unwrap(element)).getEditorValue(); return value != null ? value : super.getValue(element); } }