// ============================================================================ // // 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.subjobcontainer; 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.ChopboxAnchor; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.CompoundSnapToHelper; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.SnapToGrid; import org.eclipse.gef.SnapToHelper; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.requests.SelectionRequest; import org.eclipse.gef.rulers.RulerProvider; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.CorePlugin; import org.talend.core.model.general.ILibrariesService; import org.talend.core.model.process.Problem; import org.talend.core.model.process.Problem.ProblemStatus; import org.talend.designer.core.ui.dialog.mergeorder.ErrorMessageDialog; import org.talend.designer.core.ui.editor.nodecontainer.NodeContainer; import org.talend.designer.core.ui.editor.nodes.Node; import org.talend.designer.core.ui.editor.process.NodeSnapToGeometry; import org.talend.designer.core.ui.editor.process.Process; import org.talend.designer.core.ui.views.properties.ComponentSettingsView; import org.talend.librariesmanager.ui.views.ModulesView; /** * DOC nrousseau class global comment. Detailled comment */ public class SubjobContainerPart extends AbstractGraphicalEditPart implements PropertyChangeListener, IAdaptable, NodeEditPart { @Override protected void unregisterVisuals() { super.unregisterVisuals(); IFigure figure = getFigure(); if (figure instanceof SubjobContainerFigure) { ((SubjobContainerFigure) figure).disposeColors(); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#setSelected(int) */ @Override public void setSelected(int value) { super.setSelected(value); if (value == SELECTED_PRIMARY) { ComponentSettingsView viewer = (ComponentSettingsView) PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getActivePage().findView(ComponentSettingsView.ID); if (viewer != null) { viewer.setElement((SubjobContainer) getModel()); } } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate() */ @Override public void activate() { super.activate(); ((SubjobContainer) getModel()).addPropertyChangeListener(this); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate() */ @Override public void deactivate() { super.deactivate(); ((SubjobContainer) getModel()).removePropertyChangeListener(this); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ @Override protected void refreshVisuals() { Boolean isDisplaySubjobs = ((SubjobContainer) this.getModel()).isDisplayed(); if (getParent() == null || !isDisplaySubjobs) { return; } Rectangle rectangle = ((SubjobContainer) this.getModel()).getSubjobContainerRectangle(); if (rectangle == null) { return; } ((SubjobContainerFigure) getFigure()).initializeSubjobContainer(rectangle); // added for bug 4005 if (getFigure().getParent() != null) { ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), rectangle); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ @Override protected IFigure createFigure() { Boolean isDisplaySubjobs = ((SubjobContainer) this.getModel()).isDisplayed(); if (!isDisplaySubjobs) { Figure figure = new FreeformLayer(); figure.setLayoutManager(new FreeformLayout()); return figure; } SubjobContainerFigure subjobContainer = new SubjobContainerFigure((SubjobContainer) this.getModel()); return subjobContainer; } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.LAYOUT_ROLE, new SubjobContainerLayoutEditPolicy()); } /* * (non-Javadoc) * * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent evt) { String prop = evt.getPropertyName(); if (SubjobContainer.UPDATE_SUBJOB_CONTENT.equals(prop)) { refresh(); List<AbstractGraphicalEditPart> childrens = getChildren(); for (AbstractGraphicalEditPart part : childrens) { part.refresh(); } } else if (SubjobContainer.UPDATE_SUBJOB_CONNECTIONS.equals(prop)) { refreshSourceConnections(); } else if (SubjobContainer.UPDATE_SUBJOB_TITLE_COLOR.equals(prop)) { if (getFigure() instanceof SubjobContainerFigure) { ((SubjobContainerFigure) getFigure()).updateSubJobTitleColor(); refreshVisuals(); } } else if (SubjobContainer.UPDATE_SUBJOB_DISPLAY.equals(prop)) { List<NodeContainer> tmpList = new ArrayList<NodeContainer>(((SubjobContainer) getModel()).getNodeContainers()); ((SubjobContainer) getModel()).getNodeContainers().clear(); refreshChildren(); List elems = ((Process) getParent().getModel()).getElements(); elems.remove(getModel()); EditPart parent = getParent(); parent.refresh(); ((SubjobContainer) getModel()).getNodeContainers().addAll(tmpList); elems.add(getModel()); parent.refresh(); } else { // can only be UPDATE_SUBJOB_DATA, need to modify if some others are added if (getFigure() instanceof SubjobContainerFigure) { ((SubjobContainerFigure) getFigure()).updateData(); refreshVisuals(); } } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() */ @Override protected List getModelChildren() { return ((SubjobContainer) getModel()).getNodeContainers(); } /* * (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); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addChildVisual(org.eclipse.gef.EditPart, int) */ @Override protected void addChildVisual(EditPart childEditPart, int index) { int nbChildrensInFigure = 2; Boolean isDisplaySubjobs = ((SubjobContainer) this.getModel()).isDisplayed(); if (!isDisplaySubjobs) { nbChildrensInFigure = 0; } super.addChildVisual(childEditPart, index + nbChildrensInFigure); } /* * (non-Javadoc) * * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart) */ public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request) */ public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart) */ public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request) */ public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections() */ @Override protected List getModelSourceConnections() { return ((SubjobContainer) this.getModel()).getOutgoingConnections(); } @Override public void performRequest(Request req) { if (req instanceof SelectionRequest) { Point location = ((SelectionRequest) req).getLocation(); List<NodeContainer> list = this.getModelChildren(); for (NodeContainer nodeCon : list) { if (nodeCon.getErrorMarkRectangle().contains(location)) { Node node = nodeCon.getNode(); if (node.isErrorFlag()) { Shell shell = Display.getCurrent().getActiveShell();// getViewer().getControl().getShell(); ErrorMessageDialog dialog = new ErrorMessageDialog(new Shell(shell), node); dialog.open(); break; } } else if (nodeCon.getErrorRectangle() != null && nodeCon.getErrorRectangle().contains(location)) { Node node = nodeCon.getNode(); showModules(node); } } } super.performRequest(req); } private void showModules(Node node) { ILibrariesService moduleService = CorePlugin.getDefault().getLibrariesService(); if (moduleService == null) { return; } List<Problem> problems = moduleService.getProblems(node, node); List<Problem> mproblems = new ArrayList<Problem>(); List<String> modulesName = new ArrayList<String>(); String componentName = null; String moduleStr = "Module_"; for (Problem pro : problems) { if (pro.getStatus() == ProblemStatus.ERROR && pro.getKey() != null && pro.getKey().startsWith(moduleStr)) { mproblems.add(pro); } } if (mproblems.isEmpty()) { return; } for (Problem pro : mproblems) { if (componentName == null) { componentName = pro.getComponentName(); } String key = pro.getKey(); if (key.contains(moduleStr)) { int first = key.indexOf(moduleStr); String keydes = key.substring(first + moduleStr.length()); modulesName.add(keydes); } } IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); final IWorkbenchPage page = window.getActivePage(); if (page == null) { return; } try { IViewPart view = page.showView("org.talend.designer.codegen.perlmodule.ModulesView"); if (view instanceof ModulesView) { ((ModulesView) view).selectUninstalledItem(componentName, modulesName); } } catch (PartInitException e) { ExceptionHandler.process(e); } } }