﻿/*
 * Copyright (c) 2007, 2009 Borland Software Corporation
 * 
 * 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:
 *    bblajer (Borland) - initial API and implementation
 */

«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»

«DEFINE MatchingStrategy FOR gmfgen::GenDiagram-»
«EXPAND xpt::Common::copyright FOR editorGen-»
package «editorGen.editor.packageName»;

«EXPAND xpt::Common::generatedClassComment»
public class «matchingStrategyClassName» «EXPAND supertypes» {
	«EXPAND matches-»
	«EXPAND getURIFromInput-»
	«EXPAND additions-»
}
«ENDDEFINE»

«DEFINE supertypes FOR gmfgen::GenDiagram»implements org.eclipse.ui.IEditorMatchingStrategy«ENDDEFINE»

«DEFINE matches FOR gmfgen::GenDiagram-»
«EXPAND xpt::Common::generatedMemberComment»
public boolean matches(org.eclipse.ui.IEditorReference editorRef, org.eclipse.ui.IEditorInput input) {
	if (editorRef == null || !«editorGen.editor.getQualifiedClassName()».ID.equals(editorRef.getId())) {
		return false;
	}
	org.eclipse.emf.common.util.URI inputURI = getURIFromInput(input);
	if (inputURI == null) {
		return false;
	}
	try {
		org.eclipse.ui.IEditorInput editorInput = editorRef.getEditorInput();
		org.eclipse.emf.common.util.URI editorURI = getURIFromInput(editorInput);
		if (editorURI == null) {
			return false;
		}
		«EXPAND compareURIs-»
	} catch (org.eclipse.ui.PartInitException e) {
		return false;
	}
}
«ENDDEFINE»

«DEFINE getURIFromInput FOR gmfgen::GenDiagram-»
«EXPAND xpt::editor::Editor::getURIFromInput FOR editorGen.editor-»
«ENDDEFINE»

«DEFINE compareURIs FOR gmfgen::GenDiagram-»
if (!editorURI.trimFragment().equals(inputURI.trimFragment())) {
	return false;
}
String editorFragment = editorURI.fragment();
String inputFragment = inputURI.fragment();
if (editorFragment != null && inputFragment != null) {
	return editorFragment.equals(inputFragment);
}
String nonNullFragment;
if (editorFragment != null) {
	nonNullFragment = editorFragment;
} else if (inputFragment != null) {
	nonNullFragment = inputFragment;
} else {
	return true;
}
org.eclipse.emf.transaction.TransactionalEditingDomain domain = «EXPAND xpt::editor::Common::createEditingDomain FOR editorGen»;
org.eclipse.emf.ecore.resource.Resource resource = domain.getResourceSet().getResource(editorURI.trimFragment(), true);
for (java.util.Iterator it = resource.getContents().iterator(); it.hasNext(); ) {
	org.eclipse.emf.ecore.EObject next = (org.eclipse.emf.ecore.EObject) it.next();
	if (nonNullFragment.equals(resource.getURIFragment(next))) {
		return true;
	}
	if (next instanceof org.eclipse.gmf.runtime.notation.Diagram) {
		return false;
	}
}
return false;
«ENDDEFINE»

«DEFINE additions FOR gmfgen::GenDiagram»«ENDDEFINE»
