blob: a1e3c645b5f90d6da880607b3ad99be324e154a1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 Sybase, Inc. and others.
*
* 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
import java.util.Iterator;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
/**
*
* Utility class to add and remove edit part markers.
*
* FIXME: add the identification mechanism of the model and remove the
* dependency on the PageflowElement
*
* @author Xiao-guang Zhang
*
*
*/
public class EditPartMarkerUtil {
/**
* Removes all markers that were created using createMarker()
*
* @param model -
* the emf model related with edit part
* @throws CoreException
*/
public static void removeAllMarkers(EObject model) throws CoreException {
IResource resource = getResource(model);
if (resource != null) {
String markerTypes[] = { IMarker.PROBLEM, IMarker.TASK };
for (int iMT = 0; iMT < markerTypes.length; iMT++) {
IMarker[] markers = resource.findMarkers(markerTypes[iMT],
false, IResource.DEPTH_ONE);
for (int iMark = 0; iMark < markers.length; iMark++) {
markers[iMark].delete();
}
}
}
}
/**
* Removes a specific problem marker type with the given severity.
*
* @param model -
* the model related with this edit part.
* @param sMarkerType -
* the marker type, either IMarker.PROBLEM or IMarker.TASK
* @param iSeverity -
* severity/priority: if sMarkerType is IMarker.PROBLEM, then
* this value is one of the PROBLEM severities; if sMarkerType is
* IMarker.TASK, this is a task priority.
* @throws CoreException
* passed on from IResource.findMarkers()
*/
public static void removeAllMarkers(EObject model, String sMarkerType,
int iSeverity) throws CoreException {
IResource resource = getResource(model);
if (resource != null) {
IMarker[] markers = resource.findMarkers(sMarkerType, false,
IResource.DEPTH_ONE);
for (int i = 0; i < markers.length; i++) {
IMarker marker = markers[i];
int iMarkerSeverity = marker.getAttribute(IMarker.SEVERITY,
IMarker.SEVERITY_ERROR);
if (iMarkerSeverity == iSeverity || iSeverity == -1) {
markers[i].delete();
}
}
}
}
/**
* get the resouce according to part or model.
*
* @param part
* @param model
* @return
*/
private static IResource getResource(EObject model) {
IResource resource = null;
resource = WebrootUtil.getResource(model);
return resource;
}
/**
* Create a problem marker.
*
* @param model -
* the model related with this edit part.
* @param sMarkerType
* @param severity -
* the problem severity, one of IMarker.SEVERITY_ERROR,
* IMarker.SEVERITY_WARNING or IMarker.SEVERITY_INFO
* @param message -
* the text associated with this marker
* @param location -
* a unique ID that the application can use to locate the
* editpart
*
* that corresponds to this marker; this is typically the DiagramElement's
* ID string
* @throws CoreException
*/
public static void createMarker(EObject model, String sMarkerType,
int severity, String message, String location) throws CoreException {
IResource resource = getResource(model);
if (resource != null) {
IMarker marker = resource.createMarker(sMarkerType);
marker.setAttribute(IMarker.MESSAGE, message);
marker.setAttribute(IMarker.SEVERITY, severity);
// The problem view doesn't show the location - only the line number
// is shown in the "location" column. Doh!
if (location != null && location.length() > 0) {
marker.setAttribute(IMarker.LOCATION, location);
}
}
}
/**
* Removes a specific problem marker type with the given severity.
*
* @param model -
* the model related with this edit part.
* @param sMarkerType -
* the marker type, either IMarker.PROBLEM or IMarker.TASK
* @throws CoreException
* passed on from IResource.findMarkers()
*/
public static void removeMarker(EObject model, String sMarkerType)
throws CoreException {
IResource resource = getResource(model);
if (resource != null) {
IMarker[] markers = resource.findMarkers(sMarkerType, false,
IResource.DEPTH_ONE);
for (int i = 0; i < markers.length; i++) {
IMarker marker = markers[i];
// get the marker's location
Object id = marker.getAttribute(IMarker.LOCATION);
if (model instanceof PageflowElement) {
if (((PageflowElement) model).getId().equals(id)) {
markers[i].delete();
}
}
}
}
}
/**
* Searches the hierarchy starting at the given EditPart for a given model
* object ID string (the DiagramElement.ID value) and returns that EditPart
*
* @param containerPart
* @param id
* @return the EditPart that corresponds to the given ID string, or null if
* not found
*/
public static GraphicalEditPart findEditPart(
GraphicalEditPart containerPart, String id) {
Object model = containerPart.getModel();
if (model instanceof PageflowElement) {
String modelId = ((PageflowElement) model).getId();
if (modelId != null && modelId.equals(id)) {
return containerPart;
}
}
Iterator iterNode = containerPart.getChildren().iterator();
while (iterNode.hasNext()) {
GraphicalEditPart child = (GraphicalEditPart) iterNode.next();
GraphicalEditPart foundPart = findEditPart(child, id);
if (foundPart != null) {
return foundPart;
}
}
Iterator iterConnection = containerPart.getSourceConnections()
.iterator();
while (iterConnection.hasNext()) {
GraphicalEditPart child = (GraphicalEditPart) iterConnection.next();
GraphicalEditPart foundPart = findEditPart(child, id);
if (foundPart != null) {
return foundPart;
}
}
return null;
}
}