/******************************************************************************* * Copyright (c) 2010 Alena Laskavaia * 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: * Alena Laskavaia - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.codan.ui; import org.eclipse.cdt.codan.core.CodanRuntime; import org.eclipse.cdt.codan.core.model.ICodanProblemMarker; import org.eclipse.cdt.codan.core.model.IProblem; import org.eclipse.cdt.codan.internal.core.model.CodanProblemMarker; import org.eclipse.core.resources.IMarker; /** * Abstract class that provides stubs for problems details. * This class intended to be extended by the users of codanProblemDetails * extension point. * One instance of this class would exists at runtime. To query for results, * framework * would synchronize on this class object, set setMarker then call other * getStyled* methods * to obtain data. */ public abstract class AbstractCodanProblemDetailsProvider { protected IMarker marker; public AbstractCodanProblemDetailsProvider() { } /** * sets the marker, called from framework to initialize provider */ public void setMarker(IMarker marker) { this.marker = marker; } /** * Get marker associated with this provider * * @return */ public IMarker getMarker() { return marker; } /** * Convenience method to return marker message * * @return */ protected String getProblemMessage() { String message = marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$ return message; } /** * Convenience method to return codan problem id * * @return */ protected String getProblemId() { String id = marker.getAttribute(ICodanProblemMarker.ID, (String) null); return id; } /** * return true if provider can provide details for given marker (previously * set by setMarker) * * @param id - id of the problem * @return true if details are available for given marker */ public abstract boolean isApplicable(String id); /** * Returns problem arguments by index (set by checker when reporting * problem) * * @since 2.0 */ public String getProblemArgument(int index) { return CodanProblemMarker.getProblemArgument(marker, index); } /** * Return the arguments of a problem that checker passed to "reportProblem" * method * * @param marker - problem marker * @return problem arguments, can not be null. Can be 0 sized array. * @since 2.0 */ public String[] getProblemArguments() { return CodanProblemMarker.getProblemArguments(marker); } /** * Return styled problem message. This text would be used in Link widget. * String can include <a> tags to which would be * visible as hyperlinks and newline characters (\n). Default message if * marker message plus location. Ampersand (&) should be escape because * it is interpreted as mnemonic for control navigation (can use * espaceForLink method). <br> * This method intended to be overriden by the client. */ public String getStyledProblemMessage() { String message = escapeForLink(getProblemMessage()); String href = getLocationHRef(); String link = getLocation(); return "<a href=\"" + href + "\">" + link + "</a> \n" + message + "\n"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ } protected String getLocationHRef() { return CodanEditorUtility.getLocationHRef(marker); } /** * @since 2.0 */ protected String getLocation() { return CodanEditorUtility.getLocation(marker); } /** * Return styled problem description. This text would be used in Link * widget. * String can include <a> tags to which would be * visible as hyperlinks and newline characters (\n). * Ampersand (&) should be escape because * it is interpreted as mnemonic for control navigation (can use * espaceForLink method). * * Default implementation return desciption of codan problem. <br> * This method intended to be overriden by the client. * */ public String getStyledProblemDescription() { String id = getProblemId(); if (id == null) return ""; //$NON-NLS-1$ IProblem problem = CodanRuntime.getInstance().getCheckersRegistry().getDefaultProfile().findProblem(id); String desc = problem.getDescription(); if (desc == null) return ""; //$NON-NLS-1$ return escapeForLink(desc); } /** * Method to escape characters which are interpreted by Link swt control, * such as & (mnemonic) */ protected String escapeForLink(String text) { return text.replaceAll("&", "&&"); //$NON-NLS-1$//$NON-NLS-2$ } }