/**
* Copyright 2005 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.eclipse.flow.common.editor.core;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.geometry.Point;
/**
* A connection between two model elements.
*
* @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
*/
public abstract class ElementConnection implements Serializable {
private static final long serialVersionUID = 510l;
public static final int CHANGE_BENDPOINTS = 1;
public static final int CHANGE_LABEL = 2;
private ElementWrapper source;
private ElementWrapper target;
private transient List<Point> bendpoints = new ArrayList<Point>();
private transient List<ModelListener> listeners = new ArrayList<ModelListener>();
public ElementConnection() {
}
public void localSetSource(ElementWrapper source) {
this.source = source;
}
public void localSetTarget(ElementWrapper target) {
this.target = target;
}
public void disconnect() {
if (source == null) {
throw new IllegalStateException("Can't disconnect, source is null");
}
if (target == null) {
throw new IllegalStateException("Can't disconnect, target is null");
}
source.removeOutgoingConnection(this);
target.removeIncomingConnection(this);
source = null;
target = null;
}
public void connect(ElementWrapper source, ElementWrapper target) {
if (source == null) {
throw new IllegalArgumentException("source is null");
}
if (this.source != null) {
throw new IllegalStateException("The source of a connection cannot be changed");
}
if (target == null) {
throw new IllegalArgumentException("target is null");
}
if (this.target != null) {
throw new IllegalStateException("The target of a connection cannot be changed");
}
this.source = source;
this.target = target;
source.addOutgoingConnection(this);
target.addIncomingConnection(this);
}
public ElementWrapper getSource() {
return source;
}
public ElementWrapper getTarget() {
return target;
}
public void addBendpoint(int index, Point point) {
bendpoints.add(index, point);
internalSetBendpoints(bendpoints);
notifyListeners(CHANGE_BENDPOINTS);
}
public void removeBendpoint(int index) {
bendpoints.remove(index);
internalSetBendpoints(bendpoints);
notifyListeners(CHANGE_BENDPOINTS);
}
public void replaceBendpoint(int index, Point point) {
bendpoints.set(index, point);
internalSetBendpoints(bendpoints);
notifyListeners(CHANGE_BENDPOINTS);
}
protected void internalSetBendpoints(List<Point> bendPoints) {
}
public void localSetBendpoints(List<Point> bendpoints) {
this.bendpoints = bendpoints;
}
public List<Point> getBendpoints() {
if (bendpoints == null) {
bendpoints = internalGetBendpoints();
}
return bendpoints;
}
protected abstract List<Point> internalGetBendpoints();
public void addListener(ModelListener listener) {
listeners.add(listener);
}
public void removeListener(ModelListener listener) {
listeners.remove(listener);
}
public void notifyListeners(int change) {
ModelEvent event = new ModelEvent(change);
for (Iterator it = listeners.iterator(); it.hasNext(); ) {
ModelListener listener = (ModelListener) it.next();
listener.modelChanged(event);
}
}
private void readObject(ObjectInputStream aInputStream)
throws ClassNotFoundException, IOException {
aInputStream.defaultReadObject();
listeners = new ArrayList();
}
}