/* * 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.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.draw2d.ColorConstants; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.commands.Command; import org.teiid.core.designer.ModelerCoreException; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.association.AssociationDescriptor; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.PluginConstants; import org.teiid.designer.diagram.ui.editor.DiagramViewer; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.uml.part.SetAssociationCommand; import org.teiid.designer.diagram.ui.part.AbstractDefaultEditPart; import org.teiid.designer.diagram.ui.part.DiagramEditPart; import org.teiid.designer.diagram.ui.part.DropEditPart; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; /** * HiliteDndNodeSelectionEditPolicy * * @since 8.0 */ /** * @author blafond To change the template for this generated type comment go to Window>Preferences>Java>Code Generation>Code and * Comments * * @since 8.0 */ public class HiliteDndNodeSelectionEditPolicy extends DiagramNodeSelectionEditPolicy { protected boolean hilited = false; private boolean canCreateAssociation() { boolean canCreate = false; if (!isDiagramReadOnly() && isPackageDiagram()) { final List selectedEObjects = getSelectedEObjects(); if (selectedEObjects.size() > 1) try { final Collection descriptors = ModelerCore.getModelEditor().getNewAssociationDescriptors(selectedEObjects); if (descriptors.size() == 1) { final AssociationDescriptor theDescriptor = (AssociationDescriptor)descriptors.iterator().next(); if(theDescriptor!=null) { printDescriptor(theDescriptor); if (theDescriptor.isAmbiguous()) DiagramUiConstants.Util.log(IStatus.INFO, "HiliteDndNodeSelectionEditPolicy.canCreateAssociation() The Association Descriptor is AMBIGUOUS"); //$NON-NLS-1$ if (theDescriptor.isComplete()) canCreate = true; } } else { // System.out.println(" -->> HDndNSP.canCreateAssociation() # Descriptors = " + descriptors.size()); final Iterator iter = descriptors.iterator(); AssociationDescriptor theDescriptor = null; while (iter.hasNext()) { theDescriptor = (AssociationDescriptor)iter.next(); if (theDescriptor.isAmbiguous()) DiagramUiConstants.Util.log(IStatus.INFO, "HiliteDndNodeSelectionEditPolicy.canCreateAssociation() The Association Descriptor is AMBIGUOUS"); //$NON-NLS-1$ if (theDescriptor.isComplete()) canCreate = true; if (canCreate) break; } } } catch (final ModelerCoreException theException) { DiagramUiConstants.Util.log(IStatus.ERROR, "HiliteDndNodeSelectionEditPolicy.canCreateAssociation() ERROR getting New Association Descriptors"); //$NON-NLS-1$ } } // System.out.println(" ---------->> HDndNSP.canCreateAssociation() = " + canCreate + " for Host = "+ getHost()); return canCreate; } @Override public void eraseTargetFeedback( final Request request ) { if (request != null && request.getType().equals(RequestConstants.REQ_ADD)) showHighlight(false); } @Override public Command getCommand( final Request request ) { final DiagramEditPart thisEditPart = (DiagramEditPart)getHost(); if (thisEditPart.getModelObject() instanceof Diagram) return null; final List eObjs = getSelectedEObjects(); if (eObjs.size() > 1 && request.getType().equals(RequestConstants.REQ_MOVE) || request.getType().equals(RequestConstants.REQ_ADD)) { final SetAssociationCommand newCommand = new SetAssociationCommand(getSelectedEObjects()); return newCommand; } return null; } private List getSelectedEditParts() { if (getViewer() != null) return getViewer().getSelectedEditParts(); return Collections.EMPTY_LIST; } private List getSelectedEObjects() { final Iterator iter = getSelectedEditParts().iterator(); final List selectedEObjects = new ArrayList(); DiagramEditPart nextEP = null; DiagramModelNode nextDMN = null; while (iter.hasNext()) { nextEP = (DiagramEditPart)iter.next(); if (nextEP.getModel() != null && nextEP.getModel() instanceof DiagramModelNode) { nextDMN = (DiagramModelNode)nextEP.getModel(); if (nextDMN.getModelObject() != null && !selectedEObjects.contains(nextDMN.getModelObject())) // System.out.println(" -->> HDndNSP.getSelectedEObjects() added: "+ // ModelerCore.getModelEditor().getName(nextDMN.getModelObject())); selectedEObjects.add(nextDMN.getModelObject()); } } final DiagramEditPart thisEditPart = (DiagramEditPart)getHost(); if (thisEditPart.getModel() != null && thisEditPart.getModel() instanceof DiagramModelNode) { nextDMN = (DiagramModelNode)thisEditPart.getModel(); if (nextDMN.getModelObject() != null && !selectedEObjects.contains(nextDMN.getModelObject())) // System.out.println(" -->> HDndNSP.getSelectedEObjects() added: "+ // ModelerCore.getModelEditor().getName(nextDMN.getModelObject())); selectedEObjects.add(nextDMN.getModelObject()); } return selectedEObjects; } @Override public EditPart getTargetEditPart( final Request request ) { if (request != null && request.getType() != null) return request.getType().equals(RequestConstants.REQ_ADD) ? getHost() : null; return null; } private DiagramViewer getViewer() { final EditPart ep = getHost(); if (ep != null && ep instanceof AbstractDefaultEditPart) { final AbstractDefaultEditPart adep = (AbstractDefaultEditPart)ep; if (adep.isValidViewer()) if (adep.getViewer() instanceof DiagramViewer) return (DiagramViewer)adep.getViewer(); } return null; } protected boolean isDiagramReadOnly() { if (getViewer() != null) { final Diagram diagram = getViewer().getEditor().getDiagram(); return ModelObjectUtilities.isReadOnly(diagram); } return true; } private boolean isPackageDiagram() { boolean result = false; if (getViewer() != null) { final Diagram diagram = getViewer().getEditor().getDiagram(); if (diagram != null && diagram.getType() != null && diagram.getType().equals(PluginConstants.PACKAGE_DIAGRAM_TYPE_ID)) result = true; } return result; } private void printDescriptor( final AssociationDescriptor theDescriptor ) { // System.out.println(" ------------------- AssociationDescriptor ------------------------"); // System.out.println(" desciptor = " + theDescriptor); // System.out.println(" desciptor.isAmbiguous()" + theDescriptor.isAmbiguous()); // System.out.println(" desciptor.isComplete()" + theDescriptor.isComplete()); // AssociationDescriptor[] dArray = theDescriptor.getChildren(); // AssociationDescriptor nextD = null; // for(int i=0; i<dArray.length; i++ ) { // System.out.println(" NESTED desciptor = " + dArray[i]); // System.out.println(" NESTED desciptor.isAmbiguous()" + dArray[i].isAmbiguous()); // System.out.println(" NESTED desciptor.isComplete()" + dArray[i].isComplete()); // } // System.out.println(" ------------------- AssociationDescriptor ------------------------"); } protected void showHighlight( final boolean hilite ) { final DiagramEditPart selectedEditPart = (DiagramEditPart)getHost(); if (selectedEditPart instanceof DropEditPart) ((DropEditPart)selectedEditPart).hilite(hilite); else if (hilite && !hilited) { hilited = true; selectedEditPart.hiliteBackground(ColorConstants.lightGreen); } else if (!hilite && hilited) { selectedEditPart.hiliteBackground(null); hilited = false; } } @Override public void showTargetFeedback( final Request request ) { if (request.getType().equals(RequestConstants.REQ_MOVE) || request.getType().equals(RequestConstants.REQ_ADD)) // DiagramEditPart // selectedEditPart // = // (DiagramEditPart)getHost(); // if( selectedEditPart.shouldHiliteBackground(getSelectedEditParts()) ) if (canCreateAssociation()) showHighlight(true); } @Override public boolean understandsRequest( final Request request ) { return false; } }