treestarlayout.java

来自「mywork是rcp开发的很好的例子」· Java 代码 · 共 71 行

JAVA
71
字号
package net.sf.freenote.mindmap.figure;

import java.util.Arrays;
import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;

/**
 * startlayout时对子figure的布局处理
 * @author levin
 * @since 2008-2-24 下午06:32:42
 */
public class TreeStarLayout extends TreeNormalLayout {
	/**
	 * @see org.eclipse.draw2d.LayoutManager#layout(org.eclipse.draw2d.IFigure)
	 */
	public void layout(IFigure container) {
		Animation.recordInitialState(container);
		if (Animation.playbackState(container))
			return;
		List subtrees = container.getChildren();
		if(subtrees.isEmpty())return;
		
		TreeBranchFigure parent = (TreeBranchFigure)container.getParent();
		TreeRootFigure root = (parent).getRoot();
		TreeBranchFigure subtree;
		Rectangle nodeArea = parent.getNode().getClientArea();
		//中心点之间的距离
		int distance=nodeArea.width + root.getMajorSpacing();
		//中心点
		Point reference=nodeArea.getLocation().getTranslated(nodeArea.width/2,nodeArea.height/2);
		
		for (int i = 0; i < subtrees.size(); i++) {
			subtree = (TreeBranchFigure)subtrees.get(i);
			
			Dimension subtreeSize = subtree.getPreferredSize();
			subtree.setSize(subtreeSize);
			
			// 椭圆方程和直线方程,解2元2次方程
			double angle=Math.PI*2/subtrees.size()*i;
			if(angle > Math.PI)
				angle=(angle - Math.PI*2);
			
			double a = distance;
			double b = a*1.2;
			double k = Math.tan(angle);		
			double dx = 0.0, dy = 0.0;
			
			dx = Math.sqrt(1.0 / (1.0 / (a * a) + k * k / (b * b)));
			if(angle > Math.PI / 2 || angle < -Math.PI / 2)
				dx = -dx;
			dy = k * dx;
			
			//如果还有下级节点,距离增加3倍
			if(!subtree.getContentsPane().getChildren().isEmpty()){
				dx *= 3;
				dy *= 3;
			}
			
			//从中心点修正到左上角的location点
			dx -= subtreeSize.width/2;
			dy -= subtreeSize.height/2;
			//得到椭圆中心点,加上偏移,得到最终点坐标
			subtree.setLocation(reference.getTranslated((int)dx, (int)dy));
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?