mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-03 14:25:37 +02:00
bug 302720: [Error Parser] Build preferences should store only customized error parsers
This commit is contained in:
parent
11b3b8cbe7
commit
0593978730
11 changed files with 273 additions and 75 deletions
|
@ -403,10 +403,17 @@ public class RegexErrorParserTests extends TestCase {
|
|||
assertEquals(firstName, retrieved2.getName());
|
||||
assertTrue(retrieved2 instanceof ErrorParserNamedWrapper);
|
||||
assertEquals(dummy2, ((ErrorParserNamedWrapper)retrieved2).getErrorParser());
|
||||
|
||||
IErrorParserNamed retrieved2_ext = ErrorParserManager.getErrorParserExtensionCopy(firstId);
|
||||
assertNotNull(retrieved2_ext);
|
||||
assertEquals(firstName, retrieved2_ext.getName());
|
||||
assertEquals(firstErrorParser, retrieved2_ext);
|
||||
}
|
||||
// reset available parsers
|
||||
{
|
||||
ErrorParserManager.setUserDefinedErrorParsers(null);
|
||||
String[] userDefinedIds = ErrorParserManager.getUserDefinedErrorParserIds();
|
||||
assertNull(userDefinedIds);
|
||||
|
||||
String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
|
||||
assertEquals(false, all.contains(TESTING_ID));
|
||||
|
@ -431,6 +438,9 @@ public class RegexErrorParserTests extends TestCase {
|
|||
// reset parsers
|
||||
{
|
||||
ErrorParserManager.setUserDefinedErrorParsers(null);
|
||||
String[] userDefinedIds = ErrorParserManager.getUserDefinedErrorParserIds();
|
||||
assertNull(userDefinedIds);
|
||||
|
||||
String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
|
||||
String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds());
|
||||
assertEquals(all, extensions);
|
||||
|
@ -439,6 +449,9 @@ public class RegexErrorParserTests extends TestCase {
|
|||
ErrorParserManager.setUserDefinedErrorParsers(new IErrorParserNamed[] {
|
||||
new ErrorParserNamedWrapper(TESTING_ID, TESTING_NAME, new DummyErrorParser()),
|
||||
});
|
||||
String userDefinedIds = ErrorParserManager.toDelimitedString(ErrorParserManager.getUserDefinedErrorParserIds());
|
||||
assertEquals(TESTING_ID, userDefinedIds);
|
||||
|
||||
String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
|
||||
String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds());
|
||||
assertFalse(all.equals(extensions));
|
||||
|
|
|
@ -164,7 +164,7 @@ public class ErrorParserManager extends OutputStream {
|
|||
}
|
||||
fErrorParsers = new LinkedHashMap<String, IErrorParser[]>(parsersIDs.length);
|
||||
for (String parsersID : parsersIDs) {
|
||||
IErrorParser errorParser = ErrorParserExtensionManager.getErrorParserCopy(parsersID);
|
||||
IErrorParser errorParser = getErrorParserCopy(parsersID);
|
||||
if (errorParser!=null) {
|
||||
fErrorParsers.put(parsersID, new IErrorParser[] {errorParser} );
|
||||
}
|
||||
|
@ -748,6 +748,14 @@ outer:
|
|||
return hasErrors;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return default error parsers IDs to be used if error parser list is empty.
|
||||
* @since 5.3
|
||||
*/
|
||||
public static String[] getUserDefinedErrorParserIds() {
|
||||
return ErrorParserExtensionManager.getUserDefinedErrorParserIds();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set and store in workspace area user defined error parsers.
|
||||
*
|
||||
|
@ -797,14 +805,24 @@ outer:
|
|||
|
||||
/**
|
||||
* @param id - ID of error parser
|
||||
* @return cloned copy of error parser. Note that {@link ErrorParserNamedWrapper} returns
|
||||
* shallow copy with the same instance of underlying error parser.
|
||||
* @return cloned copy of error parser or {@code null}.
|
||||
* Note that {@link ErrorParserNamedWrapper} returns shallow copy with the same instance
|
||||
* of underlying error parser.
|
||||
* @since 5.2
|
||||
*/
|
||||
public static IErrorParserNamed getErrorParserCopy(String id) {
|
||||
return ErrorParserExtensionManager.getErrorParserCopy(id);
|
||||
return ErrorParserExtensionManager.getErrorParserCopy(id, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id - ID of error parser
|
||||
* @return cloned copy of error parser as defined by its extension point or {@code null}.
|
||||
* @since 5.3
|
||||
*/
|
||||
public static IErrorParserNamed getErrorParserExtensionCopy(String id) {
|
||||
return ErrorParserExtensionManager.getErrorParserCopy(id, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ids - array of error parser IDs
|
||||
* @return error parser IDs delimited with error parser delimiter ";"
|
||||
|
|
|
@ -20,11 +20,10 @@ import java.util.ArrayList;
|
|||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
@ -44,7 +43,9 @@ import org.eclipse.cdt.core.IMarkerGenerator;
|
|||
import org.eclipse.cdt.core.errorparsers.ErrorParserNamedWrapper;
|
||||
import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
|
||||
import org.eclipse.cdt.core.errorparsers.RegexErrorPattern;
|
||||
import org.eclipse.cdt.core.resources.ResourcesUtil;
|
||||
import org.eclipse.cdt.internal.core.XmlUtil;
|
||||
import org.eclipse.core.filesystem.URIUtil;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
import org.eclipse.core.runtime.IExtension;
|
||||
|
@ -101,6 +102,34 @@ public class ErrorParserExtensionManager {
|
|||
private static LinkedHashMap<String, IErrorParserNamed> fUserDefinedErrorParsers = null;
|
||||
private static List<String> fDefaultErrorParserIds = null;
|
||||
|
||||
private static class ErrorParserComparator implements Comparator<IErrorParserNamed> {
|
||||
// For the error parsers taken from platform extensions following sorting order applies:
|
||||
// - first regular error parsers
|
||||
// - then deprecated ones
|
||||
// - then contributed by test plugin
|
||||
// inside the same category sort by parser name
|
||||
public int compare(IErrorParserNamed errorParser1, IErrorParserNamed errorParser2) {
|
||||
final String TEST_PLUGIN_ID="org.eclipse.cdt.core.tests"; //$NON-NLS-1$
|
||||
final String DEPRECATED=CCorePlugin.getResourceString("CCorePlugin.Deprecated"); //$NON-NLS-1$
|
||||
|
||||
boolean isTestPlugin1 = errorParser1.getId().startsWith(TEST_PLUGIN_ID);
|
||||
boolean isTestPlugin2 = errorParser2.getId().startsWith(TEST_PLUGIN_ID);
|
||||
if (isTestPlugin1==true && isTestPlugin2==false)
|
||||
return 1;
|
||||
if (isTestPlugin1==false && isTestPlugin2==true)
|
||||
return -1;
|
||||
|
||||
boolean isDeprecated1 = errorParser1.getName().contains(DEPRECATED);
|
||||
boolean isDeprecated2 = errorParser2.getName().contains(DEPRECATED);
|
||||
if (isDeprecated1==true && isDeprecated2==false)
|
||||
return 1;
|
||||
if (isDeprecated1==false && isDeprecated2==true)
|
||||
return -1;
|
||||
|
||||
return errorParser1.getName().compareTo(errorParser2.getName());
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
loadUserDefinedErrorParsers();
|
||||
loadDefaultErrorParserIds();
|
||||
|
@ -122,12 +151,12 @@ public class ErrorParserExtensionManager {
|
|||
}
|
||||
|
||||
if (doc!=null) {
|
||||
Set<IErrorParserNamed> errorParsers = new LinkedHashSet<IErrorParserNamed>();
|
||||
loadErrorParserExtensions(doc, errorParsers);
|
||||
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
|
||||
loadErrorParserExtensions(doc, sortedErrorParsers);
|
||||
|
||||
if (errorParsers.size()>0) {
|
||||
if (sortedErrorParsers.size()>0) {
|
||||
fUserDefinedErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
|
||||
for (IErrorParserNamed errorParser : errorParsers) {
|
||||
for (IErrorParserNamed errorParser : sortedErrorParsers) {
|
||||
fUserDefinedErrorParsers.put(errorParser.getId(), errorParser);
|
||||
}
|
||||
}
|
||||
|
@ -212,34 +241,7 @@ public class ErrorParserExtensionManager {
|
|||
* @noreference This method is not intended to be referenced by clients.
|
||||
*/
|
||||
synchronized public static void loadErrorParserExtensions() {
|
||||
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new Comparator<IErrorParserNamed>() {
|
||||
// For the error parsers taken from platform extensions following sorting order applies:
|
||||
// - first regular error parsers
|
||||
// - then deprecated ones
|
||||
// - then contributed by test plugin
|
||||
// inside the same category sort by parser name
|
||||
public int compare(IErrorParserNamed errorParser1, IErrorParserNamed errorParser2) {
|
||||
final String TEST_PLUGIN_ID="org.eclipse.cdt.core.tests"; //$NON-NLS-1$
|
||||
final String DEPRECATED=CCorePlugin.getResourceString("CCorePlugin.Deprecated"); //$NON-NLS-1$
|
||||
|
||||
boolean isTestPlugin1 = errorParser1.getId().startsWith(TEST_PLUGIN_ID);
|
||||
boolean isTestPlugin2 = errorParser2.getId().startsWith(TEST_PLUGIN_ID);
|
||||
if (isTestPlugin1==true && isTestPlugin2==false)
|
||||
return 1;
|
||||
if (isTestPlugin1==false && isTestPlugin2==true)
|
||||
return -1;
|
||||
|
||||
boolean isDeprecated1 = errorParser1.getName().contains(DEPRECATED);
|
||||
boolean isDeprecated2 = errorParser2.getName().contains(DEPRECATED);
|
||||
if (isDeprecated1==true && isDeprecated2==false)
|
||||
return 1;
|
||||
if (isDeprecated1==false && isDeprecated2==true)
|
||||
return -1;
|
||||
|
||||
return errorParser1.getName().compareTo(errorParser2.getName());
|
||||
}
|
||||
});
|
||||
|
||||
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
|
||||
loadErrorParserExtensions(Platform.getExtensionRegistry(), sortedErrorParsers);
|
||||
|
||||
fExtensionErrorParsers.clear();
|
||||
|
@ -287,15 +289,44 @@ public class ErrorParserExtensionManager {
|
|||
*/
|
||||
private static void recalculateAvailableErrorParsers() {
|
||||
fAvailableErrorParsers.clear();
|
||||
if (fUserDefinedErrorParsers!=null) {
|
||||
fAvailableErrorParsers.putAll(fUserDefinedErrorParsers);
|
||||
}
|
||||
for (IErrorParserNamed errorParser : fExtensionErrorParsers.values()) {
|
||||
String id = errorParser.getId();
|
||||
if (!fAvailableErrorParsers.containsKey(id)) {
|
||||
fAvailableErrorParsers.put(id, errorParser);
|
||||
// put default parsers on top of the list
|
||||
List<String> ids = new ArrayList<String>();
|
||||
if (fDefaultErrorParserIds!=null) {
|
||||
for (String id : fDefaultErrorParserIds) {
|
||||
IErrorParserNamed errorParser = null;
|
||||
if (fUserDefinedErrorParsers!=null) {
|
||||
errorParser = fUserDefinedErrorParsers.get(id);
|
||||
}
|
||||
if (errorParser==null) {
|
||||
errorParser = fExtensionErrorParsers.get(id);
|
||||
}
|
||||
if (errorParser!=null) {
|
||||
fAvailableErrorParsers.put(id, errorParser);
|
||||
ids.add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
// then the rest in the order defined by comparator
|
||||
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
|
||||
|
||||
if (fUserDefinedErrorParsers!=null) {
|
||||
for (String id : fUserDefinedErrorParsers.keySet()) {
|
||||
if (!ids.contains(id)) {
|
||||
IErrorParserNamed errorParser = fUserDefinedErrorParsers.get(id);
|
||||
sortedErrorParsers.add(errorParser);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (String id : fExtensionErrorParsers.keySet()) {
|
||||
if (!ids.contains(id)) {
|
||||
IErrorParserNamed errorParser = fExtensionErrorParsers.get(id);
|
||||
sortedErrorParsers.add(errorParser);
|
||||
}
|
||||
}
|
||||
|
||||
for (IErrorParserNamed errorParser : sortedErrorParsers) {
|
||||
fAvailableErrorParsers.put(errorParser.getId(), errorParser);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -456,6 +487,7 @@ public class ErrorParserExtensionManager {
|
|||
transformer.transform(source, result);
|
||||
|
||||
fileStream.close();
|
||||
ResourcesUtil.refreshWorkspaceFiles(URIUtil.toURI(location));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -627,7 +659,7 @@ public class ErrorParserExtensionManager {
|
|||
* Return error parser as stored in internal list.
|
||||
*
|
||||
* @noreference This method is not intended to be referenced by clients.
|
||||
* Use {@link #getErrorParserCopy(String)} instead.
|
||||
* Use {@link #getErrorParserCopy(String, boolean)} instead.
|
||||
*
|
||||
* @param id - ID of error parser
|
||||
* @return internal instance of error parser
|
||||
|
@ -662,9 +694,11 @@ public class ErrorParserExtensionManager {
|
|||
if (errorParsers==null) {
|
||||
fUserDefinedErrorParsers = null;
|
||||
} else {
|
||||
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
|
||||
sortedErrorParsers.addAll(Arrays.asList(errorParsers));
|
||||
fUserDefinedErrorParsers= new LinkedHashMap<String, IErrorParserNamed>();
|
||||
// set customized list
|
||||
for (IErrorParserNamed errorParser : errorParsers) {
|
||||
for (IErrorParserNamed errorParser : sortedErrorParsers) {
|
||||
fUserDefinedErrorParsers.put(errorParser.getId(), errorParser);
|
||||
}
|
||||
}
|
||||
|
@ -686,6 +720,15 @@ public class ErrorParserExtensionManager {
|
|||
return fExtensionErrorParsers.keySet().toArray(new String[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return default error parsers IDs to be used if error parser list is empty.
|
||||
*/
|
||||
public static String[] getUserDefinedErrorParserIds() {
|
||||
if (fUserDefinedErrorParsers!=null)
|
||||
return fUserDefinedErrorParsers.keySet().toArray(new String[0]);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set and store default error parsers IDs to be used if error parser list is empty.
|
||||
*
|
||||
|
@ -711,6 +754,7 @@ public class ErrorParserExtensionManager {
|
|||
} else {
|
||||
fDefaultErrorParserIds = new ArrayList<String>(Arrays.asList(ids));
|
||||
}
|
||||
recalculateAvailableErrorParsers();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -725,11 +769,12 @@ public class ErrorParserExtensionManager {
|
|||
|
||||
/**
|
||||
* @param id - ID of error parser
|
||||
* @param isExtension - if {@code true} get unmodified copy of error parser defined as extension
|
||||
* @return cloned copy of error parser. Note that {@link ErrorParserNamedWrapper} returns
|
||||
* shallow copy with the same instance of underlying error parser.
|
||||
*/
|
||||
public static IErrorParserNamed getErrorParserCopy(String id) {
|
||||
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
|
||||
public static IErrorParserNamed getErrorParserCopy(String id, boolean isExtension) {
|
||||
IErrorParserNamed errorParser = isExtension ? fExtensionErrorParsers.get(id) : fAvailableErrorParsers.get(id);
|
||||
|
||||
try {
|
||||
if (errorParser instanceof RegexErrorParser) {
|
||||
|
@ -743,5 +788,4 @@ public class ErrorParserExtensionManager {
|
|||
return errorParser;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
BIN
core/org.eclipse.cdt.ui/icons/obj16/extension_obj.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/obj16/extension_obj.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 186 B |
BIN
core/org.eclipse.cdt.ui/icons/obj16/flask.png
Normal file
BIN
core/org.eclipse.cdt.ui/icons/obj16/flask.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 481 B |
BIN
core/org.eclipse.cdt.ui/icons/obj16/person-me.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/obj16/person-me.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 307 B |
|
@ -143,6 +143,7 @@ public class Messages extends NLS {
|
|||
public static String ErrorParsTab_label_DefaultRegexErrorParserName;
|
||||
public static String ErrorParsTab_label_EnterName;
|
||||
public static String ErrorParsTab_message_ConfirmReset;
|
||||
public static String ErrorParsTab_Reset;
|
||||
public static String ErrorParsTab_title_Add;
|
||||
public static String ErrorParsTab_title_ConfirmReset;
|
||||
public static String ErrorParsTab_title_Edit;
|
||||
|
|
|
@ -209,6 +209,7 @@ ErrorParsTab_error_IllegalCharacter=Special character ''{0}'' is not allowed
|
|||
ErrorParsTab_label_EnterName=Enter name of new error parser:
|
||||
ErrorParsTab_label_DefaultRegexErrorParserName=Regex Error Parser
|
||||
ErrorParsTab_message_ConfirmReset=Are you sure you want to delete all customized error parsers?
|
||||
ErrorParsTab_Reset=Reset
|
||||
ErrorParsTab_title_Add=Add Regex Error Parser
|
||||
ErrorParsTab_title_ConfirmReset=Confirm Resetting Error Parsers
|
||||
ErrorParsTab_title_Edit=Edit Regex Error Parser name
|
||||
|
|
|
@ -39,6 +39,10 @@ import org.eclipse.swt.graphics.Image;
|
|||
* <br>
|
||||
* and {@link org.eclipse.ui.ide.IDE.SharedImages}.
|
||||
* </p>
|
||||
* <p>
|
||||
* Note that org.eclipse.cdt.ui.tests.misc.CDTSharedImagesTests will verify
|
||||
* existence of the images defined here.
|
||||
* </p>
|
||||
*
|
||||
* @noextend This class is not intended to be subclassed by clients.
|
||||
* @noinstantiate This class is not intended to be instantiated by clients.
|
||||
|
@ -115,6 +119,10 @@ public class CDTSharedImages {
|
|||
public static final String IMG_OBJS_IMPORT_SETTINGS = "icons/obj16/import_settings_wiz.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OBJS_EXPORT_SETTINGS = "icons/obj16/export_settings_wiz.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OBJS_INCCONT = "icons/obj16/incc_obj.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OBJS_EXTENSION = "icons/obj16/extension_obj.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OBJS_USER = "icons/obj16/person-me.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OBJS_CDT_TESTING = "icons/obj16/flask.png"; //$NON-NLS-1$
|
||||
|
||||
public static final String IMG_OBJS_NLS_NEVER_TRANSLATE = "icons/obj16/never_translate.gif"; //$NON-NLS-1$
|
||||
|
||||
// Breakpoint images
|
||||
|
@ -169,6 +177,8 @@ public class CDTSharedImages {
|
|||
// overlays
|
||||
public static final String IMG_OVR_WARNING = "icons/ovr16/warning_co.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OVR_ERROR = "icons/ovr16/error_co.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OVR_SETTING = "icons/ovr16/setting_nav.gif"; //$NON-NLS-1$
|
||||
public static final String IMG_OVR_INACTIVE = "icons/ovr16/inactive_co.gif"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* The method finds URL of the image corresponding to the key which could be project-relative path
|
||||
|
|
|
@ -11,6 +11,9 @@
|
|||
|
||||
package org.eclipse.cdt.ui.dialogs;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.core.resources.IMarker;
|
||||
import org.eclipse.core.runtime.Assert;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -90,6 +93,8 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
private RegexErrorParser fErrorParser;
|
||||
private boolean fEditable;
|
||||
|
||||
private List<Listener> fListeners = new ArrayList<Listener>();
|
||||
|
||||
/**
|
||||
* Provides generic implementation for overridden methods.
|
||||
* One purpose is to make it easier for subclasses to operate with {@link RegexErrorPattern},
|
||||
|
@ -245,6 +250,7 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
fErrorParser = null;
|
||||
|
||||
initializeTable();
|
||||
fireEvent();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -673,9 +679,11 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
moveItem(false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
return;
|
||||
}
|
||||
applyPatterns();
|
||||
updateButtons();
|
||||
fireEvent();
|
||||
}
|
||||
|
||||
private void addErrorPattern() {
|
||||
|
@ -714,13 +722,8 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
fTableViewer.insert(item, newPos);
|
||||
fTable.setSelection(newPos);
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||
*/
|
||||
@Override
|
||||
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||
|
||||
private void applyPatterns() {
|
||||
if (fErrorParser!=null && fEditable) {
|
||||
fErrorParser.clearPatterns();
|
||||
for (TableItem tableItem : fTable.getItems()) {
|
||||
|
@ -732,6 +735,16 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||
*/
|
||||
@Override
|
||||
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||
applyPatterns();
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
@ -741,4 +754,24 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
|
|||
public void performDefaults() {
|
||||
// ErrorParsTas.performDefaults() will do all the work
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 5.3
|
||||
*/
|
||||
public void addListener(Listener listener){
|
||||
fListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 5.3
|
||||
*/
|
||||
public void removeListener(Listener listener){
|
||||
fListeners.remove(listener);
|
||||
}
|
||||
|
||||
private void fireEvent() {
|
||||
for (Listener listener : fListeners) {
|
||||
listener.handleEvent(new Event());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,11 +11,13 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.ui.newui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
|
@ -28,6 +30,7 @@ import org.eclipse.jface.layout.PixelConverter;
|
|||
import org.eclipse.jface.viewers.CheckStateChangedEvent;
|
||||
import org.eclipse.jface.viewers.CheckboxTableViewer;
|
||||
import org.eclipse.jface.viewers.ICheckStateListener;
|
||||
import org.eclipse.jface.viewers.IDecoration;
|
||||
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
||||
import org.eclipse.jface.viewers.LabelProvider;
|
||||
import org.eclipse.jface.viewers.Viewer;
|
||||
|
@ -37,9 +40,12 @@ import org.eclipse.swt.SWT;
|
|||
import org.eclipse.swt.custom.SashForm;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.graphics.Image;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.swt.widgets.Event;
|
||||
import org.eclipse.swt.widgets.Listener;
|
||||
import org.eclipse.swt.widgets.Table;
|
||||
import org.eclipse.swt.widgets.TableItem;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
|
@ -47,12 +53,14 @@ import org.osgi.service.prefs.BackingStoreException;
|
|||
|
||||
import com.ibm.icu.text.MessageFormat;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.ErrorParserManager;
|
||||
import org.eclipse.cdt.core.IErrorParserNamed;
|
||||
import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
|
||||
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICResourceDescription;
|
||||
import org.eclipse.cdt.ui.CDTSharedImages;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.cdt.ui.dialogs.ICOptionPage;
|
||||
import org.eclipse.cdt.ui.dialogs.IInputStatusValidator;
|
||||
|
@ -87,6 +95,7 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
MOVEUP_STR,
|
||||
MOVEDOWN_STR,
|
||||
};
|
||||
private static final String RESET_STR = Messages.ErrorParsTab_Reset;
|
||||
|
||||
private static final String OOPS = "OOPS"; //$NON-NLS-1$
|
||||
|
||||
|
@ -94,6 +103,8 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
private CheckboxTableViewer fTableViewer;
|
||||
private ICConfigurationDescription fCfgDesc;
|
||||
|
||||
private static Map<String, IErrorParserNamed> fExtensionErrorParsers = null;
|
||||
|
||||
private final Map<String, IErrorParserNamed> fAvailableErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
|
||||
private final Map<String, ICOptionPage> fOptionsPageMap = new HashMap<String, ICOptionPage>();
|
||||
private ICOptionPage fCurrentOptionsPage = null;
|
||||
|
@ -156,6 +167,34 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
}
|
||||
return OOPS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getImage(Object element) {
|
||||
final String TEST_PLUGIN_ID = "org.eclipse.cdt.core.tests"; //$NON-NLS-1$
|
||||
final String DEPRECATED = CCorePlugin.getResourceString("CCorePlugin.Deprecated"); //$NON-NLS-1$
|
||||
if (element instanceof String) {
|
||||
String id = (String) element;
|
||||
String[] extIds = ErrorParserManager.getErrorParserExtensionIds();
|
||||
if (Arrays.asList(extIds).contains(id)) {
|
||||
String imageKey = CDTSharedImages.IMG_OBJS_EXTENSION;
|
||||
if (id.startsWith(TEST_PLUGIN_ID))
|
||||
imageKey = CDTSharedImages.IMG_OBJS_CDT_TESTING;
|
||||
|
||||
String[] overlayKeys = new String[5];
|
||||
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
|
||||
IErrorParserNamed errorParserExt = fExtensionErrorParsers.get(id);
|
||||
if (!errorParser.equals(errorParserExt)) {
|
||||
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING;
|
||||
} else if (errorParser.getName().contains(DEPRECATED)) {
|
||||
overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_INACTIVE;
|
||||
}
|
||||
return CDTSharedImages.getImageOverlaid(imageKey, overlayKeys);
|
||||
}
|
||||
return CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_USER);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
fTableViewer.addCheckStateListener(new ICheckStateListener() {
|
||||
|
@ -191,6 +230,14 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
}
|
||||
|
||||
private void initMapParsers() {
|
||||
if (fExtensionErrorParsers==null) {
|
||||
fExtensionErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
|
||||
String[] idsExt = ErrorParserManager.getErrorParserExtensionIds();
|
||||
for (String idExt : idsExt) {
|
||||
IErrorParserNamed errorParserExt = ErrorParserManager.getErrorParserExtensionCopy(idExt);
|
||||
fExtensionErrorParsers.put(idExt, errorParserExt);
|
||||
}
|
||||
}
|
||||
fAvailableErrorParsers.clear();
|
||||
fOptionsPageMap.clear();
|
||||
for (String id : ErrorParserManager.getErrorParserAvailableIds()) {
|
||||
|
@ -220,7 +267,7 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
displaySelectedOptionPage();
|
||||
}
|
||||
|
||||
private void initializeOptionsPage(String id) {
|
||||
private void initializeOptionsPage(final String id) {
|
||||
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
|
||||
if (errorParser!=null) {
|
||||
String name = errorParser.getName();
|
||||
|
@ -229,6 +276,12 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
if (errorParser instanceof RegexErrorParser) {
|
||||
// allow to edit only for Build Settings Preference Page (where cfgd==null)
|
||||
RegexErrorParserOptionPage optionsPage = new RegexErrorParserOptionPage((RegexErrorParser) errorParser, isErrorParsersEditable());
|
||||
optionsPage.addListener(new Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
fTableViewer.refresh(id);
|
||||
updateButtons();
|
||||
}
|
||||
});
|
||||
fOptionsPageMap.put(id, optionsPage);
|
||||
optionsPage.setContainer(page);
|
||||
optionsPage.createControl(fCompositeForOptionsPage);
|
||||
|
@ -382,15 +435,25 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
if (n < 0)
|
||||
return;
|
||||
|
||||
fTableViewer.remove(fTableViewer.getElementAt(n));
|
||||
String id = (String)fTableViewer.getElementAt(n);
|
||||
if (fExtensionErrorParsers.containsKey(id)) {
|
||||
// Reset
|
||||
fAvailableErrorParsers.put(id, ErrorParserManager.getErrorParserExtensionCopy(id));
|
||||
fTableViewer.refresh(id);
|
||||
initializeOptionsPage(id);
|
||||
displaySelectedOptionPage();
|
||||
} else {
|
||||
// Delete
|
||||
fTableViewer.remove(id);
|
||||
|
||||
int last = fTable.getItemCount() - 1;
|
||||
if (n>last)
|
||||
n = last;
|
||||
if (n>=0)
|
||||
fTable.setSelection(n);
|
||||
|
||||
int last = fTable.getItemCount() - 1;
|
||||
if (n>last)
|
||||
n = last;
|
||||
if (n>=0)
|
||||
fTable.setSelection(n);
|
||||
|
||||
saveChecked();
|
||||
saveChecked();
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -416,6 +479,15 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if error parser with this id shown to user differs from error parser defined as extension.
|
||||
*/
|
||||
private boolean isModified(String id) {
|
||||
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
|
||||
IErrorParserNamed errorParserExt = fExtensionErrorParsers.get(id);
|
||||
return ! errorParser.equals(errorParserExt);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.ui.newui.AbstractCPropertyTab#updateButtons()
|
||||
*/
|
||||
|
@ -427,11 +499,17 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
boolean selected = pos >= 0 && pos <= last;
|
||||
String id = (String)fTableViewer.getElementAt(pos);
|
||||
|
||||
boolean isExtensionId = isExtensionId(id);
|
||||
boolean canDelete = !isExtensionId && isErrorParsersEditable();
|
||||
boolean canReset = isExtensionId && isErrorParsersEditable() && isModified(id);
|
||||
|
||||
buttonSetText(BUTTON_DELETE, isExtensionId ? RESET_STR : DEL_STR);
|
||||
|
||||
buttonSetEnabled(BUTTON_ADD, isErrorParsersEditable());
|
||||
buttonSetEnabled(BUTTON_EDIT, isErrorParsersEditable() && selected);
|
||||
buttonSetEnabled(BUTTON_DELETE, isErrorParsersEditable() && selected && !isExtensionId(id));
|
||||
buttonSetEnabled(BUTTON_MOVEUP, selected && pos != 0);
|
||||
buttonSetEnabled(BUTTON_MOVEDOWN, selected && pos != last);
|
||||
buttonSetEnabled(BUTTON_DELETE, (canDelete || canReset) && selected);
|
||||
buttonSetEnabled(BUTTON_MOVEUP, selected && pos!=0);
|
||||
buttonSetEnabled(BUTTON_MOVEDOWN, selected && pos!=last);
|
||||
}
|
||||
|
||||
|
||||
|
@ -471,13 +549,13 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
if (fCfgDesc==null) {
|
||||
// Build Settings page
|
||||
try {
|
||||
IErrorParserNamed[] errorParsers = new IErrorParserNamed[fTable.getItemCount()];
|
||||
int i=0;
|
||||
List<IErrorParserNamed> errorParsersList = new ArrayList<IErrorParserNamed>(fTable.getItemCount());
|
||||
for (TableItem item : fTable.getItems()) {
|
||||
if (item.getData() instanceof String) {
|
||||
String id = (String) item.getData();
|
||||
errorParsers[i] = fAvailableErrorParsers.get(id);
|
||||
i++;
|
||||
if (isModified(id)) {
|
||||
errorParsersList.add(fAvailableErrorParsers.get(id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -485,8 +563,8 @@ public class ErrorParsTab extends AbstractCPropertyTab {
|
|||
String[] checkedErrorParserIds = new String[checkedElements.length];
|
||||
System.arraycopy(checkedElements, 0, checkedErrorParserIds, 0, checkedElements.length);
|
||||
|
||||
ErrorParserManager.setUserDefinedErrorParsers(errorParsers);
|
||||
ErrorParserManager.setDefaultErrorParserIds(checkedErrorParserIds);
|
||||
ErrorParserManager.setUserDefinedErrorParsers(errorParsersList.toArray(new IErrorParserNamed[errorParsersList.size()]));
|
||||
} catch (BackingStoreException e) {
|
||||
CUIPlugin.log(Messages.ErrorParsTab_error_OnApplyingSettings, e);
|
||||
} catch (CoreException e) {
|
||||
|
|
Loading…
Add table
Reference in a new issue