public Command getCreateLinkCommand(View source, View target, GenCommonBase linkType) { IElementType metamodelType = getElementType(linkType); CreateRelationshipRequest relationShipReq = new CreateRelationshipRequest(metamodelType); ConnectionViewAndElementDescriptor desc = new ConnectionViewAndElementDescriptor( new CreateElementRequestAdapter(relationShipReq), metamodelType instanceof IHintedType ? ((IHintedType) metamodelType).getSemanticHint() : "", getDefaultPreferencesHint()); CreateConnectionViewAndElementRequest req = new CreateConnectionViewAndElementRequest(desc); req.setType(RequestConstants.REQ_CONNECTION_START); EditPart sourceEditPart = findEditPart(source); req.setSourceEditPart(sourceEditPart); // Note: initializes the sourceCommand in the request Command sourceCmd = sourceEditPart.getCommand(req); if (sourceCmd == null || !sourceCmd.canExecute()) { return null; } EditPart targetEditPart = target != null ? findEditPart(target) : null; if (targetEditPart != null) { req.setType(RequestConstants.REQ_CONNECTION_END); req.setTargetEditPart(targetEditPart); req.setLocation(new Point(0, 0)); sourceEditPart.getCommand(req); Command targetCmd = targetEditPart.getCommand(req); return targetCmd; } return null; }
/** * return commands to transform a binary association to n-ary association or allow adding * branches. * * @param createConnectionViewAndElementRequest the create connection view and element request * @param command that will contains subcommands * @return the command */ public Command getCommand( CreateConnectionViewAndElementRequest createConnectionViewAndElementRequest, Command command) { // 0. get source and target type command = new CompoundCommand(); EditPart sourceEditPart = createConnectionViewAndElementRequest.getSourceEditPart(); EditPart targetEditPart = createConnectionViewAndElementRequest.getTargetEditPart(); // if the the source or the target is a node association the goal is // to create only one branch if ((((View) sourceEditPart.getModel()).getType() == "" + AssociationNodeEditPart.VISUAL_ID)) { return getBranchAssociationCommand(createConnectionViewAndElementRequest, command); } if ((((View) targetEditPart.getModel()).getType() == "" + AssociationNodeEditPart.VISUAL_ID)) { return UnexecutableCommand.INSTANCE; } // the source or the target has to be different of a dependency branch if (sourceEditPart instanceof AssociationBranchEditPart) { GraphicalEditPart associationNodeEditPart = lookForAssociationNodeEditPart((AssociationBranchEditPart) sourceEditPart); if (associationNodeEditPart != null) { createConnectionViewAndElementRequest.setSourceEditPart(associationNodeEditPart); return getBranchAssociationCommand(createConnectionViewAndElementRequest, command); } else { return UnexecutableCommand.INSTANCE; } } // the source or the target has to be different of a dependency branch if (targetEditPart instanceof AssociationBranchEditPart) { return UnexecutableCommand.INSTANCE; } // if not this a transformation of simple dependency to multiDependency return getAssociationToMultiAssociationCommand(createConnectionViewAndElementRequest, command); }