blob: 91e63b6741b3137a6c1c61e4e946715097de51d3 [file] [log] [blame]
/*******************************************************************************
* <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 378342 - Cannot store more than a diagram per file
*
* </copyright>
*
*******************************************************************************/
package org.eclipse.graphiti.ui.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.graphiti.internal.util.T;
import org.eclipse.graphiti.ui.internal.services.GraphitiUiInternal;
import org.eclipse.graphiti.ui.internal.util.ReflectionUtil;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorMatchingStrategy;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.PartInitException;
/**
* Checks whether any file editor input
* matches one of the opened editors. Scenario is a user's double-clicking
* on a diagram file in the explorer. If done multiple times on the same
* file, no new editor must be opened.
* @since 0.9
*/
public final class DiagramEditorMatchingStrategy implements IEditorMatchingStrategy {
public boolean matches(IEditorReference editorRef, IEditorInput input) {
try {
if (input instanceof DiagramEditorInput) {
// normal case: check for input equality
final IEditorInput editorInput = editorRef.getEditorInput();
if (input.equals(editorInput)) {
return true;
}
} else if (input instanceof URIEditorInput) {
final URIEditorInput uriInput = (URIEditorInput) input;
URI uri = uriInput.getURI();
uri = GraphitiUiInternal.getEmfService().mapDiagramFileUriToDiagramUri(uri);
// Check whether the given file contains a diagram as its
// root element. If yes, compare it with the given editor's
// diagram.
final IEditorInput editorInput = editorRef.getEditorInput();
if (editorInput instanceof DiagramEditorInput) {
final DiagramEditorInput diagInput = (DiagramEditorInput) editorInput;
// We do not compare diagram object but diagram files
// only.
// Reason is that if editorRef points to a not yet
// realized editor, its input's diagram is null (not yet
// created), thus we can only get its diagram file.
final String uriString = diagInput.getUriString();
final URI diagramUri = URI.createURI(uriString);
if (diagramUri != null) {
if (uri.equals(diagramUri)) {
return true;
}
}
}
} else {
IFile file = ReflectionUtil.getFile(input);
if (file != null) {
// check whether the given input comes with a file which is
// already opened in the diagram editor.
final IEditorInput editorInputOfOpenEditor = editorRef.getEditorInput();
IFile fileOpenedInDiagramEditor = ReflectionUtil.getFile(editorInputOfOpenEditor);
if (file.equals(fileOpenedInDiagramEditor)) {
return true;
}
}
}
} catch (final PartInitException e) {
T.racer().error(e.getMessage(), e);
}
return false;
}
}