// ============================================================================
//
// 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.nodecontainer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.rulers.RulerProvider;
import org.talend.core.model.process.IElementParameter;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.core.ui.editor.nodes.Node;
import org.talend.designer.core.ui.editor.nodes.NodePart;
import org.talend.designer.core.ui.editor.process.NodeSnapToGeometry;
/**
* EditPart linked to the NodeContainer.
*
* $Id: NodeContainerPart.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class NodeContainerPart extends AbstractGraphicalEditPart implements PropertyChangeListener, IAdaptable {
@Override
protected void unregisterVisuals() {
super.unregisterVisuals();
if (getFigure() instanceof NodeContainerFigure) {
((NodeContainerFigure) getFigure()).disposeColors();
}
}
@Override
public boolean isSelectable() {
return false;
}
public void activate() {
if (!isActive()) {
super.activate();
Node node = ((NodeContainer) getModel()).getNode();
node.addPropertyChangeListener(this);
}
}
public void deactivate() {
if (isActive()) {
super.deactivate();
Node node = ((NodeContainer) getModel()).getNode();
node.removePropertyChangeListener(this);
}
}
@Override
public void setSelected(int value) {
super.setSelected(SELECTED_NONE);
}
public NodePart getNodePart() {
Object o = this.getChildren().get(0);
if (o instanceof NodePart) {
return (NodePart) o;
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
@Override
protected IFigure createFigure() {
NodeContainerFigure nodeContainerFigure = new NodeContainerFigure((NodeContainer) this.getModel());
Node node = ((NodeContainer) getModel()).getNode();
if (node.isActivate()) {
nodeContainerFigure.setAlpha(-1);
} else {
nodeContainerFigure.setAlpha(Node.ALPHA_VALUE);
}
IElementParameter param = node.getElementParameter(EParameterName.INFORMATION.getName());
if (param != null) {
boolean showInfoFlag = Boolean.TRUE.equals(param.getValue());
nodeContainerFigure.updateStatus(node.getStatus(), showInfoFlag);
nodeContainerFigure.setInfoHint(node.getShowHintText());
}
return nodeContainerFigure;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.LAYOUT_ROLE, new NodeContainerLayoutEditPolicy());
}
protected void refreshVisuals() {
Rectangle rectangle = ((NodeContainer) this.getModel()).getNodeContainerRectangle();
Rectangle cleanRectangle = ((NodeContainer) this.getModel()).getNodeMarkRectangle();
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), rectangle);
((NodeContainerFigure) getFigure()).initializeNodeContainer(cleanRectangle);
}
protected List getModelChildren() {
return ((NodeContainer) this.getModel()).getElements();
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent changeEvent) {
if (changeEvent.getPropertyName().equals(EParameterName.VALIDATION_RULES.getName())) {
Node node = ((NodeContainer) getModel()).getNode();
((NodeContainerFigure) this.getFigure()).updateValidationRuleFigure(node.isHasValidationRule());
refreshVisuals();
}
if (changeEvent.getPropertyName().equals(EParameterName.HINT.getName())) {
Node node = ((NodeContainer) getModel()).getNode();
((NodeContainerFigure) figure).setInfoHint(node.getShowHintText());
}
if (changeEvent.getPropertyName().equals(Node.UPDATE_STATUS)) {
Node node = ((NodeContainer) getModel()).getNode();
((NodeContainerFigure) this.getFigure()).updateErrorFlag(node.isErrorFlag());
((NodeContainerFigure) this.getFigure()).setShowCompareMark(node.isCompareFlag() && !node.isErrorFlag());
IElementParameter param = node.getElementParameter(EParameterName.INFORMATION.getName());
if (param != null) {
boolean showInfoFlag = Boolean.TRUE.equals(param.getValue());
if (changeEvent.getNewValue() instanceof Integer) {
Integer status = (Integer) changeEvent.getNewValue();
if (status != null) {
((NodeContainerFigure) this.getFigure()).updateStatus(status, showInfoFlag);
}
((NodeContainerFigure) this.getFigure()).setInfoHint(node.getShowHintText());
}
refreshVisuals();
}
}
if (changeEvent.getPropertyName().equals(EParameterName.ACTIVATE.getName())) {
Node node = ((NodeContainer) getModel()).getNode();
if (node.isActivate()) {
((NodeContainerFigure) figure).setAlpha(-1);
((NodeContainerFigure) figure).repaint();
refreshVisuals();
} else {
((NodeContainerFigure) figure).setAlpha(Node.ALPHA_VALUE);
((NodeContainerFigure) figure).repaint();
refreshVisuals();
}
}
if (changeEvent.getPropertyName().equals(Node.PERFORMANCE_DATA)) {
refreshVisuals();
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter(Class key) {
if (key == SnapToHelper.class) {
List<Object> snapStrategies = new ArrayList<Object>();
Boolean val = (Boolean) getViewer().getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY);
val = (Boolean) getViewer().getProperty(NodeSnapToGeometry.PROPERTY_SNAP_ENABLED);
if (val != null && val.booleanValue()) {
snapStrategies.add(new NodeSnapToGeometry(this));
}
val = (Boolean) getViewer().getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
if (val != null && val.booleanValue()) {
snapStrategies.add(new SnapToGrid(this));
}
if (snapStrategies.size() == 0) {
return null;
}
if (snapStrategies.size() == 1) {
return snapStrategies.get(0);
}
SnapToHelper[] ss = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++) {
ss[i] = (SnapToHelper) snapStrategies.get(i);
}
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(key);
}
}