// This code is taken from WSO2 Carbon and is licensed by WSO2, Inc. // under the Apache License version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html package org.wso2.carbon.bpel.ui.bpel2svg; import java.util.*; import org.wso2.carbon.bpel.ui.bpel2svg.ActivityInterface.ActivityState; public class LayoutManager { // Variables // Properties private int svgWidth = 1400; public int getSvgWidth() { return svgWidth; } public void setSvgWidth(int svgWidth) { this.svgWidth = svgWidth; } private int svgHeight = 1000; public int getSvgHeight() { return svgHeight; } public void setSvgHeight(int svgHeight) { this.svgHeight = svgHeight; } private int xSpacing = 20; public int getXSpacing() { return xSpacing; } public void setXSpacing(int xSpacing) { this.xSpacing = xSpacing; } private int ySpacing = 50; public int getYSpacing() { return ySpacing; } public void setYSpacing(int ySpacing) { this.ySpacing = ySpacing; } private boolean includeAssigns = true; public boolean isIncludeAssigns() { return includeAssigns; } public void setIncludeAssigns(boolean includeAssigns) { this.includeAssigns = includeAssigns; } private boolean showSequenceBoxes = true; public boolean isShowSequenceBoxes() { return showSequenceBoxes; } public void setShowSequenceBoxes(boolean showSequenceBoxes) { this.showSequenceBoxes = showSequenceBoxes; } private boolean verticalLayout = false; //this should be implement in some where public boolean isVerticalLayout() { return verticalLayout; } public void setVerticalLayout(boolean verticalLayout) { this.verticalLayout = verticalLayout; } private boolean addCompositeActivityOpacity = false; public boolean isAddCompositeActivityOpacity() { return addCompositeActivityOpacity; } public void setAddCompositeActivityOpacity(boolean addCompositeActivityOpacity) { this.addCompositeActivityOpacity = addCompositeActivityOpacity; } private boolean addIconOpacity = false; public boolean isAddIconOpacity() { return addIconOpacity; } public void setAddIconOpacity(boolean addIconOpacity) { this.addIconOpacity = addIconOpacity; } private boolean addSimpleActivityOpacity = true; public boolean isAddSimpleActivityOpacity() { return addSimpleActivityOpacity; } public void setAddSimpleActivityOpacity(boolean addSimpleActivityOpacity) { this.addSimpleActivityOpacity = addSimpleActivityOpacity; } private double iconOpacity = 0.4; public double getCompositeActivityOpacity() { return compositeActivityOpacity; } public void setCompositeActivityOpacity(double compositeActivityOpacity) { this.compositeActivityOpacity = compositeActivityOpacity; } private double opacity = 0.50; public double getIconOpacity(ActivityState state) { double ret=iconOpacity; if (state != ActivityState.Ready) { ret = 1.0; } return ret; } public void setIconOpacity(double iconOpacity) { this.iconOpacity = iconOpacity; } private double simpleActivityOpacity = 0.351; public double getOpacity() { return opacity; } public void setOpacity(double opacity) { this.opacity = opacity; } private double compositeActivityOpacity = 0.10; public double getSimpleActivityOpacity(ActivityState state) { double ret=simpleActivityOpacity; if (state == ActivityState.Active) { ret = 1.0; } else if (state == ActivityState.Completed || state == ActivityState.Failed) { ret += 0.3; } return ret; } public void setSimpleActivityOpacity(double simpleActivityOpacity) { this.simpleActivityOpacity = simpleActivityOpacity; } private int startIconDim = 32; public int getStartIconDim() { return startIconDim; } public void setStartIconDim(int startIconDim) { this.startIconDim = startIconDim; } private int endIconDim = 22; public int getEndIconDim() { return endIconDim; } public void setEndIconDim(int endIconDim) { this.endIconDim = endIconDim; } // Methods public void layoutSVG(ActivityInterface rootActivity) { rootActivity.getDimensions(); //rootActivity.layout(0, 0); layoutLinks(rootActivity); // rootActivity.getDimensions(); rootActivity.layout(0, 0); } private Map<ActivityInterface, ArrayList<ActivityInterface>> getLinkAdjacencyList(Map<String, Link> links) { Map<org.wso2.carbon.bpel.ui.bpel2svg.ActivityInterface, ArrayList<ActivityInterface>> linkAdjacencyList = new HashMap<ActivityInterface, ArrayList<ActivityInterface>>(); if (links != null && !links.isEmpty()) { Set linksSet = links.entrySet(); Iterator linksIterator = linksSet.iterator(); while(linksIterator.hasNext()){ Map.Entry<String, Link> link = (Map.Entry<String, Link>)linksIterator.next(); ActivityInterface startActivity = link.getValue().getSource(); ActivityInterface endActivity = link.getValue().getTarget(); if (linkAdjacencyList.containsKey(startActivity)) { linkAdjacencyList.get(startActivity).add(endActivity); } else { ArrayList<ActivityInterface> tmpArrayList = new ArrayList<ActivityInterface>(); tmpArrayList.add(endActivity); linkAdjacencyList.put(startActivity, tmpArrayList); } } } return linkAdjacencyList; } private Map<ActivityInterface, ArrayList<ActivityInterface>> linkAdjacencyList; private Set<ActivityInterface> rootLinks; private int correctionCumulation = 0; private int hieghestCorrectionCumulation = 0; private void setCorrectionY(ActivityInterface source, ArrayList<ActivityInterface> children) { if (children != null && !children.isEmpty()) { for (ActivityInterface target : children) { int whereTargetShouldBe = (source.getStartIconYTop() + source.getStartIconHeight() + 40); int whereTargetIs = target.getStartIconYTop(); int correction = whereTargetShouldBe - whereTargetIs; if (whereTargetIs < whereTargetShouldBe) { //the correction is included in YTop target.setCorrectionY(correction); int relativeCorrection = whereTargetShouldBe - source.getStartIconYTop(); correctionCumulation += relativeCorrection; setCorrectionY(target, linkAdjacencyList.get(target)); correctionCumulation -= relativeCorrection; } } } else { if (hieghestCorrectionCumulation < correctionCumulation) { hieghestCorrectionCumulation = correctionCumulation; } } } private void layoutLinks(ActivityInterface rootActivity) { Map<String, Link> links = rootActivity.getLinks(); if (links != null && !links.isEmpty()) { linkAdjacencyList = getLinkAdjacencyList(links); rootLinks = rootActivity.getLinkRoots(); // this shud b static for (ActivityInterface root : rootLinks) { correctionCumulation = 0; setCorrectionY(root, linkAdjacencyList.get(root)); } ActivityInterface tempParent = rootLinks.iterator().next().getParent(); //chk for empty set while (tempParent != null) { int tempHeight = tempParent.getDimensions().getHeight(); tempParent.getDimensions().setHeight(tempHeight + hieghestCorrectionCumulation); //this should b corrected tempParent = tempParent.getParent(); } rootLinks.clear(); } } }