/******************************************************************************
* Copyright (c) 2016 Oracle
* 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:
* Ling Hao - initial implementation and ongoing maintenance
* Shenxue Zhou - [371909] Double-click on connection labels does not place
* label in direct edit mode
******************************************************************************/
package org.eclipse.sapphire.ui.swt.gef.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.sapphire.ui.Point;
import org.eclipse.sapphire.ui.diagram.DiagramConnectionPart;
import org.eclipse.sapphire.ui.swt.gef.DiagramConfigurationManager;
import org.eclipse.sapphire.ui.swt.gef.model.DiagramConnectionLabelModel;
import org.eclipse.sapphire.ui.swt.gef.model.DiagramResourceCache;
import org.eclipse.sapphire.ui.swt.gef.policies.ConnectionLabelDirectEditPolicy;
/**
* @author <a href="mailto:ling.hao@oracle.com">Ling Hao</a>
*/
public class DiagramConnectionLabelEditPart extends AbstractGraphicalEditPart
implements PropertyChangeListener, IConfigurationManagerHolder {
private DiagramConfigurationManager configManager;
private ConnectionDirectEditManager manager;
public DiagramConnectionLabelEditPart(DiagramConfigurationManager configManager) {
this.configManager = configManager;
}
public DiagramConfigurationManager getConfigurationManager() {
return this.configManager;
}
@Override
protected IFigure createFigure() {
Label label = new Label() {
@Override
public Insets getInsets() {
return new Insets(0,2,0,2);
}
};
DiagramResourceCache resourceCache = getCastedModel().getDiagramModel().getResourceCache();
label.setFont(resourceCache.getDefaultFont());
// let text change color when the parent connection is selected
// DiagramResourceCache resourceCache = getCastedModel().getDiagramModel().getResourceCache();
// DiagramConnectionPart connectionPart = getCastedModel().getModelPart();
// label.setForegroundColor(resourceCache.getLineColor(connectionPart));
return label;
}
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new ConnectionLabelDirectEditPolicy());
}
public DiagramConnectionPart getDiagramConnectionPart() {
return ((DiagramConnectionLabelModel)getModel()).getModelPart();
}
public DiagramConnectionLabelModel getCastedModel() {
return (DiagramConnectionLabelModel)getModel();
}
@Override
public EditPart getParent() {
EditPart parent = super.getParent();
if (parent instanceof DiagramConnectionEditPart) {
DiagramConnectionEditPart connectionEditPart = (DiagramConnectionEditPart)parent;
if (connectionEditPart.getSource() != null) {
return connectionEditPart.getSource().getParent();
}
if (connectionEditPart.getTarget() != null) {
connectionEditPart.getTarget().getParent();
}
}
return parent;
}
@Override
public void activate() {
if (!isActive()) {
super.activate();
getCastedModel().addPropertyChangeListener(this);
}
}
@Override
public void deactivate() {
if (isActive()) {
super.deactivate();
getCastedModel().removePropertyChangeListener(this);
}
}
private void performDirectEdit() {
if (manager == null) {
Label label = (Label)getFigure();
manager = new ConnectionDirectEditManager(this, TextCellEditor.class, new ConnectionEditorLocator(this, label), label);
}
manager.show();
}
public void performRequest(Request request)
{
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
{
if (!(request instanceof DirectEditRequest))
{
// Direct edit invoked using key command
performDirectEdit();
}
}
else if (request.getType().equals(REQ_OPEN))
{
performDirectEdit();
}
}
private void refreshLabel() {
((Label)getFigure()).setText(getDiagramConnectionPart().getLabel());
}
private void refreshLabelLocation() {
PolylineConnection parent = (PolylineConnection)getFigure().getParent();
Point position = getDiagramConnectionPart().getLabelPosition();
SapphireMidpointLocator locator = position == null ?
new SapphireMidpointLocator(getConfigurationManager(), parent) :
new SapphireMidpointLocator(getConfigurationManager(), parent, position.getX(), position.getY());
parent.getLayoutManager().setConstraint(getFigure(), locator);
}
@Override
public void refresh() {
super.refresh();
refreshLabel();
refreshLabelLocation();
}
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (DiagramConnectionLabelModel.CONNECTION_LABEL.equals(prop)) {
refreshLabel();
} else if (DiagramConnectionLabelModel.CONNECTION_LABEL_MOVED.equals(prop)) {
refreshLabelLocation();
getFigure().revalidate();
} else if (DiagramConnectionLabelModel.CONNECTION_START_EDITING.equals(prop)) {
performDirectEdit();
}
}
}