/******************************************************************************* * Copyright (c) 2007-2009 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.hibernate.ui.diagram.editors.autolayout.impl; import java.util.ArrayList; import java.util.List; /** * @author ? */ public class Group { LayoutConstants constants; int number; List<Integer> itemList = new ArrayList<Integer>(); Item[] allitems = null; private int[] items = null; int miny = -1; int[] xDeltas = null; GroupArranger arranger = new GroupArranger(this); public Group() { } public void setItems(Item[] items) { allitems = items; } public void setConstants(LayoutConstants constants) { this.constants = constants; } public void expandGroup(int _item) { Item item = allitems[_item]; item.group = this; itemList.add(Integer.valueOf(_item)); int[] is = item.comments; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (!item2.isSet()) { allitems[is[i]].ix = item.ix; } expandGroup(is[i]); } is = item.inputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.group != null) continue; if (!item2.isSet()) { item2.ix = item.ix - 1; } expandGroup(is[i]); } is = item.outputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.group != null) { continue; } if (!item2.isSet()) { item2.ix = item.ix + 1; } expandGroup(is[i]); } } int[] items() { if (items == null) { items = new int[itemList.size()]; for (int i = 0; i < items.length; i++) { items[i] = itemList.get(i); } } return items; } Item getItem(int i) { return allitems[items[i]]; } public void moveX() { items(); int min = 0; for (int i = 0; i < items.length; i++) { if (getItem(i).ix < min) { min = getItem(i).ix; } } if (min == 0) { return; } for (int i = 0; i < items.length; i++) { if (!getItem(i).isSet()) { getItem(i).ix -= min; if (getItem(i).ix >= Groups.FX) { getItem(i).ix = Groups.FX - 1; } } } } public void buildY(Item item, int[][] field) { field[item.ix][item.iy] = 1; int[] is = item.comments; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } is = item.inputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } is = item.outputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } } public void buildY_2(Item item, int[][] field) { field[item.ix][item.iy] = 1; int[] is = item.comments; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } is = item.inputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } if (item.ix != item2.ix + 1) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } is = item.outputs; for (int i = 0; i < is.length; i++) { Item item2 = allitems[is[i]]; if (item2.yAssigned) { continue; } if (item.ix != item2.ix - 1) { continue; } item2.yAssigned = true; if (!item2.isSet()) { item2.iy = findFreeY(item2.ix, miny, item.iy, Groups.FY, field); } buildY(item2, field); } } private int findFreeY(int ix, int miny, int prefy, int maxy, int[][] field) { for (int i = 0; i < 20; i++) { int iy = prefy + i; if (iy >= miny && iy < maxy && field[ix][iy] == 0) { return iy; } iy = prefy - i; if (iy >= miny && iy < maxy && field[ix][iy] == 0) { return iy; } } return prefy; } public int getMaxY() { int maxy = 0; for (int i = 0; i < items.length; i++) { if (getItem(i).iy > maxy) { maxy = getItem(i).iy; } } return maxy; } public boolean hasSetItems() { items(); for (int i = 0; i < items.length; i++) { if (getItem(i).isSet()) { return true; } } return false; } public void buildXDeltas() { xDeltas = new int[getMaxX() + 1]; for (int i = 0; i < xDeltas.length; i++) { xDeltas[i] = 0; } // /if (hasSetItems()) return; for (int i = 0; i < items.length; i++) { int c = getItem(i).ix; if (c >= xDeltas.length) { continue; } int sz = getItem(i).inputs.length - 1; if (sz > xDeltas[c]) { xDeltas[c] = sz; } ++c; if (c >= xDeltas.length) { continue; } sz = getItem(i).outputs.length - 1; if (sz > xDeltas[c]) { xDeltas[c] = sz; } } for (int i = 0; i < xDeltas.length; i++) { if (xDeltas[i] > 4) { xDeltas[i] = 4; } } for (int i = 0; i < items.length; i++) { int c = getItem(i).ix; ++c; if (c >= xDeltas.length) { continue; } int[] shape = getItem(i).getItemInfo().getShape(); if (shape == null || shape.length < 4) { continue; } int wi = (shape[2] - (constants.deltaX / 2)) / constants.incX; if (wi > xDeltas[c]) { xDeltas[c] = wi; } } for (int i = 1; i < xDeltas.length; i++) { xDeltas[i] += xDeltas[i - 1]; } } public int getMaxX() { int maxx = 0; for (int i = 0; i < items.length; i++) { if (getItem(i).ix > maxx) { maxx = getItem(i).ix; } } return maxx; } // //////////////////////////////////////// public void createGroup(int _item) { expandGroup2(_item); int length = items().length; for (int i = 0; i < length; i++) { getItem(i).initActivities(); } arranger.arrange(); } private void expandGroup2(int _item) { Item item = allitems[_item]; item.group = this; itemList.add(Integer.valueOf(_item)); int[] is = item.comments; for (int i = 0; i < is.length; i++) { expandGroup2(is[i]); } is = item.inputs; for (int i = 0; i < is.length; i++) { if (allitems[is[i]].group == null) { expandGroup2(is[i]); } } is = item.outputs; for (int i = 0; i < is.length; i++) { if (allitems[is[i]].group == null) { expandGroup2(is[i]); } } } }