blob: fe3f47319345f16ff890379d493acb3d22cc4946 [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2004, 2008 Fraunhofer Gesellschaft, Munich, Germany,
* for its Fraunhofer Institute for Computer Architecture and Software
* Technology (FIRST), Berlin, Germany and Technical University Berlin,
* Germany.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Fraunhofer FIRST - Initial API and implementation
* Technical University Berlin - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.internal.ui.callinmarkers;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.objectteams.otdt.core.ext.IMarkableJavaElement;
import org.eclipse.objectteams.otdt.ui.OTDTUIPlugin;
/**
* @author gis
*/
public class CallinMarker
{
public static final String CALLIN_ID = "org.eclipse.objectteams.otdt.ui.callinMarker"; //$NON-NLS-1$
public static final String CALLOUT_ID = "org.eclipse.objectteams.otdt.ui.calloutMarker"; //$NON-NLS-1$
public static final String PLAYEDBY_ID = "org.eclipse.objectteams.otdt.ui.playedByMarker"; //$NON-NLS-1$
public static final String ATTR_BASE_ELEMENT = "org.eclipse.objectteams.otdt.ui.markerAttr.BaseElement"; //$NON-NLS-1$
public static final String ATTR_ROLE_ELEMENTS = "org.eclipse.objectteams.otdt.ui.markerAttr.RoleElements"; //$NON-NLS-1$
public static final String[] CALLIN_MARKER_IDS = { PLAYEDBY_ID, CALLIN_ID, CALLOUT_ID };
private Map<String, Object> _attribs = new HashMap<String, Object>(11);
private String id;
public CallinMarker(String markerKind)
{
super();
this.id = markerKind;
_attribs.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
_attribs.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_HIGH));
}
public void setLineNumber(int line)
{
_attribs.put(IMarker.LINE_NUMBER, new Integer(line));
}
public void setNameRange(ISourceRange nameRange) {
_attribs.put(IMarker.CHAR_START, nameRange.getOffset());
_attribs.put(IMarker.CHAR_END, nameRange.getOffset()+nameRange.getLength());
}
/** define the roles or callin mappings referenced by the base element. */
public <M extends IMember> void setRoleElement(Set<M> roleElements)
{
StringBuffer encoded = new StringBuffer();
for (IMember m : roleElements) {
encoded.append(m.getHandleIdentifier());
encoded.append('\n');
}
this._attribs.put(CallinMarker.ATTR_ROLE_ELEMENTS, encoded.toString());
}
/** set the base element (class or method) to which this marker is attached. */
public void setBaseElement(IMember baseElement)
{
_attribs.put(CallinMarker.ATTR_BASE_ELEMENT, baseElement.getHandleIdentifier());
if (baseElement.getElementType() == IJavaElement.TYPE) {
_attribs.put(IMarker.MESSAGE, OTDTUIPlugin.getResourceString("CallinMarker.playedby_tooltip")+' '+baseElement.getElementName()); //$NON-NLS-1$
} else if (this.id == CALLIN_ID) {
_attribs.put(IMarker.MESSAGE, OTDTUIPlugin.getResourceString("CallinMarker.callin_tooltip")+' '+baseElement.getElementName()+"()"); //$NON-NLS-1$ //$NON-NLS-2$
} else if (this.id == CALLOUT_ID) {
String baseMemberName = baseElement.getElementName();
if (baseElement.getElementType() == IJavaElement.METHOD) // not for callout to field
baseMemberName += "()"; //$NON-NLS-1$
_attribs.put(IMarker.MESSAGE, OTDTUIPlugin.getResourceString("CallinMarker.callout_tooltip") + ' ' + baseMemberName); //$NON-NLS-1$
}
}
/**
* Actually create the marker.
* PRE: all relevant attributes have been set before.
*
* @param target the target element where to attach the marker (based on a resource or a java element)
* @throws CoreException thrown when a marker operation failed.
*/
@SuppressWarnings("unchecked") // IMarker.getAttributes() yields raw type
public void create(IMarkableJavaElement target) throws CoreException
{
IMarker marker = target.createMarker(this.id);
Map markerAttributes = marker.getAttributes();
if (markerAttributes != null)
_attribs.putAll(markerAttributes); // markers for JavaElements have already one attribute
marker.setAttributes(_attribs);
_attribs.clear(); // clear attributes for reuse of this object
}
/** get all playedBy and callin markers for the given resource. */
public static IMarker[] getAllBindingMarkers(IResource resource) throws CoreException {
IMarker[] markers1 = resource.findMarkers(PLAYEDBY_ID, true, IResource.DEPTH_INFINITE);
IMarker[] markers2 = resource.findMarkers(CALLIN_ID, true, IResource.DEPTH_INFINITE);
IMarker[] markers3 = resource.findMarkers(CALLOUT_ID, true, IResource.DEPTH_INFINITE);
int len1 = markers1.length, len2 = markers2.length, len3 = markers3.length;
IMarker[] result = new IMarker[len1+len2+len3];
System.arraycopy(markers1, 0, result, 0, len1);
System.arraycopy(markers2, 0, result, len1, len2);
System.arraycopy(markers3, 0, result, len1+len2, len3);
return result;
}
public static boolean isTypeMarker(IMarker marker) {
try {
return marker.getType().equals(PLAYEDBY_ID);
} catch (CoreException e) {
return false;
}
}
}