blob: fd597c07bfd532ad44ddf0688a03238209fbdd54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.tests.qvt.oml.ui.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.text.IRegion;
import org.eclipse.m2m.tests.qvt.oml.util.SourceAnnotationReader.AnnotationData;
import org.eclipse.m2m.tests.qvt.oml.util.SourceAnnotationReader.RegionInfo;
class HyperLinkHelper {
static class SourceHyperLink {
final AnnotationData link;
final IRegion targeRegion;
final String targetModule;
final URI targetElemenUri;
SourceHyperLink(AnnotationData link, final RegionInfo target) {
this.link = link;
this.targeRegion = new IRegion() {
public int getLength() {
return target.getLength();
}
public int getOffset() {
return target.getOffset();
}
};
this.targetModule = null;
this.targetElemenUri = null;
}
SourceHyperLink(AnnotationData link, IRegion target) {
this.link = link;
this.targeRegion = target;
this.targetModule = null;
this.targetElemenUri = null;
}
SourceHyperLink(AnnotationData link, URI targetElemenUri) {
this.link = link;
this.targetElemenUri = targetElemenUri;
this.targetModule = null;
this.targeRegion = null;
}
SourceHyperLink(AnnotationData link, String sourceModule) {
this.link = link;
this.targetModule = sourceModule;
this.targetElemenUri = null;
this.targeRegion = null;
}
@Override
public String toString() {
return link.toString();
}
}
public static final String HYPERLINK_TAG = "link"; //$NON-NLS-1$
public static final String HYPERLINK_REF_ATTR = "ref"; //$NON-NLS-1$
public static final String HYPERLINK_MODULE_ATTR = "module"; //$NON-NLS-1$
public static final String HYPERLINK_ELEMENT_URI_ATTR = "elementUri"; //$NON-NLS-1$
public static final String REGION_TAG = "region"; //$NON-NLS-1$
public static final String REGION_ID_ATTR = "id"; //$NON-NLS-1$
private List<SourceHyperLink> fHLinks = new ArrayList<SourceHyperLink>();
private Map<String, AnnotationData> fTargetRegions = new HashMap<String, AnnotationData>();
HyperLinkHelper(List<AnnotationData> annotations) {
fTargetRegions = new HashMap<String, AnnotationData>();
List<AnnotationData> links = new ArrayList<AnnotationData>();
for (AnnotationData a : annotations) {
if(HYPERLINK_TAG.equals(a.getName())) {
links.add(a);
}
else if(REGION_TAG.equals(a.getName())) {
String id = a.getAttrValue(REGION_ID_ATTR);
if(id != null) {
if(fTargetRegions.put(id, a) != null) {
throw new RuntimeException("Region already defined. " + a); //$NON-NLS-1$
}
}
}
else {
throw new RuntimeException("Uknown test source annotation type"); //$NON-NLS-1$
}
}
for (AnnotationData nextLink : links) {
String refId = nextLink.getAttrValue(HYPERLINK_REF_ATTR);
if(refId != null) {
AnnotationData targetReg = fTargetRegions.get(refId);
if(targetReg == null && nextLink.getAttrValue(HYPERLINK_MODULE_ATTR) == null) {
throw new RuntimeException("No target region for link annotation found:" + nextLink); //$NON-NLS-1$
}
if(nextLink.getAttrValue(HYPERLINK_MODULE_ATTR) != null) {
fHLinks.add(new SourceHyperLink(nextLink, nextLink.getAttrValue(HYPERLINK_MODULE_ATTR)));
} else {
fHLinks.add(new SourceHyperLink(nextLink, targetReg.getAnnotatedRegion()));
}
}
else if(nextLink.getAttrValue(HYPERLINK_ELEMENT_URI_ATTR) != null) {
URI uri = URI.createURI(nextLink.getAttrValue(HYPERLINK_ELEMENT_URI_ATTR));
fHLinks.add(new SourceHyperLink(nextLink, uri));
}
else {
throw new RuntimeException("Hyperlink annotation must specify 'ref' or 'elementUri' attribute"); //$NON-NLS-1$
}
}
}
public List<SourceHyperLink> getHyperLinks() {
return fHLinks;
}
public AnnotationData getTargetRegion(String id) {
return fTargetRegions.get(id);
}
}