//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 IBM Corporation and others. // 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: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.diagram.ui.service; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin; import org.eclipse.epf.diagram.add.part.ADDiagramEditor; import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin; import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor; import org.eclipse.epf.diagram.core.part.DiagramEditorInput; import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy; import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil; import org.eclipse.epf.diagram.core.services.DiagramHelper; import org.eclipse.epf.diagram.core.services.DiagramManager; import org.eclipse.epf.diagram.ui.DiagramUIPlugin; import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin; import org.eclipse.epf.library.edit.ICommandListener; import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; import org.eclipse.epf.library.edit.util.DiagramOptions; import org.eclipse.epf.library.edit.util.IDiagramManager; import org.eclipse.epf.library.edit.util.ProcessUtil; import org.eclipse.epf.library.edit.util.Suppression; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.Process; import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; /** * Helper class for diagram editor. * * @author Shashidhar Kannoori * @author Phong Nguyen Le * @since 1.2 */ public class DiagramEditorHelper { private Map<Process, DiagramManager> processToDiagramManagerMap = new HashMap<Process, DiagramManager>(); public DiagramEditorHelper() { } public DiagramManager getDiagramManager(Process proc) { DiagramManager mgr = processToDiagramManagerMap.get(proc); if(mgr != null && mgr.isDisposed()) { processToDiagramManagerMap.remove(proc); mgr = null; } if(mgr == null) { synchronized (processToDiagramManagerMap) { mgr = processToDiagramManagerMap.get(proc); if(mgr == null) { mgr = DiagramManager.getInstance(proc, this); processToDiagramManagerMap.put(proc, mgr); } } } return mgr; } public void openDiagram(IEditorPart part, int diagramType, Object selectedObject, Suppression suppression) { try { DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput( selectedObject, suppression, diagramType); DiagramEditorUtil.openDiagramEditor(part.getSite().getPage(), input, getDiagramPreferencesHint(diagramType), new NullProgressMonitor()); } catch (RuntimeException e) { DiagramUIPlugin.getDefault().getLogger().logError(e); } } public org.eclipse.gmf.runtime.notation.Diagram getDiagram(Activity activity, int type) { org.eclipse.gmf.runtime.notation.Diagram diagram = null; DiagramManager dMgr = getDiagramManager(TngUtil.getOwningProcess(activity)); if (dMgr != null) { try { List<Diagram> list = dMgr.getDiagrams(activity, type); if (!list.isEmpty()) { diagram = (org.eclipse.gmf.runtime.notation.Diagram) list.get(0); } } catch (Exception e) { DiagramUIPlugin.getDefault().getLogger().logError( "Core error retrieving a diagram in process editor:", e); //$NON-NLS-1$ } } return diagram; } /** * * @param act * @return */ public Collection getDiagrams(Activity act) { DiagramManager mgr = getDiagramManager(TngUtil.getOwningProcess(act)); try{ ArrayList<Diagram> diagrams = new ArrayList<Diagram>(); for (int i = 0; i < DiagramHelper.DIAGRAM_TYPES.length; i++) { List<Diagram> list = mgr.getDiagrams(act, DiagramHelper.DIAGRAM_TYPES[i]); if (!list.isEmpty()) { diagrams.addAll(list); } } return diagrams; }catch(Exception e){ return Collections.EMPTY_LIST; } } public void dispose(){ for (DiagramManager mgr : processToDiagramManagerMap.values()) { try { mgr.removeConsumer(this); } catch(Exception e) { // } } } public static int getDiagramType(Diagram diagram){ return DiagramHelper.getDiagramType(diagram); } public static String getDiagramTypeString(Diagram diagram){ return DiagramHelper.getDiagramTypeString(diagram); } public static PreferencesHint getDiagramPreferencesHint(int diagramType) { switch(diagramType) { case IDiagramManager.ACTIVITY_DIAGRAM: return ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT; case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM: return ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT; case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM: return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT; } return null; } /** * Close diagram editors * * @param closeElement * @param closeEditorRefs */ public static void closeDiagramEditors(Object closeElement, java.util.List<IEditorReference> closedEditorRefs) { IWorkbenchPage workbenchPage = DiagramUIPlugin.getDefault() .getWorkbench().getActiveWorkbenchWindow() .getActivePage(); if(workbenchPage == null) { return; } IEditorReference[] editorReferences = workbenchPage.getEditorReferences(); if(closedEditorRefs == null) { closedEditorRefs = new ArrayList<IEditorReference>(); } ArrayList<IEditorReference> closeEditorRefs = new ArrayList<IEditorReference>(); for (int i = 0; i < editorReferences.length; i++) { IEditorReference reference = editorReferences[i]; IEditorPart editor = reference.getEditor(true); if (editor != null) { IEditorInput input = editor.getEditorInput(); Object element = null; if (input instanceof DiagramEditorInputProxy) { DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput(); if (diagramInput.getWrapper() != null) { element = diagramInput.getWrapper(); if(element instanceof BreakdownElementWrapperItemProvider){ // close the parent editor too, if opened. Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(element); if(parent instanceof BreakdownElementWrapperItemProvider){ if(element.equals(closeElement)) closeDiagramEditors(parent, closedEditorRefs); } } } else { element = diagramInput.getMethodElement(); } } if (element != null) { if (element.equals(closeElement)) { closeEditorRefs.add(reference); } else { // check whether element is child of closeElement // directly/indirectly if (closeElement instanceof Activity) { Collection collection = new ArrayList(); ProcessUtil.getChildElements( (Activity) closeElement, Activity.class, collection); if (collection.contains(element)) { closeEditorRefs.add(reference); } } } } } } int size = closeEditorRefs.size(); IEditorReference[] references = new IEditorReference[size]; for (int i = 0; i < size; i++) { references[i] = (IEditorReference) closeEditorRefs.get(i); } workbenchPage.closeEditors(references, false); references = null; } /** * Diagram editors of object itself will be closed. And Parent diagram * editors will be refreshed. * */ public static void refreshParentDiagramEditors(Object refreshElement, java.util.List<IEditorReference> openEditorRefs, boolean parentRefresh) { openEditorRefs = new ArrayList<IEditorReference>(); // Now refresh object's parent's diagrams. IWorkbenchPage workbenchPage = DiagramUIPlugin.getDefault() .getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorReference[] editorReferences = workbenchPage .getEditorReferences(); for (int i = 0; i < editorReferences.length; i++) { IEditorReference reference = editorReferences[i]; IEditorPart editor = reference.getEditor(true); if (editor != null) { IEditorInput input = editor.getEditorInput(); Object element = null; if (input instanceof DiagramEditorInputProxy) { DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input) .getDiagramEditorInput(); if (diagramInput.getWrapper() != null) { element = diagramInput.getWrapper(); if(parentRefresh){ if (element instanceof BreakdownElementWrapperItemProvider) { Object parent = ((BreakdownElementWrapperItemProvider) element) .getParent(null); if (parent instanceof BreakdownElementWrapperItemProvider) { if (element.equals(refreshElement)) refreshParentDiagramEditors(parent, openEditorRefs, parentRefresh); } } } } else { element = diagramInput.getMethodElement(); } } if (element != null) { if (element instanceof Activity) { if(!parentRefresh){ if(element == refreshElement){ openEditorRefs.add(reference); } } if (((Activity) element).getBreakdownElements() .contains(refreshElement)) openEditorRefs.add(reference); else if (refreshElement instanceof BreakdownElementWrapperItemProvider) { Object localRefreshElement = refreshElement; while ((localRefreshElement instanceof BreakdownElementWrapperItemProvider) && ((BreakdownElementWrapperItemProvider) localRefreshElement) .getOwner() != null) { if (((BreakdownElementWrapperItemProvider) localRefreshElement) .getOwner().equals(element)) { openEditorRefs.add(reference); } localRefreshElement = ((BreakdownElementWrapperItemProvider) localRefreshElement) .getOwner(); } } if(((Activity) element).getVariabilityBasedOnElement() != null){ Activity base = (Activity)((Activity) element).getVariabilityBasedOnElement(); if (((Activity) base).getBreakdownElements() .contains(refreshElement)) openEditorRefs.add(reference); } } else if (element instanceof BreakdownElementWrapperItemProvider) { Collection c = ((BreakdownElementWrapperItemProvider) element) .getChildren(element); if (c != null && c.contains(refreshElement)) { openEditorRefs.add(reference); } } } } } int size = openEditorRefs.size(); // IEditorReference[] references = new IEditorReference[size]; for (int i = 0; i < size; i++) { IEditorReference reference = (IEditorReference) openEditorRefs .get(i); IEditorPart editor = reference.getEditor(true); if (editor instanceof AbstractDiagramEditor) { ((AbstractDiagramEditor) editor).refreshDiagram(); if(editor instanceof ADDiagramEditor){ ((ADDiagramEditor)editor).runResetLayoutAction(); } } } } /** * Gets list of command listeners that will handle the diagram related changes of the commands of interesses * * @return * @see ICommandListener */ // public static List<ICommandListener> getCommandListeners() { // if (commandListeners == null) { // commandListeners = new ArrayList<ICommandListener>(); // } // // commandListeners.add(new ICommandListener() { // // public void notifyExecuted(Command command) { // // get contributor/replacer of the activity // // // if(true) return; // Activity act = (Activity) command.getResult().iterator().next(); // Activity base = (Activity) act.getVariabilityBasedOnElement(); // DiagramManager dMgr = null; // DiagramManager baseMgr = null; // try { // if (base != null) { // Activity parentAct = act.getSuperActivities(); // dMgr = DiagramManager.getInstance(TngUtil // .getOwningProcess(parentAct)); // Diagram diagram = null; // List<Diagram> diagrams = dMgr.getDiagrams(parentAct, // IDiagramManager.ACTIVITY_DIAGRAM); // if (!diagrams.isEmpty()) { // diagram = diagrams.get(0); // } // if (diagram != null) { // // find existing node for base and link it to the // // contributore/replacer of the activity // Node node = findNode(diagram, base); // if (node != null) { // NodeAdapter adapter = BridgeHelper // .getNodeAdapter(node.getElement()); // if (adapter != null // && adapter.getElement() != act) { // BridgeHelper.associate((EModelElement) node // .getElement(), act); // BridgeHelper // .unmarkInHerited((EModelElement) node // .getElement()); // } // } // } // if (act.getVariabilityType() == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) { // // copy diagrams and their publishing options // baseMgr = DiagramManager // .getInstance(TngUtil.getOwningProcess(base)); // for (int i = 0; i < DiagramHelper.DIAGRAM_TYPES.length; i++) { // int diagramType = DiagramHelper.DIAGRAM_TYPES[i]; // List baseDiagrams = baseMgr.getDiagrams(base, // diagramType); // if (!baseDiagrams.isEmpty() && baseDiagrams.get(0) != null) { // Diagram copy = baseMgr.createDiagram(act, // diagramType, null); // if (isPublishDiagram(base, diagramType)) { // setDiagramOptions(act, diagramType); // } // } // } // } // } // }catch(Exception e){ // // } // finally{ // if(dMgr != null){ // dMgr.release(); // } // if(baseMgr != null){ // dMgr.release(); // } // } // } // // public Class getCommandType() { // return VaryActivityCommand.class; // } // // public void preUndo(Command command) { // // get old contributor/replacer of the activity // // // if(true) return; // Activity act = (Activity) command.getResult().iterator().next(); // VariabilityElement baseAct = act.getVariabilityBasedOnElement(); // if (baseAct != null) { // Activity parentAct = act.getSuperActivities(); // DiagramManager dMgr = DiagramManager.getInstance(TngUtil.getOwningProcess(parentAct)); // Diagram diagram = null; // try { // List diagrams = dMgr.getDiagrams(parentAct, // GraphicalDataHelper.ACTIVITY_DIAGRAM); // diagram = (Diagram) diagrams.get(0); // if (diagram != null) { // // find existing node for the old // // contributore/replacer // // old and relink it to the base activity // Node node = findNode(diagram, act); // if (node != null) { // NodeAdapter adapter = BridgeHelper // .getNodeAdapter(node.getElement()); // if (adapter != null // && adapter.getElement() != baseAct) { // BridgeHelper.associate((EModelElement) node // .getElement(), baseAct); // BridgeHelper // .markInherited((EModelElement) node // .getElement()); // } // } // } // // remove diagrams // // // }catch(Exception e){ // // } // finally { // // } // } // } // // public void preExecute(Command command) { // // } // // }); // // return commandListeners; // } public static void setDiagramOptions(Activity activity , int diagramType){ switch(diagramType){ case IDiagramManager.ACTIVITY_DIAGRAM: DiagramOptions.setPublishAD(activity, false); break; case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM: DiagramOptions.setPublishADD(activity, false); break; case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM: DiagramOptions.setPublishWPDD(activity, false); break; } } public static boolean isPublishDiagram(Activity activity, int diagramType){ switch(diagramType){ case IDiagramManager.ACTIVITY_DIAGRAM: return DiagramOptions.isPublishAD(activity); case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM: return DiagramOptions.isPublishADD(activity); case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM: return DiagramOptions.isPublishWPDD(activity); } return false; } }