mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 09:25:31 +02:00
Bug 337625 - Support for example parameters for message pattern to be used in codan preference UI.
This commit is contained in:
parent
f1d8668d9a
commit
7a7f4df061
5 changed files with 231 additions and 154 deletions
|
@ -168,6 +168,56 @@ where xxx what checker would post as an argument for the problem.
|
|||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="exampleParam0" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
Example parameter for 'messagePattern' (with position 0.) This value is used only in the "Code Analysis" Preference UI to provide some context to the message shown for a particular problem.
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="exampleParam1" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
Example parameter for 'messagePattern' (with position 1.) This value is used only in the "Code Analysis" Preference UI to provide some context to the message shown for a particular problem.
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="exampleParam2" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
Example parameter for 'messagePattern' (with position 2.) This value is used only in the "Code Analysis" Preference UI to provide some context to the message shown for a particular problem.
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="exampleParam3" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
Example parameter for 'messagePattern' (with position 3.) This value is used only in the "Code Analysis" Preference UI to provide some context to the message shown for a particular problem.
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="exampleParam4" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
Example parameter for 'messagePattern' (with position 4.) This value is used only in the "Code Analysis" Preference UI to provide some context to the message shown for a particular problem.
|
||||
</documentation>
|
||||
<appinfo>
|
||||
<meta.attribute translatable="true"/>
|
||||
</appinfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="description" type="string">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2010 Alena Laskavaia
|
||||
* Copyright (c) 2009, 2011 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
|
||||
* Alena Laskavaia - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.model;
|
||||
|
||||
|
@ -20,20 +20,20 @@ import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
|||
* determined by runtime. If it is the case - two Problems should be created
|
||||
* (i.e. one for error and one for warning). All of problem attributes are
|
||||
* defined in a checker extension point.
|
||||
*
|
||||
*
|
||||
* <p>
|
||||
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as part
|
||||
* of a work in progress. There is no guarantee that this API will work or that
|
||||
* it will remain the same.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @noextend This interface is not intended to be extended by clients.
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IProblem extends IProblemElement {
|
||||
/**
|
||||
* Name of the problem - user visible "title", not the message
|
||||
*
|
||||
*
|
||||
* @return title of the problem
|
||||
*/
|
||||
String getName();
|
||||
|
@ -41,50 +41,60 @@ public interface IProblem extends IProblemElement {
|
|||
/**
|
||||
* Unique problem id. Should be qualified by plugin name to maintain
|
||||
* uniqueness.
|
||||
*
|
||||
*
|
||||
* @return unique problem id
|
||||
*/
|
||||
String getId();
|
||||
|
||||
/**
|
||||
* Is enabled in current context (usually within profile)
|
||||
*
|
||||
* Returns <code>true</code> if the problem is enabled in current context
|
||||
* (usually within profile)
|
||||
*
|
||||
* @return true if enabled
|
||||
*/
|
||||
boolean isEnabled();
|
||||
|
||||
/**
|
||||
* Get current severity
|
||||
*
|
||||
* Returns current severity
|
||||
*
|
||||
* @return severity
|
||||
*/
|
||||
CodanSeverity getSeverity();
|
||||
|
||||
/**
|
||||
* Message pattern, java patter like 'Variable {0} is never used here'
|
||||
*
|
||||
*
|
||||
* @return pattern
|
||||
*/
|
||||
String getMessagePattern();
|
||||
|
||||
/**
|
||||
* Get root preference descriptor or null if not defined (used by ui to
|
||||
* Returns the example parameters to use with {@link #getMessagePattern()}.
|
||||
* These parameters are used only in the "Code Analysis" Preference UI.
|
||||
*
|
||||
* @return example parameters
|
||||
* @since 2.0
|
||||
*/
|
||||
public String[] getExampleMessageParameters();
|
||||
|
||||
/**
|
||||
* Returns root preference descriptor or null if not defined (used by UI to
|
||||
* generate user controls for changing parameters)
|
||||
*
|
||||
*
|
||||
* @return root preference or null
|
||||
*/
|
||||
public IProblemPreference getPreference();
|
||||
|
||||
/**
|
||||
* Get short description of a problem
|
||||
*
|
||||
* Returns short description of a problem
|
||||
*
|
||||
* @return description
|
||||
*/
|
||||
public String getDescription();
|
||||
|
||||
/**
|
||||
* Return marker id for the problem
|
||||
*
|
||||
* Returns marker id for the problem
|
||||
*
|
||||
* @return marker id
|
||||
*/
|
||||
public String getMarkerType();
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2010 Alena Laskavaia
|
||||
* Copyright (c) 2009, 2011 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
|
||||
* Alena Laskavaia - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core;
|
||||
|
||||
|
@ -86,18 +86,15 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
processChecker(configurationElement);
|
||||
}
|
||||
// init parameters for checkers with parameters
|
||||
for (Iterator<IChecker> iterator = problemList.keySet().iterator(); iterator
|
||||
.hasNext();) {
|
||||
for (Iterator<IChecker> iterator = problemList.keySet().iterator(); iterator.hasNext();) {
|
||||
IChecker c = iterator.next();
|
||||
if (c instanceof ICheckerWithPreferences) {
|
||||
Collection<IProblem> list = problemList.get(c);
|
||||
for (Iterator<IProblem> iterator2 = list.iterator(); iterator2
|
||||
.hasNext();) {
|
||||
for (Iterator<IProblem> iterator2 = list.iterator(); iterator2.hasNext();) {
|
||||
IProblem p = iterator2.next();
|
||||
if (p instanceof IProblemWorkingCopy) {
|
||||
try {
|
||||
((ICheckerWithPreferences) c)
|
||||
.initPreferences((IProblemWorkingCopy) p);
|
||||
((ICheckerWithPreferences) c).initPreferences((IProblemWorkingCopy) p);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
CodanCorePlugin.log(t);
|
||||
|
@ -140,19 +137,16 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
name = id;
|
||||
IChecker checkerObj = null;
|
||||
try {
|
||||
Object checker = configurationElement
|
||||
.createExecutableExtension("class"); //$NON-NLS-1$
|
||||
Object checker = configurationElement.createExecutableExtension("class"); //$NON-NLS-1$
|
||||
checkerObj = (IChecker) checker;
|
||||
addChecker(checkerObj);
|
||||
} catch (CoreException e) {
|
||||
CodanCorePlugin.log(e);
|
||||
return;
|
||||
}
|
||||
IConfigurationElement[] children1 = configurationElement
|
||||
.getChildren("problemRef"); //$NON-NLS-1$
|
||||
boolean hasRef = false;
|
||||
IConfigurationElement[] children2 = configurationElement
|
||||
.getChildren(PROBLEM_ELEMENT);
|
||||
IConfigurationElement[] children2 =
|
||||
configurationElement.getChildren(PROBLEM_ELEMENT);
|
||||
if (children2 != null) {
|
||||
for (IConfigurationElement ref : children2) {
|
||||
IProblem p = processProblem(ref);
|
||||
|
@ -160,11 +154,12 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
hasRef = true;
|
||||
}
|
||||
}
|
||||
IConfigurationElement[] children1 =
|
||||
configurationElement.getChildren("problemRef"); //$NON-NLS-1$
|
||||
if (children1 != null) {
|
||||
for (IConfigurationElement ref : children1) {
|
||||
hasRef = true;
|
||||
IProblem p = getDefaultProfile().findProblem(
|
||||
ref.getAttribute("refId")); //$NON-NLS-1$
|
||||
IProblem p = getDefaultProfile().findProblem(ref.getAttribute("refId")); //$NON-NLS-1$
|
||||
addRefProblem(checkerObj, p);
|
||||
}
|
||||
}
|
||||
|
@ -183,8 +178,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
* @param configurationElement
|
||||
* @return
|
||||
*/
|
||||
private CodanProblem processProblem(
|
||||
IConfigurationElement configurationElement) {
|
||||
private CodanProblem processProblem(IConfigurationElement configurationElement) {
|
||||
if (configurationElement.getName().equals(PROBLEM_ELEMENT)) {
|
||||
String id = getAtt(configurationElement, ID_ATTR);
|
||||
if (id == null)
|
||||
|
@ -199,9 +193,15 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
String enab = getAtt(configurationElement, "defaultEnabled", false); //$NON-NLS-1$
|
||||
String sev = getAtt(configurationElement, "defaultSeverity", false); //$NON-NLS-1$
|
||||
String patt = getAtt(configurationElement, "messagePattern", false); //$NON-NLS-1$
|
||||
ArrayList<String> exampleParams = new ArrayList<String>();
|
||||
for (int i = 0; ; i++) {
|
||||
String param = configurationElement.getAttribute("exampleParam" + i); //$NON-NLS-1$
|
||||
if (param == null)
|
||||
break;
|
||||
exampleParams.add(param);
|
||||
}
|
||||
String desc = getAtt(configurationElement, "description", false); //$NON-NLS-1$
|
||||
String markerType = getAtt(configurationElement,
|
||||
"markerType", false); //$NON-NLS-1$
|
||||
String markerType = getAtt(configurationElement, "markerType", false); //$NON-NLS-1$
|
||||
if (enab != null) {
|
||||
p.setEnabled(Boolean.valueOf(enab));
|
||||
}
|
||||
|
@ -213,6 +213,9 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
if (patt != null) {
|
||||
p.setMessagePattern(patt);
|
||||
}
|
||||
if (!exampleParams.isEmpty()) {
|
||||
p.setExampleMessageParameters(exampleParams.toArray(new String[exampleParams.size()]));
|
||||
}
|
||||
if (markerType != null) {
|
||||
p.setMarkerType(markerType);
|
||||
}
|
||||
|
@ -232,21 +235,25 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
String name, boolean req) {
|
||||
String elementValue = configurationElement.getAttribute(name);
|
||||
if (elementValue == null && req)
|
||||
CodanCorePlugin
|
||||
.log("Extension " + configurationElement.getDeclaringExtension().getUniqueIdentifier() //$NON-NLS-1$
|
||||
+ " missing required attribute: " + configurationElement.getName() + "." + name); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
CodanCorePlugin.log("Extension " //$NON-NLS-1$
|
||||
+ configurationElement.getDeclaringExtension().getUniqueIdentifier()
|
||||
+ " missing required attribute: " + configurationElement.getName() //$NON-NLS-1$
|
||||
+ "." + name); //$NON-NLS-1$
|
||||
return elementValue;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#iterator()
|
||||
*/
|
||||
public Iterator<IChecker> iterator() {
|
||||
return checkers.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the singleton checkers registry
|
||||
*/
|
||||
public static CheckersRegistry getInstance() {
|
||||
if (instance == null)
|
||||
return new CheckersRegistry();
|
||||
|
@ -255,7 +262,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#addChecker(org.eclipse
|
||||
* .cdt.codan.core.model.IChecker)
|
||||
|
@ -266,7 +273,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#addProblem(org.eclipse
|
||||
* .cdt.codan.core.model.IProblem, java.lang.String)
|
||||
|
@ -280,7 +287,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#addCategory(org.eclipse
|
||||
* .cdt.codan.core.model.IProblemCategory, java.lang.String)
|
||||
|
@ -294,7 +301,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#addRefProblem(org.
|
||||
* eclipse.cdt.codan.core.model.IChecker,
|
||||
|
@ -311,7 +318,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/**
|
||||
* Returns list of problems registered for given checker
|
||||
*
|
||||
*
|
||||
* @return collection of problems or null
|
||||
*/
|
||||
public Collection<IProblem> getRefProblems(IChecker checker) {
|
||||
|
@ -320,7 +327,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#getDefaultProfile()
|
||||
*/
|
||||
|
@ -330,7 +337,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#getWorkspaceProfile()
|
||||
*/
|
||||
|
@ -361,7 +368,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfile
|
||||
* (org.eclipse.core.resources.IResource)
|
||||
|
@ -373,18 +380,17 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
try {
|
||||
prof = (IProblemProfile) getWorkspaceProfile().clone();
|
||||
// load default values
|
||||
CodanPreferencesLoader loader = new CodanPreferencesLoader(
|
||||
prof);
|
||||
Preferences projectNode = CodanPreferencesLoader
|
||||
.getProjectNode((IProject) element);
|
||||
boolean useWorkspace = projectNode.getBoolean(
|
||||
PreferenceConstants.P_USE_PARENT, false);
|
||||
CodanPreferencesLoader loader = new CodanPreferencesLoader(prof);
|
||||
Preferences projectNode =
|
||||
CodanPreferencesLoader.getProjectNode((IProject) element);
|
||||
boolean useWorkspace = projectNode.getBoolean(PreferenceConstants.P_USE_PARENT,
|
||||
false);
|
||||
if (!useWorkspace) {
|
||||
loader.load(projectNode);
|
||||
}
|
||||
profiles.put(element, prof);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
// cant
|
||||
// can't
|
||||
}
|
||||
} else if (element.getParent() != null) {
|
||||
prof = getResourceProfile(element.getParent());
|
||||
|
@ -398,34 +404,32 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @seeorg.eclipse.cdt.codan.core.model.ICheckersRegistry#
|
||||
* getResourceProfileWorkingCopy(org.eclipse.core.resources.IResource)
|
||||
*/
|
||||
public IProblemProfile getResourceProfileWorkingCopy(IResource element) {
|
||||
try {
|
||||
IProblemProfile prof = (IProblemProfile) getResourceProfile(element)
|
||||
.clone();
|
||||
IProblemProfile prof = (IProblemProfile) getResourceProfile(element).clone();
|
||||
return prof;
|
||||
} catch (CloneNotSupportedException e) {
|
||||
// cant
|
||||
// can't
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if checker is enabled (needs to be run) or not. Checker is enabled
|
||||
* if at least one problem it prints is enabled.
|
||||
*
|
||||
* Tests if a checker is enabled (needs to be run) or not. Checker is enabled
|
||||
* if at least one problem it reports is enabled.
|
||||
*
|
||||
* @param checker
|
||||
* @param resource
|
||||
* @return
|
||||
* @return <code>true</code> if the checker is enabled
|
||||
*/
|
||||
public boolean isCheckerEnabled(IChecker checker, IResource resource) {
|
||||
IProblemProfile resourceProfile = getResourceProfile(resource);
|
||||
Collection<IProblem> refProblems = getRefProblems(checker);
|
||||
for (Iterator<IProblem> iterator = refProblems.iterator(); iterator
|
||||
.hasNext();) {
|
||||
for (Iterator<IProblem> iterator = refProblems.iterator(); iterator.hasNext();) {
|
||||
IProblem p = iterator.next();
|
||||
// we need to check problem enablement in particular profile
|
||||
IProblem problem = resourceProfile.findProblem(p.getId());
|
||||
|
@ -439,15 +443,15 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
}
|
||||
|
||||
/**
|
||||
* Test if checker need to run in specific launch mode
|
||||
*
|
||||
* Tests if a checker needs to run in a specific launch mode.
|
||||
*
|
||||
* @param checker
|
||||
* @param resource
|
||||
* @param mode
|
||||
* @return
|
||||
* @return <code>true</code> if the checker should run.
|
||||
*/
|
||||
public boolean isCheckerEnabledForLaunchMode(IChecker checker,
|
||||
IResource resource, CheckerLaunchMode mode) {
|
||||
public boolean isCheckerEnabledForLaunchMode(IChecker checker, IResource resource,
|
||||
CheckerLaunchMode mode) {
|
||||
IProblemProfile resourceProfile = getResourceProfile(resource);
|
||||
Collection<IProblem> refProblems = getRefProblems(checker);
|
||||
boolean enabled = false;
|
||||
|
@ -459,13 +463,10 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
if (problem == null)
|
||||
throw new IllegalArgumentException("Id is not registered"); //$NON-NLS-1$
|
||||
if (checker instanceof AbstractCheckerWithProblemPreferences) {
|
||||
MapProblemPreference map = (MapProblemPreference) problem
|
||||
.getPreference();
|
||||
IProblemPreference pref1 = map
|
||||
.getChildDescriptor(LaunchTypeProblemPreference.KEY);
|
||||
MapProblemPreference map = (MapProblemPreference) problem.getPreference();
|
||||
IProblemPreference pref1 = map.getChildDescriptor(LaunchTypeProblemPreference.KEY);
|
||||
LaunchTypeProblemPreference pref = (LaunchTypeProblemPreference) pref1;
|
||||
if (pref == null
|
||||
|| pref.isRunningInMode(CheckerLaunchMode.USE_PARENT)) {
|
||||
if (pref == null || pref.isRunningInMode(CheckerLaunchMode.USE_PARENT)) {
|
||||
enabled = true;
|
||||
break;
|
||||
}
|
||||
|
@ -479,7 +480,7 @@ public class CheckersRegistry implements Iterable<IChecker>, ICheckersRegistry {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @return the number of checkers
|
||||
*/
|
||||
public int getCheckersSize() {
|
||||
return checkers.size();
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2010 Alena Laskavaia
|
||||
* Copyright (c) 2009, 2011 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
|
||||
* Alena Laskavaia - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.model;
|
||||
|
||||
|
@ -15,21 +15,30 @@ import org.eclipse.cdt.codan.core.model.IProblemReporter;
|
|||
import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||
|
||||
/**
|
||||
* A type of problems reported by Codan.
|
||||
*/
|
||||
public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
||||
|
||||
private String id;
|
||||
private String name;
|
||||
private String message;
|
||||
private String messagePattern;
|
||||
private CodanSeverity severity = CodanSeverity.Warning;
|
||||
private boolean enabled = true;
|
||||
private IProblemPreference preference;
|
||||
private boolean frozen;
|
||||
private String description;
|
||||
private String markerType = IProblemReporter.GENERIC_CODE_ANALYSIS_MARKER_TYPE;
|
||||
private String[] exampleParams = { "X", "Y", "Z", "U", "V" }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$
|
||||
|
||||
public CodanSeverity getSeverity() {
|
||||
return severity;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param problemId - the ID of the problem
|
||||
* @param name - the name of the problem
|
||||
*/
|
||||
public CodanProblem(String problemId, String name) {
|
||||
this.id = problemId;
|
||||
this.name = name;
|
||||
|
@ -65,7 +74,7 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see java.lang.Object#clone()
|
||||
*/
|
||||
@Override
|
||||
|
@ -92,11 +101,11 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see org.eclipse.cdt.codan.core.model.IProblem#getMessagePattern()
|
||||
*/
|
||||
public String getMessagePattern() {
|
||||
return message;
|
||||
return messagePattern;
|
||||
}
|
||||
|
||||
protected void freeze() {
|
||||
|
@ -104,12 +113,12 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param message
|
||||
* the message to set
|
||||
* @param messagePattern
|
||||
* the message to set
|
||||
*/
|
||||
public void setMessagePattern(String message) {
|
||||
public void setMessagePattern(String messagePattern) {
|
||||
checkSet();
|
||||
this.message = message;
|
||||
this.messagePattern = messagePattern;
|
||||
}
|
||||
|
||||
protected void checkSet() {
|
||||
|
@ -119,7 +128,7 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see org.eclipse.cdt.codan.core.model.IProblem#getDescription()
|
||||
*/
|
||||
public String getDescription() {
|
||||
|
@ -128,7 +137,7 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.cdt.codan.core.model.IProblemWorkingCopy#setDescription(java
|
||||
* .lang.String)
|
||||
|
@ -139,14 +148,40 @@ public class CodanProblem implements IProblemWorkingCopy, Cloneable {
|
|||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see org.eclipse.cdt.codan.core.model.IProblem#getMarkerType()
|
||||
*/
|
||||
public String getMarkerType() {
|
||||
return markerType;
|
||||
}
|
||||
|
||||
public void setMarkerType(String type) {
|
||||
markerType = type;
|
||||
/**
|
||||
* Sets the marker id for the problem.
|
||||
|
||||
* @param markerType
|
||||
*/
|
||||
public void setMarkerType(String markerType) {
|
||||
this.markerType = markerType;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.eclipse.cdt.codan.core.model.IProblem#getExampleParameters()
|
||||
*/
|
||||
public String[] getExampleMessageParameters() {
|
||||
return exampleParams.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an example message parameter to use with {@link #getMessagePattern()}.
|
||||
*
|
||||
* @param exampleParameters - the example message parameters to set,
|
||||
* e.g. { "<variable_name>" }.
|
||||
* @see #getExampleMessageParameters()
|
||||
*/
|
||||
public void setExampleMessageParameters(String[] exampleParameters) {
|
||||
checkSet();
|
||||
this.exampleParams = exampleParameters;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2009, 2010 Alena Laskavaia
|
||||
* Copyright (c) 2009, 2011 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
|
||||
* Alena Laskavaia - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.ui.preferences;
|
||||
|
||||
|
@ -17,7 +17,6 @@ import org.eclipse.cdt.codan.core.CodanRuntime;
|
|||
import org.eclipse.cdt.codan.core.model.ICheckersRegistry;
|
||||
import org.eclipse.cdt.codan.core.model.IProblem;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemProfile;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||
import org.eclipse.cdt.codan.internal.ui.CodanUIActivator;
|
||||
import org.eclipse.cdt.codan.internal.ui.CodanUIMessages;
|
||||
import org.eclipse.cdt.codan.internal.ui.dialogs.CustomizeProblemDialog;
|
||||
|
@ -55,29 +54,27 @@ import org.eclipse.ui.preferences.ScopedPreferenceStore;
|
|||
* preference store that belongs to the main plug-in class. That way,
|
||||
* preferences can be accessed directly via the preference store.
|
||||
*/
|
||||
public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
||||
IWorkbenchPreferencePage {
|
||||
public class CodanPreferencePage extends FieldEditorOverlayPage implements IWorkbenchPreferencePage {
|
||||
private IProblemProfile profile;
|
||||
private ISelectionChangedListener problemSelectionListener;
|
||||
private IProblem selectedProblem;
|
||||
private Group info;
|
||||
private Label infoDesc;
|
||||
private Label infoMessage;
|
||||
//private Label infoParams;
|
||||
// private Label infoParams;
|
||||
private Button infoButton;
|
||||
private ProblemsTreeEditor checkedTreeEditor;
|
||||
|
||||
public CodanPreferencePage() {
|
||||
super(GRID);
|
||||
setPreferenceStore(new ScopedPreferenceStore(new InstanceScope(),
|
||||
setPreferenceStore(new ScopedPreferenceStore(InstanceScope.INSTANCE,
|
||||
CodanCorePlugin.PLUGIN_ID));
|
||||
// setDescription("Code Analysis Preference Page");
|
||||
problemSelectionListener = new ISelectionChangedListener() {
|
||||
public void selectionChanged(SelectionChangedEvent event) {
|
||||
if (info != null) {
|
||||
if (event.getSelection() instanceof ITreeSelection) {
|
||||
ITreeSelection s = (ITreeSelection) event
|
||||
.getSelection();
|
||||
ITreeSelection s = (ITreeSelection) event.getSelection();
|
||||
if (s.getFirstElement() instanceof IProblem)
|
||||
setSelectedProblem((IProblem) s.getFirstElement());
|
||||
else
|
||||
|
@ -100,8 +97,7 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
*/
|
||||
@Override
|
||||
public void createFieldEditors() {
|
||||
checkedTreeEditor = new ProblemsTreeEditor(getFieldEditorParent(),
|
||||
profile);
|
||||
checkedTreeEditor = new ProblemsTreeEditor(getFieldEditorParent(), profile);
|
||||
addField(checkedTreeEditor);
|
||||
checkedTreeEditor.getTreeViewer().addSelectionChangedListener(
|
||||
problemSelectionListener);
|
||||
|
@ -111,11 +107,9 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
openCustomizeDialog();
|
||||
}
|
||||
});
|
||||
GridData layoutData = new GridData(GridData.FILL, GridData.FILL, true,
|
||||
true);
|
||||
GridData layoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
|
||||
layoutData.heightHint = 400;
|
||||
checkedTreeEditor.getTreeViewer().getControl()
|
||||
.setLayoutData(layoutData);
|
||||
checkedTreeEditor.getTreeViewer().getControl().setLayoutData(layoutData);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -127,9 +121,9 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
*/
|
||||
@Override
|
||||
protected Control createContents(Composite parent) {
|
||||
profile = isPropertyPage() ? getRegistry()
|
||||
.getResourceProfileWorkingCopy((IResource) getElement())
|
||||
: getRegistry().getWorkspaceProfile();
|
||||
profile = isPropertyPage() ?
|
||||
getRegistry().getResourceProfileWorkingCopy((IResource) getElement()) :
|
||||
getRegistry().getWorkspaceProfile();
|
||||
Composite comp = (Composite) super.createContents(parent);
|
||||
createInfoControl(comp);
|
||||
return comp;
|
||||
|
@ -143,10 +137,10 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
info.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
info.setLayout(new GridLayout(2, false));
|
||||
info.setText(CodanUIMessages.CodanPreferencePage_Info);
|
||||
GridDataFactory gdLab = GridDataFactory.swtDefaults()
|
||||
.align(SWT.BEGINNING, SWT.BEGINNING).grab(false, false);
|
||||
GridDataFactory gdFact = GridDataFactory.swtDefaults()
|
||||
.align(SWT.BEGINNING, SWT.BEGINNING).grab(true, true);
|
||||
GridDataFactory gdLab =
|
||||
GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.BEGINNING).grab(false, false);
|
||||
GridDataFactory gdFact =
|
||||
GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.BEGINNING).grab(true, true);
|
||||
// message
|
||||
Label labelMessage = new Label(info, SWT.NONE);
|
||||
labelMessage.setText(CodanUIMessages.CodanPreferencePage_MessageLabel);
|
||||
|
@ -154,9 +148,9 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
infoMessage = new Label(info, SWT.WRAP);
|
||||
infoMessage.setLayoutData(gdFact.copy().create());
|
||||
// description
|
||||
// Label labelDesc = new Label(info, SWT.NONE);
|
||||
// labelDesc.setText(CodanUIMessages.CodanPreferencePage_Description);
|
||||
// labelDesc.setLayoutData(gdLab.create());
|
||||
// Label labelDesc = new Label(info, SWT.NONE);
|
||||
// labelDesc.setText(CodanUIMessages.CodanPreferencePage_Description);
|
||||
// labelDesc.setLayoutData(gdLab.create());
|
||||
infoDesc = new Label(info, SWT.WRAP);
|
||||
PixelConverter pixelConverter = new PixelConverter(comp);
|
||||
infoDesc.setLayoutData(gdFact
|
||||
|
@ -166,14 +160,14 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
pixelConverter.convertHeightInCharsToPixels(3))
|
||||
.create());
|
||||
// params
|
||||
// Label labelParams = new Label(info, SWT.NONE);
|
||||
// labelParams.setText(CodanUIMessages.CodanPreferencePage_Parameters);
|
||||
// labelParams.setLayoutData(gdLab.create());
|
||||
// infoParams = new Label(info, SWT.NONE);
|
||||
// infoParams.setLayoutData(gdFact.create());
|
||||
// Label labelParams = new Label(info, SWT.NONE);
|
||||
// labelParams.setText(CodanUIMessages.CodanPreferencePage_Parameters);
|
||||
// labelParams.setLayoutData(gdLab.create());
|
||||
// infoParams = new Label(info, SWT.NONE);
|
||||
// infoParams.setLayoutData(gdFact.create());
|
||||
infoButton = new Button(info, SWT.PUSH);
|
||||
infoButton.setLayoutData(GridDataFactory.swtDefaults().span(2, 1)
|
||||
.align(SWT.END, SWT.BEGINNING).create());
|
||||
infoButton.setLayoutData(
|
||||
GridDataFactory.swtDefaults().span(2, 1).align(SWT.END, SWT.BEGINNING).create());
|
||||
infoButton.setText(CodanUIMessages.CodanPreferencePage_Customize);
|
||||
infoButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
|
@ -212,20 +206,13 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
return super.performOk();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void saveWidgetValues() {
|
||||
CodanUIActivator
|
||||
.getDefault()
|
||||
.getDialogSettings()
|
||||
.put(getWidgetId(),
|
||||
selectedProblem == null ? "" : selectedProblem.getId()); //$NON-NLS-1$
|
||||
CodanUIActivator.getDefault().getDialogSettings().put(getWidgetId(),
|
||||
selectedProblem == null ? "" : selectedProblem.getId()); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
private void restoreWidgetValues() {
|
||||
String id = CodanUIActivator.getDefault().getDialogSettings()
|
||||
.get(getWidgetId());
|
||||
String id = CodanUIActivator.getDefault().getDialogSettings().get(getWidgetId());
|
||||
if (id != null && id.length() > 0 && checkedTreeEditor != null) {
|
||||
checkedTreeEditor.getTreeViewer().setSelection(
|
||||
new StructuredSelection(profile.findProblem(id)), true);
|
||||
|
@ -241,30 +228,28 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
return getPageId() + ".selection"; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private void updateProblemInfo() {
|
||||
if (selectedProblem == null) {
|
||||
infoMessage.setText(""); //$NON-NLS-1$
|
||||
infoDesc.setText(""); //$NON-NLS-1$
|
||||
//infoParams.setText(""); //$NON-NLS-1$
|
||||
// infoParams.setText(""); //$NON-NLS-1$
|
||||
infoButton.setEnabled(false);
|
||||
} else {
|
||||
IProblemPreference pref = selectedProblem.getPreference();
|
||||
String description = selectedProblem.getDescription();
|
||||
if (description == null)
|
||||
description = CodanUIMessages.CodanPreferencePage_NoInfo;
|
||||
String messageToShow = CodanUIMessages.CodanPreferencePage_NoInfo;
|
||||
String messagePattern = selectedProblem.getMessagePattern();
|
||||
String message = CodanUIMessages.CodanPreferencePage_NoInfo;
|
||||
if (messagePattern != null) {
|
||||
message = MessageFormat.format(messagePattern, "X", "Y", "Z"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
Object[] exampleParams = selectedProblem.getExampleMessageParameters();
|
||||
messageToShow = MessageFormat.format(messagePattern, exampleParams);
|
||||
}
|
||||
infoMessage.setText(message);
|
||||
infoMessage.setText(messageToShow);
|
||||
infoDesc.setText(description);
|
||||
// infoParams
|
||||
// .setText(pref == null ? CodanUIMessages.CodanPreferencePage_NoInfo
|
||||
// : CodanUIMessages.CodanPreferencePage_HasPreferences);
|
||||
// IProblemPreference pref = selectedProblem.getPreference();
|
||||
// infoParams.setText(pref == null ?
|
||||
// CodanUIMessages.CodanPreferencePage_NoInfo :
|
||||
// CodanUIMessages.CodanPreferencePage_HasPreferences);
|
||||
infoButton.setEnabled(true);
|
||||
}
|
||||
info.layout(true);
|
||||
|
@ -273,20 +258,16 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements
|
|||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
|
||||
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
|
||||
*/
|
||||
public void init(IWorkbench workbench) {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
protected void openCustomizeDialog() {
|
||||
if (selectedProblem == null)
|
||||
return;
|
||||
CustomizeProblemDialog d = new CustomizeProblemDialog(getShell(),
|
||||
selectedProblem, (IResource) getElement());
|
||||
d.open();
|
||||
CustomizeProblemDialog dialog = new CustomizeProblemDialog(getShell(), selectedProblem,
|
||||
(IResource) getElement());
|
||||
dialog.open();
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue