// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui.editor.connections;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
import org.eclipse.gef.requests.GroupRequest;
import org.talend.commons.ui.utils.workbench.gef.LabelCellEditorLocator;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IConnectionCategory;
import org.talend.designer.core.ui.editor.cmd.ConnectionDeleteCommand;
/**
* Graphical part of the Gef object for the connection label. <br/>
*
* $Id: ConnLabelEditPart.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class ConnLabelEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener {
NodeLabelEditManager manager = null;
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
@Override
public void activate() {
if (!isActive()) {
super.activate();
((Element) getModel()).addPropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate()
*/
@Override
public void deactivate() {
if (isActive()) {
super.deactivate();
((Element) getModel()).removePropertyChangeListener(this);
manager = null;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
@Override
public IFigure createFigure() {
String text = ((ConnectionLabel) getModel()).getLabelText();
Label label = new Label();
label.setText(text);
return label;
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
String request = evt.getPropertyName();
if (request.equals("positionChange") || request.equals("textChange")) { //$NON-NLS-1$ //$NON-NLS-2$
refreshVisuals();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
public void createEditPolicies() {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ConnTextMovePolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new ConnTextEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ConnectionEditPolicy() {
@Override
protected Command getDeleteCommand(GroupRequest request) {
if (((Connection) getHost().getParent().getModel()).isReadOnly()) {
return null;
}
List<Connection> connectionList = new ArrayList<Connection>();
for (int i = 0; i < request.getEditParts().size(); i++) {
if (request.getEditParts().get(i) instanceof ConnLabelEditPart) {
connectionList.add(((ConnectionLabel) ((ConnLabelEditPart) request.getEditParts().get(i)).getModel())
.getConnection());
}
}
return new ConnectionDeleteCommand(connectionList);
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request)
*/
@Override
public DragTracker getDragTracker(Request request) {
return new ConnTextTracker(this, (ConnectionPart) getParent());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
@Override
protected void refreshVisuals() {
String text = ((ConnectionLabel) getModel()).getLabelText();
Point offset = ((ConnectionLabel) getModel()).getOffset();
Label figure = (Label) getFigure();
figure.setText(text);
ConnectionPart parent = (ConnectionPart) getParent();
PolylineConnection connFigure = (PolylineConnection) parent.getFigure();
ConnLabelConstraint constraint = new ConnLabelConstraint(text, "center", offset, connFigure); //$NON-NLS-1$
parent.setLayoutConstraint(this, getFigure(), constraint);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#performRequest(org.eclipse.gef.Request)
*/
@Override
public void performRequest(Request request) {
Connection connectionParent = (Connection) getParent().getModel();
if (((Connection) getParent().getModel()).isReadOnly()) {
return;
}
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT
&& (connectionParent.getLineStyle().hasConnectionCategory(IConnectionCategory.CUSTOM_NAME))) {
performDirectEdit();
}
}
/**
* Start the manager to edit the label.
*/
private void performDirectEdit() {
((Label) getFigure()).setText(((Connection) getParent().getModel()).getName());
if (manager == null) {
manager = new NodeLabelEditManager(this, NodeLabelCellEditor.class, new LabelCellEditorLocator((Label) getFigure()));
}
manager.show();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#setSelected(int)
*/
@Override
public void setSelected(int value) {
super.setSelected(value);
if (this.getParent().getSelected() != value) {
this.getParent().setSelected(value);
}
}
/**
* Getter for manager.
*
* @return the manager
*/
public NodeLabelEditManager getDirectEditManager() {
return this.manager;
}
}