Mercurial > hg > Members > shoshi > jungle > jungle-core
view src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/store/omnigraffle/InsertNodePositionData.java @ 329:2a0cb1f0ba4e
rename Error package
author | kono |
---|---|
date | Sat, 08 Jul 2017 21:05:55 +0900 |
parents | 0767620e6f5f |
children |
line wrap: on
line source
package jp.ac.u_ryukyu.ie.cr.jungle.store.omnigraffle; import jp.ac.u_ryukyu.ie.cr.jungle.tree.JungleTree; import jp.ac.u_ryukyu.ie.cr.jungle.query.traverser.nodeiterator.DefaultNodeIterator; import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNode; import jp.ac.u_ryukyu.ie.cr.jungle.transaction.node.TreeNodeChildren; import jp.ac.u_ryukyu.ie.cr.jungle.store.index.ParentIndex; import jp.ac.u_ryukyu.ie.cr.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.jungle.util.jungleError.Error; import java.util.Iterator; import java.util.LinkedList; import java.util.Optional; import java.util.TreeMap; public class InsertNodePositionData { private JungleTree tree; private TreeMap<TreeNode, NodePoint> treeMap = new TreeMap<>(); private LinkedList<TreeNode> nodeList = new LinkedList<>(); /* * NodeのX座標を決める際に使用する * 葉の方から座標を指定していく * このListにはまだX座標が決まっていない葉Nodeが格納される * X座標格納後はそのNodeの親が格納される * この中身が空になったら全てのNodeにX座標の格納が終わったということ */ public int getNODE_Y_GAP() { return NODE_Y_GAP; } private int NODE_Y_GAP = 300; private final int X_GAP = 300; //ノードとノードの隙間 private int MAX_X = 100; public InsertNodePositionData(JungleTree tree) { this.tree = tree; } public TreeMap<TreeNode, NodePoint> InsertPositionData() { ParentIndex parentIndex = tree.getParentIndex(); TreeNode rootNode = tree.getRootNode(); DefaultNodeIterator nodeIterator = new DefaultNodeIterator(rootNode); NodePoint rootPoint = new NodePoint(); //まずはrootのY座標を指定する、Y座標を指定する際は親Nodeを参照するため、rootだけは別に処理を書く必要がある rootPoint.setY(NODE_Y_GAP); treeMap.put(rootNode, rootPoint); while (nodeIterator.hasNext()) { TreeNode currentNode = nodeIterator.next(); Iterator<TreeNode> children = currentNode.getChildren().iterator(); if (!children.hasNext()) { //子供が空の場合Listに格納する nodeList.add(currentNode); } else { while (children.hasNext()) {//子がある場合このY座標を設定する setYPosition(currentNode, children.next()); } } } for (int num = 0; nodeList.size() > 0; ) { //Listの中にはX座標の格納が終わっていないNodeが入る X座標は子Nodeの最初のNodeと最後のNodeのX座標を足し、2で割った値を格納する TreeNode node = nodeList.get(num); TreeNodeChildren children = node.getChildren(); int childrenSize = children.size() - 1; //childのlastを取る時に使う if (childrenSize == -1) { NodePoint np = treeMap.get(node); np.setX(MAX_X); MAX_X = MAX_X + X_GAP; nodeList.remove(num); Optional<TreeNode> parentNodeOp = parentIndex.get(node);//子のX座標のデータを格納したら親をListに入れ、X格納の準備をする if (parentNodeOp.isPresent()) { TreeNode parentNode = parentNodeOp.get(); if (!nodeList.contains(parentNode)) //親ノードがまだListに登録されていない場合登録する nodeList.add(parentNode); } continue; } Either<Error, TreeNode> firstChildEither = children.at(0); if (firstChildEither.isA()) { System.out.println("ノードが見つかりません"); throw new NullPointerException(); } TreeNode firstChild = firstChildEither.b(); Either<Error, TreeNode> lastChildEither = children.at(childrenSize); if (lastChildEither.isA()) { System.out.println("ノードが見つかりません"); throw new NullPointerException(); } TreeNode lastChild = lastChildEither.b(); NodePoint firstChildPoint = treeMap.get(firstChild); NodePoint lastChildPoint = treeMap.get(lastChild); if (firstChildPoint.getX() != 0 && lastChildPoint.getX() != 0) { //最初のNodeと最後のNodeのX座標がすでに格納されている場合 NodePoint np = treeMap.get(node); np.setX((firstChildPoint.getX() + lastChildPoint.getX()) / 2); nodeList.remove(num); Optional<TreeNode> parentNodeOp = parentIndex.get(node);//子のX座標のデータを格納したら親をListに入れ、X格納の準備をする if (parentNodeOp.isPresent()) nodeList.add(parentNodeOp.get()); } if (num > nodeList.size()) num = 0; } return treeMap; } private void setYPosition(TreeNode parrentNode, TreeNode childNode) { NodePoint parrentPosition = treeMap.get(parrentNode); int parrentY = parrentPosition.getY(); NodePoint childPosition = new NodePoint(); childPosition.setY(parrentY + NODE_Y_GAP); treeMap.put(childNode, childPosition); } }