/*******************************************************************************
* Copyright (c) 2004, 2008 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.beans.ui.graph.parts;
import java.util.List;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.jdt.core.IType;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.ui.BeansUIUtils;
import org.springframework.ide.eclipse.beans.ui.graph.figures.BeanFigure;
import org.springframework.ide.eclipse.beans.ui.graph.model.Bean;
import org.springframework.ide.eclipse.ui.SpringUIUtils;
/**
* @author Torsten Juergeleit
* @author Christian Dupuis
*/
public class BeanPart extends AbstractGraphicalEditPart implements NodeEditPart {
public Bean getBean() {
return (Bean) getModel();
}
@Override
protected IFigure createFigure() {
Bean bean = getBean();
BeanFigure figure = new BeanFigure(bean);
return figure;
}
@Override
protected void createEditPolicies() {
}
/**
* Sets constraint for XYLayout (rectangle with figure bounds from bean).
*/
@Override
protected void refreshVisuals() {
Dimension dim = getFigure().getPreferredSize();
Rectangle rect = null;
if (getBean().getInnerBeans().length > 0) {
rect = new Rectangle(getBean().x, getBean().y, dim.width + 3, dim.height);
}
else {
rect = new Rectangle(getBean().x, getBean().y, dim.width + 3, dim.height);
}
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), rect);
getFigure().setBounds(rect);
}
@Override
protected List getModelSourceConnections() {
return getBean().outgoing;
}
@Override
protected List getModelTargetConnections() {
return getBean().incoming;
}
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart conn) {
return new TopOrBottomAnchor(getFigure());
}
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
return new TopOrBottomAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart conn) {
return new TopOrBottomAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
return new TopOrBottomAnchor(getFigure());
}
@Override
public void setSelected(int value) {
super.setSelected(value);
Border border = getFigure().getBorder();
if (border instanceof LineBorder) {
if (value != EditPart.SELECTED_NONE) {
((LineBorder) border).setWidth(2);
}
else {
((LineBorder) border).setWidth(1);
}
getFigure().repaint();
}
}
/**
* Opens this bean's config file or corresponding java element on double click.
*/
@Override
public void performRequest(Request req) {
if (req.getType() == RequestConstants.REQ_OPEN) {
if (BeansUIUtils.shouldOpenConfigFile()) {
BeansUIUtils.openInEditor(getBean().getBean());
}
else {
IType type = BeansModelUtils.getBeanType(getBean().getBean(), null);
if (type != null) {
SpringUIUtils.openInEditor(type);
}
}
}
super.performRequest(req);
}
protected static class TopOrBottomAnchor extends ChopboxAnchor {
public TopOrBottomAnchor(IFigure owner) {
super(owner);
}
@Override
public Point getLocation(Point reference) {
Point p = getOwner().getBounds().getCenter();
getOwner().translateToAbsolute(p);
if (reference.y < p.y) {
p = getOwner().getBounds().getTop();
}
else {
p = getOwner().getBounds().getBottom();
}
getOwner().translateToAbsolute(p);
return p;
}
}
}