/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.mongodb.erd.core.part;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.draw2d.AbsoluteBendpoint;
import org.eclipse.draw2d.BendpointConnectionRouter;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.ConnectionEndpointLocator;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.editparts.AbstractConnectionEditPart;
import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
import com.hangum.tadpole.mongodb.erd.core.figures.decoration.relation.RelationDecorator;
import com.hangum.tadpole.mongodb.erd.core.policies.RelationBendpointEditPolicy;
import com.hangum.tadpole.mongodb.model.Relation;
public class RelationEditPart extends AbstractConnectionEditPart {
private static final Logger logger = Logger.getLogger(RelationEditPart.class);
private RelationAdapter adapter;
private Label labelSource;
private Label labelTarget;
public RelationEditPart() {
super();
adapter = new RelationAdapter();
}
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy());
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new RelationBendpointEditPolicy());
// delte
// installEditPolicy(EditPolicy.CONNECTION_ROLE, new RelationConnectionEditPolicy());
}
@Override
protected IFigure createFigure() {
PolylineConnection conn = new PolylineConnection();
conn.setConnectionRouter(new BendpointConnectionRouter());
Relation relation = (Relation)getModel();
conn.setSourceDecoration(new RelationDecorator(relation.getSource_kind().getName()));
conn.setTargetDecoration(new RelationDecorator(relation.getTarget_kind().getName()));
// source
// text에는 target 이름을 넣는다.
labelSource = new Label();
labelSource.setText(relation.getReferenced_column_name());
labelSource.setLabelAlignment(PositionConstants.CENTER);
labelSource.setOpaque(true);
labelSource.setBackgroundColor(ColorConstants.white());
labelSource.setForegroundColor(ColorConstants.darkBlue());
conn.add(labelSource, new ConnectionEndpointLocator(conn, true));
// target
// text에서 source이름을 넣는다.
//
labelTarget = new Label();
labelTarget.setText(relation.getColumn_name());
labelTarget.setLabelAlignment(PositionConstants.CENTER);
labelTarget.setOpaque(true);
labelTarget.setBackgroundColor(ColorConstants.white());
labelTarget.setForegroundColor(ColorConstants.darkBlue());
conn.add(labelTarget, new ConnectionEndpointLocator(conn, false));
return conn;
}
@Override
protected void refreshVisuals() {
Connection connection = getConnectionFigure();
List<Point> modelConstraint = ((Relation)getModel()).getBendpoint();
List<AbsoluteBendpoint> figureConstraint = new ArrayList<AbsoluteBendpoint>();
for (Point p : modelConstraint) {
figureConstraint.add(new AbsoluteBendpoint(p));
}
connection.setRoutingConstraint(figureConstraint);
}
@Override
public void activate() {
if(!isActive()) ((Relation)getModel()).eAdapters().add(adapter);
super.activate();
}
@Override
public void deactivate() {
if(!isActive()) ((Relation)getModel()).eAdapters().remove(adapter);
super.deactivate();
}
public class RelationAdapter implements Adapter {
@Override
public void notifyChanged(Notification notification) {
// Relation relation = (Relation)getModel();
// try {
// logger.debug("\t\t\t #############relation########## [source] " + relation.getSource().getName() );
// logger.debug("\t\t\t #############relation########## [target] " + relation.getTarget().getName() );
// } catch(Exception e) {}
refreshVisuals();
}
@Override
public Notifier getTarget() {
return (Relation)getModel();
}
@Override
public void setTarget(Notifier newTarget) {
}
@Override
public boolean isAdapterForType(Object type) {
return type.equals(Relation.class);
}
}
}