package org.teiid.designer.ui.actions; import java.util.List; import org.eclipse.core.expressions.PropertyTester; import org.eclipse.core.resources.IFile; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.metamodels.core.ModelImport; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.ui.actions.workers.CloneWorker; import org.teiid.designer.ui.editors.ModelEditorManager; import org.teiid.designer.ui.viewsupport.DiagramHelperManager; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * @since 8.0 */ public final class DesignerUiPropertyTester extends PropertyTester { /** * The toString() values of these enum values match entries in plugin.xml. */ private enum Tests { CLONE_ALLOWED, EDITABLE_OBJECT, MODEL_PROJECT_OBJECT, READONLY_MODEL_OBJECT, RENAME_ALLOWED, PASTE_SPECIAL_ALLOWED } /** * {@inheritDoc} * * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], * java.lang.Object) */ @Override public boolean test( Object receiver, String property, Object[] args, Object expectedValue ) { // first make sure the selected object is in a Model Project if (!isModelProjectObject(receiver)) { return false; } if (Tests.CLONE_ALLOWED.toString().equals(property)) { return isCloneAllowed(receiver); } if (Tests.EDITABLE_OBJECT.toString().equals(property)) { return isEditableObject(receiver); } if (Tests.MODEL_PROJECT_OBJECT.toString().equals(property)) { return isModelProjectObject(receiver); } if (Tests.PASTE_SPECIAL_ALLOWED.toString().equals(property)) { return isPasteSpecialAllowed(receiver); } if (Tests.READONLY_MODEL_OBJECT.toString().equals(property)) { return isReadOnlyModelObject(receiver); } if (Tests.RENAME_ALLOWED.toString().equals(property)) { return isRenameAllowed(receiver); } // make sure all properties have been handled assert false : "Did not test all properties"; //$NON-NLS-1$ return false; } private boolean isCloneAllowed( Object receiver ) { ISelection selection = null; if (receiver instanceof List<?>) { List<?> items = (List<?>)receiver; if (items.isEmpty()) { return false; } selection = new StructuredSelection(items); } else { selection = new StructuredSelection(receiver); } // let work determine enablement CloneWorker cloneWorker = new CloneWorker(true); return cloneWorker.selectionChanged(selection); } private boolean isEditableObject( Object receiver ) { assert (receiver instanceof EObject) : "Receiver is not an EObject. Check handler's enabledWhen logic in plugin.xml."; //$NON-NLS-1$ return ModelEditorManager.canEdit((EObject)receiver); } private boolean isModelProjectObject( Object receiver ) { if (receiver instanceof IFile) { return ModelUtilities.isModelFile((IFile)receiver); } if (receiver instanceof EObject) { return (ModelerCore.getModelWorkspace().findModelResource((EObject)receiver) != null); } return false; } private boolean isPasteSpecialAllowed( Object receiver ) { for (IPasteSpecialContributor contributor : PasteSpecialAction.getPasteSpecialContributors()) { if (contributor.canPaste()) { return true; } } return false; } private boolean isReadOnlyModelObject( Object receiver ) { if (receiver instanceof EObject) { return ModelObjectUtilities.isReadOnly((EObject)receiver); } assert false : "Receiver is not an EObject. Check handler's enabledWhen logic in plugin.xml"; //$NON-NLS-1$ return false; } private boolean isRenameAllowed( Object receiver ) { assert (receiver instanceof EObject) : "Receiver is not an EObject. Check handler's enabledWhen logic in plugin.xml."; //$NON-NLS-1$ EObject eObj = (EObject)receiver; if (isReadOnlyModelObject(eObj)) { return false; } if (eObj instanceof Diagram) { return DiagramHelperManager.canRename((Diagram)eObj); } if (eObj instanceof ModelImport) { return false; } return ModelerCore.getModelEditor().hasName(eObj); } }