/******************************************************************************* * <copyright> * * Copyright (c) 2005, 2012 SAP AG. * 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: * SAP AG - initial API, implementation and documentation * mwenz - Bug 338067 - Drill down features should not use current diagram type provider * for opening diagram of other type * Ali Akar, mwenz - Bug 340842 - Opening a user contributed editor * Bug 336488 - DiagramEditor API * cbrand - Bug 377475 - Fix AbstractCustomFeature.execute and canExecute * fvelasco - Bug 396247 - ImageDescriptor changes * pjpaulin - Bug 352120 - Now uses IDiagramContainerUI interface * * </copyright> * *******************************************************************************/ package org.eclipse.graphiti.ui.features; import java.util.Collection; import java.util.HashSet; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICustomContext; import org.eclipse.graphiti.features.custom.AbstractCustomFeature; import org.eclipse.graphiti.internal.Messages; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.platform.IPlatformImageConstants; import org.eclipse.graphiti.ui.editor.DiagramEditor; import org.eclipse.graphiti.ui.internal.services.GraphitiUiInternal; import org.eclipse.graphiti.ui.services.GraphitiUi; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ListDialog; /** * The Class AbstractDrillDownFeature. */ public abstract class AbstractDrillDownFeature extends AbstractCustomFeature { private static final String NAME = Messages.AbstractDrillDownFeature_0_xfld; /** * Creates a new {@link AbstractDrillDownFeature}. * * @param fp * the feature provider */ public AbstractDrillDownFeature(IFeatureProvider fp) { super(fp); } @Override public String getName() { return NAME; } public void execute(ICustomContext context) { final PictogramElement pe = context.getPictogramElements()[0]; final Collection<Diagram> possibleDiagramsList = getLinkedDiagrams(pe); Diagram diagram = null; if (!possibleDiagramsList.isEmpty()) { final Diagram[] possibleDiagrams = possibleDiagramsList.toArray(new Diagram[0]); if (possibleDiagramsList.size() == 1) { diagram = possibleDiagrams[0]; } else { ListDialog dialog = new ListDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); dialog.setContentProvider(new IStructuredContentProvider() { public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object inputElement) { return possibleDiagramsList.toArray(); } }); dialog.setTitle(Messages.AbstractDrillDownFeature_1_xmsg); dialog.setMessage(Messages.AbstractDrillDownFeature_2_xmsg); dialog.setInitialSelections(new Diagram[] { possibleDiagrams[0] }); dialog.setLabelProvider(new DiagramLabelProvider()); dialog.setAddCancelButton(true); dialog.setHelpAvailable(false); dialog.setInput(new Object()); dialog.open(); Object[] result = dialog.getResult(); if (result != null) { for (int i = 0; i < result.length; i++) { diagram = (Diagram) result[i]; } } } if (diagram != null) { openDiagramEditor(diagram); } } } /** * Opens the diagram editor for the drill down. Users can override this * method in order to open different editors, open editors in different * windows or do completely different stuff for the drill down. * * @param diagram * the diagram for which the editor will be opened. */ protected void openDiagramEditor(Diagram diagram) { // Found a diagram to open String diagramTypeProviderId = GraphitiUi.getExtensionManager().getDiagramTypeProviderId(diagram.getDiagramTypeId()); GraphitiUiInternal.getWorkbenchService().openDiagramEditor(diagram, diagramTypeProviderId, getDiagramEditorId(diagram)); } /** * Returns the editor id of the diagram editor to open by default * {@link DiagramEditor#DIAGRAM_EDITOR_ID}. Users can override and return a * different editor id, must be the id of a subclass of * {@link DiagramEditor}. * * @param diagram * the diagram for which the editor will be opened * @return the editor id of the diagram editor to open */ protected String getDiagramEditorId(Diagram diagram) { return DiagramEditor.DIAGRAM_EDITOR_ID; } @Override public boolean canExecute(ICustomContext context) { final PictogramElement[] pes = context.getPictogramElements(); if (pes != null && pes.length == 1) { final PictogramElement pe = context.getPictogramElements()[0]; final Collection<Diagram> possibleDiagramsList = getLinkedDiagrams(pe); return possibleDiagramsList.size() >= 1; } return false; } /* * (non-Javadoc) * * @see org.eclipse.graphiti.features.impl.AbstractFeature#hasDoneChanges() */ @Override public boolean hasDoneChanges() { return false; } /** * Returns a list of all diagrams, which are connected to the given * pictogram element. This means, that the diagrams and the pictogram * element have at least one linked business object in common. * * @param pe * The pictogram element for which to return the connected * diagrams. * @return A list of all diagrams, which are connected to the given * pictogram element. */ protected Collection<Diagram> getLinkedDiagrams(PictogramElement pe) { final Collection<Diagram> ret = new HashSet<Diagram>(); final Object[] businessObjectsForPictogramElement = getAllBusinessObjectsForPictogramElement(pe); final Collection<Diagram> allDiagrams = getDiagrams(); for (final Diagram d : allDiagrams) { final Diagram currentDiagram = getDiagram(); if (!EcoreUtil.equals(currentDiagram, d)) { // always filter out the // current // diagram final Object[] businessObjectsForDiagram = getAllBusinessObjectsForPictogramElement(d); for (int i = 0; i < businessObjectsForDiagram.length; i++) { final Object diagramBo = businessObjectsForDiagram[i]; for (int j = 0; j < businessObjectsForPictogramElement.length; j++) { final Object currentBo = businessObjectsForPictogramElement[j]; if (getFeatureProvider().getDiagramTypeProvider().getCurrentToolBehaviorProvider() .equalsBusinessObjects(currentBo, diagramBo)) { ret.add(d); } } } } } return ret; } /** * Returns all diagrams which are considered for navigation. * * @return the diagrams */ protected abstract Collection<Diagram> getDiagrams(); /** * The Class DiagramLabelProvider. */ private class DiagramLabelProvider extends LabelProvider { Image image; /** * Instantiates a new diagram label provider. */ public DiagramLabelProvider() { super(); } @Override public String getText(Object o) { String ret = null; if (o instanceof Diagram) { Diagram diagram = (Diagram) o; ret = diagram.getName() + " (" + diagram.getDiagramTypeId() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } return ret; } @Override public Image getImage(Object element) { if (this.image == null) { this.image = GraphitiUi.getImageService().getPlatformImageForId( IPlatformImageConstants.IMG_DIAGRAM); } return this.image; } } protected TransactionalEditingDomain getTransActionalEditingDomainForNewDiagram() { return GraphitiUi.getEmfService().createResourceSetAndEditingDomain(); } }