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 + -
显示快捷键?