| //------------------------------------------------------------------------------ |
| // 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 |
| //------------------------------------------------------------------------------ |
| //------------------------------------------------------------------------------ |
| // 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.core.part.util; |
| |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.core.resources.IStorage; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.common.util.AbstractTreeIterator; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; |
| import org.eclipse.emf.transaction.util.TransactionUtil; |
| import org.eclipse.emf.workspace.AbstractEMFOperation; |
| import org.eclipse.epf.common.CommonPlugin; |
| import org.eclipse.epf.diagram.core.DiagramCorePlugin; |
| import org.eclipse.epf.diagram.core.bridge.ActivityDiagramAdapter; |
| import org.eclipse.epf.diagram.core.bridge.BridgeHelper; |
| import org.eclipse.epf.diagram.core.bridge.DiagramAdapter; |
| import org.eclipse.epf.diagram.core.bridge.NodeAdapter; |
| import org.eclipse.epf.diagram.core.editparts.InternalNodeEditPart; |
| 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.DiagramFileEditorInputProxy; |
| import org.eclipse.epf.diagram.core.part.IDiagramEditorInputProvider; |
| import org.eclipse.epf.diagram.core.part.IDiagramFileEditorInputProxy; |
| import org.eclipse.epf.diagram.core.providers.SharedResourceDiagramDocumentProvider; |
| import org.eclipse.epf.diagram.core.resources.IDiagramStorage; |
| import org.eclipse.epf.diagram.core.services.DiagramManager; |
| import org.eclipse.epf.diagram.core.util.DiagramCoreUtil; |
| import org.eclipse.epf.diagram.model.ActivityDetailDiagram; |
| import org.eclipse.epf.diagram.model.ModelFactory; |
| import org.eclipse.epf.diagram.model.NamedNode; |
| import org.eclipse.epf.diagram.model.NodeContainer; |
| import org.eclipse.epf.diagram.model.RoleTaskComposite; |
| import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram; |
| import org.eclipse.epf.diagram.model.impl.DiagramImpl; |
| import org.eclipse.epf.diagram.model.impl.NodeImpl; |
| import org.eclipse.epf.diagram.model.util.TxUtil; |
| import org.eclipse.epf.library.edit.TngAdapterFactory; |
| import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; |
| 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.MethodElement; |
| import org.eclipse.epf.uma.TaskDescriptor; |
| import org.eclipse.gef.ConnectionEditPart; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPartViewer; |
| import org.eclipse.gef.GraphicalViewer; |
| import org.eclipse.gmf.runtime.common.core.util.StringStatics; |
| import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.gmf.runtime.notation.Edge; |
| import org.eclipse.gmf.runtime.notation.FontStyle; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorReference; |
| import org.eclipse.ui.IFileEditorInput; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.PartInitException; |
| |
| /** |
| * @author Phong Nguyen Le |
| * @author skannoor |
| * @since 1.2 |
| */ |
| public class DiagramEditorUtil { |
| private static final String AD_EDITOR_ID = "org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"; //$NON-NLS-1$ |
| private static final String ADD_EDITOR_ID = "org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"; //$NON-NLS-1$ |
| private static final String WPDD_EDITOR_ID = "org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"; //$NON-NLS-1$ |
| |
| public static String getEditorId(int diagramType) { |
| switch(diagramType) { |
| case IDiagramManager.ACTIVITY_DIAGRAM: |
| return AD_EDITOR_ID; |
| case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM: |
| return ADD_EDITOR_ID; |
| case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM: |
| return WPDD_EDITOR_ID; |
| } |
| return null; |
| } |
| |
| public static IEditorPart openDiagramEditor(IWorkbenchPage page, DiagramEditorInput input, PreferencesHint hint, IProgressMonitor progressMonitor) { |
| DiagramEditorInputProxy inputProxy = new DiagramEditorInputProxy(input, hint); |
| |
| IEditorPart editorPart = null; |
| try { |
| editorPart = page.openEditor(inputProxy, getEditorId(input.getDiagramType()), true); |
| } catch (Exception e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| } |
| |
| if(editorPart instanceof AbstractDiagramEditor){ |
| if(input.getDiagramType() == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) { |
| AbstractDiagramEditor editor = ((AbstractDiagramEditor)editorPart); |
| editor.resetLayout(); |
| // TODO: has to call resetLayout twice here so it can layout properly |
| // need to improve this method |
| // |
| editor.resetLayout(); |
| } |
| |
| IDocumentProvider docProvider = ((DiagramDocumentEditor)editorPart).getDocumentProvider(); |
| |
| // set the document as savable if the diagram is new |
| // |
| org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(input.getMethodElement()); |
| if(proc != null) { |
| DiagramManager mgr = null; |
| Object consumer = new Object(); |
| try { |
| mgr = DiagramManager.getInstance(proc, consumer); |
| if(mgr != null && inputProxy.isNewDiagram()) { |
| docProvider.setCanSaveDocument(inputProxy); |
| } |
| } |
| finally { |
| if(mgr != null) { |
| mgr.removeConsumer(consumer); |
| } |
| } |
| } |
| |
| // initialization might have made the document dirty |
| // this will clear dirty flag of the editor |
| // |
| if (docProvider instanceof SharedResourceDiagramDocumentProvider |
| && editorPart.isDirty() |
| && !inputProxy.isNewDiagram()) { |
| ((SharedResourceDiagramDocumentProvider) docProvider) |
| .markDocumentAsSaved(inputProxy); |
| } |
| |
| // Check whether diagram is read-only and plug-in is locked. |
| // |
| if(!isModifiable(inputProxy)){ |
| ((SharedResourceDiagramDocumentProvider)((AbstractDiagramEditor)editorPart).getDocumentProvider()).lock(true); |
| DiagramEditPart editPart = ((IDiagramWorkbenchPart)editorPart).getDiagramEditPart(); |
| editPart.disableEditMode(); |
| } |
| } |
| return editorPart; |
| } |
| |
| public static void refreshVisual(DiagramEditPart editPart) { |
| // refresh labels |
| // |
| Iterator<Object> iter = new AbstractTreeIterator<Object>(editPart, false) { |
| |
| /** |
| * |
| */ |
| private static final long serialVersionUID = 1L; |
| |
| @Override |
| protected Iterator<?> getChildren(Object object) { |
| if(object instanceof EditPart) { |
| return ((EditPart)object).getChildren().iterator(); |
| } |
| return Collections.EMPTY_LIST.iterator(); |
| } |
| |
| }; |
| while(iter.hasNext()) { |
| Object child = iter.next(); |
| if(child instanceof ITextAwareEditPart || child instanceof ConnectionNodeEditPart) { |
| ((EditPart)child).refresh(); |
| } |
| } |
| |
| // refresh connections |
| // |
| for (Iterator iterator = editPart.getConnections().iterator(); iterator.hasNext();) { |
| ConnectionEditPart conn = (ConnectionEditPart) iterator.next(); |
| conn.refresh(); |
| } |
| } |
| |
| public static void refreshLabels(DiagramEditPart editPart) { |
| // // make sure that the edit part figure is large enough to show the icon and all the text |
| // // |
| // for (Iterator iterator = editPart.getChildren().iterator(); iterator.hasNext();) { |
| // Object child = (Object) iterator.next(); |
| // if(child instanceof GraphicalEditPart) { |
| // IFigure f = ((GraphicalEditPart)child).getFigure(); |
| // if(f instanceof DefaultSizeNodeFigure) { |
| // Object f2 = ((DefaultSizeNodeFigure)f).getChildren().get(0); |
| // if(f2 instanceof RectangleFigure) { |
| // RectangleFigure figure = (RectangleFigure) f2; |
| // List children = ((RectangleFigure)figure).getChildren(); |
| // if(!children.isEmpty()) { |
| // Object l = children.get(0); |
| // if(l instanceof WrapLabel) { |
| // WrapLabel label = ((WrapLabel)l); |
| // Rectangle r = figure.getBounds(); |
| // Dimension d = figure.getPreferredSize(); |
| // Rectangle textR = label.getTextBounds(); |
| ////// textR.width += (textR.width * WidenedWrapLabel.DELTA_FACTOR); |
| //// textR.width += 20; |
| //// if(r.width < d.width || r.height < d.height) { |
| //// WrapLabel label = ((WrapLabel)l); |
| //// label.invalidate(); |
| //// figure.setBounds(r.union(textR)); |
| ////// System.out.println(label.getSubStringText()); |
| //// } |
| //// if("Design the Solution".equals(label.getText())) { |
| // System.out.println("Text: '" + label.getText() + "'"); |
| // System.out.println("Label font: " + label.getFont()); |
| // System.out.println("Default font: " + DiagramConstants.DEFAULT_FONT); |
| // System.out.println("Calculated text size: " + DiagramCoreUtil.getTextSizeInWrapLabel(label.getText(), null, r.width, r.height, null)); |
| // System.out.println("Current text width: " + textR.width); |
| // System.out.println("Node width: " + r.width); |
| //// } |
| // } |
| // } |
| // } |
| // } |
| // } |
| // } |
| |
| Iterator iter = new AbstractTreeIterator(editPart, false) { |
| |
| @Override |
| protected Iterator getChildren(Object object) { |
| if(object instanceof EditPart) { |
| return ((EditPart)object).getChildren().iterator(); |
| } |
| return Collections.EMPTY_LIST.iterator(); |
| } |
| |
| }; |
| while(iter.hasNext()) { |
| Object child = iter.next(); |
| if(child instanceof ITextAwareEditPart) { |
| ((ITextAwareEditPart)child).refresh(); |
| } |
| } |
| } |
| |
| private static Diagram getDiagram(DiagramEditorInputProxy inputProxy) throws CoreException { |
| IStorage storage = inputProxy.getStorage(); |
| return storage instanceof IDiagramStorage ? ((IDiagramStorage)storage).getDiagram() : null; |
| } |
| |
| private static boolean doInitialize( |
| final DiagramEditorInputProxy inputProxy, |
| IProgressMonitor monitor) throws CoreException { |
| final Diagram model = getDiagram(inputProxy); |
| if(model == null) { |
| return false; |
| } |
| if(DiagramManager.AD_kind.equals(model.getType())) { |
| ActivityDiagramAdapter adapter = (ActivityDiagramAdapter) BridgeHelper.getNodeAdapter(model.getElement()); |
| if(adapter == null) { |
| adapter = new ActivityDiagramAdapter( |
| (Activity) inputProxy |
| .getDiagramEditorInput().getMethodElement()); |
| adapter |
| .setEditingDomain((InternalTransactionalEditingDomain) TransactionUtil |
| .getEditingDomain(model)); |
| adapter.setSuppression(inputProxy |
| .getDiagramEditorInput().getSuppression()); |
| adapter.setView(model); |
| model.getElement().eAdapters().add(adapter); |
| } |
| adapter.populateDiagram(); |
| return true; |
| } |
| else if(DiagramManager.ADD_kind.equals(model.getType()) |
| || DiagramManager.WPD_kind.equals(model.getType())) { |
| TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(model); |
| AbstractEMFOperation op = new AbstractEMFOperation(domain, StringStatics.BLANK) { |
| |
| @Override |
| protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) |
| throws ExecutionException { |
| org.eclipse.epf.diagram.model.Diagram d = |
| (org.eclipse.epf.diagram.model.Diagram) model.getElement(); |
| DiagramEditorInput input = inputProxy.getDiagramEditorInput(); |
| d.setSuppression(input.getSuppression()); |
| d.setLinkedElement(input.getMethodElement()); |
| d.setObject(d.getLinkedElement()); |
| |
| return Status.OK_STATUS; |
| } |
| |
| }; |
| try { |
| op.execute(monitor, null); |
| return true; |
| } catch (ExecutionException e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| return false; |
| } |
| |
| public static void initializeOnActivate(DiagramEditPart editPart) { |
| if(editPart.getViewer() instanceof IDiagramEditorInputProvider) { |
| IEditorPart editor = ((IDiagramEditorInputProvider)editPart.getViewer()).getEditor(); |
| if(editor != null && editor.getEditorInput() instanceof DiagramEditorInputProxy) { |
| DiagramEditorInputProxy inputProxy = (DiagramEditorInputProxy) editor.getEditorInput(); |
| IProgressMonitor monitor = new NullProgressMonitor(); |
| boolean dirty = editor.isDirty(); |
| try { |
| if(doInitialize(inputProxy, monitor)) { |
| doRefresh(editPart, monitor, false); |
| refreshVisual(editPart); |
| } |
| } catch (CoreException e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } finally { |
| if(editor.isDirty() && !dirty) { |
| // initialization made the document dirty |
| // this will clear dirty flag of the editor |
| // |
| IDocumentProvider docProvider = ((DiagramDocumentEditor)editor).getDocumentProvider(); |
| if (docProvider instanceof SharedResourceDiagramDocumentProvider) { |
| ((SharedResourceDiagramDocumentProvider) docProvider) |
| .markDocumentAsSaved(inputProxy); |
| } |
| } |
| } |
| |
| } |
| } |
| } |
| |
| public static void initialize(final DiagramEditPart editPart, final DiagramEditorInputProxy inputProxy, IProgressMonitor monitor) { |
| try { |
| if(doInitialize(inputProxy, monitor)) { |
| refresh(editPart, monitor); |
| refreshLabels(editPart); |
| } |
| } catch (CoreException e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| private static void updateEdges(View view){ |
| boolean allVisible = false; |
| for (Iterator iter = view.getChildren().iterator(); iter.hasNext();) { |
| View child = (View) iter.next(); |
| if(child.getElement() instanceof NodeImpl) { |
| NodeImpl node = (NodeImpl)child.getElement(); |
| if(!node.isVisible()){ |
| setEdgeVisibility(view, node.isVisible()); |
| }else{ |
| child.setVisible(node.isVisible()); |
| setEdgeVisibility(child, true); |
| } |
| if(node instanceof NamedNode) { |
| FontStyle style = (FontStyle) child.getStyle(NotationPackage.Literals.FONT_STYLE); |
| if(style == null) { |
| style = (FontStyle) child.createStyle(NotationPackage.Literals.FONT_STYLE); |
| } |
| } |
| if(child.isVisible() && child.getElement() instanceof NodeContainer) { |
| updateEdges(child); |
| } |
| if(node.isVisible()){ |
| allVisible = true; |
| } |
| } |
| } |
| if(view.getElement() instanceof NodeContainer |
| && !(view.getElement() instanceof ActivityDetailDiagram) |
| && !(view.getElement() instanceof WorkProductDependencyDiagram)){ |
| setEdgeVisibility(view, allVisible); |
| } |
| |
| } |
| |
| private static void setEdgeVisibility(View view, boolean visibility){ |
| Diagram diagram = view.getDiagram(); |
| for (Iterator iterator = diagram.getEdges().iterator(); iterator |
| .hasNext();) { |
| Edge edge = (Edge) iterator.next(); |
| if(edge.getSource() == view || edge.getTarget() == view){ |
| if(visibility){ |
| view.setVisible(true); |
| } |
| edge.setVisible(visibility); |
| } |
| } |
| } |
| |
| private static void updateView(View view) { |
| boolean allVisible = false; |
| for (Iterator iter = view.getChildren().iterator(); iter.hasNext();) { |
| View child = (View) iter.next(); |
| if(child.getElement() instanceof NodeImpl) { |
| NodeImpl node = (NodeImpl)child.getElement(); |
| child.setVisible(node.isVisible()); |
| if(node instanceof NamedNode) { |
| FontStyle style = (FontStyle) child.getStyle(NotationPackage.Literals.FONT_STYLE); |
| if(style == null) { |
| style = (FontStyle) child.createStyle(NotationPackage.Literals.FONT_STYLE); |
| } |
| } |
| if(child.isVisible() && child.getElement() instanceof NodeContainer) { |
| updateView(child); |
| } |
| if(node.isVisible()){ |
| allVisible = true; |
| } |
| } |
| } |
| |
| if(view.getElement() instanceof NodeContainer |
| && !(view.getElement() instanceof ActivityDetailDiagram) |
| && !(view.getElement() instanceof WorkProductDependencyDiagram)) { |
| // if(!allVisible) { |
| // System.out.println(); |
| // } |
| view.setVisible(allVisible); |
| } |
| } |
| |
| public static boolean isInherited(EditPart editPart) { |
| EditPartViewer viewer = editPart.getViewer(); |
| if(viewer instanceof IDiagramEditorInputProvider) { |
| DiagramEditorInput input = ((IDiagramEditorInputProvider)viewer).getDiagramEditorInput(); |
| return isInherited(input); |
| } |
| return false; |
| } |
| |
| private static boolean isInherited(DiagramEditorInput input) { |
| return input != null && input.getWrapper() != null |
| && input.getWrapper().isInherited(); |
| } |
| |
| private static Collection getSemanticChildren(DiagramEditPart editPart) { |
| EditPartViewer viewer = editPart.getViewer(); |
| if(viewer instanceof IDiagramEditorInputProvider) { |
| DiagramEditorInput input = ((IDiagramEditorInputProvider)viewer).getDiagramEditorInput(); |
| if(input != null && input.getWrapper() != null && |
| input.getWrapper().isInherited()) { |
| Object model = editPart.getModel(); |
| if(model instanceof View) { |
| Collection children = null; |
| Diagram diagram = editPart.getDiagramView(); |
| String type = diagram.getType(); |
| if(DiagramManager.AD_kind.equals(type)) { |
| DiagramAdapter da = ((DiagramAdapter)BridgeHelper.getNodeAdapter(diagram.getElement())); |
| if(da != null) { |
| BreakdownElementWrapperItemProvider wrapper = input.getWrapper(); |
| if(TngUtil.getBestAdapterFactory(wrapper.getAdapterFactory()) != TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()) { |
| List wrappers = ProcessUtil.getWrappers(wrapper, new AdapterFactory[] { |
| TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()}); |
| wrapper = (BreakdownElementWrapperItemProvider) wrappers.get(0); |
| } |
| ActivityDiagramAdapter adapter = null; |
| try { |
| adapter = new ActivityDiagramAdapter(wrapper); |
| adapter.setFilter(da.getFilter()); |
| adapter.setSuppression(Suppression.getSuppression(TngUtil.getOwningProcess(wrapper))); |
| children = adapter.getChildren(); |
| } |
| finally { |
| if(adapter != null) { |
| adapter.dispose(); |
| } |
| } |
| } |
| } |
| else if(DiagramManager.ADD_kind.equals(type) || DiagramManager.WPD_kind.equals(type)) { |
| DiagramImpl d; |
| if(DiagramManager.ADD_kind.equals(type)) { |
| d = (DiagramImpl) ModelFactory.eINSTANCE.createActivityDetailDiagram(); |
| } |
| else { |
| d = (DiagramImpl) ModelFactory.eINSTANCE.createWorkProductDependencyDiagram(); |
| } |
| DiagramImpl diagramInUse = ((DiagramImpl)diagram.getElement()); |
| Suppression suppression = diagramInUse.getSuppression(); |
| if(suppression != null) { |
| d.setWrapper(input.getWrapper()); |
| d.setFilter(diagramInUse.getFilter()); |
| d.setSuppression(diagramInUse.getSuppression()); |
| children = d.getChildren(); |
| } |
| } |
| return children; |
| } |
| } |
| } |
| return null; |
| } |
| |
| public static void refreshConnections(DiagramEditPart editPart) { |
| Diagram diagram = editPart.getDiagramView(); |
| for (Iterator iter = diagram.getEdges().iterator(); iter.hasNext();) { |
| Edge edge = (Edge) iter.next(); |
| boolean visible = edge.getSource() != null && edge.getSource().isVisible() |
| && edge.getTarget() != null && edge.getTarget().isVisible(); |
| if(edge.isVisible() != visible) { |
| edge.setVisible(visible); |
| } |
| }; |
| |
| } |
| |
| private static void refreshChildren(DiagramEditPart editPart) { |
| Collection semanticChildren = getSemanticChildren(editPart); |
| if(semanticChildren != null) { |
| refreshChildren(editPart, semanticChildren); |
| refreshConnections(editPart); |
| } |
| } |
| |
| |
| public static void filterChildren(EditPart editPart, Collection children) { |
| DiagramEditPart diagramEditPart = DiagramCoreUtil.getDiagramEditPart(editPart); |
| Collection semanticChildren = getSemanticChildren(diagramEditPart); |
| if(semanticChildren == null) { |
| children.clear(); |
| } |
| else { |
| for (Iterator iter = children.iterator(); iter.hasNext();) { |
| EObject child = (EObject) iter.next(); |
| MethodElement e = BridgeHelper.getMethodElement(child); |
| if(getWrapper(e, semanticChildren) == null) { |
| iter.remove(); |
| } |
| } |
| } |
| } |
| |
| private static Object getWrapper(MethodElement e, Collection semanticChildren) { |
| for (Iterator iterator = semanticChildren.iterator(); iterator.hasNext();) { |
| Object c = (Object) iterator.next(); |
| if(TngUtil.unwrap(c) == e) { |
| return c; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Refreshes edit part of an inherited element. |
| * |
| * @param editPart |
| */ |
| private static void refreshChildren(EditPart editPart, Collection semanticChildren) { |
| // special handling for edit part of RoleTaskComposite that should not be shown if |
| // none of its tasks are visible |
| // |
| boolean isRoleTaskComposite = false; |
| boolean hasTask = false; |
| Object model = editPart.getModel(); |
| if(model instanceof View && ((View)model).getElement() instanceof RoleTaskComposite) { |
| isRoleTaskComposite = true; |
| } |
| |
| for (Iterator<?> iter = editPart.getChildren().iterator(); iter |
| .hasNext();) { |
| Object child = (Object) iter.next(); |
| if(child instanceof EditPart) { |
| boolean refreshChildren = true; |
| EditPart childEditPart = ((EditPart)child); |
| Object m = childEditPart.getModel(); |
| if(m instanceof View) { |
| View v = (View) m; |
| MethodElement e = BridgeHelper.getMethodElement(v); |
| if(e != null) { |
| Object object = getWrapper(e, semanticChildren); |
| boolean visible = object != null; |
| if(v.isVisible() != visible) { |
| v.setVisible(visible); |
| } |
| if(!visible) { |
| refreshChildren = false; |
| } |
| else if(isRoleTaskComposite && !hasTask && e instanceof TaskDescriptor) { |
| hasTask = true; |
| } |
| } |
| else { |
| // this is a non-UMA node like control node, text node, figure... |
| // |
| } |
| } |
| if(refreshChildren) { |
| refreshChildren(childEditPart, semanticChildren); |
| } |
| } |
| } |
| |
| if(isRoleTaskComposite && !hasTask) { |
| ((View)editPart.getModel()).setVisible(false); |
| } |
| } |
| |
| public static void doRefresh(final DiagramEditPart editPart, IProgressMonitor monitor, final boolean refreshData) { |
| final boolean isInherited = isInherited(editPart); |
| final Diagram diagram = (Diagram) editPart.getModel(); |
| if(diagram.getElement() instanceof org.eclipse.epf.diagram.model.Diagram) { |
| TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(diagram); |
| AbstractEMFOperation op = new AbstractEMFOperation(domain, StringStatics.BLANK) { |
| @Override |
| protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) |
| throws ExecutionException { |
| if(refreshData) { |
| // refresh the data |
| // |
| org.eclipse.epf.diagram.model.Diagram d = (org.eclipse.epf.diagram.model.Diagram) diagram.getElement(); |
| d.setObject(d.getLinkedElement()); |
| } |
| |
| // show/hide nodes according updated data |
| // |
| if(isInherited) { |
| refreshChildren(editPart); |
| } |
| else { |
| updateEdges(diagram); |
| updateView(diagram); |
| } |
| |
| return Status.OK_STATUS; |
| } |
| |
| }; |
| try { |
| op.execute(monitor, null); |
| } catch (ExecutionException e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| else { |
| NodeAdapter adapter = BridgeHelper.getNodeAdapter(diagram.getElement()); |
| if(adapter instanceof DiagramAdapter) { |
| if(refreshData) { |
| ((DiagramAdapter)adapter).populateDiagram(); |
| } |
| if(isInherited) { |
| try { |
| new AbstractEMFOperation(TransactionUtil.getEditingDomain(diagram), StringStatics.BLANK) { |
| |
| @Override |
| protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { |
| refreshChildren(editPart); |
| return Status.OK_STATUS; |
| } |
| |
| }.execute(monitor, null); |
| } catch (ExecutionException e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| } |
| } |
| } |
| |
| public static void refresh(final DiagramEditPart editPart, IProgressMonitor monitor) { |
| IDiagramEditorInputProvider p = ((IDiagramEditorInputProvider)editPart.getViewer()); |
| boolean wasDirty = p.getEditor() != null ? p.getEditor().isDirty() : false; |
| boolean wasBaseDirty = false; |
| IEditorPart baseEditor = null; |
| final boolean isInherited = isInherited(editPart); |
| if(isInherited) { |
| MethodElement element = BridgeHelper.getMethodElement(editPart.getDiagramView()); |
| String type = editPart.getDiagramView().getType(); |
| |
| if(p.getEditor() != null) { |
| // try to find the dirty flag of base diagram editor |
| // |
| IEditorReference[] editorRefs = p.getEditor().getSite().getPage().getEditorReferences(); |
| for (int i = 0; i < editorRefs.length; i++) { |
| IEditorReference ref = editorRefs[i]; |
| try { |
| if(ref.getEditorInput() instanceof IDiagramFileEditorInputProxy) { |
| DiagramEditorInput input = ((IDiagramFileEditorInputProxy)ref.getEditorInput()).getDiagramEditorInput(); |
| if(input.getWrapper() == null && input.getMethodElement() == element && |
| DiagramManager.getDiagramType(type) == input.getDiagramType()) { |
| IEditorPart editor = ref.getEditor(false); |
| if(editor != null) { |
| wasBaseDirty = editor.isDirty(); |
| baseEditor = editor; |
| break; |
| } |
| } |
| } |
| } catch (PartInitException e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| } |
| } |
| |
| doRefresh(editPart, monitor, true); |
| |
| // editors can become dirty after refresh |
| // clear dirty flag |
| // |
| if(!wasDirty && p.getEditor() != null && p.getEditor().isDirty()) { |
| ((SharedResourceDiagramDocumentProvider)((DiagramDocumentEditor)p.getEditor()).getDocumentProvider()) |
| .markDocumentAsSaved((IFileEditorInput) p.getEditor().getEditorInput()); |
| } |
| if(baseEditor != null && !wasBaseDirty) { |
| ((SharedResourceDiagramDocumentProvider)((DiagramDocumentEditor)baseEditor).getDocumentProvider()) |
| .markDocumentAsSaved((IFileEditorInput) baseEditor.getEditorInput()); |
| } |
| } |
| |
| public static void refresh(final DiagramEditPart editPart, IProgressMonitor monitor, boolean isinherited){ |
| |
| final boolean isInherited = isInherited(editPart); |
| final Diagram diagram = (Diagram) editPart.getModel(); |
| if(diagram.getElement() instanceof org.eclipse.epf.diagram.model.Diagram) { |
| try { |
| TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(diagram); |
| TxUtil.runInTransaction(diagram.getElement(), new Runnable() { |
| |
| public void run() { |
| // refresh the data |
| // |
| org.eclipse.epf.diagram.model.Diagram d = (org.eclipse.epf.diagram.model.Diagram) diagram.getElement(); |
| d.setObject(d.getLinkedElement()); |
| } |
| |
| }); |
| |
| TxUtil.runInTransaction(domain, new Runnable() { |
| |
| public void run() { |
| // show/hide nodes according updated data |
| // |
| if(isInherited) { |
| refreshChildren(editPart); |
| } |
| else { |
| updateEdges(diagram); |
| updateView(diagram); |
| } |
| } |
| |
| }); |
| } catch (Exception e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| else { |
| NodeAdapter adapter = BridgeHelper.getNodeAdapter(diagram.getElement()); |
| if(adapter instanceof DiagramAdapter) { |
| ((DiagramAdapter)adapter).populateDiagram(); |
| if(isInherited) { |
| try { |
| new AbstractEMFOperation(TransactionUtil.getEditingDomain(diagram), StringStatics.BLANK) { |
| |
| @Override |
| protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { |
| refreshChildren(editPart); |
| return Status.OK_STATUS; |
| } |
| |
| }.execute(monitor, null); |
| } catch (ExecutionException e) { |
| DiagramCorePlugin.getDefault().getLogger().logError(e); |
| } |
| } |
| } |
| } |
| } |
| |
| public static void resetEditor(AbstractDiagramEditor editor){ |
| if(editor.isEditable()){ |
| DiagramEditPart editPart =editor.getDiagramEditPart(); |
| IEditorInput input = editor.getEditorInput(); |
| if(input instanceof DiagramEditorInputProxy ){ |
| initialize(editPart, (DiagramEditorInputProxy)input, |
| new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public static boolean isModifiable(Object element) { |
| if(element instanceof DiagramFileEditorInputProxy){ |
| DiagramFileEditorInputProxy input = (DiagramFileEditorInputProxy)element; |
| if(input != null){ |
| DiagramEditorInput dInput = input.getDiagramEditorInput(); |
| if(dInput != null){ |
| MethodElement e = dInput.getMethodElement(); |
| // Check for plugin lock. |
| if(e != null){ |
| if(TngUtil.isLocked(e)) |
| return false; |
| } |
| // Check wrapper is readonly. |
| Object wrapper = dInput.getWrapper(); |
| if(wrapper != null && ((BreakdownElementWrapperItemProvider)wrapper).isReadOnly()){ |
| return false; |
| } |
| } |
| } |
| } |
| return true; |
| } |
| |
| /** |
| * GMF and GEF is not handling connections visibility properly. |
| * This is work-around solution to handle connections visibility. |
| * Visibility of edges need to set first and then nodes. |
| * defect opened for this: |
| * https://bugs.eclipse.org/bugs/show_bug.cgi?id=184081 |
| */ |
| public static void refreshConnectionEditParts(DiagramEditPart diagramEditPart) { |
| GraphicalViewer viewer = (GraphicalViewer)diagramEditPart.getViewer(); |
| Diagram act = (Diagram)diagramEditPart.getModel(); |
| List<?> edges = act.getEdges(); |
| for (Iterator<?> iter = edges.iterator(); iter.hasNext();) { |
| Edge edge = (Edge) iter.next(); |
| if(edge.isVisible()){ |
| ConnectionEditPart part = (ConnectionEditPart)viewer.getEditPartRegistry().get(edge); |
| |
| if(part != null){ |
| if(part.getSource() == null){ |
| for (Iterator<?> iter1 = diagramEditPart.getChildren().iterator(); iter1.hasNext();) { |
| EditPart element = (EditPart) iter1.next(); |
| Object model = element.getModel(); |
| if(edge.getSource() == model){ |
| if(element instanceof GraphicalEditPart){ |
| GraphicalEditPart sourceEditPart = ((GraphicalEditPart)element); |
| if(sourceEditPart.getFigure().isVisible()){ |
| part.setSource(element); |
| if(sourceEditPart instanceof InternalNodeEditPart && |
| !sourceEditPart.getSourceConnections().contains(part)) { |
| ((InternalNodeEditPart) sourceEditPart).primAddSourceConnection(part, 0); |
| } |
| }else{ |
| part.setSource(null); |
| } |
| } |
| } |
| } |
| } |
| if(part.getTarget() == null){ |
| for (Iterator<?> iter1 = diagramEditPart.getChildren().iterator(); iter1.hasNext();) { |
| EditPart element = (EditPart) iter1.next(); |
| Object model = element.getModel(); |
| if(edge.getTarget() == model){ |
| if(element instanceof GraphicalEditPart){ |
| GraphicalEditPart targetEditPart = ((GraphicalEditPart)element); |
| if(targetEditPart.getFigure().isVisible()){ |
| part.setTarget(element); |
| if(targetEditPart instanceof InternalNodeEditPart && |
| !targetEditPart.getTargetConnections().contains(part)) { |
| ((InternalNodeEditPart) targetEditPart).primAddTargetConnection(part, 0); |
| } |
| } else { |
| part.setTarget(null); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| try { |
| for (Iterator<?> iter = edges.iterator(); iter.hasNext();) { |
| Edge edge = (Edge) iter.next(); |
| org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart part = |
| (org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart)viewer.getEditPartRegistry().get(edge); |
| if(part != null && (part.getSource() == null || part.getTarget() == null) |
| && part.getFigure() != null){ |
| part.getFigure().setVisible(false); |
| part.getFigure().revalidate(); |
| part.deactivate(); |
| } |
| } |
| } catch(Exception e){ |
| if(DiagramCorePlugin.getDefault().isDebugging()){ |
| DiagramCorePlugin.getDefault().getLogger().logError("Error occured while refresh the connection: "+ e); //$NON-NLS-1$ |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |