/*******************************************************************************
* 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.*;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.IItemInfo;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.ILinkInfo;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.IDiagramInfo;
/**
* @author ?
*/
public class Items {
protected LayoutConstants constants;
protected IDiagramInfo process;
protected Item[] items;
protected Map<String, Item> paths = new HashMap<String, Item>();
protected Groups groups = new Groups();
protected boolean override = false;
public Items() {
}
public void setConstants(LayoutConstants constants) {
this.constants = constants;
groups.setConstants(constants);
}
public void setOverride(boolean b) {
override = b;
}
public void setProcess(IDiagramInfo process) {
this.process = process;
load();
}
private void load() {
initItems();
if (isAllSet()) {
return;
}
buildBinds();
groups.load(items);
print();
}
private void initItems() {
IItemInfo[] is = process.getItems();
items = new Item[is.length];
for (int i = 0; i < is.length; i++) {
Item item = new Item(i, is[i]);
items[i] = item;
paths.put(is[i].getID(), item);
int[] shape = is[i].getShape();
if (!override && shape != null && shape.length > 1) {
item.x = shape[0];
item.y = shape[1];
if (item.x != 0 && item.y != 0) {
item.isSet = true;
}
item.ix = (item.x / constants.deltaX);
item.iy = (item.y / constants.deltaY);
if (item.ix < 0) {
item.ix = 0;
}
if (item.iy < 0) {
item.iy = 0;
}
if (item.ix >= Groups.FX) {
item.ix = Groups.FX - 1;
}
if (item.iy >= Groups.FY) {
item.iy = Groups.FY - 1;
}
}
initItem(item);
}
}
// override
protected void initItem(Item item) {
}
// override
public ILinkInfo[] getOutput(IItemInfo itemObject) {
return itemObject.getLinks();
}
private boolean isAllSet() {
for (int i = 0; i < items.length; i++) {
if (!items[i].isSet()) {
return false;
}
}
return true;
}
private void buildBinds() {
for (int i = 0; i < items.length; i++) {
ILinkInfo[] ts = (items[i].getItemInfo() instanceof ILinkInfo) ? new ILinkInfo[] { (ILinkInfo) items[i].getItemInfo() }
: getOutput(items[i].getItemInfo());
for (int j = 0; j < ts.length; j++) {
String target = ts[j].getTargetID();
if (target == null || target.length() == 0) {
continue;
}
Item item2 = paths.get(target);
if (item2 == null) {
continue;
}
if (items[i].isComment()) {
item2.addComment(items[i].getId());
items[i].isOwned = true;
} else if (item2.weight < 0) {
continue;
} else {
item2.addInput(items[i].getId(), ts[j]);
items[i].addOutput(item2.getId());
}
}
}
}
private void print() {
for (int i = 0; i < items.length; i++) {
items[i].print();
}
}
}