/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.actions;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlClassifier;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.util.AspectManager;
import org.teiid.designer.metamodels.core.ModelImport;
import org.teiid.designer.metamodels.relational.ForeignKey;
import org.teiid.designer.metamodels.relational.UniqueKey;
import org.teiid.designer.ui.viewsupport.ModelObjectEditHelper;
/**
* @author jhelbling
*
*
*
* @since 8.0
*/
public class RelationalObjectEditHelper extends ModelObjectEditHelper {
// /* (non-Javadoc)
// * @See org.teiid.designer.ui.actions.IModelObjectEditHelper#canDelete(java.lang.Object)
// */
// public boolean canDelete(Object obj) {
//
// return true;
// }
/* (non-Javadoc)
* @See org.teiid.designer.ui.actions.IModelObjectEditHelper#canDelete(java.lang.Object)
*/
@Override
public boolean canUndoDelete(Object obj) {
if ( isMultiClassifierForeignKeyCutDeleteCase( obj ) ) {
return false;
}
return true;
}
// /* (non-Javadoc)
// * @See org.teiid.designer.ui.actions.IModelObjectEditHelper#canCut(java.lang.Object)
// */
// public boolean canCut(Object obj) {
//
// return true;
// }
/* (non-Javadoc)
* @See org.teiid.designer.ui.actions.IModelObjectEditHelper#canCut(java.lang.Object)
*/
@Override
public boolean canUndoCut(Object obj) {
if ( isMultiClassifierForeignKeyCutDeleteCase( obj ) ) {
return false;
}
return true;
}
private boolean isMultiClassifierForeignKeyCutDeleteCase( Object obj ) {
/*
* Use case:
* if a CUT or DELETE will break an FK relationahship, we cannot UNDO it later.
* [Note: As MetaData codebase evolves, this situation may improve, and this
* edit should be removed at that time.]
*
* Ex: If table A has a PK, table B has an FK that points to A's PK,
* then a CUT or DELETE of A will break the PK/FK relationship,
* and cannot later be undone if the classifiers on BOTH ends
* of an FK relationship are in the list of objects to be CUT or DELETEd.
*/
if( obj instanceof List ) {
AspectManager amgr = DiagramUiPlugin.getDiagramAspectManager();
List lstSelected = (List)obj;
Iterator it = lstSelected.iterator();
while( it.hasNext() ) {
Object o = it.next();
if ( o instanceof EObject ) {
EObject eoThisEObject = (EObject)o;
MetamodelAspect mma = amgr.getUmlAspect( eoThisEObject );
if ( mma instanceof UmlClassifier ) {
UmlClassifier classif = (UmlClassifier)mma;
Collection col = classif.getRelationships( eoThisEObject );
Iterator it2 = col.iterator();
while( it2.hasNext() ) {
Object o2 = it2.next();
if ( o2 instanceof ForeignKey ) {
ForeignKey fk = (ForeignKey)o2;
UniqueKey uk = fk.getUniqueKey();
if ( uk != null ) {
EObject eoContainer = uk.eContainer();
if ( selectionContainsOtherEndOfForeignKey( lstSelected, eoContainer, eoThisEObject ) ) {
return true;
}
}
}
}
}
}
}
}
return false;
}
private boolean selectionContainsOtherEndOfForeignKey( List lstSelected, EObject eoContainer, EObject eoThisClassifier ) {
Iterator it = lstSelected.iterator();
while( it.hasNext() ) {
Object o = it.next();
if ( o instanceof EObject ) {
if ( o != eoThisClassifier && o == eoContainer ) {
return true;
}
}
}
return false;
}
@Override
public boolean canClone(Object obj) {
if( obj instanceof ModelImport )
return false;
return super.canClone(obj);
}
@Override
public boolean canCopy(Object obj) {
if( obj instanceof ModelImport )
return false;
return super.canCopy(obj);
}
@Override
public boolean canCut(Object obj) {
if( obj instanceof ModelImport )
return false;
return super.canCut(obj);
}
@Override
public boolean canPaste(Object obj, Object pasteParent) {
if( obj instanceof ModelImport )
return false;
return super.canPaste(obj, pasteParent);
}
@Override
public boolean canRename(Object obj) {
if( obj instanceof ModelImport )
return false;
return super.canRename(obj);
}
}