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);
    }

}