diff --git a/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java b/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java index 62c120e..ddb1428 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java +++ b/AlgebraicDataflowArchitectureModel/src/application/layouts/DAGLayout.java @@ -67,7 +67,7 @@ public void execute(Object parent) { graphModel.beginUpdate(); try { - // ���f������resource, channel, eventChannel�ɕ����� + // ���f������resource, channel, eventChannel�ɕ����� for (int i = 0; i < graphModel.getChildCount(parent); i++) { mxCell cell = (mxCell) graphModel.getChildAt(parent, i); @@ -75,7 +75,7 @@ mxCellState state = view.getState(cell); cells.add(cell); - // cell��resource�ł��� + // cell��resource�ł��� if ("ellipse".equals(state.getStyle().get("shape"))) { roots.add(cell); hierarchicalRecursionOrder.put(cell, new ArrayList<>()); @@ -87,20 +87,31 @@ continue; } - // cell��eventChannel�ł��� + // cell��eventChannel�ł��� if (cell.getEdgeCount() == 1) { eventChannels.add(cell); hierarchicalRecursionOrder.put(cell, new ArrayList<>()); } else { - // cell��channel�ł��� - channels.add(cell); + // cell��channel�ł��� + boolean bEventChannel = true; + for (int j = 0; j < cell.getEdgeCount(); j++) { + mxCell edge = (mxCell) cell.getEdgeAt(j); + if (edge.getTarget() == cell) { + bEventChannel = false; + } + } + if (bEventChannel) { + eventChannels.add(cell); + } else { + channels.add(cell); + } hierarchicalRecursionOrder.put(cell, new ArrayList<>()); } } } } - // �S�Ă�cell�̍��W�A�傫���Ȃǂ������� + // �S�Ă�cell�̍��W�A�傫���Ȃǂ������� for (mxCell c : cells) { c.getGeometry().setX(0); c.getGeometry().setY(0); @@ -112,22 +123,22 @@ } } - // dotEdges�������� + // dotEdges�������� for (mxCell c : cells) { dotEdges.put(c, new HashSet<>()); } - // line���\�z���� + // line���\�z���� for (mxCell ec : eventChannels) { List newline = new ArrayList(); lines.add(newline); constructionLine(ec, 0); } - // cell�̐[�����Čv�Z + // cell�̐[�����Čv�Z reculcDist(); - // cell��������line��index�����߂� + // cell��������line��index�����߂� for (int i = 0; i < lines.size(); i++) { for (mxCell cell : lines.get(i)) { if (cellToLineIndex.get(cell) == null) { @@ -137,10 +148,10 @@ } } - // ���ׂ�line�̏��Ԃ��\�[�g���� + // ���ׂ�line�̏��Ԃ��\�[�g���� sortLines(); - // cell��z�u���� + // cell��z�u���� layout((mxCell) parent); } finally { @@ -148,7 +159,7 @@ } } - // �K�w�\�����ċA�I�ɒT�� + // �K�w�\�����ċA�I�ɒT�� public void familySearch(mxCell r, mxCell p, int d) { int childNum = graphModel.getChildCount(p); @@ -166,42 +177,42 @@ } } - // line���\�z���� + // line���\�z���� public void constructionLine(mxCell cur, int d) { - // vertexToDist{key : cell, value : �[��} �������� + // vertexToDist{key : cell, value : �[��} �������� if (vertexToDist.get(cur) == null) { vertexToDist.put(cur, d); } else { - // ���g���܂܂��line�̒��ň�ԑ傫���[����ۑ� + // ���g���܂܂��line�̒��ň�ԑ傫���[����ۑ� vertexToDist.put(cur, Math.max(vertexToDist.get(cur), d)); } lines.get(lines.size() - 1).add(cur); - int tagCount = 0; // edge�̎n�_�ƂȂ�cell�Ƃ��ĎQ�Ƃ��ꂽ�� + int tagCount = 0; // edge�̎n�_�ƂȂ�cell�Ƃ��ĎQ�Ƃ��ꂽ�� for (int i = 0; i < cur.getEdgeCount(); i++) { mxCell edge = (mxCell) cur.getEdgeAt(i); mxCellState state = view.getState(edge); mxCell target = (mxCell) edge.getTarget(); - // cur���n�_�ƂȂ�edge�̏I�_�ƂȂ�target�����g�A�������͑��݂��Ȃ��ꍇ������ + // cur���n�_�ƂȂ�edge�̏I�_�ƂȂ�target�����g�A�������͑��݂��Ȃ��ꍇ������ if ((cur != target) && (target != null)) { - // edge�̎�ނ�"dashed"�̏ꍇ + // edge�̎�ނ�"dashed"�̏ꍇ if ("true".equals(state.getStyle().get("dashed"))) { - state.getStyle().put("strokeColor", "#800080"); // edge�̐F��ύX - dotEdges.get(cur).add(target); // dotEdges{key : �n�_�ƂȂ�cell, value : �I�_�ƂȂ�cell} + state.getStyle().put("strokeColor", "#800080"); // edge�̐F��ύX + dotEdges.get(cur).add(target); // dotEdges{key : �n�_�ƂȂ�cell, value : �I�_�ƂȂ�cell} } else { tagCount++; - // �n�_�Ƃ��ĕ�����Q�Ƃ���Ă���ꍇ + // �n�_�Ƃ��ĕ�����Q�Ƃ���Ă���ꍇ if (tagCount > 1) { - // cur�܂ł�line�̏����č\�z���āA��������V����line���\�z���� + // cur�܂ł�line�̏����č\�z���āA��������V����line���\�z���� List newline = new ArrayList(lines.get(lines.size() - 1)); while (newline.get(newline.size() - 1).getId() != cur.getId()) { newline.remove(newline.size() - 1); } lines.add(newline); constructionLine(target, d + 1); - // �n�_�Ƃ��ď��߂ĎQ�Ƃ��ꂽ�ꍇ + // �n�_�Ƃ��ď��߂ĎQ�Ƃ��ꂽ�ꍇ } else { constructionLine(target, d + 1); } @@ -210,13 +221,13 @@ } } - // cell�̐[�����Čv�Z���� + // cell�̐[�����Čv�Z���� public void reculcDist() { boolean isChanging = false; - // �[���̍X�V���s���Ȃ��Ȃ�܂ŌJ��Ԃ� + // �[���̍X�V���s���Ȃ��Ȃ�܂ŌJ��Ԃ� while (true) { - // �����line�Ɋ܂܂�鎩�g��1�Ž�O�̐[���Ǝ��g�̐[�����r���āA�������[�����v�Z + // �����line�Ɋ܂܂�鎩�g��1�Ž�O�̐[���Ǝ��g�̐[�����r���āA�������[�����v�Z for (List line : lines) { for (int i = 1; i < line.size(); i++) { mxCell cur = line.get(i); @@ -230,7 +241,7 @@ } } - // �K�w�\�����l������cell�̐[�����v�Z + // �K�w�\�����l������cell�̐[�����v�Z for (mxCell r : roots) { for (mxCell c : hierarchicalRecursionOrder.get(r)) { mxCell p = (mxCell) graphModel.getParent(c); @@ -245,28 +256,28 @@ } } - // 1�x���ύX�������ƃ��[�v�𔲂��� + // 1�x���ύX�������ƃ��[�v�𔲂��� if (!isChanging) { break; } } } - // line���\�[�g����(�������A���ۂɂ�lines���̗v�f�̏��Ԃ͓���ւ����A�Ăяo�����Ԃ�ۑ�����order���쐬) + // line���\�[�g����(�������A���ۂɂ�lines���̗v�f�̏��Ԃ͓���ւ����A�Ăяo�����Ԃ�ۑ�����order���쐬) public void sortLines() { for (int i = 0; i < lines.size(); i++) { List line = lines.get(i); - // eventChannel����̏o�͐悪root�ł���ꍇ + // eventChannel����̏o�͐悪root�ł���ꍇ if (roots.contains(line.get(1))) { for (mxCell c : line) { - addLine(c); // order��line��index���i�[���� + addLine(c); // order��line��index���i�[���� } } } } - // order��line��index���i�[���� + // order��line��index���i�[���� public void addLine(mxCell c) { if (cellToLineIndex.get(c) != null) { for (int i : cellToLineIndex.get(c)) { @@ -277,17 +288,17 @@ } } - // root��������line��index���i�[������A�q����������line��index�������i�[���� + // root��������line��index���i�[������A�q����������line��index�������i�[���� for (int i = 0; i < graphModel.getChildCount(c); i++) { mxCell child = (mxCell) graphModel.getChildAt(c, i); addLine(child); } } - // cell��z�u���� + // cell��z�u���� public void layout(mxCell s) { - /* cell�̍��W�́Acell��parent�̍���̍��W�����x��y���ǂꂾ�����炷���Œ�`����Ă��� - ����Čv�Z�̓s����Aid=1 ��cell(���C�A�E�g���)�̍������ɂ������W��ۑ����Ă��� */ + /* cell�̍��W�́Acell��parent�̍���̍��W�����x��y���ǂꂾ�����炷���Œ�`����Ă��� + ����Čv�Z�̓s����Aid=1 ��cell(���C�A�E�g���)�̍������ɂ������W��ۑ����Ă��� */ Set movedSet = new HashSet<>(); List movedList = new ArrayList<>(); @@ -298,12 +309,12 @@ putCellGeo(s, 0, 0); - // �[���̍ő�l�����߂� + // �[���̍ő�l�����߂� for (mxCell c : cells) { maxD = Math.max(maxD, vertexToDist.get(c)); } - // ������ + // ������ distToMaxX.put(-1, 0.0); for (int d = 0; d <= maxD; d++) { movedMap.put(d, new ArrayList<>()); @@ -311,28 +322,28 @@ } for (int i : order) { - double centerY = -1; // �z�u�\���y���W(����) + double centerY = -1; // �z�u�\���y���W(����) for (mxCell cur : lines.get(i)) { - // ���ɔz�u�ς݂Ȃ�X�L�b�v + // ���ɔz�u�ς݂Ȃ�X�L�b�v if (movedSet.contains(cur)) { continue; } - int d = vertexToDist.get(cur); // cur�̐[�� - double x = distToMaxX.get(d - 1) + MOVE_X; // �z�u�\���x���W - double endX = 0; // �z�u����cell�̉E�[��x���W - double endY = 0; // �z�u����cell�̉��[��y���W + int d = vertexToDist.get(cur); // cur�̐[�� + double x = distToMaxX.get(d - 1) + MOVE_X; // �z�u�\���x���W + double endX = 0; // �z�u����cell�̉E�[��x���W + double endY = 0; // �z�u����cell�̉��[��y���W - // cur��root, channel, eventChannel�ɑ�����cell�ł���ꍇ + // cur��root, channel, eventChannel�ɑ�����cell�ł���ꍇ if (roots.contains(cur) || channels.contains(cur) || eventChannels.contains(cur)) { if (centerY == -1) { centerY = maxY + MOVE_Y + cur.getGeometry().getHeight() / 2; } - double y = centerY - cur.getGeometry().getHeight() / 2; // �z�u�\���y���W + double y = centerY - cur.getGeometry().getHeight() / 2; // �z�u�\���y���W double ny = y; double nx = x; - // �\�肵�Ă�����W�ɔz�u����Ƒ��̃��\�[�X�����ɔz�u����Ă��܂��ꍇ�A���ɂ��炷 + // �\�肵�Ă�����W�ɔz�u����Ƒ��̃��\�[�X�����ɔz�u����Ă��܂��ꍇ�A���ɂ��炷 for (mxCell m : movedSet) { if (roots.contains(m) || channels.contains(m)) { if (cellOverlap(m.getGeometry().getX(), m.getGeometry().getY(), m.getGeometry().getWidth(), m.getGeometry().getHeight(), x, y, cur.getGeometry().getWidth(), cur.getGeometry().getHeight())) { @@ -341,7 +352,7 @@ } } - // �\��̍��W�ɔz�u���āA�e�폈�����s�� + // �\��̍��W�ɔz�u���āA�e�폈�����s�� cur.getGeometry().setX(nx); cur.getGeometry().setY(ny); endX = nx + cur.getGeometry().getWidth(); @@ -350,26 +361,26 @@ addMoved(movedSet, movedList, movedMap, cur, d); graphModel.setGeometry(cur, (mxGeometry) cur.getGeometry().clone()); - // �[����d�̍ő��x���W���X�V�����ꍇ�A���ɔz�u�ς݂�cell������ɉ����ĉE�ɂ��炷 + // �[����d�̍ő��x���W���X�V�����ꍇ�A���ɔz�u�ς݂�cell������ɉ����ĉE�ɂ��炷 if (distToMaxX.get(d) < endX) { updateDistToMaxX(distToMaxX, movedSet, movedMap, d, maxD, endX); } - maxY = Math.max(maxY, endY); // �z�u�ς݂�cell�̒��ł̉��[�̍��W�̍ő� + maxY = Math.max(maxY, endY); // �z�u�ς݂�cell�̒��ł̉��[�̍��W�̍ő� - // root�̎q�����܂Ƃ߂Ĕz�u���� + // root�̎q�����܂Ƃ߂Ĕz�u���� for (mxCell c : hierarchicalRecursionOrder.get(cur)) { d = vertexToDist.get(c); - nx = x; // �z�u�\���x���W + nx = x; // �z�u�\���x���W mxCell parent = (mxCell) graphModel.getParent(c); - // �[�����e�Ɠ������ꍇ�A�e��x���W��菭���傫������ + // �[�����e�Ɠ������ꍇ�A�e��x���W��菭���傫������ if (d == vertexToDist.get(parent)) { nx = cellGeo.get(parent).get("x") + MARGIN_WIDTH; } else { nx = distToMaxX.get(d - 1) + MOVE_X; } - // �z�u�ς݂Ő[�����������Z�킪�v��ꍇ�A���ɂ��炷 + // �z�u�ς݂Ő[�����������Z�킪�v��ꍇ�A���ɂ��炷 double brotherMaxY = MOVE_Y; for (int k = 0; k < graphModel.getChildCount(parent); k++) { mxCell child = (mxCell) graphModel.getChildAt(parent, k); @@ -382,7 +393,7 @@ } } - // �\��̍��W�ɔz�u���āA�e�폈�����s�� + // �\��̍��W�ɔz�u���āA�e�폈�����s�� c.getGeometry().setX(nx - cellGeo.get(parent).get("x")); c.getGeometry().setY(brotherMaxY); graphModel.setGeometry(c, (mxGeometry) c.getGeometry().clone()); @@ -391,9 +402,9 @@ endX = cellGeo.get(c).get("x") + c.getGeometry().getWidth(); endY = cellGeo.get(c).get("y") + c.getGeometry().getHeight(); - endY = resize(parent, endX, endY); // �q�����e�̓����Ɋ܂܂�Ȃ��ꍇ�A�e�̑傫����ύX���� + endY = resize(parent, endX, endY); // �q�����e�̓����Ɋ܂܂�Ȃ��ꍇ�A�e�̑傫����ύX���� - // �[����d�̍ő��x���W���X�V�����ꍇ�A���ɔz�u�ς݂�cell������ɉ����ĉE�ɂ��炷 + // �[����d�̍ő��x���W���X�V�����ꍇ�A���ɔz�u�ς݂�cell������ɉ����ĉE�ɂ��炷 if (distToMaxX.get(vertexToDist.get(c)) < endX) { updateDistToMaxX(distToMaxX, movedSet, movedMap, d, maxD, endX); } @@ -403,7 +414,7 @@ } } - // �_���̕ӂ��d�Ȃ��Ă���ꍇ�A�E�ɂ��炷 + // �_���̕ӂ��d�Ȃ��Ă���ꍇ�A�E�ɂ��炷 for (mxCell c : resources) { for (mxCell cc : dotEdges.get(c)) { for (Map.Entry> entry : dotEdges.entrySet()) { @@ -427,7 +438,7 @@ } } - // eventChannel���o�͐��y���W�ɑ����� + // eventChannel���o�͐��y���W�ɑ����� for (int i : order) { mxCell cur = lines.get(i).get(1); List ecs = new ArrayList<>(); @@ -460,7 +471,7 @@ } } - // ����resource�ɕ�����eventChannel���o�͂��Ă���ꍇ�A�d�Ȃ��Ă��܂��̂ʼn��ɂ��炷 + // ����resource�ɕ�����eventChannel���o�͂��Ă���ꍇ�A�d�Ȃ��Ă��܂��̂ʼn��ɂ��炷 Map> ecToLineIndex = new HashMap<>(); for (mxCell ec : eventChannels) { ecToLineIndex.put(ec, new ArrayList<>()); @@ -540,7 +551,7 @@ mm.get(d).add(c); } - // 2�‚̕ӂ��d�Ȃ��Ă��邩���� + // 2�‚̕ӂ��d�Ȃ��Ă��邩���� public boolean isStraightLine(double []u1, double []v1, double []u2, double []v2) { double gradient1 = 0; double length1 = Math.pow(u1[0] - v1[0], 2) + Math.pow(u1[1] - v1[1], 2); @@ -601,7 +612,7 @@ } } - // 2�‚�resource���d�Ȃ��Ă��邩���� + // 2�‚�resource���d�Ȃ��Ă��邩���� public boolean cellOverlap(double ax, double ay, double aw, double ah, double bx, double by, double bw, double bh) { if (((ax <= bx) && (bx <= ax + aw)) || ((bx <= ax) && (ax <= bx + bw))) { if (((ay <= by) && (by <= ay + ah)) || ((by <= ay) && (ay <= by + bh))) { @@ -611,7 +622,7 @@ return false; } - // �[�����Ƃ̍ő��x���W���ύX���ꂽ�Ƃ��̏��� + // �[�����Ƃ̍ő��x���W���ύX���ꂽ�Ƃ��̏��� public void updateDistToMaxX(Map distToMaxX, Set movedSet, Map> movedMap, int d, int md, double endX) { double preEndX = distToMaxX.get(d); distToMaxX.replace(d, endX); @@ -647,7 +658,7 @@ } } - // �e�̑傫����ύX + // �e�̑傫����ύX public double resize(mxCell ancestor, double endX, double endY) { while (true) { boolean isChanging = false; @@ -676,7 +687,7 @@ return endY; } - // x���W��ύX + // x���W��ύX public void relocateX(mxCell c, double nx, double dx) { c.getGeometry().setX(nx - dx); graphModel.setGeometry(c, (mxGeometry) c.getGeometry().clone());