package org.eclipse.uml2.diagram.sequence.internal.layout.alien;
//package com.borland.tg.uml20.interaction.internal.layout.alien;
//
//import java.awt.Dimension;
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Collections;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsDiagram;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsElement;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsLayoutAccess;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsLink;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsLinkEnumeration;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsNode;
//import com.borland.tg.uml20.interaction.internal.layout.abstractgde.AbsNodeEnumeration;
//import com.borland.tg.uml20.interaction.internal.layout.model.LmObjectsResolver;
//import com.borland.tg.uml20.interaction.internal.layout.model.SdLayoutModelAccess;
//
///**
// *
// */
//public class AlienElementsLayout implements IAlienElementsLayout {
// public AlienElementsLayout(SdLayoutModelAccess layoutModelAccess, AbsDiagram gdeDiagram, AbsLayoutAccess absLinkLayoutAccess) {
// myLayoutModelAccess = layoutModelAccess;
// myGdeDiagram = gdeDiagram;
// myAbsLinkLayoutAccess = absLinkLayoutAccess;
// }
//
// public Dimension layoutReshaped(Collection reshapedGdeElements, int clientAreaLeft, int clientAreaTop) {
// // Here we rely on the fact, that source and destination of GdeLinks cannot be both links at the same time
//
// List sdElementsList = new ArrayList();
// Set alienLinks = new HashSet();
//
// for (Iterator it = reshapedGdeElements.iterator(); it.hasNext(); ) {
// AbsElement gdeElement = (AbsElement) it.next();
//
// if (gdeElement instanceof AbsNode) {
// sdElementsList.add(gdeElement);
// } else {
// AbsLink gdeLink = (AbsLink) gdeElement;
//
// Object lmObject = getLmObjectsResolver().getLmObject(gdeElement);
//
// if (lmObject instanceof AlienLink) {
// alienLinks.add(lmObject);
// } else {
// sdElementsList.add(gdeLink);
// }
// }
// }
//
// Set firstOrderAbsLinks = new HashSet();
//
// LinksCache linksCache = new LinksCache(myGdeDiagram, getLmObjectsResolver());
//
// for (Iterator it = sdElementsList.iterator(); it.hasNext(); ) {
// AbsElement gdeElement = (AbsElement) it.next();
// Collection relatedAbsAlienLinks = linksCache.getLinks(gdeElement);
//
// firstOrderAbsLinks.addAll(relatedAbsAlienLinks);
// }
//
// List alienLinksToLayout = sortGdeLinks(firstOrderAbsLinks, alienLinks, linksCache);
//
// Dimension result = placeAllAlienNodesInClientArea(clientAreaLeft, clientAreaTop);
// layoutLinks(alienLinksToLayout);
// return result;
// }
//
// public Dimension fullLayout(int alienElementsAreaLeft, int alienElementsAreaTop) {
// Set allLinks = new HashSet();
// for (AbsLinkEnumeration linksEnum = myGdeDiagram.links(); linksEnum.hasMoreElements(); ) {
// AbsLink gdeLink = linksEnum.nextGdeLink();
// Object lmObject = getLmObjectsResolver().getLmObject(gdeLink);
// if (lmObject instanceof AlienLink) {
// allLinks.add(lmObject);
// }
// }
//
// LinksCache linksCache = new LinksCache(myGdeDiagram, getLmObjectsResolver());
//
// List alienLinksToLayout = sortGdeLinks(Collections.EMPTY_SET, allLinks, linksCache);
//
// AlienElementsFullLayout fullLayout = new AlienElementsFullLayout(myAbsLinkLayoutAccess, getLmObjectsResolver());
// fullLayout.readElements(myGdeDiagram, alienLinksToLayout);
// return fullLayout.layout(alienElementsAreaLeft, alienElementsAreaTop);
// //layoutLinks(alienLinksToLayout, true);
// }
//
// private List sortGdeLinks(Set firstOrderAbsLinks, Collection alienLinks, LinksCache linksCache) {
// List resultAbsLinksList = new ArrayList();
//
// resultAbsLinksList.addAll(firstOrderAbsLinks);
//
//
// Collection absLinksWeCanDependOn = new ArrayList(firstOrderAbsLinks.size()+alienLinks.size());
// absLinksWeCanDependOn.addAll(firstOrderAbsLinks);
// for (Iterator it = alienLinks.iterator(); it.hasNext(); ) {
// AlienLink alienLink = (AlienLink) it.next();
// absLinksWeCanDependOn.add(alienLink.getGdeLink());
// }
//
// List nondependentAlienGdeLinks = new ArrayList(alienLinks.size());
//
// for (Iterator it = alienLinks.iterator(); it.hasNext(); ) {
// AlienLink alienLink = (AlienLink) it.next();
//
// AbsLink gdeLink = alienLink.getGdeLink();
//
// if (doesDependOnAny(gdeLink, absLinksWeCanDependOn)) {
// continue;
// } else {
// nondependentAlienGdeLinks.add(gdeLink);
// }
// }
//
// resultAbsLinksList.addAll(nondependentAlienGdeLinks);
//
// if (resultAbsLinksList.isEmpty()) {
// return Collections.EMPTY_LIST;
// }
//
// int size = resultAbsLinksList.size();
// for (int i=0; i<size; i++) {
// AbsLink gdeLink = (AbsLink) resultAbsLinksList.get(i);
// addRelatedLinks(gdeLink, resultAbsLinksList, linksCache);
// }
//
// return resultAbsLinksList;
// }
//
// private boolean doesDependOnAny(AbsLink gdeLink, Collection otherLinks) {
// AbsElement source = gdeLink.getSource();
// if (source instanceof AbsLink) {
// if (otherLinks.contains(source)) {
// return true;
// }
// if (doesDependOnAny((AbsLink)source, otherLinks)) {
// return true;
// }
// }
// AbsElement destination = gdeLink.getDestination();
// if (destination instanceof AbsLink) {
// if (otherLinks.contains(destination)) {
// return true;
// }
// if (doesDependOnAny((AbsLink)destination, otherLinks)) {
// return true;
// }
// }
// return false;
// }
//
// private void addRelatedLinks(AbsLink gdeLink, List list, LinksCache linksCache) {
// Collection links = linksCache.getLinks(gdeLink);
// for (Iterator it = links.iterator(); it.hasNext(); ) {
// AbsLink relatedLink = (AbsLink) it.next();
// list.add(relatedLink);
// addRelatedLinks(relatedLink, list, linksCache);
// }
// }
//
// protected LmObjectsResolver getLmObjectsResolver() {
// return myLayoutModelAccess.getLayoutModel().getLmObjectsResolver();
// }
//
// private void layoutLinks(Collection alienAbsLinks) {
// if (alienAbsLinks == null) {
// return;
// }
// for (Iterator it = alienAbsLinks.iterator(); it.hasNext(); ) {
// AbsLink gdeLink = (AbsLink) it.next();
// myAbsLinkLayoutAccess.layoutLink(gdeLink);
// }
// }
//
// private Dimension placeAllAlienNodesInClientArea(int clientAreaLeft, int clientAreaTop) {
// Dimension result = new Dimension(0, 0);
// for (AbsNodeEnumeration nodeEnumeration = myGdeDiagram.getInteractionAbsNode().subnodes(); nodeEnumeration.hasMoreElements(); ) {
// AbsNode absNode = nodeEnumeration.nextGdeNode();
// if (! (getLmObjectsResolver().getLmObject(absNode) instanceof AlienNode)) {
// continue;
// }
// //CR#28283
// if (absNode.isExternal()) {
// continue;
// }
//
// if (absNode.getX() < clientAreaLeft) {
// absNode.setX(clientAreaLeft);
// }
// if (absNode.getY() < clientAreaTop) {
// absNode.setY(clientAreaTop);
// }
//
// result.width = Math.max(result.width, absNode.getX()+absNode.getWidth() - clientAreaLeft);
// result.height = Math.max(result.height, absNode.getY()+absNode.getHeight() - clientAreaTop);
// }
// return result;
// }
//
// private final AbsDiagram myGdeDiagram;
// private final SdLayoutModelAccess myLayoutModelAccess;
//
//
//
// private static class LinksCache {
// LinksCache(AbsDiagram gdeDiagram, LmObjectsResolver lmObjectsResolver) {
// for (AbsLinkEnumeration linksEnum = gdeDiagram.links(); linksEnum.hasMoreElements(); ) {
// AbsLink link1 = linksEnum.nextGdeLink();
//
// Object lmObject = lmObjectsResolver.getLmObject(link1);
// if (lmObject instanceof AlienLink) {
// addToMap(link1.getSource(),link1);
// addToMap(link1.getDestination(),link1);
// }
// }
// }
// Collection getLinks(AbsElement gdeElement) {
// List list = (List) myGdeElement2linksList.get(gdeElement);
// if (list == null) {
// return Collections.EMPTY_LIST;
// } else {
// return list;
// }
// }
// private void addToMap(AbsElement linkEnd, AbsLink gdeLink) {
// if (linkEnd == null) {
// return;
// }
// List linksList = (List) myGdeElement2linksList.get(linkEnd);
// if (linksList == null) {
// linksList = new ArrayList(3);
// myGdeElement2linksList.put(linkEnd, linksList);
// }
// linksList.add(gdeLink);
// }
// private final Map myGdeElement2linksList = new HashMap();
// }
//
//
// private final AbsLayoutAccess myAbsLinkLayoutAccess;
//}