1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-06 07:45:50 +02:00

bug 302720: [Error Parser] Build preferences should store only customized error parsers

This commit is contained in:
Andrew Gvozdev 2010-12-31 20:44:08 +00:00
parent 11b3b8cbe7
commit 0593978730
11 changed files with 273 additions and 75 deletions

View file

@ -403,10 +403,17 @@ public class RegexErrorParserTests extends TestCase {
assertEquals(firstName, retrieved2.getName()); assertEquals(firstName, retrieved2.getName());
assertTrue(retrieved2 instanceof ErrorParserNamedWrapper); assertTrue(retrieved2 instanceof ErrorParserNamedWrapper);
assertEquals(dummy2, ((ErrorParserNamedWrapper)retrieved2).getErrorParser()); 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 // reset available parsers
{ {
ErrorParserManager.setUserDefinedErrorParsers(null); ErrorParserManager.setUserDefinedErrorParsers(null);
String[] userDefinedIds = ErrorParserManager.getUserDefinedErrorParserIds();
assertNull(userDefinedIds);
String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds()); String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
assertEquals(false, all.contains(TESTING_ID)); assertEquals(false, all.contains(TESTING_ID));
@ -431,6 +438,9 @@ public class RegexErrorParserTests extends TestCase {
// reset parsers // reset parsers
{ {
ErrorParserManager.setUserDefinedErrorParsers(null); ErrorParserManager.setUserDefinedErrorParsers(null);
String[] userDefinedIds = ErrorParserManager.getUserDefinedErrorParserIds();
assertNull(userDefinedIds);
String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds()); String all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds()); String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds());
assertEquals(all, extensions); assertEquals(all, extensions);
@ -439,6 +449,9 @@ public class RegexErrorParserTests extends TestCase {
ErrorParserManager.setUserDefinedErrorParsers(new IErrorParserNamed[] { ErrorParserManager.setUserDefinedErrorParsers(new IErrorParserNamed[] {
new ErrorParserNamedWrapper(TESTING_ID, TESTING_NAME, new DummyErrorParser()), 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 all = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserAvailableIds());
String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds()); String extensions = ErrorParserManager.toDelimitedString(ErrorParserManager.getErrorParserExtensionIds());
assertFalse(all.equals(extensions)); assertFalse(all.equals(extensions));

View file

@ -164,7 +164,7 @@ public class ErrorParserManager extends OutputStream {
} }
fErrorParsers = new LinkedHashMap<String, IErrorParser[]>(parsersIDs.length); fErrorParsers = new LinkedHashMap<String, IErrorParser[]>(parsersIDs.length);
for (String parsersID : parsersIDs) { for (String parsersID : parsersIDs) {
IErrorParser errorParser = ErrorParserExtensionManager.getErrorParserCopy(parsersID); IErrorParser errorParser = getErrorParserCopy(parsersID);
if (errorParser!=null) { if (errorParser!=null) {
fErrorParsers.put(parsersID, new IErrorParser[] {errorParser} ); fErrorParsers.put(parsersID, new IErrorParser[] {errorParser} );
} }
@ -748,6 +748,14 @@ outer:
return hasErrors; 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. * Set and store in workspace area user defined error parsers.
* *
@ -797,14 +805,24 @@ outer:
/** /**
* @param id - ID of error parser * @param id - ID of error parser
* @return cloned copy of error parser. Note that {@link ErrorParserNamedWrapper} returns * @return cloned copy of error parser or {@code null}.
* shallow copy with the same instance of underlying error parser. * Note that {@link ErrorParserNamedWrapper} returns shallow copy with the same instance
* of underlying error parser.
* @since 5.2 * @since 5.2
*/ */
public static IErrorParserNamed getErrorParserCopy(String id) { 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 * @param ids - array of error parser IDs
* @return error parser IDs delimited with error parser delimiter ";" * @return error parser IDs delimited with error parser delimiter ";"

View file

@ -20,11 +20,10 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.Map.Entry;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; 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.ErrorParserNamedWrapper;
import org.eclipse.cdt.core.errorparsers.RegexErrorParser; import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
import org.eclipse.cdt.core.errorparsers.RegexErrorPattern; import org.eclipse.cdt.core.errorparsers.RegexErrorPattern;
import org.eclipse.cdt.core.resources.ResourcesUtil;
import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtension;
@ -101,6 +102,34 @@ public class ErrorParserExtensionManager {
private static LinkedHashMap<String, IErrorParserNamed> fUserDefinedErrorParsers = null; private static LinkedHashMap<String, IErrorParserNamed> fUserDefinedErrorParsers = null;
private static List<String> fDefaultErrorParserIds = 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 { static {
loadUserDefinedErrorParsers(); loadUserDefinedErrorParsers();
loadDefaultErrorParserIds(); loadDefaultErrorParserIds();
@ -122,12 +151,12 @@ public class ErrorParserExtensionManager {
} }
if (doc!=null) { if (doc!=null) {
Set<IErrorParserNamed> errorParsers = new LinkedHashSet<IErrorParserNamed>(); Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
loadErrorParserExtensions(doc, errorParsers); loadErrorParserExtensions(doc, sortedErrorParsers);
if (errorParsers.size()>0) { if (sortedErrorParsers.size()>0) {
fUserDefinedErrorParsers = new LinkedHashMap<String, IErrorParserNamed>(); fUserDefinedErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
for (IErrorParserNamed errorParser : errorParsers) { for (IErrorParserNamed errorParser : sortedErrorParsers) {
fUserDefinedErrorParsers.put(errorParser.getId(), errorParser); fUserDefinedErrorParsers.put(errorParser.getId(), errorParser);
} }
} }
@ -212,34 +241,7 @@ public class ErrorParserExtensionManager {
* @noreference This method is not intended to be referenced by clients. * @noreference This method is not intended to be referenced by clients.
*/ */
synchronized public static void loadErrorParserExtensions() { synchronized public static void loadErrorParserExtensions() {
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new Comparator<IErrorParserNamed>() { Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
// 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());
}
});
loadErrorParserExtensions(Platform.getExtensionRegistry(), sortedErrorParsers); loadErrorParserExtensions(Platform.getExtensionRegistry(), sortedErrorParsers);
fExtensionErrorParsers.clear(); fExtensionErrorParsers.clear();
@ -287,15 +289,44 @@ public class ErrorParserExtensionManager {
*/ */
private static void recalculateAvailableErrorParsers() { private static void recalculateAvailableErrorParsers() {
fAvailableErrorParsers.clear(); fAvailableErrorParsers.clear();
if (fUserDefinedErrorParsers!=null) { // put default parsers on top of the list
fAvailableErrorParsers.putAll(fUserDefinedErrorParsers); List<String> ids = new ArrayList<String>();
} if (fDefaultErrorParserIds!=null) {
for (IErrorParserNamed errorParser : fExtensionErrorParsers.values()) { for (String id : fDefaultErrorParserIds) {
String id = errorParser.getId(); IErrorParserNamed errorParser = null;
if (!fAvailableErrorParsers.containsKey(id)) { if (fUserDefinedErrorParsers!=null) {
fAvailableErrorParsers.put(id, errorParser); 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); transformer.transform(source, result);
fileStream.close(); fileStream.close();
ResourcesUtil.refreshWorkspaceFiles(URIUtil.toURI(location));
} }
/** /**
@ -627,7 +659,7 @@ public class ErrorParserExtensionManager {
* Return error parser as stored in internal list. * Return error parser as stored in internal list.
* *
* @noreference This method is not intended to be referenced by clients. * @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 * @param id - ID of error parser
* @return internal instance of error parser * @return internal instance of error parser
@ -662,9 +694,11 @@ public class ErrorParserExtensionManager {
if (errorParsers==null) { if (errorParsers==null) {
fUserDefinedErrorParsers = null; fUserDefinedErrorParsers = null;
} else { } else {
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
sortedErrorParsers.addAll(Arrays.asList(errorParsers));
fUserDefinedErrorParsers= new LinkedHashMap<String, IErrorParserNamed>(); fUserDefinedErrorParsers= new LinkedHashMap<String, IErrorParserNamed>();
// set customized list // set customized list
for (IErrorParserNamed errorParser : errorParsers) { for (IErrorParserNamed errorParser : sortedErrorParsers) {
fUserDefinedErrorParsers.put(errorParser.getId(), errorParser); fUserDefinedErrorParsers.put(errorParser.getId(), errorParser);
} }
} }
@ -686,6 +720,15 @@ public class ErrorParserExtensionManager {
return fExtensionErrorParsers.keySet().toArray(new String[0]); 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. * Set and store default error parsers IDs to be used if error parser list is empty.
* *
@ -711,6 +754,7 @@ public class ErrorParserExtensionManager {
} else { } else {
fDefaultErrorParserIds = new ArrayList<String>(Arrays.asList(ids)); fDefaultErrorParserIds = new ArrayList<String>(Arrays.asList(ids));
} }
recalculateAvailableErrorParsers();
} }
/** /**
@ -725,11 +769,12 @@ public class ErrorParserExtensionManager {
/** /**
* @param id - ID of error parser * @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 * @return cloned copy of error parser. Note that {@link ErrorParserNamedWrapper} returns
* shallow copy with the same instance of underlying error parser. * shallow copy with the same instance of underlying error parser.
*/ */
public static IErrorParserNamed getErrorParserCopy(String id) { public static IErrorParserNamed getErrorParserCopy(String id, boolean isExtension) {
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id); IErrorParserNamed errorParser = isExtension ? fExtensionErrorParsers.get(id) : fAvailableErrorParsers.get(id);
try { try {
if (errorParser instanceof RegexErrorParser) { if (errorParser instanceof RegexErrorParser) {
@ -743,5 +788,4 @@ public class ErrorParserExtensionManager {
return errorParser; return errorParser;
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

View file

@ -143,6 +143,7 @@ public class Messages extends NLS {
public static String ErrorParsTab_label_DefaultRegexErrorParserName; public static String ErrorParsTab_label_DefaultRegexErrorParserName;
public static String ErrorParsTab_label_EnterName; public static String ErrorParsTab_label_EnterName;
public static String ErrorParsTab_message_ConfirmReset; public static String ErrorParsTab_message_ConfirmReset;
public static String ErrorParsTab_Reset;
public static String ErrorParsTab_title_Add; public static String ErrorParsTab_title_Add;
public static String ErrorParsTab_title_ConfirmReset; public static String ErrorParsTab_title_ConfirmReset;
public static String ErrorParsTab_title_Edit; public static String ErrorParsTab_title_Edit;

View file

@ -209,6 +209,7 @@ ErrorParsTab_error_IllegalCharacter=Special character ''{0}'' is not allowed
ErrorParsTab_label_EnterName=Enter name of new error parser: ErrorParsTab_label_EnterName=Enter name of new error parser:
ErrorParsTab_label_DefaultRegexErrorParserName=Regex Error Parser ErrorParsTab_label_DefaultRegexErrorParserName=Regex Error Parser
ErrorParsTab_message_ConfirmReset=Are you sure you want to delete all customized error parsers? 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_Add=Add Regex Error Parser
ErrorParsTab_title_ConfirmReset=Confirm Resetting Error Parsers ErrorParsTab_title_ConfirmReset=Confirm Resetting Error Parsers
ErrorParsTab_title_Edit=Edit Regex Error Parser name ErrorParsTab_title_Edit=Edit Regex Error Parser name

View file

@ -39,6 +39,10 @@ import org.eclipse.swt.graphics.Image;
* <br> * <br>
* and {@link org.eclipse.ui.ide.IDE.SharedImages}. * and {@link org.eclipse.ui.ide.IDE.SharedImages}.
* </p> * </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. * @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated 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_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_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_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$ public static final String IMG_OBJS_NLS_NEVER_TRANSLATE = "icons/obj16/never_translate.gif"; //$NON-NLS-1$
// Breakpoint images // Breakpoint images
@ -169,6 +177,8 @@ public class CDTSharedImages {
// overlays // overlays
public static final String IMG_OVR_WARNING = "icons/ovr16/warning_co.gif"; //$NON-NLS-1$ 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_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 * The method finds URL of the image corresponding to the key which could be project-relative path

View file

@ -11,6 +11,9 @@
package org.eclipse.cdt.ui.dialogs; package org.eclipse.cdt.ui.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -90,6 +93,8 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
private RegexErrorParser fErrorParser; private RegexErrorParser fErrorParser;
private boolean fEditable; private boolean fEditable;
private List<Listener> fListeners = new ArrayList<Listener>();
/** /**
* Provides generic implementation for overridden methods. * Provides generic implementation for overridden methods.
* One purpose is to make it easier for subclasses to operate with {@link RegexErrorPattern}, * 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; fErrorParser = null;
initializeTable(); initializeTable();
fireEvent();
} }
}); });
@ -673,9 +679,11 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
moveItem(false); moveItem(false);
break; break;
default: default:
break; return;
} }
applyPatterns();
updateButtons(); updateButtons();
fireEvent();
} }
private void addErrorPattern() { private void addErrorPattern() {
@ -714,13 +722,8 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
fTableViewer.insert(item, newPos); fTableViewer.insert(item, newPos);
fTable.setSelection(newPos); fTable.setSelection(newPos);
} }
/*
* (non-Javadoc) private void applyPatterns() {
*
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
if (fErrorParser!=null && fEditable) { if (fErrorParser!=null && fEditable) {
fErrorParser.clearPatterns(); fErrorParser.clearPatterns();
for (TableItem tableItem : fTable.getItems()) { 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) * (non-Javadoc)
* *
@ -741,4 +754,24 @@ public final class RegexErrorParserOptionPage extends AbstractCOptionPage {
public void performDefaults() { public void performDefaults() {
// ErrorParsTas.performDefaults() will do all the work // 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());
}
}
} }

View file

@ -11,11 +11,13 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.ui.newui; package org.eclipse.cdt.ui.newui;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; 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.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer; 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.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite; 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.Table;
import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI; import org.eclipse.ui.PlatformUI;
@ -47,12 +53,14 @@ import org.osgi.service.prefs.BackingStoreException;
import com.ibm.icu.text.MessageFormat; import com.ibm.icu.text.MessageFormat;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParserNamed; import org.eclipse.cdt.core.IErrorParserNamed;
import org.eclipse.cdt.core.errorparsers.RegexErrorParser; import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription; import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription;
import org.eclipse.cdt.core.settings.model.ICResourceDescription; 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.CUIPlugin;
import org.eclipse.cdt.ui.dialogs.ICOptionPage; import org.eclipse.cdt.ui.dialogs.ICOptionPage;
import org.eclipse.cdt.ui.dialogs.IInputStatusValidator; import org.eclipse.cdt.ui.dialogs.IInputStatusValidator;
@ -87,6 +95,7 @@ public class ErrorParsTab extends AbstractCPropertyTab {
MOVEUP_STR, MOVEUP_STR,
MOVEDOWN_STR, MOVEDOWN_STR,
}; };
private static final String RESET_STR = Messages.ErrorParsTab_Reset;
private static final String OOPS = "OOPS"; //$NON-NLS-1$ private static final String OOPS = "OOPS"; //$NON-NLS-1$
@ -94,6 +103,8 @@ public class ErrorParsTab extends AbstractCPropertyTab {
private CheckboxTableViewer fTableViewer; private CheckboxTableViewer fTableViewer;
private ICConfigurationDescription fCfgDesc; private ICConfigurationDescription fCfgDesc;
private static Map<String, IErrorParserNamed> fExtensionErrorParsers = null;
private final Map<String, IErrorParserNamed> fAvailableErrorParsers = new LinkedHashMap<String, IErrorParserNamed>(); private final Map<String, IErrorParserNamed> fAvailableErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
private final Map<String, ICOptionPage> fOptionsPageMap = new HashMap<String, ICOptionPage>(); private final Map<String, ICOptionPage> fOptionsPageMap = new HashMap<String, ICOptionPage>();
private ICOptionPage fCurrentOptionsPage = null; private ICOptionPage fCurrentOptionsPage = null;
@ -156,6 +167,34 @@ public class ErrorParsTab extends AbstractCPropertyTab {
} }
return OOPS; 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() { fTableViewer.addCheckStateListener(new ICheckStateListener() {
@ -191,6 +230,14 @@ public class ErrorParsTab extends AbstractCPropertyTab {
} }
private void initMapParsers() { 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(); fAvailableErrorParsers.clear();
fOptionsPageMap.clear(); fOptionsPageMap.clear();
for (String id : ErrorParserManager.getErrorParserAvailableIds()) { for (String id : ErrorParserManager.getErrorParserAvailableIds()) {
@ -220,7 +267,7 @@ public class ErrorParsTab extends AbstractCPropertyTab {
displaySelectedOptionPage(); displaySelectedOptionPage();
} }
private void initializeOptionsPage(String id) { private void initializeOptionsPage(final String id) {
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id); IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
if (errorParser!=null) { if (errorParser!=null) {
String name = errorParser.getName(); String name = errorParser.getName();
@ -229,6 +276,12 @@ public class ErrorParsTab extends AbstractCPropertyTab {
if (errorParser instanceof RegexErrorParser) { if (errorParser instanceof RegexErrorParser) {
// allow to edit only for Build Settings Preference Page (where cfgd==null) // allow to edit only for Build Settings Preference Page (where cfgd==null)
RegexErrorParserOptionPage optionsPage = new RegexErrorParserOptionPage((RegexErrorParser) errorParser, isErrorParsersEditable()); RegexErrorParserOptionPage optionsPage = new RegexErrorParserOptionPage((RegexErrorParser) errorParser, isErrorParsersEditable());
optionsPage.addListener(new Listener() {
public void handleEvent(Event event) {
fTableViewer.refresh(id);
updateButtons();
}
});
fOptionsPageMap.put(id, optionsPage); fOptionsPageMap.put(id, optionsPage);
optionsPage.setContainer(page); optionsPage.setContainer(page);
optionsPage.createControl(fCompositeForOptionsPage); optionsPage.createControl(fCompositeForOptionsPage);
@ -382,15 +435,25 @@ public class ErrorParsTab extends AbstractCPropertyTab {
if (n < 0) if (n < 0)
return; 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; saveChecked();
if (n>last) }
n = last;
if (n>=0)
fTable.setSelection(n);
saveChecked();
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -416,6 +479,15 @@ public class ErrorParsTab extends AbstractCPropertyTab {
return false; 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) /* (non-Javadoc)
* @see org.eclipse.cdt.ui.newui.AbstractCPropertyTab#updateButtons() * @see org.eclipse.cdt.ui.newui.AbstractCPropertyTab#updateButtons()
*/ */
@ -427,11 +499,17 @@ public class ErrorParsTab extends AbstractCPropertyTab {
boolean selected = pos >= 0 && pos <= last; boolean selected = pos >= 0 && pos <= last;
String id = (String)fTableViewer.getElementAt(pos); 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_ADD, isErrorParsersEditable());
buttonSetEnabled(BUTTON_EDIT, isErrorParsersEditable() && selected); buttonSetEnabled(BUTTON_EDIT, isErrorParsersEditable() && selected);
buttonSetEnabled(BUTTON_DELETE, isErrorParsersEditable() && selected && !isExtensionId(id)); buttonSetEnabled(BUTTON_DELETE, (canDelete || canReset) && selected);
buttonSetEnabled(BUTTON_MOVEUP, selected && pos != 0); buttonSetEnabled(BUTTON_MOVEUP, selected && pos!=0);
buttonSetEnabled(BUTTON_MOVEDOWN, selected && pos != last); buttonSetEnabled(BUTTON_MOVEDOWN, selected && pos!=last);
} }
@ -471,13 +549,13 @@ public class ErrorParsTab extends AbstractCPropertyTab {
if (fCfgDesc==null) { if (fCfgDesc==null) {
// Build Settings page // Build Settings page
try { try {
IErrorParserNamed[] errorParsers = new IErrorParserNamed[fTable.getItemCount()]; List<IErrorParserNamed> errorParsersList = new ArrayList<IErrorParserNamed>(fTable.getItemCount());
int i=0;
for (TableItem item : fTable.getItems()) { for (TableItem item : fTable.getItems()) {
if (item.getData() instanceof String) { if (item.getData() instanceof String) {
String id = (String) item.getData(); String id = (String) item.getData();
errorParsers[i] = fAvailableErrorParsers.get(id); if (isModified(id)) {
i++; errorParsersList.add(fAvailableErrorParsers.get(id));
}
} }
} }
@ -485,8 +563,8 @@ public class ErrorParsTab extends AbstractCPropertyTab {
String[] checkedErrorParserIds = new String[checkedElements.length]; String[] checkedErrorParserIds = new String[checkedElements.length];
System.arraycopy(checkedElements, 0, checkedErrorParserIds, 0, checkedElements.length); System.arraycopy(checkedElements, 0, checkedErrorParserIds, 0, checkedElements.length);
ErrorParserManager.setUserDefinedErrorParsers(errorParsers);
ErrorParserManager.setDefaultErrorParserIds(checkedErrorParserIds); ErrorParserManager.setDefaultErrorParserIds(checkedErrorParserIds);
ErrorParserManager.setUserDefinedErrorParsers(errorParsersList.toArray(new IErrorParserNamed[errorParsersList.size()]));
} catch (BackingStoreException e) { } catch (BackingStoreException e) {
CUIPlugin.log(Messages.ErrorParsTab_error_OnApplyingSettings, e); CUIPlugin.log(Messages.ErrorParsTab_error_OnApplyingSettings, e);
} catch (CoreException e) { } catch (CoreException e) {