/*******************************************************************************
* Copyright 2005, CHISEL Group, University of Victoria, Victoria, BC, Canada.
* All rights reserved. This program and the accompanying materials
* are 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
*
* Contributors:
* The Chisel Group, University of Victoria
*******************************************************************************/
package org.eclipse.zest.layouts.exampleStructures;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.zest.layouts.LayoutBendPoint;
import org.eclipse.zest.layouts.LayoutEntity;
import org.eclipse.zest.layouts.LayoutRelationship;
import org.eclipse.zest.layouts.constraints.BasicEdgeConstraints;
import org.eclipse.zest.layouts.constraints.LabelLayoutConstraint;
import org.eclipse.zest.layouts.constraints.LayoutConstraint;
import org.eclipse.zest.layouts.dataStructures.BendPoint;
/**
* The SimpleRelation class describes the relationship between
* two objects: source and destination. Each relationship
* has a weight and direction associated with it.
* Note: The source object is at the beginning of the relationship.
* Note: The destination object is at the end of the relationship.
*
* @version 2.0
* @author Casey Best (version 1.0 by Jingwei Wu)
* @author Chris Bennett
*/
public class SimpleRelationship implements LayoutRelationship {
private static int DEFAULT_REL_LINE_WIDTH = 1;
private static int DEFAULT_REL_LINE_WIDTH_SELECTED = DEFAULT_REL_LINE_WIDTH + 2;
private static Object DEFAULT_RELATIONSHIP_COLOR;
private static Object DEFAULT_RELATIONSHIP_HIGHLIGHT_COLOR;
/** The line width for this relationship. */
private int lineWidth = DEFAULT_REL_LINE_WIDTH;
/** The color for this relationship. */
private Object color = DEFAULT_RELATIONSHIP_COLOR;
/**
* A list of layout dependent attributes
*/
private Map attributes;
/**
* The sourceEntity of this SimpleRelation.
*/
protected LayoutEntity sourceEntity;
/**
* The object of this SimpleRelation.
*/
protected LayoutEntity destinationEntity;
/**
* If directional, algorithms must note the direction of the relationship.
* If not directional, algorithms are to ignore which direction the relationship is going.
* Switching the source and destination should make no difference.
*/
protected boolean bidirectional;
/**
* The weight given to this relation.
*/
private double weight;
private Object internalRelationship;
private LayoutBendPoint[] bendPoints;
private String label;
/**
* Constructor.
* @param sourceEntity The sourceEntity of this SimpleRelation.
* @param destinationEntity The object of this SimpleRelation.
* @param bidirectional Determines if the <code>sourceEntity</code> and
* <code>destinationEntity</code> are equal(exchangeable).
* @throws java.lang.NullPointerException If either <code>sourceEntity
* </code> or <code>destinationEntity</code> is <code>null</code>.
*/
public SimpleRelationship(LayoutEntity sourceEntity, LayoutEntity destinationEntity, boolean bidirectional) {
this (sourceEntity, destinationEntity, bidirectional, 1);
}
/**
* Constructor.
* @param sourceEntity The sourceEntity of this SimpleRelation.
* @param destinationEntity The destinationEntity of this SimpleRelation.
* @param exchangeable Determines if the <code>sourceEntity</code> and
* <code>destinationEntity</code> are equal(exchangeable).
* @throws java.lang.NullPointerException If either <code>sourceEntity
* </code> or <code>destinationEntity</code> is <code>null</code>.
*/
public SimpleRelationship(LayoutEntity sourceEntity, LayoutEntity destinationEntity, boolean bidirectional, double weight) {
this.destinationEntity = destinationEntity;
this.sourceEntity = sourceEntity;
this.bidirectional = bidirectional;
this.weight = weight;
this.attributes = new HashMap();
this.lineWidth = DEFAULT_REL_LINE_WIDTH;
this.color = DEFAULT_RELATIONSHIP_COLOR;
}
/**
* Gets the sourceEntity of this SimpleRelation whether the relation is
* exchangeable or not.
* @return The sourceEntity.
*/
public LayoutEntity getSourceInLayout() {
return sourceEntity;
}
/**
* Gets the destinationEntity of this SimpleRelation whether the relation is
* exchangeable or not.
* @return The destinationEntity of this SimpleRelation.
*/
public LayoutEntity getDestinationInLayout() {
return destinationEntity;
}
/**
* If bidirectional, the direction of the relationship doesn't matter. Switching the source and destination should make no difference.
* If not bidirectional, layout algorithms need to take into account the direction of the relationship. The direction is based on the
* source and destination entities.
*/
public boolean isBidirectionalInLayout() {
return bidirectional;
}
public void setWeightInLayout(double weight) {
this.weight = weight;
}
public double getWeightInLayout() {
return weight;
}
/**
* An algorithm may require a place to store information. Use this structure for that purpose.
*/
public void setAttributeInLayout (String attribute, Object value) {
attributes.put (attribute, value);
}
/**
* An algorithm may require a place to store information. Use this structure for that purpose.
*/
public Object getAttributeInLayout (String attribute) {
return attributes.get (attribute);
}
public String toString() {
String arrow = (isBidirectionalInLayout() ? " <-> " : " -> ");
return "(" + sourceEntity + arrow + destinationEntity + ")";
}
public int getLineWidth() {
return this.lineWidth;
}
public void setLineWidth( int lineWidth ) {
this.lineWidth = lineWidth;
}
public void resetLineWidth() {
this.lineWidth = DEFAULT_REL_LINE_WIDTH;
}
public static void setDefaultSize(int i) {
DEFAULT_REL_LINE_WIDTH = i;
DEFAULT_REL_LINE_WIDTH_SELECTED = DEFAULT_REL_LINE_WIDTH + 2;
}
public void setSelected() {
this.color = DEFAULT_RELATIONSHIP_HIGHLIGHT_COLOR;
this.lineWidth = DEFAULT_REL_LINE_WIDTH_SELECTED;
}
public void setUnSelected() {
this.color = DEFAULT_RELATIONSHIP_COLOR;
this.lineWidth = DEFAULT_REL_LINE_WIDTH;
}
public Object getColor() {
return color;
}
public void setColor(Object c) {
this.color = c;
}
public static void setDefaultColor(Object c) {
DEFAULT_RELATIONSHIP_COLOR = c;
}
public static void setDefaultHighlightColor(Object c) {
DEFAULT_RELATIONSHIP_HIGHLIGHT_COLOR = c;
}
/* (non-Javadoc)
* @see ca.uvic.cs.chisel.layouts.LayoutRelationship#getInternalRelationship()
*/
public Object getLayoutInformation() {
return internalRelationship;
}
/* (non-Javadoc)
* @see ca.uvic.cs.chisel.layouts.LayoutRelationship#setInternalRelationship(java.lang.Object)
*/
public void setLayoutInformation(Object layoutInformation) {
this.internalRelationship = layoutInformation;
}
public void setBendPoints(LayoutBendPoint[] bendPoints) {
this.bendPoints = bendPoints;
}
public LayoutBendPoint[] getBendPoints() {
return this.bendPoints;
}
public void clearBendPoints() {
this.bendPoints = new BendPoint[0];
}
public void setDestinationInLayout(LayoutEntity destination) {
this.destinationEntity = destination;
}
/**
* Set the label for this edge (available in the label layout constraint).
*/
public void setLabel(String label) {
this.label = label;
}
/**
* Populate the specified layout constraint
*/
public void populateLayoutConstraint(LayoutConstraint constraint) {
if ( constraint instanceof LabelLayoutConstraint ) {
LabelLayoutConstraint labelConstraint = (LabelLayoutConstraint) constraint;
labelConstraint.label = this.label;
labelConstraint.pointSize = 18;
}
else if ( constraint instanceof BasicEdgeConstraints ) {
// noop
}
}
public Object getGraphData() {
return null;
}
public void setGraphData(Object o) {
}
}