// ============================================================================ // // 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.process; 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.ConnectionLayer; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.gef.CompoundSnapToHelper; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.RootEditPart; import org.eclipse.gef.SnapToGrid; import org.eclipse.gef.SnapToHelper; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.editpolicies.SnapFeedbackPolicy; import org.eclipse.gef.rulers.RulerProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.ui.IEditorInput; import org.talend.core.model.process.INode; import org.talend.core.model.utils.DesignerColorUtils; import org.talend.designer.core.DesignerPlugin; import org.talend.designer.core.ui.editor.ProcessEditorInput; import org.talend.designer.core.ui.editor.TalendScalableFreeformRootEditPart; import org.talend.designer.core.ui.editor.nodes.Node; import org.talend.designer.core.ui.preferences.TalendDesignerPrefConstants; import org.talend.designer.core.utils.ResourceDisposeUtil; import org.talend.repository.model.RepositoryNode; /** * EditPart of the Diagram that will set the main layer, and the differents kinds of rulers. <br/> * * $Id: ProcessPart.java 77219 2012-01-24 01:14:15Z mhirt $ * */ public class ProcessPart extends AbstractGraphicalEditPart implements PropertyChangeListener, IAdaptable { private FreeformLayer fig2; private RepositoryNode node; // private static final Color READ_WRITE_COLOR = new Color(null, DesignerColorUtils.getPreferenceDesignerEditorRGB( // DesignerColorUtils.JOBDESIGNER_EGITOR_BACKGROUND_COLOR_NAME, DesignerColorUtils.DEAULT_EDITOR_COLOR)); // // private static final Color READ_ONLY_COLOR = new Color(null, DesignerColorUtils.getPreferenceReadonlyRGB( // DesignerColorUtils.READONLY_BACKGROUND_COLOR_NAME, DesignerColorUtils.DEAULT_READONLY_COLOR)); /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() */ @Override public List getModelChildren() { return ((Process) this.getModel()).getElements(); } @Override protected void unregisterVisuals() { super.unregisterVisuals(); if (fig2 != null) { ResourceDisposeUtil.disposeColor(fig2.getBackgroundColor()); ResourceDisposeUtil.disposeColor(fig2.getForegroundColor()); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate() */ @Override public void activate() { if (isActive()) { return; } super.activate(); ((Process) getModel()).addPropertyChangeListener(this); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate() */ @Override public void deactivate() { if (!isActive()) { return; } super.deactivate(); ((Process) getModel()).removePropertyChangeListener(this); fig2.getBackgroundColor().dispose(); fig2.getForegroundColor().dispose(); fig2 = null; node = null; } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ @Override protected IFigure createFigure() { Figure figure = new FreeformLayer(); figure.setLayoutManager(new FreeformLayout()); fig2 = new FreeformLayer(); getLayer(TalendScalableFreeformRootEditPart.PROCESS_BACKGROUND_LAYER).add(fig2); ajustReadOnly(); // ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER); // connLayer.setConnectionRouter(new NullRouter()); return figure; } /** * DOC smallet Comment method "ajustReadOnly". */ public void ajustReadOnly() { if (((Process) getModel()).isReadOnly()) { fig2.setBackgroundColor(new Color(null, DesignerColorUtils.getPreferenceReadonlyRGB( DesignerColorUtils.READONLY_BACKGROUND_COLOR_NAME, DesignerColorUtils.DEFAULT_READONLY_COLOR))); fig2.setOpaque(true); } else { ResourceDisposeUtil.disposeColor(fig2.getBackgroundColor()); fig2.setBackgroundColor(new Color(null, DesignerColorUtils.getPreferenceDesignerEditorRGB( DesignerColorUtils.JOBDESIGNER_EGITOR_BACKGROUND_COLOR_NAME, DesignerColorUtils.DEFAULT_EDITOR_COLOR))); fig2.setOpaque(true); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class) */ @Override public Object getAdapter(final Class adapter) { if (adapter.equals(RepositoryNode.class)) { if (node == null) { RootEditPart rootEditPart = getRoot(); if (rootEditPart instanceof TalendScalableFreeformRootEditPart) { TalendScalableFreeformRootEditPart rootEditPart2 = (TalendScalableFreeformRootEditPart) rootEditPart; IEditorInput editorInput = rootEditPart2.getEditorInput(); if (editorInput instanceof ProcessEditorInput) { ProcessEditorInput processEditorInput = (ProcessEditorInput) editorInput; node = processEditorInput.getRepositoryNode(); } } } return node; } if (adapter == 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(adapter); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ @Override protected void refreshVisuals() { super.refreshVisuals(); if (DesignerPlugin.getDefault().getPreferenceStore().getBoolean(TalendDesignerPrefConstants.EDITOR_ANTIALIASING)) { ConnectionLayer cLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER); cLayer.setAntialias(SWT.ON); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.LAYOUT_ROLE, new ProcessLayoutEditPolicy()); installEditPolicy("Snap Feedback", new SnapFeedbackPolicy()); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(final PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (Process.NEED_UPDATE_JOB.equals(prop)) { refresh(); } } @Override public List getChildren() { return super.getChildren(); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh() */ @Override public void refresh() { sortNode(); super.refresh(); } /** * * DOC ggu Comment method "sortNode". <br/> * * Sort components Alphabeticaly in the Outline viewer. <br/> * * Rule: sorted by unique name */ private void sortNode() { Process process = (Process) this.getModel(); List<INode> eleList = (List<INode>) process.getGraphicalNodes(); if (eleList.size() > 1) { Node node, tmpNode; for (int i = 1; i < eleList.size(); i++) { tmpNode = (Node) eleList.get(i); for (int k = i; k > 0; k--) { node = (Node) eleList.get(k - 1); // ascending order if (node.getUniqueName().compareTo(tmpNode.getUniqueName()) > 0) { // Swap the node eleList.remove(node); eleList.add(k, node); } } } } } }